ISAMCHEK.INF +------------------------------------------------------------+ ! ISAMCHEK Ver 1.22 - Kontroll av ISAM-registers struktur. ! ! F|r ABC800-serien. ! 1986-07-29 Av Kristoffer Eriksson ABC-klubben <5357> ! ! F}r kopieras fritt endast f|r ickekommersiella syften. ! +------------------------------------------------------------+ Inneh}ll ------------------- 1. Presentation av ISAMCHEK 2. Hur programmet k|rs 3. Systemdata f|r ISAM-fil 4. Detaljer i indexsektorer 5. Felmeddelanden 6. Liten varning 7. Slutet 1. Presentation av ISAMCHEK ---------------------------- ISAMCHEK {r till f|r dem som vill "komma innanf|r huden" p} ett trasigt ISAM-register. Programmet kan utf|ra ett antal kontroller av ISAM-filer- nas inneh}ll, framf|r allt index-filens. Det talar {ven om hur registret {r upplagt. Vad det inte g|r, {r att reparera eventuella funna fel. Detta eftersom det ofta {r om|jligt eller mycket sv}rt f|r ett program att avg|ra vilken av tv} skiljaktiga uppgifter i registrets systemdata som {r den r{tta, om ens n}gon av dem {r r{tt. Meningen {r dock att en person insatt i ISAM med hj{lp av ISAMCHEK:s utskrifter ska ha en m|jlighet att "f|r hand" r{tta till felen, vilket med stora register kan g} mycket snabbare {n en reorganisering av regist- ret. Ibland kan man rent av r}ka ut f|r fel som f}r reorganiseringsprog- rammet att rata st|rre delen av registret. Det g}r att komma p} n{stan hur m}nga tester som skulle kunna t{cka in n}gon speciell felsituation i ett register, och de tester som ing}r i ISAMCHEK {r inte p} n}got s{tt utt|mmande, men de flesta fel som ber|r "}tkomstsystemet" f|r registrets datainneh}ll b|r uppt{ckas. En reparationsdetalj kan ISAMCHEK hj{lpa till med. Det h{nder ibland n{r datorn kraschat eller st{ngts av samtidigt som n}gon post h|ll p} att skrivas in i ISAM-registret, att posten sorterats in i ett eller flera index, men inte i datafilen, vilket f}r till effekt att det i indexfilen finns h{nvisningar ("pekare") till en post i datafilen som ligger bortan- f|r filens slut. Detta m{rks ofta direkt i ISAMCHEK p} att den uppgift som finns i index- filen om datafilens l{ngd, {r h|gre {n datafilens verkliga l{ngd. I tur- samma fall kan registret d} g|ras anv{ndsbart igen genom att datafilen f|rl{ngs en bit. Det kan ISAMCHEK g|ra med funktionen "F". 2. Hur programmet k|rs ----------------------- ISAMCHEK b|rjar med att fr}ga efter filnamn. D} ska man svara med index- filens namn. Filtypen beh|ver inte anges om den {r ".ISM". D{refter (om den angivna filen finns) undrar programmet exakt vad det ska g|ra, vilket anges med en eller flera "funktionsbokst{ver". F|ljande finns att v{lja bland: I - Kontroll av indextr{den. T - Kontroll av kedjan med tomma poster i datafilen. B - Kontroll av att postpekare endast pekar p} b|rjan av poster. R - Kontroll av att alla dataposter refereras exakt 1 g}ng per index. D - Detaljerad utskrift av alla indexsektorer. V - Val av vilka indextr{d som ska testas. S - Starta fr}n viss sektor. P - Printerutskrift. E - Skriv ej ut hela inneh}llet i sektorer med fel i. F - F|rl{ng fil. Om ingen bokstav alls anges, skriver ISAMCHEK enbart ut registrets upp- l{ggning f|r att sedan stanna. "F" kan inte kombineras med de |vriga bokst{verna. Den anv{nds till att ut|ka index- eller datafilen med ett |nskat antal sektorer. "I" l{ser igenom alla anv{nda sektorer i indexfilen, och kontrollerar att de har r{tt struktur, inte h{nvisar till platser utanf|r data- eller utanf|r indexfilen, att nycklarna {r r{tt sorterade och att varje indexsektor anv{nds exakt en g}ng. Den sista saken {r ganska minneskr{vande (olika beroende p} regis- terstorlek) och utnyttjas inte tillsammans med funktionerna "V" och "R". Funktionen "O" kan anv{ndas f|r att uttryckligen st{nga av det testet f|r att spara minne. Den l{nkade listan med f|r tillf{llet outnyttjade indexsektorer kont- rolleras p} liknande s{tt, dock inte tillsammans med funktionen "S". Sorteringen av flyttalsnycklar kontrolleras inte. Jag vet inte hur de {r lagrade. Nycklar l{ngre {n 50 tecken kollas inte heller, f|r att spara p} minnet. Testet genomf|rs f|r varje index i registret, och b|rjar med respek- tive startsektor i indexfilen som anges av systemdata. D{rifr}n fort- s{tter det till varje ytterligare sektor som {r kopplad till den f|rsta. Varje sektor utom "l|vsektorerna" h{nvisar till ytterligare indexsektorer. Denna struktur avspeglas ocks} i utskriften som gene- reras. Numret p} varje testad sektor skrivs ut. Varje sektor som inte {r en l|vsektor f|ljs av en parentes med de sektorer den h{nvi- sas till. Sektorer med fel i skrivs normalt (se "E") ut p} ett l{sbart s{tt som anger det exakta inneh}llet. P} grund av den h{r rutinens rekursiva metod, kan minnet ta slut om ett mycket stort register med mycket l}nga nycklar (f} nycklar per sektor) testas. "T" I datafilen uppr{tth}lls en "l{nkad kedja" av gamla raderade postut- rymmen som kan tas i bruk f|r nya poster. I indexfilen finns en upp- gift om den f|rsta tomma posten i datafilen. I denna finns en pekare till n{sta tomma post, osv. T-funktionen l{ser denna kedja och skriver ut sektornummer och posi- tion inom sektorn f|r varje post, samt kollar att ingen h{nvisning pekar utanf|r datafilen. "B" ut|kar |vriga tester med en n}got tidskr{vande kontroll av att pekare i indexfilen ("I") och datafilen ("T") verkligen g}r till b|rjan av en post i datafilen och inte mitt in i n}gon. Om denna bokstav anges ensam g|rs kombineras det automatiskt med I-testet. "R" utf|r ett test av att det i varje index finns en, och endast en, h{nvisning till varje post i datafilen som inte ing}tt i listan |ver tomma poster. T- och I-testen ing}r ocks}. Eventuella orefererade poster skrivs ut efter |vriga tester. Om pos- ten som b|rjar p} byte 0 i sektor 0 (dvs post 0) har raderats n}gon g}ng kommer denna att tappas bort och aldrig att utnyttjas igen. Den- na utpekas s}ledes ofta som orefererad. "D" ger en fullst{ndig utskrift av varje testad indexsektor, vilket {ven medf|r att I-testet ing}r h{r. "V" inneb{r att programmet fr}gar efter vilket eller vilka av registrets index som ska kontrolleras. Normalt behandlas alla index. I-testet {r underf|rst}tt. Fr}gan besvaras med siffran eller siffrorna f|r det eller de index som |nskas kontrollerade. Inga skilljetecken mellan siffrorna ska anv{ndas. "S" ger en m|jlighet att v{lja en utg}ngssektor var som hellst i filen (i st{llet f|r att starta d{r indexen startar). Tillsammans med "D" visar detta en viss sektor i detalj. Med "I" kontrolleras alla sektorer som en viss sektor h{nvisar till. Med b}de "D" och "I", tja, du kan v{l gissa... Under alla f|rh}llanden f|rs|ker ISAMCHEK sp}ra upp det index som den ang- ivna sektorn ytterst h|r till, varvid en eller flera andra "|ve- rord- nade" sektorer r{knas upp. "P" g|r att alla testdata som skrivs p} sk{rmen skrivs ut p} skrivaren ocks}. Fr}n b|rjan {r programmet gjort f|r Epson-skrivare med smal stil och 132 tecken per rad. Utskriftsparametrarna regleras av n}gra variabler i b|rjan av programmet vilkas namn b|rjar p} "Pr". Prfil$ kan t ex {ndras s} att utskriften g|rs p} n}gon annan fil {n skriva- ren. "E" Normalt g|rs en fullst{ndig utskrift av allas indexsektorer som ver- kar d}liga, men med denna bokstav f|rhindras detta. L{gg m{rke till att ett k|rning med funktionerna ITBR inte utf|r riktigt alla test som finns, eftersom R utesluter ett av testen under I. Utskrifterna kan stoppas tillf{lligt med mellanslagstangenten, och }te- rupptas med samma tangent. Testerna kan {ven avbrytas med PF1, varvid programmet i allm{nhet g}r vidare till n{sta index. 3. Systemdata f|r ISAM-fil --------------------------- Den inledande utskriften av ISAM-registrets systemdata kan se ut som Indexfil: YMOROKRO.ISM Antal sektorer enligt filen: 580, i verkligheten: 580. Position efter sista posten i datafilen: Sektor 853 Byte 194. Position d{r kedjan av tomma poster b|rjar: Sektor 0 Byte 0. Position f|r f|rsta tomma indexsektorn: Sektor 0 Byte 0. Postl{ngd: 89 bytes. Datafil: YMOROKRO.ISD Verklig l{ngd: 854 sektorer. Index Namn Startsektor Dupl Position L{ngd Typ 1 ONR 257 Nej 2 ARTNR 340 Ja Alla systemdata ligger i f|rsta sektorn av indesfilen. "Antal sektorer enligt filen" {r det antal existerande sektorer som enligt systemdata finns i indexfilen, vilket givetvis hellst ska |ve- rensst{mma med filens verkliga l{ngd. [r den i verkligheten st|rre {r det troligen inte farligt, bara f|rbryllande. [r den d{remot kortare saknas delar av indexfilen vilket g|r att alla datasektorer inte {r }tkomliga, och b|r resultera i klagom}l om pekare utanf|r indexfilen och orefererade dataposter. "Position efter sista posten i datafilen" {r den plats n{sta nya post kommer att f} om inga gamla raderade poster erbjuder sitt utrymme i ked- jan av tomma poster. "Position d{r kedjan av tomma poster b|rjar" utg|r b|rjan av de pekarf|r- bundna tomma utrymmena i datafilen som uppst}tt n{r poster raderats. Den- na {r noll om kedjan {r tom. "Position f|r f|rsta tomma indexsektorn" utg|r p} samma s{tt b|rjan av den pekarf|rbundna kedjan med outnyttjade sektorer i indexfilen som kan uppst} n{r m}nga poster raderas. Byte-positionen b|r f|rst}s vara noll. Ingen av dessa positionsangivelser b|r peka p} n}gon plats utanf|r res- pektive fils verkliga l{ngd. 4. Detaljer i indexsektorer ---------------------------- En detaljutskrift av ett par indexsektor kan se ut som ---------- Sektor 50: Tillbakapekare: (Byt 39 Sek 32) Byt 3: 3 Prev: (Byt 3 Sek 36) Data: (Byt 119 Sek 53) " 130 1" Byt 21: 3 Prev: (Byt 3 Sek 40) Data: (Byt 161 Sek 56) " 132 2" Byt 39: 3 Prev: (Byt 3 Sek 42) Data: (Byt 203 Sek 59) " 134 1" Byt 57: 3 Prev: (Byt 3 Sek 44) Data: (Byt 245 Sek 62) " 138 2" Byt 75: 3 Prev: (Byt 3 Sek 45) Data: (Byt 34 Sek 66) " 139 5" Byt 93: 3 Prev: (Byt 3 Sek 47) Data: (Byt 76 Sek 69) " 140 8" Byt 111: 3 Prev: (Byt 3 Sek 49) Data: (Byt 118 Sek 72) " 140 17" Byt 129: 1 Next: (Byt 3 Sek 52) ---------- Sektor 36: Tillbakapekare: (Byt 3 Sek 50) Byt 3: 2 Key : Data: (Byt 166 Sek 50) " 128 1" Byt 18: 2 Key : Data: (Byt 2 Sek 51) " 128 2" Byt 33: 2 Key : Data: (Byt 91 Sek 51) " 128 3" Byt 48: 2 Key : Data: (Byt 180 Sek 51) " 128 4" Byt 63: 2 Key : Data: (Byt 16 Sek 52) " 129 1" Byt 78: 2 Key : Data: (Byt 105 Sek 52) " 129 2" Byt 93: 2 Key : Data: (Byt 194 Sek 52) " 129 3" Byt 108: 2 Key : Data: (Byt 30 Sek 53) " 129 4" Byt 123: 0 End : F|rst ska v{l s{gas att indexfilen inneh}ller en tr{dstruktur av sektorer f|r varje index. I varje indexsektor finns en eller oftast flera pekare till dels ytterligare indesektorer och dels poster i datafilen. De yttersta indesektorerna, "l|ven", inneh}ller enbart pekare till datafi- len. Omlott med pekarna ligger nycklarna, s} att ISAM kan lokalisera den peka- re den {r ute efter. I l|vsektorerna {r det konstruerat enligt 2, Pekare till post i datafilen f|r en viss nyckel, Nyckelns v{rde l{tt kodat p} l{mpligt s{tt f|r sorteringen, 2, ... 0. De |vriga indexsektorerna {r konstruerade enligt 3, Pekare till indexsektor med nycklar som kommer sorteringsm{ssigt f|re en viss nyckel, Pekare till post i datafilen f|r just denna nyckel, Nyckeln kodad, 3, .... 1, Pekare till indexsektor med nycklar som kommer sorteringsm{ssigt efter f|reg}ende nyckel. ISAM anv{nder pekare mycket flitigt. En pekare best}r av tre bytes, varav den f|rsta anger bytepositionen inom en sektor, och de tv} andra anger sektornumret inom filen. De skrivs i programmet ut som (Byt XXX Sek XXXXX) Varje indexsektor inleds med en pekare som pekar tillbaks p} "faderpeka- ren", dvs den pekare i den fr}n indexettr{dets start sett, f|reg}ende sektorn som pekar p} den nu aktuella sektorn sj{lv. D{refter f|ljer ett antal "indexitems", varav det finns fyra olika typer numrerade 0-3. Varje item inleds av en byte som anger dess typ. Vad de olika typerna betyder b|r framg} av indexsektorf|rklaringen strax ovan. I utskriften visas heltalsnycklar som de tal de betyder, medan |vriga nycklar visas som de tecken de egentligen {r lagrade som. Oskrivbara tec- ken ers{tts dock med punkter. 5. Felmeddelanden ------------------ Felmeddelanden inleds alltid med en angivelse av i vilken sektor och byte felet, eller det som gjorde att felet uppt{cktes (T{nk p} att det hela g}r ut p} att kolla uppgift mot uppgift, och att man inte alltid vet vil- ken som {r den r{tta.). Vilken fil det g{ller framg}r av det p}g}ende testet. Ytterligare detaljer b|r framg} av den fullst{ndiga utskrift av den aktuella indexsektorn n{r det g{ller indexfilen. 6. Liten varning ----------------- Jag {r inte s{ker p} att den enkla metod f|r att avl{sa en fils verkliga l{ngd som anv{nds i ISAMCHEK fungerar p} alla DOS. Den har dock fungerat p} alla jag testat hittills (LUX-NET och UFD). Den verkliga l{ngden utnyttjas n{r en fil ska f|rl{ngas med funktionen "F", men om v{rdet d} inte st{mmer |verens med verkligheten uppt{cks det av programmet innan n}gon skada {r skedd. 7. Slutet ---------- Eventuella felrapporter s{nds till Kristoffer Eriksson Vassv{gen 3 702 31 \rebro