602SQL-┌plnß dokumentace Index   Tisk  

╚tenφ a zßpis dat na ·rovni API funkcφ

Nejni₧Üφ ·rove≥ nßstroj∙ pro Φtenφ a zßpis dat do databßze p°edstavujφ API funkce. Na vyÜÜφ ·rovni lze pou₧φt p°φkazy jazyka SQL obsahujφcφ prom∞nnΘ klienta pomocφ funkce SQL_host_execute.

Pro Φtenφ a zßpis hodnot sloupc∙ lze pou₧φt n∞kterΘ zát∞chto funkcφ:

(cd_)Read, (cd_)Write - univerzßlnφ funkce pro prßci sáhodnotou sloupce,

(cd_)Read_ind, (cd_)Write_ind - prßce se sloupcem pevnΘ velikosti,

(cd_)Read_var, (cd_)Write_var - prßce se sloupce prom∞nnΘ velikosti,

(cd_)Read_len, (cd_)Write_len - prßce sádΘlkou hodnoty sloupce prom∞nnΘ velikosti,

(cd_)Read_ind_cnt, (cd_)Write_ind_cnt - prßce sápoΦtem slo₧ek multiatributu.

(cd_)Read_record, (cd_)Write_record - prßce sácel²m zßznamem najednou.

Funkcφm se p°edßvajφ tyto parametry:

  1. Φφslo tabulky nebo otev°enΘho kurzoru, sánimi₧ se pracuje;
  2. Φφslo zßznamu vátabulce nebo kurzoru;
  3. Φφslo sloupce (krom∞ funkcφ pracujφcφch sácel²m zßznamem);
  4. po°adovΘ Φφslo hodnoty vámultiatributu; pokud funkce pracuje se sloupcem, kter² nenφ multiatributem, pak tento parametr mß hodnotu NOINDEX (pouze n∞kterΘ funkce).

P°i zßpisu hodnoty se dßle udßvß jejφ dΘlka. P°i prßci sáhodnotou prom∞nnΘ velikosti se udßvß zaΦßtek a dΘlka ·seku, sánim₧ se pracuje.

╚φslo tabulky a Φφslo kurzoru

╚φslo tabulky lze zφskat pomocφ funkce (cd_)Find_object, nap°.:

cd_Find_object(cdp, "MOJETABULKA", CATEG_TABLE, &tablenum);

╚φsla systΘmov²ch tabulek jsou váexternφch jazycφch oznaΦena konstantami TAB_TABLENUM, OBJ_TABLENUM, USR_TABLENUM, SRV_TABLENUM, REPL_TABLENUM a KEY_TABLENUM.

╚φslo kurzoru vznikne p°i otev°enφ kurzoru. Pevn² kurzor vytvo°en² podle dotazu vádatabßzi se otevφrß p°φkazem (cd_)Open_cursor, prom∞nn² kurzor zádynamicky sestrojenΘho dotazu se otevφrß funkcφ (cd_)Open_cursor_direct. Otev°en² kurzor je nutno uzav°φt funkcφ Close_cursor.

╚φsla sloupc∙ tabulek a kurzor∙

JmΘna sloupc∙ databßzov²ch tabulek a kurzor∙ se pou₧φvajφ pouze váSQL a ve vnit°nφm programovacφm jazyce. Ve funkcφch pro externφ jazyky se sloupce oznaΦujφ sv²mi po°adov²mi Φφsly.

Sloupce jsou oΦφslovßny souvisle od nuly. ╚φslo nula mß slu₧ebnφ sloupec, kter² se vátabulkßch jmenuje DELETED a vákurzorech __DELETED a nese informaci o tom, zda zßznam je zruÜen². Za nim nßsledujφ p°φpadnΘ dalÜφ slu₧ebnφ sloupce t²kajφcφ se replikacφ, kolob∞hu dokument∙ a prßv kájednotliv²m zßznam∙m (jejich jmΘna zaΦφnajφ _W5_). Za nimi jsou normßlnφ sloupce vátom po°adφ, ván∞m₧ jsou uvedeny vádefinici tabulky nebo váklauzuli SELECT vádefinici kurzoru.

Nult² sloupec mß typ uns8. Nab²vß t°φ hodnot:

