

                 	Clipper file szerkezetek		   Source: ???
                         NTX llomnyok 
			     


  Az adatbzis s .DBT file-ok szerkezete utn az index llomnyok ke-
rlnek bemutatsra. Elszr a Clipper ltal kialaktott NTX formtumot
ismertetjk.

  Az index felptse az gynevezett mdostott B-fa rendszeren alapul,
vagyis fa struktrj. A kulcsok karakteresen troldnak, dtum esetn
nyolc byte-os karaktersorozat, numerikus kulcs esetn az index kifeje-
zstl fgg szmsorozat alkotja az egyes kulcsokat. Ha szksges, ve-
zet nullk kezdik a kulcsot, amit az index menedzsel rendszer telje-
sen automatikusan elvgez. Termszetesen a karakteres kulcskifejezsek
esetben a kulcshossz a kifejezs kirtkelse utn kapott kulcs hosz-
szval egyezik meg.  

  Aki mr vizsglta az index file-okat, knnyen rjhetett, hogy ez az
llomny blokkokbl ll. Az is kiderthet, hogy egy blokk 1024 byte a
Clipper indexnl. (Az NDX-ek esetben ez csak 512) Vizsgljunk meg egy
index file-t, byte-rl byte-ra. Az llomny elejn egy extra blokk ta-
llhat, melynek tartalma, illetve felptse eltr a rkvetkezktl.
Ezt elnevezhetjk fej blokknak. Vizsgljunk meg egy ilyet.

  06 00 01 00 00 04 00 00 00 00 00 00 0B 00 03 00 ................
  00 00 4C 00 26 00 6B 6F 64 00 00 00 00 00 00 00 ..L.&.kod.......

Az index kifejezs a KOD nev meznv volt ebben az esetben, ezt a ne-
vet adtuk meg az index ltrehozsnl.  Vagyis a kifejezs szerepel az
indexllomnyban. Mieltt a tbbi adatra is rtrnnk, nem rt egy kis
ismertets a B-frl.

  A B-fa mdszernl blokkok troljk a fastruktra "cscsait". Itt egy
"cscs" tartalmazza az aktulis kulcsot, a DBF-ben szerepet jtsz re-
kord sorszmot, valamint egy blokkmutatt.  A kvnatos az lenne, hogy
minl jobban feltlttt blokkok alkotnk az indexllomnyt, ugyanis ez
azt jelenten, hogy a legkevesebb mgneslemez terletet kellene elfog-
lalni. Ekkor termszetesen a keressek is igen gyorsak lehetnnek, mi-
vel egy kulcs megkeresshez a legkisebb utat kell bejrni. A problma
ezekben az esetekben az, hogy igen bonyolult algoritmus kellene a kie-
gyenslyozshoz. (Vagyis ahhoz, hogy minden beszrs, trls stb. utn
a blokkok a lehet legjobban legyenek kihasznlva.) R.Bayer vetett fel
egy olyan megoldst, ami nmi kompromisszum rn igen jl hasznlhat.
Nevezetesen: egy blokk kivtelvel minden blokk legalbb a maximlisan
tartalmazhat cscsok felt tartalmazza, vagyis flig legyen feltltve.
Igy a kihasznls legalbb 50%-os lesz, s a klnbz fa struktrt m-
dost mveletek is leegyszersdnek. Tovbbi felttel az is, hogy egy
blokk vagy levl, vagyis legals szint, mely sorban tartalmazza a kul-
csokat, vagy pedig a tartalmazott kulcsok darabszma plusz egy blokkra
mutat r. Vgl a legals szinteknek  mindig ugyanazon szinteknek kell
lennie.

  Lssunk egy konkrt pldt az elbbiek megrtshez:

           Tartalmazza egy adatbzis a kvetkezket:

    1  TIBOR         - T
    2  GZA          - G
    3  ALADR        - A
    4  JOZSEF        - J
    5  OTTO          - O
    6  ILDIKO        - I
    7  BALZS        - B
    8  ELEMR        - E
    9  LSZLO        - L
   10  FERENC        - F
   11  CSILLA        - C
   12  DNES         - D
   13  HAJNALKA      - H
   14  RITA          - R

  Az indexnl csak a kezdbetket rjuk ki az egyszersg kedvrt:

                               Ŀ
                               P8EP4J   
                               
                   Ŀ Ŀ
      Ŀ  Ŀ   Ŀ
      P3AP7BP11CP12D  P10FP2GP13HP6I   P9LP5OP14RP1T
           
       0   0   0    0   0   0    0   0    0  0    0   0   0    0  0

  Az brn ngy blokkot lthatunk,  melybl a fels mutati rmutatnak
