Uzamykßnφ
Uzamykacφ prost°edφ BDE je hierarchie obsahujφcφ t°i vrstvy:
-
Vrstva sezenφ - Vlastnφ madla databßzφ, kurzory tabulek,
zφskanΘ zßmky tabulek a zßmky zßznam∙.
-
Vrstva madla databßze - Omezenφ re╛imu otevφrßnφ tabulek
v databßzi.
-
Vrstva kurzoru tabulky - Re╛im otev°enφ kurzoru m∙╛e
omezit p°φstup.
Vrstva sezenφ
Na vrcholu hierarchie uzamykßnφ BDE je vrstva sezenφ. Sezenφ
nep°φmo °φdφ n∞kterΘ zßmky nebo╗ °φdφ zdroje vΦetn∞ madel databßzφ a kurzor∙
tabulek. V jednom sezenφ m∙╛e b²t otev°eno vφce madel databßzφ; to nastßvß,
kdy╛ aplikace p°istupuje najednou k r∙zn²m databßzφm. Kdy╛ sezenφ je uzav°eno,
pak v╣echny zdroje p°i°azenΘ k sezenφ jsou uzav°eny a v╣echny zßmky vlastn∞nΘ
t∞mito zdroji jsou uvoln∞ny.
Sezenφ p°φmo vlastnφ zßmky tabulek a zßmky zßznam∙ zφskanΘ
aplikacφ po otev°enφ tabulky. To znamenß, ╛e pokud na jednΘ tabulce v sezenφ
je otev°eno vφce kurzor∙, pak jeden kurzor m∙╛e uvolnit zßmek zφskan² jin²m
kurzorem. Sezenφ je kompletn∞ izolovanΘ od ostatnφch sezenφ.
Vrstva madla databßze
O jeden krok nφ╛e v hierarchii uzamykßnφ BDE je vrstva madla
databßze. I kdy╛ ╛ßdnΘ zßmky nejsou vlastn∞ny madlem databßze, re╛im sdφlenφ
p°i°azen² k databßzi p°i jejφm otev°enφ urΦuje zda tabulky v databßzi mohou
b²t otevφrßny v²luΦn∞ nebo sdφlen∞. Pokud databßze je otev°ena ve v²luΦnΘm
re╛imu, pak v╣echny tabulky mohou b²t otev°eny pouze ve v²luΦnΘm re╛imu.
Kdy╛ databßze je uzav°ena, pak v╣echny zdroje alokovanΘ
na madlo databßze jsou uvoln∞ny, vΦetn∞ kurzor∙ tabulek a zßmk∙ tabulek
vlastn∞n²ch t∞mito kurzory.
Vrstva kurzoru tabulky
Dole v hierarchii uzamykßnφ BDE je vrstva kurzoru. Pouze
zßmky umφst∞nΘ na tabulce, kdy╛ je otev°ena funkcφ DbiOpenTable
jsou vlastn∞ny kurzorem. Kdy╛ tabulka je otev°ena ve v²luΦnΘm re╛imu, pak
k tabulce nemohou p°istupovat dal╣φ u╛ivatelΘ. Exklusivnφ zßmek zabra≥uje
ostatnφm u╛ivatel∙m v p°φstupu k tabulce a v umφst∞nφ n∞jakΘho zßmku na
nφ. Pokud tabulka je otev°ena ve sdφlenΘm re╛imu, pak ostatnφ kurzory mohou
p°istupovat k tabulce a mohou na nφ z°izovat Φtecφ nebo zßpisovΘ zßmky.
Kdy╛ je kurzor uzamΦen, pak v╣echny exklusivnφ zßmky
umφst∞nΘ na tabulce p°i jejφm otev°enφ jsou uvoln∞ny.
ZφskanΘ zßmky
V╣echny zßmky zφskanΘ po otev°enφ tabulky jsou vlastn∞nΘ
sezenφm (a ne kurzorem). Je n∞kolik typ∙ zφskan²ch zßmk∙:
-
ZφskanΘ zßmky tabulky
-
ZφskanΘ trvalΘ zßmky tabulky
-
ZßznamovΘ zßmky
K testovßnφ stavu zφskan²ch zßmk∙ tabulky pou╛ijeme DbiIsTableLocked.
Aplikace specifikuje typ zßmku (nezamΦen, Φtecφ zßmek nebo zßpisov² zßmek)
a funkce vracφ poΦet zßmk∙ tohoto typu umφst∞n²ch na tabulce.
Pro tabulky dBASE, FoxPro, Access a Paradox, k testovßnφ
zda tabulka je fyzicky sdφlena na sφti nebo lokßlnφm za°φzenφ a otev°ena
ve sdφlenΘm re╛imu, pou╛ijeme BbiIsTableShared. Pro tabulky SQL
tato funkce m∙╛e b²t pou╛ita k testovßnφ zda tabulka byla otev°ena ve sdφlenΘm
re╛imu.
Pokud aplikace pot°ebuje umφstit zßmek na tabulku, kterß
byla otev°ena ve sdφlenΘm re╛imu, pak volß funkci BDE DbiAcqTableLock.
Pokud zßmek nem∙╛e b²t zφskßn je vrßcena chyba. DbiAcqTableLock
m∙╛e umφstit na tabulku Φtecφ nebo zßpisov² zßmek.
Zßpisov² zßmek zabra≥uje ostatnφm u╛ivatel∙m v aktualizaci
tabulky. Na tabulce m∙╛e b²t umφst∞n pouze jeden zßpisov² zßmek. ╚tecφ
zßmek zabra≥uje v╣em v aktualizaci tabulky a zabra≥uje ostatnφm u╛ivatel∙m
v umφst∞nφ zßpisovΘho zßmku na tabulku (data v pr∙b∞hu Φtenφ nemohou b²t
zm∞n∞na). M∙╛e existovat vφce Φtecφch zßmk∙.
Pokud ovladaΦ nepodporuje Φtecφ zßmky, pak Φtecφ zßmky
jsou nahrazeny zßpisov²mi. Nap°. pro tabulky dBASE jsou Φtecφ zßmky nahrazeny
zßpisov²mi. Pro tabulky SQL, zßpisovΘ zßmky jsou stejnΘ jako Φtecφ a chovßnφ
se m∙╛e li╣it v zßvislosti na serveru. Tabulka m∙╛e zφskat vφce ne╛ jeden
zßmek.
K uvoln∞nφ zßmku tabulkovΘ ·rovn∞ umφst∞n²m DbiAcqTableLock
volßme DbiRelTableLock. Ka╛d² zφskan² zßmek vy╛aduje uvoln∞nφ samostatn²m
volßnφm DbiRelTableLock.
Trval² zßmek m∙╛e b²t umφst∞n p°ed vytvß°enφm tabulky.
Pro tabulky Paradoxu tato slu╛ba m∙╛e b²t pou╛ita k rezervovßnφ jmΘna tabulky
pro budoucφ pou╛itφ. Pro tabulky SQL, BDE si pamatuje, ╛e zßmek byl umφst∞n
a kdy╛ tabulka je vytvß°ena b∞hem p°ipojenφ, pak tabulka je uzamΦena. Tyto
zßmky jsou zφskßvßny funkcφ DbiAcqPersistTableLock. Pro uvoln∞nφ
trval²ch zφskan²ch zßmk∙ tabulky pou╛ijeme DbiRelPersistTableLock.
Aplikace m∙╛e p°id∞lovat zßznamovΘ zßmky b∞hem zφskßvßnφ
zßznam∙. V∞t╣ina funkcφ BDE, kterΘ umo╛≥ujφ zφskßvat zßznam poskytujφ uzavφracφ
volbu; nap°.
DbiGetNextRecord,
DbiGetPriorRecord a DbiGetRelativeRecord.
Parametr eLock m∙╛e b²t pou╛it ke specifikaci n∞kterΘho z nßsledujφcφch
zßznamov²ch zßmk∙:
Nastavenφ |
Popis |
dbiNOLOCK |
Bez zßmku, umo╛≥uje ostatnφm u╛ivatel∙m Φφst, aktualizovat
a uzamykat zßznam. |
dbiREADLOCK |
Zm∞n∞no na zßpisov² zßmek. |
dbiWRITELOCK |
Umo╛≥uje ostatnφm u╛ivatel∙m Φφst zßznam, ale zabra≥uje
v aktualizaci zßznamu nebo v umφst∞nφ zßmku na zßznam. |
Sprßvce uzamykßnφ Paradoxu a dBASE nahrazuje Φtecφ zßmky
zßpisov²mi zßmky; tedy zßznam je nebo nenφ uzamΦen.
Proto╛e n∞kterΘ funkce zφskßvßnφ zßznam∙ BDE provßd∞jφ
jinΘ operace ne╛ uzamykßnφ, po°adφ ve kterΘm tyto operace se vyskytnou,
m∙╛e b²t d∙le╛itΘ:
-
Nejprve nastßvß p°esun kurzoru.
-
OvladaΦe Paradoxu a dBASE se pokusφ uzamknout zßznam p°ed
pln∞nφm vyrovnßvacφ pam∞ti zßznamu.
-
OvladaΦe SQL plnφ vyrovnßvacφ pam∞╗ zßznamu klienta a pak
se pokusφ uzamknout zßznam.
P°esun kurzoru nastßvß i kdy╛ uzamΦenφ je ne·sp∞╣nΘ. Nap°.
pokud DbiGetNextRecord je volßn se Φtecφm zßmkem, pak kurzor se
p°esune na nßsledujφcφ zßznam, zßznam je pak uzamΦen. Kdy╛ ale zßznam je
ji╛ ale uzamΦen jin²m u╛ivatelem, pak pokus o uzamΦenφ je ne·sp∞╣nΘ, ale
kurzor mß zm∞n∞nou pozici.
K testovßnφ stavu uzamΦenφ zßznamu pou╛ijeme DbiIsRecordLocked.
Tato funkce vracφ stav uzamΦenφ souΦasnΘho zßznamu (uzamΦen nebo neuzamΦen).
Aplikace m∙╛e volat funkci DbiRelRecordLock k
uvoln∞nφ zßznamovΘho zßmku na souΦasnΘm zßznamu nebo uvoln∞nφ v╣ech zßznamov²ch
zßmk∙ zφskan²ch v souΦasnΘm sezenφ. Dßle DbiModifyRecord poskytuje
volbu k uvoln∞nφ zßmku pro dokonΦenφ operace.
Koexistence zßmk∙ tabulky
Ka╛d² typ zßmku tabulkovΘ ·rovn∞ umφst∞n² na tabulku ovliv≥uje
n∞jak² stupe≥ p°φstupu ostatnφch u╛ivatel∙ k tabulce. M∙╛eme pou╛φt zßmek
agresivn∞ k zabrßn∞nφ ostatnφm u╛ivatel∙m v p°φstupu k tabulce, nebo pou╛φt
zßmek defensivn∞ k zabrßn∞nφ ostatnφm u╛ivatel∙m umis╗ovat zßmky omezujφcφ
na╣i aplikaci p°istupovat k tabulce. Nßsledujφcφ tabulka zobrazuje v²sledek
pokusu u╛ivatele 2 umφstit tabulkov² zßmek po ·sp∞╣nΘm umφst∞nφ zßmku u╛ivatelem
1.
|
U╛ivatel 2 |
|
|
|
|
Pokus o otev°enφ tabulky ve v²luΦnΘm re╛imu. |
Pokus o zφskßnφ zßznamovΘho zßmku |
Pokus o zφskßnφ Φtecφho zßmku |
Pokus o otev°enφ tabulky ve sdφlenΘm re╛imu. |
U╛ivatel 1
Pokus o otev°enφ tabulky ve v²luΦnΘm re╛imu. |
ne·sp∞ch |
ne·sp∞ch |
ne·sp∞ch |
ne·sp∞ch |
Pokus o zφskßnφ zßznamovΘho zßmku |
ne·sp∞ch |
ne·sp∞ch |
ne·sp∞ch |
·sp∞ch |
Pokus o zφskßnφ Φtecφho zßmku |
ne·sp∞ch |
ne·sp∞ch |
·sp∞ch pro Paradox, ne·sp∞ch pro dBASE nebo FoxPro |
·sp∞ch |
Pokus o otev°enφ tabulky ve sdφlenΘm re╛imu. |
ne·sp∞ch |
·sp∞ch |
·sp∞ch |
·sp∞ch |
Strategie uzamykßnφ
P°i volb∞ uzamykajφ strategie se musφme zab²vat jak aplikace
pot°ebuje chrßnit data p°ed ostatnφmi u╛ivateli a jak data jsou chrßn∞na
ostatnφmi u╛ivateli. Ka╛d² zp°φstup≥ovan² systΘm databßze m∙╛e mφt takΘ
r∙znß pravidla pou╛φvanß sprßvcem uzamykßnφ. SQL pou╛φvß jinß pravidla
ne╛ Paradox a dBASE.
Specifikace SQL chovßnφ uzamykßnφ
V dBASE, Paradoxu, FoxPro a Access zßznamovΘ zßmky zabra≥ujφ
jin²m u╛ivatel∙m aktualizovat zßznam. SQL ale pracuje se zßznamov²mi zßmky
jin²m zp∙sobem. Pokud zßznam v tabulce SQL nenφ v zßznamovΘ cache, pak
zßznam je zφskßvßn ze serveru. Klient mß lokßlnφ kopii zßznamu, ale tato
kopie nemusφ b²t aktußlnφ, kdy╛ jin² klient zφskß stejn² zßznam ze serveru
a modifikuje nebo jej zru╣φ d°φve ne╛ prvnφ klient se pokusφ odeslat zm∞ny.
OvladaΦe SQL (a n∞kterΘ ODBC) pou╛φvajφ optimistickΘ
uzamykßnφ. Optimistick² zßmek umo╛≥uje aktualizaci uzamΦenΘho zßmku jin²m
u╛ivatelem, ale kdy╛ aplikace, kterß umφstila zßmek se pokusφ modifikovat
zßznam, pak BDE oznßmφ aplikaci ╛e zßznam byl zm∞n∞n a ╛e po╛adovanΘ operace
nem∙╛e b²t provedena proto╛e n∞kdo zm∞nil data. Aplikace pak zvolφ, zda
prozkoumß nov² zßznam a urΦφ zda svoji zm∞nu mß je╣t∞ provΘst.
Transakce
SystΘmy SQL pou╛φvajφ zpracovßnφ transakcφ s commit
a rollback kterΘ celou °adu operacφ v transakci ud∞lajφ trval²mi
nebo ji celou zru╣φ. Transakce mohou b²t provßd∞ny na v╣ech platformßch
SQL podporovan²ch BDE. Transakce je °ada programov²ch p°φkaz∙, kterΘ p°istupujφ
k dat∙m v na╣i databßzi. Kdy╛ transakce je dokonΦena, pak celou transakci
zapφ╣eme nebo zru╣φme. P°i zßpisu se v╣echny zm∞ny provedenΘ v transakci
stanou trval²mi.
V p°ipojenφ k SQL databßzi m∙╛e b²t aktivnφ pouze jedna
transakce. Jak²koliv pokus o spu╣t∞nφ dal╣φ transakce p°ed dokonΦenφm prvnφ
zp∙sobφ chybu.
Operace SQL v╛dy umis╗ujeme do kontextu transakce. Kdy╛
explicitnφ transakce nenastßvajφ, pak ovladaΦ SQL zpracovßvß transakce
serveru SQL transparentn∞ pro klienta. V╣echny ·sp∞╣nΘ modifikace dat serveru
SQL se bezprost°edn∞ stßvajφ trval²mi.
K zahßjenφ transakce se pou╛φvß funkce DbiBeginTran.
Po ·sp∞╣nΘm volßnφ DbiBeginTran se transakce stßvß aktivnφ. Aplikace
specifikuje ·rove≥ izolacφ pou╛itou pro transakci kdy╛ DbiBeginTran
je volßna. Mo╛nΘ hodnoty jsou:
-
xilDIRTYREAD: jsou Φteny zm∞ny, kterΘ nejsou trval²mi.
-
xilREADCOMMITTED: trvalΘ zm∞ny ostatnφch transakcφ
mohou b²t Φteny.
-
xilREPEATABLEREAD: zm∞ny ostatnφch transakcφ na p°edem
p°eΦtenß data nejsou viditelnΘ.
Schopnosti a chovßnφ izolacφ a mo╛nostφ opakovanΘho Φtenφ
zßvisφ na SQL serveru.
DbiEndTran konΦφ transakci. Aplikace specifikuje
typ konce transakce. Mo╛nΘ hodnoty jsou:
-
xendCOMMIT: Trval² zßpis transakce.
-
xendCOMMITKEEP: Pro n∞kterΘ ovladaΦe SQL, trval² zßpis
transakce a dr╛enφ kurzoru.
-
xendABORT: Zru╣enφ transakce.
Kurzory BDE mohou z∙stat aktivnφ i kdy╛ p°i°azenΘ kurzory
SQL jsou uzav°eny. BDE spravuje op∞tovnΘ otev°enφ kurzor∙ serveru SQL transparentn∞.
xendCommit a xendABORT dr╛φ kurzory, pokud
ovladaΦ a databßze podporujφ dr╛enφ kurzor∙. Pokud databßze nepodporuje
dr╛enφ kurzoru, pak existujφ Φty°i mo╛nosti pro ka╛d² otev°en² kurzor na
chovßnφ u╛ivatele BDE:
-
Kurzor pro otev°en² dotaz se zφskan²m v²sledkem je ulo╛en
lokßln∞. Je mo╛no Φφst data.
-
Kurzor otev°en² na tabulce podporujφcφ p°φmΘ umis╗ovßnφ je
uzav°en. Nenφ ovlivn∞no ╛ßdnΘ chovßnφ.
-
Kurzor otev°en² na tabulce, kterß nepodporuje p°φmΘ umis╗ovßnφ
je p∙vodn∞ otev°en v jinΘ transakci nebo kontextu p°ipojenφ (pokud to databßze
podporuje). Tento kurzor z∙stßvß otev°en proto╛e existuje v jinΘm kontextu
z po╛adovanΘ transakce.
-
Nenφ-li spln∞no nic z p°edchozφho, pak kurzor je uzav°en
a dal╣φ p°φstup k objekt∙m BDE p°i°azen²m ke kurzoru vracφ chybu.
Transakce na Paradoxu, dBASE, FoxPro a Access
Transakce pro ovladaΦe Paradoxu, dBASE, FoxPro a Access (lokßlnφ
transakce) umo╛≥ujφ zru╣it nebo zapsat zm∞ny do standardnφch tabulek. To
umo╛≥uje, aby aplikace provßd∞la aktualizace konzistentnφm zp∙sobem. Kdy╛
lokßlnφ transakce je spu╣t∞na na standardnφ databßzi, pak aktualizace provßd∞nΘ
nad tabulkami v tΘto databßzi jsou zaznamenßny. Ka╛d² zßznam obsahuje p∙vodnφ
obsah aktualizovanΘho zßznamu. Kdy╛ transakce je aktivnφ, pak aktualizovanΘ
zßznamy jsou uzamΦeny a tyto zßmky jsou dr╛eny dokud transakce nenφ ukonΦena:
-
Operacφ COMMIT (uvol≥uje v╣echny zßmky dr╛enΘ p°i aktivnφ
transakci).
-
Operacφ ROLLBACK (obnovuje p∙vodnφ stav zßznamu a potom uvol≥uje
zßmky).
Transakce a odlo╛enΘ aktualizace
Kdy╛ transakce jsou aktivnφ, pak aktualizace jsou bezprost°edn∞
zaslßny p°ipojen²m tabulkßm. Chyby jsou bezprost°edn∞ oznamovßny klient∙m.
Proto╛e aktualizace jsou bezprost°edn∞ zasφlßny p°ipojen²m tabulkßm, pak
aktualizace jsou viditelnΘ ostatnφmi transakcemi. A proto╛e ka╛d² modifikovan²
zßznam je uzamΦen, ostatnφ u╛ivatelΘ jej nemohou zm∞nit.
Toto chovßnφ se li╣φ od chovßnφ odlo╛en²ch aktualizacφ,
kdy aktualizace nejsou zasφlßny do p°ipojen²ch tabulek dokud nenastane
Φas zßpisu. Tedy chyby nejsou oznamovßny dokud nenastane Φas zßpisu. Zßmky
jsou dr╛eny pouze v pr∙b∞hu zßpisu. Pokud v pr∙b∞hu zßpisu vznikne chyba,
pak klient m∙╛e zru╣it proces zßpisu. Pokud klient zru╣φ proces zßpisu,
pak je obnoven p∙vodnφ stav tabulek.
Hlavnφ v²hodou slu╛by odlo╛en²ch aktualizacφ je to, ╛e
zßmky jsou dr╛eny pouze v pr∙b∞hu zßpisu, a tedy nenφ omezovßn p°φstupov²
Φas serveru SQL pro ostatnφ transakce, ale umo╛≥ujφ jin²m u╛ivatel∙m m∞nit
data. V²hody a nev²hody jsou shrnuty v nßsledujφcφ tabulce.
|
V²hody |
Nev²hody |
Transakce |
Aktualizace jsou bezprost°edn∞ zasφlßny tabulkßm. ModifikovanΘ
zßznamy jsou viditelnΘ ostatnφmi u╛ivateli. ModifikovanΘ zßznamy jsou uzamΦeny.
Chyby jsou oznamovßny okam╛it∞. |
UzamΦenφ pro ostatnφ u╛ivatele, dokud zßznam je modifikovßn.
Lokßlnφ transakce majφ omezenφ maximßlnφho poΦtu uzamΦen²ch zßznam∙. |
Odlo╛enΘ aktualizace |
Zßmky jsou dr╛eny pouze v pr∙b∞hu zßpisu (neomezuje v
p°φstupu ostatnφ transakce). Odlo╛enΘ aktualizace mohou b²t pou╛ity s libovoln²m
kurzorem v tabulce. Nep°ekraΦujeme omezenφ poΦtu zßmk∙ pro lokßlnφ transakce. |
Umo╛≥uje ostatnφm u╛ivatel∙m modifikaci zßznam∙. Pokud
chyba vznikne v pr∙b∞hu zßpisu, a vrßtφme tabulku do p∙vodnφho stavu, pak
v╣echny modifikace jsou ztraceny. |
Stupn∞ izolace transakcφ
Stupe≥ izolace poskytnut² transakcemi na standardnφch databßzφch
je stupe≥ 0. To znamenß, ╛e transakce nep°episuje neΦistß data jinΘ transakce.
Proto╛e je podporovßn pouze stupe≥ izolace 0, transakce na standardnφch
databßzφch jsou subjektem nßsledujφcφch omezenφ:
-
Mo╛nΘ ztrßty aktualizacφ - Dv∞ transakce provßd∞jφcφ
Φtenφ bez uzamykßnφ zßznam∙, tj. pou╛itφm protokolu dbiNOLOCK. Jestli╛e
tyto dv∞ transakce odesφlajφ svΘ aktualizace bezprost°edn∞, koneΦn² v²sledek
zahrnuje pouze zm∞ny jednΘ transakce a ztrßtu aktualizacφ druhΘ transakce.
-
Transakce neizoluje od neΦistΘho Φtenφ - Transakce
T1 m∙╛e Φφst zßznam p°edem aktualizovan² jinou transakcφ T2 a modifikuje
tento zßznam. ╚tenφ zßznamu T1 m∙╛e b²t nekonzistentnφ, proto╛e nenφ nakonec
aktualizovan² T2. Tedy Φtenφ transakce T1 je neΦistΘ Φtenφ.
-
Nechrßnφ p°ed neopakovateln²m Φtenφm - Transakce T1
Φte zßznam dvakrßt, jednou p°edtφm ne╛ transakce T2 zßznam aktualizuje
a podruhΘ po trvalΘm zßpisu aktualizacφ T2. Dv∞ operace Φtenφ vracφ r∙znΘ
hodnoty zßznamu a prvnφ Φtenφ nenφ opakovatelnΘ.
Pou╛itφm p°φslu╣nΘho uzamykacφho mechanismu v pr∙b∞hu aktualizacφ,
klient m∙╛e poskytnout vy╣╣φ stupe≥ izolace transakcφ. Nap°. ztracenΘ aktualizace
mohou b²t zachrßn∞ny pokud transakce v╛dy zφskßvajφ Φtecφ zßmky na modifikovanΘ
zßznamy. Funkce dbiBeginTran podporuje n∞kolik ·rovnφ izolacφ transakcφ:
xilDIRTYREAD,
xilREADCOMMITTED
a xilREPEATABLEREAD.
Pro tabulky SQL, p°φslu╣nΘ ·rovn∞ izolacφ transakcφ,
mohou b²t po╛adovßny dople mo╛nostφ serveru SQL. ┌rove≥ izolace xilREADCOMMITTED
zachra≥uje ztrßtu aktualizacφ a neΦistΘmu Φtenφ. ┌rove≥ izolacφ xilREPEATABLEREAD
zabra≥uje neopakovatelnΘmu Φtenφ.
Proto╛e v╣echny aktualizace jsou atomickΘ, u╛ivatelΘ
budou informovßni o konfliktech uzamykßnφ bezprost°edn∞. Detekce uvßznutφ
nenφ provßd∞na. Uvßznutφ nastane, kdy╛ dv∞ transakce Φekajφ na zßmky dr╛enΘ
navzßjem. Pokud je libovoln² konflikt uzamykßnφ mezi r∙zn²mi transakcemi,
pak klientovi je vrßcena chybovß zprßva. Kdy╛ uvßznutφ nastane, pak klient
m∙╛e rozhodnout o zru╣enφ transakce.
Pou╛itφ transakcφ
BDE poskytuje dv∞ API funkce: DbiBeginTran (zahßjenφ
transakce) a DbiEndTran (ukonΦenφ transakce):
DBIResult DBIFN DbiBeginTran ( // Zahßjenφ
transakce
hDBIDb
hDb, // Madlo databßze
eXILType
eXIL, // ┌rove≥ izolace transakcφ
phDBIXact
phXact // Vraceno. Madlo Xact
);
DBIResult DBIFN DbiEndTran (
// Konec transakce
hDBIDb
hDb, // Madlo databßze
hDBIXact
hXact, // Madlo Xact
eXEnd
eEnd // Typ ukonΦenφ transakce
);
typedef enum
// ┌rovn∞ izolace transakcφ
{
xilDIRTYREAD,
// ╚tenφ netrval²ch zm∞n
xilREADCOMMITTED,
// TrvalΘ zm∞ny, bez zjevovßnφ
xilREPEATABLEREAD
// Plnß opakovatelnost Φtenφ
} eXILType;
typedef enum
// Konec °φzenφ transakce
{
xendCOMMIT,
// Trval² zßpis transakce
xendCOMMITKEEP,
// Trval² zßpis transakce, dr╛enφ kurzor∙
xendABORT
// Zru╣enφ transakce
} eXEnd;
Nßsledujφcφ v²sledky nastanou kdy╛ jsou aktivnφ transakce:
-
Pokud jsou aktivnφ transakce v sezenφ, pak DbiCloseSession
uzavφrß toto sezenφ a jeho aktivnφ transakce jsou zru╣eny. Podobn∞ DbiExit
ru╣φ aktivnφ transakce v systΘmu.
-
V p°φpad∞ standardnφch databßzφ (lokßlnφ transakce), DbiModifyRecord,
DbiInsertRecord
a DbiDeleteRecord jsou pou╛φvßny k provßd∞nφ zßznamu transakcφ.
Denφk je udr╛ovßn, pokud transakce je aktivnφ. Je zru╣en po trvalΘm zßpisu
nebo zru╣enφ transakce.
Dotazovßnφ databßzφ
API BDE umo╛≥uje, aby klient pou╛φval SQL nebo QBE pro p°φstup
k tabulkßm dBASE, FoxPro, Access a Paradoxu stejn∞ jako k SQL tabulkßm.
Skupina funkcφ rozhranφ dotazu BDE je poskytnuta pro
p°edßvßnφ dotaz∙ SQL nebo QBE na serverovΘ i na PC zalo╛enΘ zdroje.
Dotazovßnφ Paradoxu, dBASE, FoxPro a Access
SpoleΦn² modul dotaz∙ umo╛≥uje v²vojß°∙m BDE aplikacφ p°istupovat
k tabulkßm ve standardnφch databßzφch pomocφ jazyk∙ SQL nebo QBE. Ve standardnφch
databßzφch jsou podporovßny dv∞ kategorie p°φkaz∙ SQL (Lokßlnφho SQL):
-
Jazyk definice dat (DDL)
-
Jazyk manipulace dat (DML)
Kdy╛ zapisujeme p°φkazy SQL pro pou╛itφ na tabulkßch dBASE,
FoxPro, Access a Paradoxu je nutno dodr╛ovat nßsledujφcφ pojmenovacφ konvence:
JmΘna tabulek, kterΘ obsahujφ teΦku musφ b²t uvedeny
v uvozovkßch nebo apostrofech. Nap°.
select * from 'c:\sample.dat\table'
select * from "table.dbf"
JmΘna tabulek mohou obsahovat p°ezdφvky stylu BDE. Nap°.
select * from ":data:table"
JmΘna, kterß jsou klφΦov²mi slovy musφ b²t uvedeny v
uvozovkßch. Nap°.
select passid from "password"
JmΘna, kterß obsahujφ mezeru musφ b²t uvedeny v uvozovkßch.
Nap°.
select * from "old table"
JmΘna polo╛ek, kterΘ majφ mezeru musφ b²t zapsßny v uvozovkßch.
Nap°.
select e."Emp Id" from Employee e
JmΘna polo╛ek, kterß jsou klφΦov²mi slovy musφ b²t v
uvozovkßch. Nap°.
select t."date" from Table t
JmΘna tabulek zapsanß v uvozovkßch musφ pou╛φvat korelaΦnφ
jmΘna.
V DML jsou podporovßny nßsledujφcφ klauzule: SELECT,
WHERE,
ORDER
BY, GROUP BY, UNION a HAVING a je mo╛no pou╛φvat
nßsledujφcφ agregaΦnφ funkce: SUM, AVG,
MIN,
MAX
a COUNT. Typ polo╛ky vracen² agregaΦnφmi funkcemi je
DOUBLE.
Jsou podporovßny nßsledujφcφ operßtory: +, -, *, /, =, <, >, <>,
<=, >=, NOT. Operace UPDATE,
INSERT a
DELETE
jsou pln∞ podporovßny na ·rovni vstupu SQL 92. Nap°.
DELETE FROM "Current Cust.db" C
WHERE C."CustID" IN
(SELECT O."CustID"
FROM "Old Cust.db" O)
Dßle je podporovßno:
-
Poddotazy v klauzulφch SELECT, WHERE a HAVING.
Mimo skalßrnφch relaΦnφch operßtor∙ ( =, <, > ... ), jsou podporovßny
i IN,
ANY,
SOME,
ALL a EXISTS.
-
Jsou podporovßny agregaΦnφ v²razy. Nap°.
SUM( Field * 10 )
SUM( Field ) * 10
SUM( Field1 + Field2 )
-
Konstrukce typu SUM( MIN(Field) ) jsou podporovßny.
-
M∙╛eme omezit aktualizovatelnost libovolnΘho dotazu nastavenφm
vlastnosti
stmtCONSTRAINED na true p°ed provedenφm. P°i pokusu
o modifikaci nebo vlo╛enφ bude signalizovßna chyba.
Syntaxe DDL pro tabulky Paradoxu, dBASE, FoxPro a Access
je omezena na CREATE TABLE (nebo INDEX) a DROP TABLE
(nebo INDEX). Nap°.
create table parts ( part_no char(6), part_name
char(20) )
Nßsledujφcφ p°φklad ukazuje jak DDL SQL m∙╛e b²t provßd∞no
prost°ednictvφm BDE:
hDBICur hCur;
pBYTE szQuery = "create table 'c:\\example\\test.dbf'
"
"( fld1
int, fld2 date)";
rslt = DbiQExecDirect(hDb, langSQL, szQuery,
&hCur);
Dotazovßnφ r∙zn²ch databßzφ
Prost°ednictvφm rozhranφ BDE, v²vojß° aplikace m∙╛e pou╛φvat
SQL ke spojovßnφ tabulek v r∙zn²ch datov²ch zdrojφch. Nßsledujφcφ p°φkaz
SQL ukazuje spojenφ t°φ tabulek z r∙zn²ch platforem pomocφ p°ezdφvek:
select distinct c.cust_no, c.state, o.order_no,
i.price
from ':Local_alias:customer.db' c,
':IB_alias:order'
o,
':SYB_alias:lineitem'
i
where o.cust_no = c.cust_no and o.order_no
= i.order_no
P°φmΘ provßd∞nφ dotaz∙
Pro jednoduchΘ dotazy, kde nenφ nutnß specißlnφ p°φprava
pou╛ijeme DbiQExecDirec. Tato funkce bezprost°edn∞ p°ipravφ a provede
dotaz SQL nebo QBE a vracφ kurzor na v²sledkovou mno╛inu, pokud je generovßna.
Aplikace p°edßvß madlo databßze, specifikuje zda jazyk dotazu je SQL nebo
QBE a p°edßvß °et∞zec dotazu.
S jazykem dotazu SQL, pokud specifikovanΘ madlo databßze
ukazuje na serverovou databßzi, pak je oΦekßvßn p°irozen² dialekt serveru
SQL. Pokud madlo databßze referuje na standardnφ databßzi, pak p°φkaz SQL
je omezen na podporovanou podmno╛inu spoleΦn²m modulem dotazu.
Nßsledujφcφ p°φklad ukazuje jak dotaz SQL je provßd∞n
funkcφ DbiQExecDirect:
DBIResult rslt;
hDBICur hCur;
pBYTE szQuery =
"Select t.name, t.age "
"from EMPLOYEE t "
"where t.age > 30 "
"and t.salary > 1000000 ";
rslt = DbiQExecDirect(hDb, qrylangSQL, szQuery,
&hCur);
PostupnΘ provßd∞nφ dotaz∙
N∞kterΘ dotazy vy╛adujφ p°φkazovΘ madlo a vy╛adujφ postupnΘ
provßd∞nφ. P°φkazovΘ madlo je vy╛adovßno pokud aplikace pot°ebuje °φdit
typ tabulky ve v²sledkovΘ mno╛in∞ nebo ke spojovßnφ s parametry pro dotazy.
Pro ka╛d² stav dotazu je pou╛φvßna samostatnß funkce:
-
K zφskßnφ novΘho p°φkazovΘho madla, volßme DbiQAlloc.
-
Ke zm∞n∞ vlastnostφ v p°φkazovΘm madlu volßme DbiSetProp.
Zde je takΘ mo╛no urΦit, zda chceme "╛ivou" v²sledkovou mno╛inu, tj. modifikovatelnou.
-
Pro p°φpravu dotazu volßme DbiQPrepare.
-
Pro provedenφ p°ipravenΘho dotazu volßme DbiQExec.
-
Pro uvoln∞nφ zdroj∙ spojen²ch s dotazem volßme DbiQFree.
Funkce DbiQAlloc alokuje p°φkazovΘ madlo vy╛adovanΘ
funkcemi p°φpravy dotazu. Specifikujeme madlo databßze a jazyk dotazu a
je vrßceno p°φkazovΘ madlo. DbiQAlloc je nezbytn²m prvnφm krokem
ve v╣ech p°ipravovan²ch dotazech.
DbiSetProp je pou╛ita k nastavenφ vlastnostφ objektu
na specifikovanΘ hodnoty. V tomto p°φpad∞ objekt je p°φkazovΘ madlo vrßcenΘ
DbiQAlloc.
NastavovanΘ vlastnosti mohou b²t typ v²sledkovΘ tabulky, stupe≥ ╛ivosti
nebo re╛im dotazu pro spojovßnφ parametr∙. Nßsledujφcφ p°φklady ukazujφ
jak nastavovat tyto vlastnosti:
DbiSetProp(hStmt, stmtANSTYPE, (UINT32) szPARADOX);
DbiSetProp(hStmt, stmtLIVENESS, (UINT32)
wantLIVE);
Funkce DbiQPrepare je pou╛ita pro p°φpravu dotazu
pro nßsledujφcφ provßd∞nφ. Akceptuje madlo p°φkazu obsahujφcφ p°ipravovan²
dotaz.
P°edchßzejφcφ p°φklad ukazuje jak m∙╛eme specifikovat
na╣e preference pro ╛ivou nebo zru╣itelnou v²sledkovou mno╛inu v pr∙b∞hu
provßd∞nφ dotazu. Zru╣itelnß v²sledkovß mno╛ina se podobß kopii p∙vodnφch
dat vybran²ch dotazem. «ivß v²sledkovß mno╛ina je pohledem na p∙vodnφ data
a pokud ╛ivou v²sledkovou mno╛inu modifikujeme, pak zm∞ny se projevφ na
p∙vodnφch datech.
Kdy╛ specifikujeme na╣e preference na ╛ivou v²sledkovou
mno╛inu, pak Sprßvce dotazu se pokusφ nßm poskytnou ╛ivou v²sledkovou mno╛inu.
N∞kdy to ale nenφ mo╛nΘ. Po provedenφ dotazu a nßvratu v²sledkovΘ mno╛iny
m∙╛eme zjistit, zda se jednß o ╛ivou mno╛inu prozkoumßnφm vlastnosti bTempTable
kurzoru. Je-li tato vlastnost false, pak se jednß o ╛ivou v²sledkovou
mno╛inu.
Dotazy SQL na servery SQL vracejφ chybu, pokud v²sledek
nem∙╛e b²t ╛iv². bTempTable je p°φpustnß pro lokßlnφ dotazy.
Mo╛nΘ hodnoty pro ╛ivotnost jsou:
Hodnota |
Popis |
wantCANNED |
Zru╣itelnß v²sledkovß mno╛ina |
wantLIVE |
«ivß v²sledkovß mno╛ina |
wantSPEED |
Rozhoduje Sprßvce dotazu (na zßklad∞ rychlej╣φ metody) |
wantDEFAULT |
StejnΘ jako wantCANNED |
DbiQExec provßdφ p°edem p°ipraven² dotaz identifikovan²
p°edan²m p°φkazov²m madlem a vracφ kurzor na v²sledkovou mno╛inu (je-li
generovßna). Pro v╣echny dotazy (lokßlnφ i vzdßlenΘ) p°ipraven² dotaz m∙╛e
b²t proveden n∞kolikrßt, ale pouze kdy╛ nevy°φzenΘ v²sledky byly p°eΦteny
nebo zru╣eny (pomocφ DbiCloseCursor).
Funkce DbiQFree je v╛dy pou╛ita jako poslednφ
krok v provßd∞nφ p°ipravovan²ch dotaz∙ k uvoln∞nφ v╣ech systΘmov²ch zdroj∙
alokovan²ch v pr∙b∞hu a pou╛itφ dotazu.
Zφskßvßnφ a nastavovßnφ vlastnostφ
Ka╛d² objekt BDE je definovßn mno╛inou vlastnostφ. Vlastnosti
definujφcφ objekt zßvisφ na typu objektu. Nap°. session je objekt
BDE a jeho vlastnosti zahrnujφ sesMAXPROPS, sesSESSIONNAME
a sesCFGMODE2. Ka╛d² typ objektu mß svΘ vlastnφ vlastnosti. Hodnoty
jsou p°i vytvß°enφ objektu p°i°azeny k vlastnostem. Nap°. jmΘno tabulky
je p°i°azeno vlastnosti curTABLENAME objektu kurzoru, kdy╛ tabulka
je otev°ena pomocφ DbiOpenTable.
Hodnoty n∞kter²ch vlastnostφ mohou b²t zm∞n∞ny funkcφ
DbiSetProp.
K nastavenφ vlastnosti, aplikace p°edßvß madlo objektu, jmΘno m∞n∞nΘ vlastnosti
a novou hodnotu vlastnosti. K zφskßnφ souΦasnΘ hodnoty vlastnosti pou╛ijeme
DbiGetProp.
K zφskßnφ madla objektu pou╛ijeme DbiGetObjFromName. K zφskßnφ madla
databßze kurzoru pou╛ijeme
DbiGetObjFromObj.
Nßsledujφcφ p°φklad ukazuje metody pro zφskßvßnφ jmΘna/typu
tabulky, kdy╛ v╣e co je dostupnΘ je kurzor tabulky.
UINT16 iLen;
DBITBLNAME tblName;
DBINAME tblType,
dbName;
// Kurzor tabulky umo╛≥uje p°istup ke jmΘnu
a typu tabulky
DbiGetProp(hCursor, curTABLENAME, (pVOID)
tblName,
sizeof(tblName), &iLen);
DbiGetProp(hCursor, curTABLETYPE, (pVOID)
tblType,
sizeof(tblType), &iLen);
// M∙╛eme takΘ p°istupovat k vlastnostem
databßze (jako je
// jmΘno databßze p°i°azenΘ ke kurzoru).
DbiGetProp(hCursor, dbDATABASENAME, (pVOID)
dbName,
sizeof(dbName), &iLen);
Vlastnosti objekt∙
Ka╛d² objekt je definovßn svoji vlastnφ mno╛inou vlastnostφ
jak je uvedeno v nßsledujφcφ tabulce. Ne v╣echny ovladaΦe podporujφ v╣echny
vlastnosti.
Vlastnost
|
System
|
Session
|
Database
|
Driver
|
Cursor
|
Statement
|
sysMAXPROPS |
x
|
x
|
x
|
x
|
x
|
x
|
sysLOWMEMUSAGE |
x
|
x
|
x
|
x
|
x
|
x
|
sesMAXPROPS |
|
x
|
x
|
|
x
|
x
|
sesSESSIONNAME |
|
x
|
x
|
|
x
|
x
|
sesNETFILE |
|
x
|
x
|
|
x
|
x
|
sesCFGNAME |
|
x
|
x
|
|
x
|
x
|
sesCFGUPDATE |
|
x
|
x
|
|
x
|
x
|
sesCFGMODE2 |
|
x
|
x
|
|
x
|
x
|
dbBATCHCOUNT |
|
|
x
|
|
|
|
dbBLOBCOUNT |
|
|
x
|
|
|
|
dbBLOBSIZE |
|
|
x
|
|
|
|
dbMAXPROPS |
|
|
x
|
|
x
|
x
|
dbDATABASENAME |
|
|
x
|
|
x
|
x
|
dbDATABASETYPE |
|
|
x
|
|
x
|
x
|
dbASYNCSUPPORT |
|
|
x
|
|
|
|
dbPROCEDURES |
|
|
x
|
|
|
|
dbDEFAULTTXNISO |
|
|
x
|
|
|
|
dbNATIVEHNDL |
|
|
x
|
|
|
|
dbNATIVEPASSTHRUHNDL |
|
|
|
x
|
|
|
dbUSESCHEMAFILE |
|
|
x
|
|
|
|
dbSERVERVERSION |
|
|
x
|
|
x
|
|
dbTRACEMODE |
|
|
|
|
|
|
drvMAXPROPS |
|
|
x
|
x
|
x
|
|
drvDRIVERTYPE |
|
|
|
x
|
x
|
|
drvDRIVERVERSION |
|
|
|
x
|
x
|
|
cfgREFRESH |
x
|
x
|
|
|
|
|
curGETEXTENDEDINFO |
|
|
|
|
x
|
|
curMAXPROPS |
|
|
|
|
x
|
|
curMAXROWS |
|
|
x
|
x
|
x
|
|
curTABLENAME |
|
|
|
|
x
|
|
curTABLETYPE |
|
|
|
|
x
|
|
curTABLELEVEL |
|
|
|
|
x
|
|
curFILENAME |
|
|
|
|
x
|
|
curXLTMODE |
|
|
|
|
x
|
|
curSEQREADON |
|
|
|
|
x
|
|
curONEPASSON |
|
|
|
|
x
|
|
curUPDATETS |
|
|
|
|
x
|
|
curSOFTDELETEON |
|
|
|
|
x
|
|
curLANGDRVNAME |
|
|
|
|
x
|
|
curPDXMAXPROPS |
|
|
|
|
x
|
|
curDBMAXPROPS |
|
|
|
|
x
|
|
curINEXACTON |
|
|
|
|
x
|
|
curNATIVEHNDL |
|
|
|
|
x
|
|
curUPDLOCKMODE |
|
|
|
|
x
|
|
stmtMAXPROPS |
|
|
|
|
|
x
|
stmtPARAMCOUNT |
|
|
|
|
|
x
|
stmtUNIDIRECTIONAL |
|
|
|
|
|
x
|
stmtANSTYPE |
|
|
|
|
|
x
|
stmtLIVENESS |
|
|
|
|
|
x
|
stmtQRYMODE |
|
|
|
|
|
x
|
stmtBLANKS |
|
|
|
|
|
x
|
stmtDATEFORMAT |
|
|
|
|
|
x
|
stmtNUMBERFORMAT |
|
|
|
|
|
x
|
stmtAUXTBLS |
|
|
|
|
|
x
|
stmtTBLVECTOR |
|
|
|
|
|
x
|
stmtALLPROPS |
|
|
|
|
|
x
|
stmtALLPROPSSIZE |
|
|
|
|
|
x
|
stmtANSNAME |
|
|
|
|
|
x
|
stmtNATIVEHNDL |
|
|
|
|
|
x
|
stmtCURSORNAME |
|
|
|
|
|
x
|
stmtROWCOUNT |
|
|
|
|
|
x
|
stmtCONSTRAINED |
|
|
|
|
|
x
|
stmtFIELDDESCS |
|
|
|
|
|
x
|
stmtCURPROPS |
|
|
|
|
|
x
|
Zφskßvacφ schΘma a systΘmovΘ informace
N∞kterΘ funkce BDE vracejφ schΘma nebo systΘmovΘ informace.
N∞kterΘ funkce ve formßtu DbiOpenxxxList mohou b²t pou╛ity pro nßvrat
kurzoru pam∞╗ovΘ tabulky, jejφ╛ zßznamy obsahujφ po╛adovanΘ informace.
Ostatnφ funkce ve formßtu DbiGetxxxDescs vracejφ informace p°φmo
ve strukturßch popis∙ a polφch podporovan²ch aplikacφ.
-
Funkce DbiOpenList - vracejφ madlo kurzoru k tabulce
v pam∞ti obsahujφcφch po╛adovanΘ informace.
-
Funkce DbiGetDescs - vracejφ popisujφcφ informace
v p°edanΘ struktu°e.
Funkce BdiOpenList
Tato funkΦnφ volßnφ vracejφ madlo kurzoru na tabulku v pam∞ti
s po╛adovan²mi informacemi. Tento kurzor je urΦen pouze pro Φtenφ a aplikace
tedy nem∙╛e modifikovat po╛adovanΘ informace. Z tΘto tabulky informace
mohou b²t zφskßvßny normßlnφm zp∙sobem. Ka╛d² zßznam m∙╛e b²t Φten z p°eddefinovanΘ
struktury p°i°azenΘ k funkci. Tyto struktury jsou uvedeny v souboru IDAPI.H.
Seznam funkcφ |
Struktura virtußlnφ tabulky vracen²ch informacφ |
DbiOpenDatabaseList |
DBDesc |
DbiOpenDriverList |
Virtußlnφ tabulka obsahuje pouze jednu polo╛ku CHAR |
DbiOpenFamilyList |
FMLDesc |
DbiOpenFieldList |
FLDDesc |
DbiOpenFieldTypesList |
FLDType |
DbiOpenFileList |
FILEDesc |
DbiOpenFunctionArgList |
DBIFUNCArgDesc |
DbiOpenFunctionList |
DBIFUNCDesc |
DbiOpenIndexList |
IDXDesc |
DbiOpenIndexTypesList |
IDXType |
DbiOpenLdList |
LDDesc |
DbiOpenLockList |
LOCKDesc |
DbiOpenRintList |
RINTDesc |
DbiOpenSecurityList |
SECDesc |
DbiOpenTableList |
TBLBaseDesc, TBLExtDesc, TBLFullDesc |
DbiOpenTableTypesList |
TBLType |
DbiOpenUserList |
USERDesc |
DbiOpenVchkList |
VCHKDesc |
Nßsledujφcφ p°φklad ukazuje pou╛itφ statickΘ struktury
jako vyrovnßvacφ pam∞ti zßznam∙:
DBIResult rslt;
hDBICur hListCur;
IDXDesc idxDesc;
// Otev°enΘ schΘma tabulky obsahujφcφ jeden
zßznam pro ka╛d² index
// souΦasn∞ dostupn² v danΘ tabulce.
rslt = DbiOpenIndexList(hDb, "Sample", szPARADOX,
&hListCur);
if (rslt == DBIERR_NONE)
{
// Pou╛itφ cyklu k zφskßnφ v╣ech deskriptor∙
index∙
while (DbiGetNextRecord(hListCur,
dbiNOLOCK,
(pBYTE) &idxDesc, NULL) == DBIERR_NONE)
{
...
}
// Uzav°enφ seznamu index∙
DbiCloseCursor(&hListCur);
}
Funkce DbiGetDescs
Tyto funkce jsou volßny pro zφskßnφ popisujφcφch informacφ
v p°edanΘ struktu°e.
Seznam funkcφ |
Struktura virtußlnφ tabulky vracen²ch informacφ |
DbiGetDatabaseDesc |
Struktura DBDesc |
DbiGetDriverDesc |
Struktura DRVType |
DbiGetFieldDescs |
Pole struktur FLDDesc |
DbiGetFieldTypeDesc |
Struktura FLDType |
DbiGetIndexDesc |
Struktura IDXDesc |
DbiGetIndexDescs |
Pole struktur IDXDesc |
DbiGetIndexTypeDesc |
IDXType |
DbiGetTableTypeDesc |
Struktura TBLType |
DbiQGetBaseDescs |
Struktura STMTBaseDesc |
Nßsledujφcφ p°φklad ukazuje jak zφskat v╣echny deskriptory
index∙ v jednom funkΦnφm volßnφ.
DBIResult rslt;
hDBICur hCursor;
CURProps curProps;
pIDXDesc pIdxArray;
// Otev°enφ tabulky
rslt = DbiOpenTable(hDb, "Sample", szPARADOX,
NULL, NULL, 0,
dbiREADWRITE, dbiOPENSHARED,
xltFIELD,TRUE, NULL, &hCursor);
if (rslt == DBIERR_NONE)
{
// Zφskßnφ vlastnostφ pro kurzor
DbiGetCursorProps(hCursor, &curProps);
// Alokovßnφ vyrovnßvacφ pam∞ti pro
deskriptory index∙
pIdxArray = (pIDXDesc) malloc(sizeof(IDXDesc)*curProps.iIndexes);
// Zφskßnφ index∙
rslt = DbiGetIndexDescs(hCursor, pIdxArray);
if (rslt == DBIERR_NONE)
{
...
}
// ┌klid
free((pCHAR) pIdxArray);
DbiCloseCursor(&hCursor);
}
Vytvß°enφ tabulek
Aplikace m∙╛e vytvß°et trvalΘ tabulky pomocφ funkce BDE DbiCreateTable.
M∙╛e takΘ vytvß°et doΦasnΘ tabulky volßnφm DbiCreateTempTable a
tabulky v pam∞ti volßnφm DbiCreateMemTable.
TrvalΘ tabulky jsou pojmenovanΘ a jsou ulo╛enΘ na disk.
K vytvo°enφ trvalΘ tabulky, aplikace nejprve vytvo°φ pro ka╛dou polo╛ku
strukturu deskriptoru polo╛ky FLDDesc a pro ka╛d² index strukturu
deskriptoru indexu IDXDesc. Pro tabulky SQL a Paradoxu, aplikace
m∙╛e takΘ definovat strukturu deskriptoru pro ka╛dΘ testovßnφ p°φpustnosti
VCHKDesc,
strukturu deskriptoru pro ka╛dΘ testovßnφ referenΦnφ integrity
RINTDesc
a ka╛dΘ testovßnφ bezpeΦnosti SECDesc.
Dßle aplikace vytvß°φ strukturu deskriptoru tabulky CRTblDesc
definujφcφ obecnΘ atributy tabulky a p°ebφrajφcφ ukazatele na pole struktur
deskriptor∙ polo╛ek, index∙, p°φpustnostφ, referenΦnφ integrity a bezpeΦnosti
vytvo°enΘ d°φve. Nakonec aplikace volß DbiCreateTable a p°edßvß
ji strukturu CRTblDesc.
Kdy╛ vytvß°φme tabulku Paradoxu, dBASE, FoxPro nebo Access,
pak v poslednφch t°ech polo╛kßch struktury CRTblDesc mohou b²t obsa╛eny
volitelnΘ parametry zßvisejφcφm na ovladaΦi. K zφskßnφ seznamu a popisu
t∞chto voliteln²ch parametr∙ pro ovladaΦ, aplikace volß DbiOpenCfgInfoList,
p°edßnφm cesty vytvß°ecφch voleb ovladaΦe tabulky v konfiguraΦnφm souboru.
Tato funkce vracφ pam∞╗ovou tabulku s po╛adovan²mi informacemi.
DoΦasnΘ tabulky jsou zru╣eny p°i uzav°enφ kurzoru. Aplikace
m∙╛e vytvß°et doΦasnΘ tabulky stejn∞ jako vytvß°φ trvalΘ tabulky, pouze
mφsto volßnφ
DbiCreateTable je pou╛ito DbiCreateTempTable.
Pam∞╗ovΘ tabulky nemohou b²t uklßdßny jako trvalΘ tabulky.
Aplikace m∙╛e vytvo°it pam∞╗ovou tabulku volßnφm DbiCreateMemTable
a p°edßnφm pole struktur polo╛kov²ch deskriptor∙ FLDDesc. Jsou podporovßny
pouze logickΘ typy BDE.
Omezenφ integrity
Kdy╛ vytvß°φme tabulku pomocφ funkce BDE DbiCreateTable,
pak m∙╛eme pou╛φt omezenφ integrity k zaji╣t∞nφ aby odkazy v polo╛kßch
klφΦe v sekundßrnφ tabulce (ve stejnΘ databßzi) nebo cizφch tabulek (v
r∙zn²ch databßzφch) byly udr╛ovßny polo╛kami klφΦe v primßrnφ tabulce.
Nap°. pokud n∞kolik tabulek se odkazuje na primßrnφ klφΦ jinΘ tabulky,
pak musφ b²t zaji╣t∞no, aby zßznamy na kterΘ se odkazujeme nemohly b²t
zru╣eny.
Omezenφ integrity primßrnφch a cizφch klφΦ∙ nejsou implementovßna
ve v╣ech SQL serverech.
Podpora primßrnφho klφΦe:
-
UrΦφme, kterΘ polo╛ky nebo mno╛iny polo╛ek budou pracovat
jako primßrnφ klφΦ pro vytvß°enou tabulku. Pro tabulku dBASE, zvolφme index,
kter² bude pracovat jako primßrnφ klφΦ vytvß°enΘ tabulky.
-
Vlo╛φmu tuto informaci do struktury IDXDesc.
-
Nastavφme IDXDesc.bPrimary = TRUE;
-
P°ipojφme strukturu IDXDesc k ukazateli CRTBLDesc.pidxDesc.
Sloupce primßrnφho klφΦe musφ b²t NOT NULL, co╛ znamenß ╛e
VCHKDDesc
pro ka╛d² sloupec musφ b²t VCHKDesc.bRequired = TRUE. V²jimkou je
Paradox, kter² m∙╛e mφt jeden prßzdn² zßznam.
Tabulka m∙╛e mφt pouze jeden primßrnφ klφΦ.
Tabulka s omezenφm primßrnφho klφΦe (tabulkovß ·rove≥)
je vytvo°ena a je takΘ vytvo°en unikßtnφ index (vzestupn²) na t∞chto sloupcφch.
Pro dBASE m∙╛e b²t pou╛it i sestupn² index. Pro vzdßlenΘ databßze, tento
index m∙╛e b²t p°idßn nebo zru╣en pomocφ CREATE INDEX nebo DROP INDEX.
Podpora cizφho klφΦe:
-
UrΦφme kterΘ tabulky (jinΘ tabulky) se budou odkazovat na
vytvß°enou tabulku. Pokud to podporuje server, pak se m∙╛e jednat i o stejnou
tabulku.
-
UrΦφme, kterΘ sloupce tΘto tabulky ukazujφ na sloupce jin²ch
tabulek.
-
UrΦφme, co bude akce referenΦnφ integrity pro ru╣enφ. Pokud
je po╛adovßno kaskßdovitΘ ru╣enφ, pak nastavφme RINTDesc.eDelOp = rintCASCADE.
Je-li to podporovßno.
-
Vlo╛φme tyto informace do struktury RINTDesc.
-
P°ipojφme RINTDesc k ukazaleli CRTBLDesc.printDesc.
M∙╛e b²t vφce ne╛ jeden cizφ klφΦ v tabulce.
Poznßmka: N∞kterΘ servery, jako InterBase 4.0,
vytvß°ejφ indexy na sloupcφch cizφho klφΦe v tabulce.
Modifikovßnφ struktury tabulky
Po vytvo°enφ tabulky, ji aplikace m∙╛e modifikovat pomocφ
funkcφ BDE takto:
-
P°idßvat, ru╣it nebo regenerovat indexy.
-
Restrukturalizovat tabulku.
Aplikace m∙╛e p°idßvat index k tabulce volßnφm DbiAddIndex
a p°edßnφm struktury IDXDesc zapln∞nou p°φslu╣nou polo╛kou.
Aplikace m∙╛e zru╣it index volßnφm DbiDeleteIndex.
Aplikace m∙╛e tabulku specifikovat jmΘnem nebo na tabulce otev°φt kurzor.
Ru╣en² index nem∙╛e b²t aktivnφ.
Aplikace m∙╛e regenerovat indexy dBASE, FoxPro, Access
nebo Paradoxu volßnφm dvou funkcφ BDE. DbiRegenIndex regeneruje
jednoduchΘ indexy, zatφmco DbiRegenIndexes je zapot°ebφ pou╛φt k
regeneraci slo╛it²ch index∙. Aplikace specifikuje index jmΘnem.
SouΦasn∞ pouze pro tabulky Paradoxu, dBASE, FoxPro a
Access, aplikace m∙╛e volat DbiDoRestructure k modifikaci existujφcφch
typ∙ polo╛ek, p°idßvßnφ nov²ch polo╛ek, ru╣enφ polo╛ky, zm∞n∞ po°adφ polo╛ek,
zm∞n∞ index∙ nebo referenΦnφ integrity. Aplikace p°edßvß strukturu deskriptoru
tabulky
CRTblDesc.
Pou╛φvßnφ zp∞tnΘho volßnφ
N∞kdy aplikace pot°ebuje oznßmit specifick² typ udßlosti
modulu p°φstupu k databßzi pro dokonΦenφ operace nebo poskytnutφ informacφ
u╛ivateli. V²hodou pou╛itφ zp∞tnΘho volßnφ je, ╛e BDE m∙╛e zφskat reakci
u╛ivatele a to bez p°eru╣enφ normßlnφho b∞hu aplikace.
Ve funkcφch zp∞tnΘho volßnφ musφ b²t p°φsn∞ dodr╛eny
tato pravidla:
-
«ßdnΘ dal╣φ volßnφ nesmφ b²t provedeno uvnit° funkce zp∞tnΘho
volßnφ.
-
BDE je v pr∙b∞hu zp∞tnΘho volßnφ nerentrantnφ. Aplikace nesmφ
vyu╛φvat Windows ve zp∞tnΘm volßnφ. Nap°. pokud aplikace zobrazuje dialogovΘ
okno ve Windows, pak toto okno musφ b²t systΘmov∞ modßlnφ.
Aplikace m∙╛e volit oznamovßnφ z mnoha r∙zn²ch typ∙ udßlostφ,
v zßvislosti na registrovanΘm typu zp∞tnΘho volßnφ. Aplikace m∙╛e specifikovat
nßsledujφcφ typy zp∞tnΘho volßnφ pomocφ DbiRegisterCallback.
Zp∞tnΘ volßnφ |
Popis |
cbGENPROGRESS |
Informuje aplikaci o zpracovßvßnφ v pr∙b∞hu velkΘ dßvkovΘ
operace. |
cbRESTRUCTURE |
P°edßvß informace o probφhajφcφch akcφch a vy╛aduje reakci
od volajφcφho. |
cbBATCHRESULT |
V²sledek dßvkovΘho zpracovßni. |
cbTABLECHANGED |
Oznamuje u╛ivateli, ╛e tabulka byla zm∞n∞na. |
cbCANCELQRY |
Umo╛≥uje u╛ivateli zru╣it dotaz Sybase. |
cbINPUTREQ |
OvladaΦ BDE vy╛aduje vstup od u╛ivatele. |
cbDBASELOGIN |
Umo╛≥uje klientu p°φstup k zak≤dovan²m tabulkßm dBASE. |
cbFIELDRECALC |
Rekalkulace polo╛ek. |
cbDBLOGIN |
P°ihlß╣enφ k databßzi. |
cbDELAYEDUPD |
Zp∞tnΘ volßnφ odlo╛en²ch aktualizacφ. |
cbNBROFCBS |
PoΦet zp∞tn²ch volßnφ. |
cbTRACE |
Sledovßnφ. |
Deklarace funkcφ zp∞tnΘho volßnφ a p°i°azenΘ seznamy parametr∙,
nßvratovΘ typy funkcφ a typy dat zp∞tnΘho volßnφ jsou definovßny v hlaviΦkovΘm
souboru IDAPI.H, kter² je aplikaΦnφm rozhranφm k BDE.
Aplikace reaguje na zp∞tnΘ volßnφ nßvratov²m k≤dem, kter²
je p°φkazem k provedenφ p°φslu╣nΘ akce:
Nßvratov² k≤d |
Popis akce |
cbrUSEDEF |
Prove∩ implicitnφ akci. |
cbrCONTINUE |
PokraΦuj. |
cbrABORT |
Zru╣enφ operace. |
cbrCHKINPUT |
P°edßnφ vstupu. |
cbrYES |
Provedenφ po╛adovanΘ akce. |
cbrNO |
Neprovedenφ po╛adovanΘ akce. |
cbrPARTIALASSIST |
Asistence v kompletovßnφ prßce. |
P°edpoklßdejme, ╛e aplikace musφ p°ekopφrovat tabulku
s °ßdov∞ milionem zßznam∙ a ╛e chceme periodicky zobrazovat na obrazovce
informaci o pr∙b∞hu kopφrovßni. M∙╛eme postupovat takto:
-
Zapφ╣eme t∞lo zp∞tn∞ volanΘ funkce, deklarovanΘ s p°i°azen²m
p°eddefinovan²m seznamem parametr∙:
typedef CBRType far *pCBRType;
typedef CBRType (DBIFN * pfDBICallBack)
(
CBType
ecbType, // Typ zp∞tnΘho volßnφ
UINT32
iClientData, // Klientskß data zp∞tnΘho volßnφ
pVOID
pCbInfo // Zp∞tnΘ volßnφ informujφcφ
klienta
Input
);
-
Aplikace alokuje pam∞╗ pro vyrovnßvacφ pam∞╗ pCbBuf
pou╛itou k p°edßvßnφ dat ob∞ma sm∞ry mezi aplikacφ a funkcφ a ukazatel
na strukturu CBPROGRESSDesc.
typedef struct
{
INT16
iPercentDone; // Procento dokonΦenφ
DBIMSG
szMsg;
// Zprßva k zobrazenφ
} CBPROGRESSDesc;
typedef CBPROGRESSDesc far * pCBPROGRESSDesc;
-
K registraci zp∞tnΘho volßnφ aplikace volß DbiRegisterCallback
s p°edßnφm cbGENPROGRESS jako hodnotu pro ecbType.
-
Aplikace zajistφ volßnφ DbiBatchMove.
-
BDE vracφ procento dokonΦenφ (v parametru iPercentDone
struktury
CBPROGRESSDesc), nebo °et∞zec zprßvy k zobrazenφ na stavovΘm
°ßdku. Aplikace m∙╛e p°edpoklßdat, ╛e pokud hodnota iPercentDone
je zßpornß, pak °et∞zec zprßvy je p°φpustn²; jinak aplikace m∙╛e pou╛φt
hodnotu iPercentDone. Formßt °et∞zce zprßvy je <Text String><:><Value>,
co╛ usnad≥uje internacionalizaci aplikace. Nap°. Records copied: 250
-
K pokraΦovßnφ aplikace vracφ k≤d cbrUSEDEF. Aplikace
m∙╛e zru╣it zpracovßnφ nßvratem hodnoty cbrABORT.
NezßvislΘ datovΘ zdroje
M∙╛eme pou╛it tyto techniky k dosa╛enφ nezßvisl²ch datov²ch
zdroj∙:
-
Kvalifikovat jmΘna tabulek pomocφ p°ezdφvek definovan²ch
v konfiguraΦnφm souboru (nebo p°edßvßnφ pln∞ kvalifikovan²ch cest jmen).
-
Pou╛φvat pouze logickΘ datovΘ typy BDE.
-
Pou╛it obecnou podmno╛inu SQL podporovanou sdφlen²m modulem
dotazu.
Aplikace m∙╛e urΦovat, kterΘ p°ezdφvky jsou dostupnΘ volßnφm
BDE funkce
DbiOpenDatabaseList. Tato funkce uvßdφ seznam v╣ech p°ezdφvek
databßze z konfiguraΦnφho souboru.
Filtrovßnφ zßznam∙
Tato sekce je ·vodem k vytvß°enφ v²razovΘho stromu pou╛itΘho
v DbiAddFilter. V²razov² strom budeme pot°ebovat zapisovat pouze
tehdy, kdy╛ chceme efektivn∞ generovat vysoce omezen² pohled na data v
tabulce, kvalifikovanΘ vφce neindexovan²mi polo╛kami.
Filtr je mechanismus, kvalifikujφcφ data testovßnφm v╣ech
zßznam∙. Jako zßkladnφ p°φklad p°edpoklßdejme, ╛e chceme otev°φt tabulku
Customer,
ale zobrazit pouze ty zßkaznφky, kte°φ ╛ijφ v Kalifornii. Pro pou╛itφ filtru
je d∙le╛itΘ to, ╛e m∙╛eme zapsat aplikaci definujφcφ filtr pro otev°en²
kurzor na tabulce Customer, kde customer.state= CA. Kdy╛
filtr je aktivovßn, pak BDE zφskßvß pouze ty zßznamy, kterΘ spl≥ujφ podmφnku
a tak na╣e aplikace m∙╛e vid∞t a zpracovßvat pouze tyto zßznamy. Nap°.
kdy╛ na╣e aplikace volß DbiGetNextRecord, pak v╣echny zßznamy, kde
zßkaznφk ne╛ije v Kalifornii jsou p°eskoΦeny.
K definovßnφ filtru, aplikace volß DbiAddFilter
a p°edßvß madlo kurzoru a specifikujφcφ podmφnku filtru. Funkce vracφ madlo
filtru aplikaci. Parametr DbiAddFilter pcanExpr ukazuje na v²razov²
strom typu pBYTE. Aplikace m∙╛e pou╛φt v²razov² strom ke specifikaci
filtrovacφ podmφnky.
V²hodou pou╛φvßnφ v²razovΘho stromu k definovßnφ podmφnky
filtru je to, ╛e BDE jej m∙╛e pou╛φt k optimalizaci operacφ filtru. ┌rove≥
optimalizace zßvisφ na ·rovni podpory ovladaΦe pro rozklad v²razovΘho stromu.
Po definovßnφ filtru, filtr musφ b²t aktivovßn volßnφm
DbiActivateFilter.
Pou╛itφ v²razovΘho stromu
V²razov² strom je v²raz filtru typu pBYTE p°etypovan²
na pCANExpr. Je to t°φdφln² blok pam∞ti slo╛en² z:
-
HlaviΦky (Header) - struktura CANExpr definuje
velikost, poΦet uzl∙ a ofset.
-
Oblasti uzl∙ (Node Area) - ╪ada podmφn∞n²ch v∞tvφ
(operßtor a operand) ve strom∞, definujφcφ strom podmφnky filtru. Uzly
operandu ukazujφ umφst∞nφ ofsetu jmen polo╛ek nebo konstant ulo╛en²ch v
oblasti literßl∙.
-
Oblast literßl∙ (Literal Pool Area) - Pou╛itß k ulo╛enφ
jmen polo╛ek ukazujφcφch na ka╛d² polo╛kov² uzel a konstantnφ hodnoty ukazujφcφ
na ka╛d² konstantnφ uzel.
Pov╣imn∞te si, ╛e hlaviΦka obsahujφcφ strukturu CANExpr
je 10 slabik dlouhß, a tedy Oblast uzl∙ zaΦφnß s ofsetem 10:
Prvnφ uzel v Oblasti uzl∙ je canBinary specifikujφcφ
operand:
canExpr.iFirstNode = 10 (kde 10 je ofset
pro cel² v²razov² strom)
canExpr.iLiteralStart = 48 (kde 48 je ofset
pro cel² v²razov² strom)
canBinary.Operand1 = 12 (kde 12 je ofset
v Oblasti uzl∙)
canBinary.Operand2 = 24 (kde 24 je ofset
v Oblasti uzl∙)
canField.iNameOffset = 0 (kde 0 je ofset
v Oblasti literßl∙)
canConst.iOffset = strlen( <fieldName>
)+1 (kde hodnota konstanty je prßv∞ za jmΘnem
polo╛ky v Oblasti literßl∙)
P°φklad:
Normßln∞ pou╛φvßme strom v²raz∙ k zφskßnφ pohledu pomocφ
podmφnky stromu, kterß m∙╛e b²t znaΦn∞ slo╛itß. Pro srozumitelnost, v tomto
p°φklad∞, pou╛ijeme jednoduch² filtr, k zobrazenφ pouze t∞ch zßznam∙ kde
"CUST_NO>1500". Na╣φ ·lohou je vytvo°enφ stromu v²razu CUST_NO > 1500.00
k p°edßnφ DbiAddFilter. Nßsledujφcφ graf tento v²razov² strom popisuje:
Stejn² v²razov² strom je definovßn v C jako parametr
k p°edßnφ funkci
DbiAddFilter. Nßsledujφcφ p°φklad p°edpoklßdß,
╛e p°ekladaΦ alokuje souvisle deklarovanΘ prom∞nnΘ ve fyzickΘ souvislΘ
pam∞ti:
void Filter (void)
{
hDBIDb
hDb = 0;
// Madlo databßze.
hDBICur
hCur = 0; //
Madlo tabulky.
DBIResult
rslt;
// Hodnota vrßcenß z funkcφ IDAPI.
pBYTE
pcanExpr; // Struktura obsahujφcφ informace filtru.
hDBIFilter
hFilter;
// Madlo filtru.
UINT16
uSizeNodes; // Velikost
uzlu ve stromu.
UINT16
uSizeCanExpr; // Velikost informacφ
hlaviΦky.
UINT32
uSizeLiterals; // Velikost literßl∙.
UINT32
uTotalSize; // Celkovß
velikost v²razu filtru.
UINT32
uNumRecs = 10; // PoΦet zßznam∙ k zobrazenφ.
CANExpr
canExp;
// Obsah informacφ hlaviΦky.
struct {
CANBinary BinaryNode;
CANField FieldNode;
CANConst ConstantNode;
}
Nodes = {
// Uzly stromu filtru.
{
// Posunutφ 0
nodeBINARY,
// canBinary.nodeClass
canGT,
// canBinary.canOp
sizeof(Nodes.BinaryNode), // canBinary.iOperand1
sizeof(Nodes.BinaryNode) + sizeof(Nodes.FieldNode),
// canBinary.iOperand2
// Posunutφ v poli Nodes
},
{
// Posunutφ sizeof(Nodes.BinaryNode)
nodeFIELD,
// canField.nodeClass
canFIELD,
// canField.canOp
1,
// canField.iFieldNum
0,
// canField.iNameOffset: szField je
// literßl s posunutφm 0
},
{
// Posunutφ sizeof(Nodes.BinaryNode) + sizeof(Nodes.FieldNode)
nodeCONST,
// canConst.nodeClass
canCONST,
// canConst.canOp
fldFLOAT,
// canConst.iType
sizeof(fConst),
// canConst.iSize
8,
// canConst.iOffset: fconst je
// literal s posunutφm strlen(szField) + 1
}};
static const char szTblName[] = "cust";
// JmΘno tabulky
static const char szTblType[] = szDBASE;
// Typ tabulky
static const char szField[] =
"CUST_NO"; // JmΘno polo╛ky pro t°etφ uzel
static const DFLOAT fConst
= 1500.0; // Hodnota konstanty pro druh² uzel.
HlaviΦka v²razovΘho stromu definuje:
-
ZnaΦku verze v²razu
-
Velikost struktury stromu
-
PoΦet uzl∙ v oblasti uzl∙
-
Posunutφ umφst∞nφ prvnφho uzlu a zaΦßtku oblasti literßr∙
HlaviΦka mß tento tvar:
#define CANEXPRVERSION 2
typedef struct{
UINT16 iVer;
UINIT16 iTotalSize;
UINT16 iNodes;
UINT16 iNodeStart;
UINT16 iLiteralStart;
} CANExpr;
typedef CANExpr far *pCANExpr;
typedef pCANExpr far *ppCANExpr;
Oblast uzl∙ v²razovΘho stromu
Ka╛d² uzel formuje v∞tev stromu a definuje podmφnku.
Uzly mohou definovat operßtory nebo operandy. Operand uzlu uklßdß posunutφ
jmΘna polo╛ky nebo konstanty v oblasti literßr∙. Hodnoty jsou ulo╛enΘ v
oblasti literßl∙. Polo╛kov² uzel ukazuje na posunutφ umφst∞nφ jmΘna polo╛ky
obsahujφcφ literßl, tj. znakov² °et∞zec jmΘna polo╛ky, kter² musφ b²t ukonΦen
znakem s k≤dem nula. Uzel konstanty ukazuje na hodnotu konstanty v oblasti
literßl∙.
Uzly operßtor∙ jsou r∙zn²ch typ∙:
RelaΦnφ uzly operßtor∙
V²Φtov² typ |
Popis |
canISBLANK |
Unßrnφ, prßzdn² operand |
canNOTBLANK |
Unßrnφ, neprßzdn² operand |
canEQ |
Binßrnφ, rovno |
canNE |
Binßrnφ, nerovno |
canGT |
Binßrnφ, v∞t╣φ ne╛ |
canLT |
Binßrnφ, men╣φ ne╛ |
canGE |
Binßrnφ, v∞t╣φ nebo rovno |
canLE |
Binßrnφ, men╣φ nebo rovno |
LogickΘ uzly operßtor∙
V²Φtov² typ |
Popis |
canNOT |
Unßrnφ, NOT |
canAND |
Binßrnφ, AND |
canOR |
Binßrnφ OR |
AritmetickΘ
uzly operßtor∙
V²Φtov² typ |
Popis |
canMINUS |
Unßrnφ, minus. Nenφ podporovßno v╣emi ovladaΦi SQL. |
canADD |
Binßrnφ, souΦet. Nenφ podporovßno v╣emi ovladaΦi SQL. |
canSUB |
Binßrnφ, rozdφl. Nenφ podporovßno v╣emi ovladaΦi SQL. |
canMUL |
Binßrnφ, nßsobenφ. Nenφ podporovßno v╣emi ovladaΦi SQL. |
canDIV |
Binßrnφ, d∞lenφ. Nenφ podporovßno v╣emi ovladaΦi SQL. |
canMOD |
Binßrnφ, celoΦφselnΘ d∞lenφ. Nenφ podporovßno v╣emi ovladaΦi
SQL. |
canREM |
Binßrnφ, zbytek po d∞lenφ. Nenφ podporovßno v╣emi ovladaΦi
SQL. |
R∙znΘ uzly operßtor∙
V²Φtov² typ |
Popis |
canCONTINUE |
Unßrnφ; zastavuje vyhodnocovßnφ v²razu, kdy╛ je operand
vyhodnocen jako false (umo╛≥uje zastavit na hornφ hranici
hodnoty filtru). |
Uzly operßtor∙ ukazujφ na posunutφ jejich uzl∙ operand∙.
Oblast literßl∙
Oblast literßl∙ je pou╛it k uklßdßnφ jmen polo╛ek pou╛it²ch
jednotliv²mi uzly polo╛ek a konstantnφ hodnoty pou╛itΘ jednotliv²mi uzly
konstant. JmΘno polo╛ky je tvo°eno literßlem. Hodnoty konstant musφ b²t
reprezentovßny pouze logick²mi typy BDE.
Nap°. nßsledujφcφ logickß podmφnka je reprezentovßna
jako parametr v²razovΘho stromu:
CUST_NO <= 1500 AND CUST_NO >= 1300
Nßsledujφcφ p°φklad p°edpoklßdß, ╛e p°ekladaΦ alokuje
souvisle deklarovanΘ prom∞nnΘ ve fyzickΘ souvislΘ pam∞ti
static const char szTblName[] = "cust";
// JmΘno tabulky
static const char szTblType[] = szDBASE;
// Typ tabulky
static const char szField[] =
"CUST_NO"; // JmΘno pro prvnφ uzel polo╛ky
static const char szField2[] = "CUST_NO";
// JmΘno pro druh² uzel polo╛ky
static const DFLOAT fConst
= 1500.0; // Hodnota prvnφho uzlu konstanty
static const DFLOAT fConst2 =
1300.0; // Hodnota druhΘho uzlu konstanty
void Filter (void)
{
hDBIDb
hDb = 0;
// Madlo databßze.
hDBICur
hCur = 0; //
Madlo tabulky.
DBIResult
rslt;
// Vrßcenß hodnota funkcemi IDAPI.
pBYTE
pcanExpr; // Struktura obsahujφcφ informace filtru.
hDBIFilter
hFilter;
// Madlo filtru.
UINT16
uSizeNodes; // Velikost
uzl∙ ve stromu.
UINT16
uSizeCanExpr; // Velikost informacφ
hlaviΦky.
UINT32
uSizeLiterals; // Velikost literßl∙.
UINT32
uTotalSize; // Celkovß
velikost v²razu filtru.
UINT32
uNumRecs = 10; // PoΦet zßznam∙ k zobrazenφ.
CANExpr
canExp;
// Obsah informacφ hlaviΦky.
struct {
CANBinary MainNode;
CANBinary BinaryNode1;
CANField FieldNode1;
CANConst ConstantNode1;
CANBinary BinaryNode2;
CANField FieldNode2;
CANConst ConstantNode2;
}
Nodes = {
// Uzly stromu filtru.
{
// Posunutφ 0
nodeBINARY,
// canBinary.nodeClass
canAND,
// canBinary.canOp
sizeof(Nodes.MainNode),
// canBinary.iOperand1
sizeof(Nodes.MainNode)
+ sizeof(Nodes.BinaryNode1)
+ sizeof(Nodes.FieldNode1)
+ sizeof(Nodes.ConstantNode1),// canBinary.iOperand2
// Posunutφ v poli Nodes
},
{
// Posunutφ sizeof(Nodes.MainNode)
nodeBINARY,
// canBinary.nodeClass
canLE,
// canBinary.canOp
sizeof(Nodes.MainNode)
+ sizeof(Nodes.BinaryNode1), // canBinary.iOperand1
sizeof(Nodes.MainNode)
+ sizeof(Nodes.BinaryNode1)
+ sizeof(Nodes.FieldNode1), // canBinary.iOperand2
// Posunutφ v poli Nodes
},
{
// Posunutφ sizeof(Nodes.MainNode) + sizeof(Nodes.BinaryNode1)
nodeFIELD,
// canField.nodeClass
canFIELD,
// canField.canOp
1,
// canField.iFieldNum
0 ,
// canField.iNameOffset: szField je
// literal s posunutφm 0 (zaΦßtek oblasti literßl∙)
},
{
// Posunutφ sizeof(Nodes.MainNode) + sizeof(Nodes.BinaryNode1)
// + sizeof(Nodes.FieldNode1)
nodeCONST,
// canConst.nodeClass
canCONST,
// canConst.canOp
fldFLOAT,
// canConst.iType
sizeof(fConst),
// canConst.iSize
sizeof(szField),
// canConst.iOffset: fConst je
// literal s posunutφm sizeof(szField)
},
{
// posunutφ sizeof(Nodes.MainNode) + sizeof(Nodes.BinaryNode1)
// + sizeof(Nodes.FieldNode1) + sizeof(Nodes.ConstantNode1)
nodeBINARY,
// canBinary.nodeClass
canGE,
// canBinary.canOp
sizeof(Nodes.MainNode)
+ sizeof(Nodes.BinaryNode1)
+ sizeof(Nodes.FieldNode1)
+ sizeof(Nodes.ConstantNode1)
+ sizeof(Nodes.BinaryNode2), // canBinary.iOperand1
sizeof(Nodes.MainNode)
+ sizeof(Nodes.BinaryNode1)
+ sizeof(Nodes.FieldNode1)
+ sizeof(Nodes.ConstantNode1)
+ sizeof(Nodes.BinaryNode2)
+ sizeof(Nodes.FieldNode2), // canBinary.iOperand2
// Posunitφ v poli Nodes
},
{
// Posunutφ sizeof(Nodes.MainNode) + sizeof(Nodes.BinaryNode1)
// + sizeof(Nodes.FieldNode1) + sizeof(Nodes.ConstantNode1)
// + sizeof(Nodes.BinaryNode2)
nodeFIELD,
// canField.nodeClass
canFIELD,
// canField.canOp
2,
// canField.iFieldNum
sizeof(szField)+sizeof(fConst), // canField.iNameOffset: szField2 je
// literal s posunutφm sizeof(fConst)
// + velikost prvnφ polo╛ky
},
{
// Posunutφ sizeof(Nodes.MainNode) + sizeof(Nodes.BinaryNode1)
// + sizeof(Nodes.FieldNode1) + sizeof(Nodes.FieldNode1)
// + sizeof(Nodes.BinaryNode2) + sizeof(Nodes.FieldNode2)
nodeCONST,
// canConst.nodeClass
canCONST,
// canConst.canOp
fldFLOAT,
// canConst.iType
sizeof(fConst2),
// canConst.iSize
sizeof(szField)
+ sizeof(fConst)
+ sizeof(szField2),
// canConst.iOffset: fconst je
// literal s posunutφm sizeof(fConst)+ velikost
// prvnφ polo╛ku + druhΘ polo╛ky
}};
Nßsledujφcφ graf reprezentuje stejn² v²raz (posunutφ
jsou uvedena v zßvorkßch).
HlaviΦka:
- - - - - - - - - - - - - - - - - - - - - - - - -
Binßrnφ uzel:
AND (0)
Binßrnφ uzly:
LE (12)
GE (50)
Uzly konstant a polo╛ek:
FIELD (24) CONST (36) FIELD (62) CONST (74)
Oblast literßl∙:
CUST_NO (0) 1500 (8) CUST_NO (16) 1300 (24)