* NOT_DELETED zßznam existuje, nenφ zruÜen

* DELETED zßznam je zruÜen² (lze jej obnovit)

* RECORD_EMPTY zßznam je uvoln∞n² (nelze jej obnovit)

DefiniΦnφ soubory sáΦφsly sloupc∙ tabulek a dotaz∙ záaplikace

602SQL poskytuje specißlnφ nßstroj, jak kompilßtor∙m jednoduÜe sd∞lit Φφsla vÜech sloupc∙ ve vÜech tabulkßch a dotazech váaplikaci. Tφmto nßstrojem je vytvo°enφ definiΦnφch soubor∙, kterΘ se potΘ vyu₧ijφ p°i p°ekladu aplikaΦnφho programu.

V hlavnφm menu v²vojovΘho prost°edφ 602SQL je vámenu Nßstroje p°φkaz P°ipravit include, kter² dovoluje vytvo°it definiΦnφ soubor pro jazyk C nebo Pascal.

Pro jazyk C bude obsahem souboru °ada direktiv #define, kterΘ definujφ identifikßtor (makro) oznaΦujφcφ sloupec pomocφ jeho Φφsla. Pro Pascal budou identifikßtory definovßny pomocφ deklarace konstant.

Identifikßtory oznaΦujφcφ sloupce tabulek budou mφt tvar:

A_tabulka_sloupec
        

kde tabulka je jmΘno tabulky a sloupec je jmΘno sloupce tabulky.

Identifikßtory oznaΦujφcφ sloupce kurzor∙ budou jeden zátvar∙:

B_kurzor_sloupec
B_kurzor_tabulka_sloupec
B_kurzor_alias_sloupec
        

kde kurzor je jmΘno kurzoru, sloupec je jmΘno sloupce, tabulka je jmΘno tabulky, zánφ₧ sloupec pochßzφ a alias je p°φpadnΘ oznaΦenφ tabulky várßmci kurzoru (tabulka nebo alias se pou₧ije, pokud kurzor obsahuje vφce stejn∞ pojmenovan²ch sloupc∙).

Pro jazyk C mß definiΦnφ soubor standardn∞ p°φponu SIC, pro Pascal p°φponu SIP. Do aplikaΦnφho programu jej vlo₧φte takto:

#include "appl.sic" 

resp.

{$I appl.sip}

JmΘna utvo°enß v²Üe popsan²m zp∙sobem a definovanß vádefiniΦnφm souboru lze vyu₧φt vÜude tam, kde je parametrem funkce Φφslo sloupce.

ZjiÜ¥ovßnφ Φφsel sloupc∙ p°i b∞hu programu

Ke zjiÜt∞nφ Φφsla sloupce na zßklad∞ jeho jmΘna lze takΘ vyu₧φt tyto funkce:

Funkce (cd_)Attribute_info vracφ pro sloupec zadan² jmΘnem jeho Φφslo, typ a dalÜφ ·daje. Funkce (cd_)Enum_attributes a (cd_)Enum_attributes_ex vracejφ p°ehled vÜech sloupc∙. Tyto funkce se dajφ pou₧φt na tabulku nebo na otev°en² kurzor.

PodrobnΘ informace o sloupcφch v tabulce poskytuje systΘmov² informaΦnφ dotaz _iv_table_columns.

Sloupce kurzor∙ vznikajφcφch p°i b∞hu programu

Pro dynamicky vznikajφcφ kurzory platφ, ₧e jejich sloupce jsou oΦφslovßny zleva doprava vápo°adφ, ván∞m₧ jsou uvedeny váklauzuli SELECT. Prvnφ sloupec uveden² za SELECT mß Φφslo 1, dalÜφ 2 atd.

Nech¥ tabulka T1 obsahuje sloupce A a B, tabulka T2 sloupce C a D. Otev°ete kurzor CU vájazyce C volßnφm funkce:

Open_cursor_direct("select A,D,B+C from T1,T2 where A<C order by D", &CU);

Pak p°eΦφst hodnotu sloupce D ze zßznamu REC vákurzoru CU lze funkcφ:

Read(CU, REC, 2, NULL, &buffer);

zatφmco hodnotu souΦtu B+C p°eΦtete