az alsbb szint blokkokra, melyek csak az gynevezett nullpointereket
tartalmazzk. Ezek teht a levelek, a legals szintek. A P betvel je-
leztk azt, hogy pointerrl van sz,  az utna kvetkez szm a rekord
sorszma, majd vgl a kulcs  kezdbetje tallhat meg egy kulcselem-
ben. Termszetesen a tnyleges kulcselem az indexfile-ban a valdi kul-
csot tartalmazza.

  A mutat mindig az alsbb szint blokkra mutat, kivve ha az nem leg-
als szint. Igy a keressnl nagyon gyorsan megllapthat, hogy a k-
vnt rekord szerepel-e. Pl. Keressk meg az ILDIKO kulcs rekordot. Az
els lps az, hogy a fels szinten kezdjk keresni. Az I az E-tl na-
gyobb, s az itt szerepl mutat,  mint az brbl is kitnik, az E-nl
kisebb kulcsokat tartalmaz blokkokra mutat. A kvetkez bejegyzs a J
lesz. Ettl kisebb az I, gy az itt szerepl blokkpointer segtsgvel
tlpnk egy alsbb szintre. Itt sorba vesszk a kulcselemeket, s meg-
talljuk a keresett kulcsot. Az ott szerepl rekordsorszm segtsgvel
a DBF llomnybl mr gyorsan elrhet a keresett rekord. Ha azonban a
keresett kulcs nem szerepelt volna az index elemek kztt, akkor annak
megllaptsa sem lenne nehz. Tegyk fel, hogy S (SNDOR) kulcsot ke-
resnk. A fels szinten az utols pointer (lsd a korbbi feltteleket)
mutat egy alsbb szintre. (mivel a J-tl nagyobb az S)  Itt tovbb ke-
resnk: elszr az L, majd az O, utna az R, s vgl a T, de ez mr na-
gyobb az S-nl. Tovbb menni egy alsbb szintre nem tudunk, mivel null
pointert tartalmaz ez a bejegyzs, teht a keress megszakad gy, hogy
nem talltuk meg a kulcsot.

  Uj kulcs beszrsnl mindig a legals szint megfelel blokkjba ke-
rl az uj index bejegyzs. Ha ez megtelik, akkor a blokk kt klnll
rszre szakad, s kt j blokk jn ltre a legals szinten. Ezt le kell
kezelni az eggyel feljebb lv szinten is, ami mr a megfelel mutatt
is tartalmazza. Ha az index mr tbb szint, elkpzelhet, hogy a leg-
als szinten beszrt index az sszes feljebb lv blokkot  (ami ssze- 
kti a legfels, vagy gykr blokkal) kett kell vgni s el kell vgez-
ni azokon is a pointerek revzijt, st esetleg egy j gykr blokkot
is ltre kell hozni. Ekkor tart a legtovbb egy j index elem nyilvn-
tartsba vtele.

  A trls egy kicsit bonyolultabb,  s hosszabb mvelet is lehet, mert
elfordulhat, hogy a B-fa felttel megsznne,  ha csak egyszeren kie-
melnnk egy indexet. Ekkor tbb vagy az sszes alsbb szint bevonsval
ki kell egyenslyozni a struktrt. Az ezzel kapcsolatos rszletek meg-
tallhatk a megfelel knyvekben, itt most nem trnk ki r.

  A legfelsbb szinten lev blokkra, vagyis a gykrre az NTX file el-
s rekordjban (fejblokk) tallhat pointer mutat. Ezzel vissza is ke-
rltnk az NTX file bemutatshoz.

  Teht a cikk elejn bemutatott NTX file eleje a kvetkez:

    06 00 01 00 00 04 00 00 00 00 00 00 0B 00 03 00 ................
    00 00 4C 00 26 00 6B 6F 64 00 00 00 00 00 00 00 ..L.&.kod.......

  A kvetkez C nyelvi struktra tartalmazza az NTX file fejblokkjnak
felptst:

  # define MAX_HOSSZ 256

  typedef struct                  /* Kezdpozci  s tartalom */
    {
      unsigned ntx_jel;                    /* 00 -> 0600 */
      unsigned verzio;                     /* 02 -> 0100 */
      long gyoker;                         /* 04 -> 00400000 */
      long nem_elo_blokk;                  /* 08 -> 00000000 */
      unsigned level_meret;                /* 0C -> 0B00 */
      unsigned kulcs_meret;                /* 0E -> 0300 */
      unsigned dec_meret;                  /* 10 -> 0000 */
      unsigned max_db;                     /* 12 -> 4C00 */
      unsigned fel_max_db;                 /* 14 -> 2600 */
      char kulcs_kif[MAX_HOSSZ];           /* 16 -> kod */
      Boolean unique;                      /* 0272 -> 00 */
    } NTX_FEJ;

  Ahol az egyes struktraelemek a kvetkezknek felelnek meg:
