Format der Header-Datei für Interbase/Firebird-Datei

Kann 1, 2016 Admin Computer 0 9
FONT SIZE:
fontsize_dec
fontsize_inc

Eine einfache Klasse, um Informationen über die Struktur einer Festplatte/Firebird-Datenbank Interbase zu erhalten.

Diese einfache Klasse ermöglicht es Ihnen, eine/Interbase und Firebird-Datenbank angeben werden Informationen über die Datenbank einschließlich retrive



Sekundärdateien

Seitengrößen

Die Anzahl der Plattenstruktur

Anzahl der Seiten für jede Datei,



etc



Um es zu nutzen, können Sie einfach tun dies



GDBInfo: TGDBInfo.Create = ('c: \ something.gdb');

versuchen

für i: = 0 bis GDBInfo.Count - 1 zu tun

Showmessage (GDBInfo [I] .FileName);

endlich

GDBInfo.Free;

Ende;









Einheit GDBInfo;



Schnittstelle

Anwendungen

SysUtils, Klassen;



const

cMAX_PAGE_SIZE = 32768;



So'ne Art

Schär = Shortint;

Sshort = Smallint;

USHORT = Wort;

Slong = Lange;

Ulong = Longword;



TPag = packed record

pag_type: Schar;

pag_flags: Schar;

pag_checksum: USHORT;

pag_generation: ULONG;

pag_seqno: ULONG;

pg_offset: ULONG;

Ende;



ThDr = packed record

hdr_header: TPag;

hdr_page_size: USHORT;

hdr_ods_version: USHORT;

hdr_pages: slong;

hdr_next_page: ULONG;

hdr_oldest_transaction: slong;

hdr_oldest_active: slong;

hdr_next_transaction: slong;

hdr_sequence: USHORT;

hdr_flags: USHORT;

hdr_creation_date: array [0..1] durch slong;

hdr_attachment_id: slong;

hdr_shadow_count: slong;

hdr_implementation: Sshort;

hdr_ods_minor: USHORT;

hdr_ods_minor_original: USHORT;

hdr_end: USHORT;

hdr_page_buffers: ULONG;

hdr_bumped_transaction: slong;

hdr_oldest_snapshot: slong;

hdr_misc: array [0..3] durch slong;

Ende;



THdrPage = packed record

fix_data: ThDr;

var_data: array [0..cMAX_PAGE_SIZE - 1 - sizeof (ThDr)] of Byte;

Ende;



// IB nicht verwandten

EGDBError = class (Exception);



PGDBFile = ^ TGDBFileInfo;

TGDBFileInfo = Aufzeichnung der

Header: ThDr;

Dateiname: Short;

ContinuationFile: Short;

FirstLogicalPage: Longword;

LastLogicalPage: Longword;

Totalpages: Langwort;

Ende;



TGDBInfo class =

privat

Flist: TList;

FFilename: string;

GetDBFiles Verfahren;

Funktion GetItem (I: Integer): TGDBFileInfo;

geschützt

Öffentlichkeit

Konstruktor erstellen (const AFileName: string);

destructor zu vernichten; ignorieren;



Zählen Funktion: Integer;

Eigenschaft Items [i: Integer]: TGDBFileInfo lesen GetItem; Standard;

Ende;





Ausführung



TGDBInfo {}



arbeiten TGDBInfo.Count: Integer;

Start

Ergebnis: = FList.Count;

Ende;



TGDBInfo.Create Konstruktor (const AFileName: string);

Start

Erstellen geerbt;

Flist: = TList.Create;

FFilename: = AFileName;

GetDBFiles;

Ende;



TGDBInfo.Destroy Zerstörer;

var

I: Integer;

Start

für i: = Count - 1 0 downto tun

Start

FreeMem (flist [I]);

FList.Delete (I);

Ende;

geerbt;

Ende;



TGDBInfo.GetDBFiles Verfahren;

var

FS: TFileStream;

HeaderPage: THdrPage;

NewFile PGDBFile;

CurrentFilename: Short;

FilenameSize: Byte;

Startpage: Longword;

SourceDir: string;

Dataoffset: Integer;

Start

wenn nicht FileExists (FFilename), dann

erhöhen EGDBError.Create ('Datei existiert nicht -' + FFilename);

SourceDir: = ExtractFilePath (FFilename);

wenn SourceDir = '' dann SourceDir: = IncludeTrailingBackSlash (GetCurrentDir);



Startpage: = 0;

CurrentFilename: = + SourceDir ExtractFileName (FFilename);

Wiederholung

FS: = TFileStream.Create (CurrentFilename, fmOpenRead oder fmShareDenyNone);

versuchen

GetMem (NewFile, sizeof (TGDBFileInfo));

FS.Read (HeaderPage, sizeof (HeaderPage));

Move (HeaderPage, NewFile.Header, sizeof (ThDr));



Dataoffset: = 0;

// Format var_data Wiederholungen

// 1 = Dateiname der Start

// = 2 offiziellen Server

// 3 = Fortsetzung Datei (das ist, was wir wollen)

// 4 = Letzte Seite Logik

// 5 = Zugriff ohne Lizenz

// 6 = Intervall Sweep

// 7 = Protokolldateiwiedergabe

// 11 = shared Cache-Datei

während HeaderPage.var_data [Dataoffset] 3 zu tun

Start

wenn HeaderPage.var_data [Dataoffset + 1] = 0, dann brechen;

Inc (Dataoffset, HeaderPage.var_data [Dataoffset + 1] + 2);



wenn Dataoffset> HeaderPage.fix_data.hdr_page_size - sizeof (HeaderPage.fix_data), dann

erhöhen EGDBError.Create ('Fortsetzung');

Ende;



FilenameSize: = HeaderPage.var_data [Dataoffset + 1];



NewFile.Filename: = CurrentFileName;

SetLength (NewFile.ContinuationFile, FilenameSize);

wenn FilenameSize> 0, dann

Move (HeaderPage.var_data [Dataoffset + 2], NewFile.ContinuationFile [1], FilenameSize);

NewFile.FirstLogicalPage: = Startpage;

Move (HeaderPage.var_data [Dataoffset FilenameSize + + 4], NewFile.LastLogicalPage, sizeof (Longword));

NewFile.TotalPages: = NewFile.LastLogicalPage - NewFile.FirstLogicalPage;

Inc (Startpage, NewFile.TotalPages);

FList.Add (NewFile);



CurrentFilename: = NewFile.ContinuationFile;

wenn CurrentFilename = '' dann

Start

NewFile.LastLogicalPage: = 0;

NewFile.TotalPages: = 0;

Break;

Ende;

endlich

FS.Free;

Ende;

Falsch;

Ende;



arbeiten TGDBInfo.GetItem (I: Integer): TGDBFileInfo;

Start

Ergebnis: = PGDBFile (flist [I]) ^;

Ende;



Ende.

(0)
(0)

Kommentare - 0

Keine Kommentare

Fügen Sie einen Kommentar

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Zeichen übrig: 3000
captcha