Read(CU, REC, 3, NULL, &buffer);

DΘlka dat a datovΘ buffery

Funkce pro zßpis do databßze majφ za poslednφ parametr ·daj datasize. Hodnotou tohoto parametru je dΘlka hodnoty zapisovanΘ do databßze vábajtech. Pokud pφÜete do sloupce pevnΘ dΘlky, pak tato hodnota musφ b²t stejnß jako velikost hodnoty tohoto sloupce, tedy nap°. pro typ Char je to 1, pro Short 2, pro Date, Time, Timestamp, ukazatele a Integer 4, pro Money6, pro Real a BigInt 8, pro znakovΘ a bajtovΘ °et∞zce je to dΘlka °et∞zce uvedenß vádefinici tabulky (nikoli tedy skuteΦnß dΘlka zapisovanΘho °et∞zce).

P°i Φtenφ hodnoty je funkci nutno p°edat adresu dostateΦn∞ velkΘho bufferu. P°eΦten² °et∞zec znak∙ bude ukonΦen nulou.

DΘlky hodnoty sloupce prom∞nnΘ velikosti je 4-bajtov² celoΦφseln² ·daj, p°i jejφm zßpisu mß tedy parametr datasize hodnotu 4. PoΦet slo₧ek multiatributu je 2-bajtov² celoΦφseln² ·daj, p°i jeho zßpisu mß tedy parametr datasize hodnotu 2.

Parametr Access váuniverzßlnφch funkcφch Read a Write

Funkce (cd_)Read a (cd_)Write jsou schopny nahradit vÜechny ostatnφ funkce pro Φtenφ a zßpis dat, jejich volßnφ je vÜak pon∞kud slo₧it∞jÜφ. Do rozhranφ serveru jsou zahrnuty hlavn∞ kv∙li kompatibilit∞ se starÜφmi verzemi. Vzhledem kátomu nenφ nutno studovat zbytek tΘto sekce.

Ob∞ funkce majφ parametr access, kter² popisuje cestu, jak se dostat kápo₧adovan²m dat∙m vádatabßzi.

Pokud pracujete se sloupcem, kter² nenφ multiatributem ani nemß prom∞nnou dΘlku, pak uvßd∞jte hodnotu tohoto parametru rovnou NULL vájazyce C, NULL_ACCESS v Pascalu.

Prßce sámultiatributy, se sloupci prom∞nnΘ dΘlky a p°φpadn∞ i sáukazateli vy₧aduje zadßnφ dalÜφch parametr∙. Váp°φpad∞ multiatribut∙ je to index, tedy po°adovΘ Φφslo slo₧ky multiatributu, sánφ₧ chcete pracovat. Váp°φpad∞ sloupc∙ prom∞nnΘ dΘlky se zadßvß interval, tedy ·sek záhodnoty.

Tyto ·daje poskytuje parametr access. Mimo to umo₧≥uje:

Poslednφ operace mß efekt pouze p°i zmenÜenφ poΦtu slo₧ek multiatributu nebo dΘlky. Zv∞tÜenφ toti₧ nastßvß jedin∞ automaticky p°i zßpisu.

P°i zadßvßnφ kterΘhokoli záv²Üe uveden²ch ·daj∙ parametr access je ukazatel na pole zßznam∙ typu modifrec, kterΘ popisuje cestu vedoucφ káhledan²m hodnotßm (v Pascalu je pole zßznam∙ p°edßvßno referencφ, nikoli p°es ukazatel). Váobou p°φpadech hodnota parametru access musφ p°φsn∞ korespondovat sátypem a dalÜφmi charakteristikami p°φsluÜnΘho sloupce.

Hodnota NULL parametru access se pou₧ije prßv∞ tehdy, kdy₧ p°φsluÜn² sloupec je pevnΘ dΘlky a nenφ to multiatribut. Jinak parametr accesss popisuje p°φstup káhodnot∞ a jednotlivΘ slo₧ky pole po °ad∞ odpovφdajφ jednotliv²m krok∙m na cest∞ ke zvolen²m dat∙m. Cesta zaΦφnß u sloupce zadanΘho jako parametr funkce.