- ntx_jel        : 06 00; jelzi, hogy Clipper index file
- verzio         : 01 00; a Clipper indexelsi verzija
- gyoker         : Az a cm, mely a file elejtl szmtva a legfels
                   blokkra (gykr) mutat.
- nem_elo_blokk  : A nem hasznlt index blokkokat, amelyek trls ese-
                   tn keletkeznek, ellenttben a dBase-zel a Clipper
                   sszelncolja. Az itt trolt cm, ha nem 0, akkor a
                   legels nem hasznlt blokk pozcija az llomny e-
                   lejtl szmtva. Ebbl az is kvetkezik, hogy tr-
                   lsek hatsra az indexllomny mrete nem cskken.
                   Ezrt fordulhat el az, hogy az jraindexels hat-
                   sra cskken az NTX file mrete. A dBase-nl ugyan-
                   akkor egy felszabadult blokk mr soha nem hasznl-
                   dik jra. Egybknt a felszabadult blokkok els 4
                   byte-ja (a Clipper indexek esetben) tartalmazza a
                   kvetkez felszbadult blokk relatv cmt, (az NTX
                   els pozcijhoz kpest) s az utols ilyen blokk-
                   nl a lncolcm termszetesen null pointer.
- level_meret    : Egy index bejegyzs (B-fa levl) hossza, ami a meg-
                   adott kulcskifejezs hossza s ktszer ngy. Elz-
                   ekben mr ismertettk.
- kulcs_meret    : A kulcskifejezs eredmnynek hossza, vagyis mag-
                   nak a kulcsnak a hossza.
- dec_meret      : Ha numerikus a kulcskifejezs, akkor a tizedes je-
                   gyek szma. Egybknt definilatlan.
- max_db         : Az egy blokkban maximlisan elfr index bejegyz-
                   sek szma.
- fel_max_db     : Az elz rtk fele, mivel a B-fa egyik kritriuma,
                   hogy egy kivtelvel az sszes blokknak minimum f-
                   lig meg kell telni.
- kulcs_kif      : A kulcskifejezs. Maximum 256 byte hossz lehet, 00
                   byte-tal a vgn. gyeljnk arra, hogy a kifejezs
                   mindig ugyanolyan hossz kulcsot hozzon ltre.
- unique         : Ez az a jelz, mely arra szolgl, hogy az index ke-
                   letkezsekor ugyanazon kulcsokat tbbszr is elfo-
                   gadja-e a menedzsel rendszer vagy sem. Ha ez 1, 
                   akkor csak egyedi kulcsokat hasznlhatunk, ha 0,
                   akkor ugyanaz a kulcs tbbszr is elfordulhat.
  A fejblokk tbbi helye feltlt 00 kdot tartalmaz.

Ebben a szmunkban a rutinok kztt megtallhat egy NTX file fejblokk
kirat rutin. Ez a fentiek alapjn knnyen megrthet lesz.

  Az index llomny tovbbi rsze a B-fa struktra elemei. Egy bejegy-
zs a fastruktrba a kvetkez szerkezet:

   typedef struct
     {
       long blokk;
       long rek_sorsz;
       char kulcs;
     } NTX_ELEM;

  Azonban a konkrt megvalsts mr nem ilyen egyszer. Szksg van a
blokkok elejn egy szmllra, mely a blokkban tallhat l bejegyz-
sek szmt megadja. (Emlkezznk a B-fa feltlelekre) Ez a szm a gy-
kr blokk kivtelvel mindig a maximlisan  elhelyezhet NTX_ELEM szm
s ennek fele kztt van. Ezek utn tallhat egy tblzat, mely az e-
gyes bejegyzsek  blokkon belli cmeit tartalmazza. Ennek elemszma a
maximlis bejegyzsszm + 1. Az index bejegyzsek csak ezek utn tall-
hatk. A cmtblzat s a szmll egy j blokk esetn teljesen automa-
tikusan jn ltre. Ezek miatt sajnos elvsz nmi terlet, de az indexe-
ls technikja miatt erre szksg van. A cmtblzat elemei kt byte-os
unsigned int tpusak.

  Az indexfile kiratsra egy konkrt plda tallhat a rutinok kztt.
Hasznossga nem ktsges, segtsgvel sok indexhiba okra rjhetnk.
