15. API BDE II

Uzamykßnφ

Uzamykacφ prost°edφ BDE je hierarchie obsahujφcφ t°i vrstvy:
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∙: 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Θ:

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: 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: 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:
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:
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φ: 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:
  1. 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.
  2. 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): 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: 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:
  1. K zφskßnφ novΘho p°φkazovΘho madla, volßme DbiQAlloc.
  2. 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.
  3. Pro p°φpravu dotazu volßme DbiQPrepare.
  4. Pro provedenφ p°ipravenΘho dotazu volßme DbiQExec.
  5. 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 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:
  1. 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.
  2. Vlo╛φmu tuto informaci do struktury IDXDesc.
  3. Nastavφme IDXDesc.bPrimary = TRUE;
  4. 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:
  1. 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.
  2. UrΦφme, kterΘ sloupce tΘto tabulky ukazujφ na sloupce jin²ch tabulek.
  3. 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.
  4. Vlo╛φme tyto informace do struktury RINTDesc.
  5. 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: 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: 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:

  1. Zapφ╣eme t∞lo zp∞tn∞ volanΘ funkce, deklarovanΘ s p°i°azen²m p°eddefinovan²m seznamem parametr∙:

  2. 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
    );
  3. 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.

  4. typedef struct
    {
    INT16         iPercentDone;        // Procento dokonΦenφ
    DBIMSG        szMsg;               // Zprßva k zobrazenφ
    } CBPROGRESSDesc;
    typedef CBPROGRESSDesc far * pCBPROGRESSDesc;
  5. K registraci zp∞tnΘho volßnφ aplikace volß DbiRegisterCallback s p°edßnφm cbGENPROGRESS jako hodnotu pro ecbType.
  6. Aplikace zajistφ volßnφ DbiBatchMove.
  7. 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
  8. 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∙: 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: 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:

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)
 
15. API BDE II