Lze volit tyto kroky:

  1. Pokud cesta dosp∞la kámultiatributu, pak lze uvΘst index slo₧ky, sánφ₧ se mß pracovat. Pou₧ije se kátomu zßznam se slo₧kou modtype rovnou MODIND a sávhodnou hodnotou slo₧ky index.
  2. Pokud cesta dosp∞la ke sloupci prom∞nnΘ dΘlky (ten m∙₧e b²t i ji₧ vybranou slo₧kou multiatributu), pak lze uvΘst interval hodnot, sánimi₧ se mß pracovat. Pou₧ije se kátomu zßznam se slo₧kou modtype rovnou MODINT a sávhodn²mi hodnotami slo₧ek start a size, urΦujφcφmi zaΦßtek a velikost ·seku.
  3. Pokud cesta dosp∞la kámultiatributu nebo sloupci prom∞nnΘ dΘlky, pak lze uvΘst, ₧e chcete pracovat nikoli sájejich obsahem, n²br₧ sápoΦtem slo₧ek multiatributu resp. dΘlkou hodnoty sloupce . Kátomu pou₧ijte zßznam se slo₧kou modtype rovnou MODLEN. PoΦet slo₧ek multiatributu je Φφslo typu uns16, dΘlka hodnoty sloupce je Φφslo typu uns32.
  4. Pokud cesta dosp∞la káukazateli, kter² nenφ multiatributem, pak m∙₧ete p°ejφt kázßznamu, na n∞j₧ ukazatel odkazuje. Kátomu pou₧ijte zßznam se slo₧kou modtype rovnou MODPTR a sávhodnou hodnotou slo₧ky attr, je₧ urΦuje, ke kterΘmu sloupci vácφlovΘm zßznamu p°ejdete. Pokud ukazatel nikam neukazuje, nebo je cφlov² zßznam zruÜen², dojde káchyb∞.
  5. Pokud cesta dosp∞la kámultiukazateli, m∙₧ete p°ejφt na n∞kter² ze zßznam∙, na n∞₧ ukazuje. Kátomu pou₧ijte zßznam se slo₧kou modtype rovnou MODINDPTR a sávhodn²mi hodnotami ve slo₧kßch index a attr. Index urΦuje, kterß slo₧ka multiukazatele se pou₧ije a attr na kter² sloupec cφlovΘho zßznamu p°ejdete.
  6. Poslednφm platn²m zßznamem vápoli musφ b²t zßznam se slo₧kou modtype rovnou MODSTOP.
typedef struct
{ uns8 modtype;
  union umoddef
  { struct smodstop { } modstop;
    struct smodlen { } modlen;
    struct smodind { uns16 index; } modind;
    struct smodint { uns32 start; uns16 size; } modint;
    struct smodp { uns8 attr; } modptr;
    struct smodindp { uns16 index; uns8 attr; } modindptr;
  } moddef;
} modifrec;
type modifrec = record
 modtype : uns8;
 case integer of
 MODSTOP : ( );
 MODLEN : ( );
 MODIND : (index : uns16);
 MODINT : (start : uns32; size : uns16);
 MODPTR : (attr : uns8);
 MODINDPTR : (index2 : uns16; attr2 : uns8)
end;

Hodnotou slo₧ky modtype váka₧dΘm zßznamu musφ b²t jedna zát∞chto konstant:

konstanta Umo₧≥uje
MODSTOP tato hodnota je v₧dy váposlednφm zßznamu vápoli
MODLEN Pracovat sávelikostφ multiatributu nebo zßznamu prom∞nnΘ dΘlky
MODIND Pracovat se slo₧kou multiatributu zadanou indexem
MODINT Pracovat sá·sekem hodnoty sloupce prom∞nnΘ dΘlky zadan²m zaΦßtkem a dΘlkou
MODPTR p°ejφt do zßznamu, na n∞j₧ odkazuje ukazatel, na zadan² sloupec
MODINDPTR p°ejφt do zßznamu, na n∞j₧ odkazuje ukazatel se zadan²m indexem na zadan² sloupec

╚tete-li funkcφ (cd_)Read obsah sloupce prom∞nnΘ velikosti, pak vápoli, kam obsah sm∞°uje, bude váprvnφch 2 bajtech dΘlka p°eΦtenΘho ·seku a za nφ p°eΦtenß data.