Header-Datei-Format von Interbase/Firebird-Dateien


Eine einfache Klasse über die Datenträgerstruktur einer Interbase/Firebird-Datenbank zu informieren.
Diese einfache Klasse können Sie eine Interbase/Firebird-Datenbank angeben und es wird ermittelt werden Informationen über die Datenbank einschließlich
Sekundäre Dateien
Seitenformate
Auf die Anzahl der Datenträger-Struktur
Anzahl der Seiten für jede Datei
etc.
Um es zu benutzen können Sie einfach dazu
GDBInfo: = TGDBInfo.Create('c:\something.gdb');
versuchen Sie
für I: = 0 to GDBInfo.Count - 1
ShowMessage (GDBInfo [I]. Filename);
Schließlich
GDBInfo.Free;
Ende;


Einheit GDBInfo;
Schnittstelle
verwendet
SysUtils, Klassen;
const
cMAX_PAGE_SIZE = 32768;
Typ
SChar = Shortint;
SShort = Smallint;
UShort = Wort;
SLong = Longint;
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] von 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] von SLong;
Ende;
THdrPage = packed Record
Fix_data: THdr;
Var_data: Array [0..cMAX_PAGE_SIZE - 1 - SizeOf(THdr)] Byte;
Ende;
Nicht IB mit Bezug
EGDBError = class(Exception);
PGDBFile = ^ TGDBFileInfo;
TGDBFileInfo = Datensatz
Header: THdr;
Dateiname: ShortString;
ContinuationFile: ShortString;
FirstLogicalPage: LongWord;
LastLogicalPage: LongWord;
TotalPages: LongWord;
Ende;
TGDBInfo = Klasse
Private
FList: TList;
FFilename: String;
Prozedur GetDBFiles;
GetItem (I: Integer), Funktion: TGDBFileInfo;
geschützt
öffentliche
Konstruktor erstellen (const AFilename: String);
Destruktor Destroy; außer Kraft setzen;
Count-Funktion: Integer;
Eigenschaftenelemente [I: Integer]: TGDBFileInfo lesen Sie GetItem; in der Standardeinstellung;
Ende;

Umsetzung
{TGDBInfo}
Funktion TGDBInfo.Count: Integer;
beginnen
Ergebnis: = FList.Count;
Ende;
Konstruktor TGDBInfo.Create (const AFilename: String);
beginnen
geerbte erstellen;
FList: = TList.Create;
FFilename: = AFilename;
GetDBFiles;
Ende;

Destruktor TGDBInfo.Destroy;
var
I: Integer;
beginnen
für I: = Count - 1 Downto 0 tun
beginnen
FreeMem(FList[I]);
FList.Delete(I);
Ende;
erbte;
Ende;
Prozedur TGDBInfo.GetDBFiles;
var
FS: TFileStream;
HeaderPage: THdrPage;
NewFile: PGDBFile;
CurrentFilename: ShortString;
FilenameSize: Byte;
Startseite: LongWord;
SourceDir: String;
DataOffset: Integer;
beginnen
Wenn nicht dann FileExists(FFilename)
Auslösen von EGDBError.Create ('Datei existiert nicht -' + FFilename);
SourceDir: = ExtractFilePath(FFilename);
Wenn SourceDir = '' dann SourceDir: = IncludeTrailingBackSlash(GetCurrentDir);
StartPage: = 0;
CurrentFilename: = SourceDir + ExtractFilename(FFilename);
Wiederholen Sie die
FS: = TFileStream.Create (CurrentFilename, FmOpenRead oder FmShareDenyNone);
versuchen Sie
GetMem (NewFile, SizeOf(TGDBFileInfo));
FS. Lesen (HeaderPage, SizeOf(HeaderPage));
Bewegen Sie (HeaderPage, NewFile.Header, SizeOf(THdr));
DataOffset: = 0;
Format der Var_data wird wiederholt
1 = Wurzel-Dateiname
2 = Journal Server
3 = Fortsetzung-Datei (Dies ist die eine, wir wollen)
4 = Letzte logische Seite
5 = nicht lizenzierte Zugänge
6 = Sweep Interval
7 = Replay Logging-Datei
11 = Shared Cache-Datei
zwar HeaderPage.var_data[DataOffset] tun, <> 3
beginnen
Wenn HeaderPage.var_data[DataOffset + 1] = 0 then Break;
Inc (DataOffset, HeaderPage.var_data[DataOffset + 1] + 2);
Wenn DataOffset > HeaderPage.fix_data.hdr_page_size - SizeOf(HeaderPage.fix_data) dann
EGDBError.Create('Continuation') zu erhöhen;
Ende;
FilenameSize: = HeaderPage.var_data[DataOffset + 1];
NewFile.Filename: = CurrentFileName;
SetLength (NewFile.ContinuationFile, FilenameSize);
Wenn FilenameSize > 0 dann
Bewegen (HeaderPage.var_data [DataOffset + 2], NewFile.ContinuationFile[1], FilenameSize);
NewFile.FirstLogicalPage: = StartPage;
Bewegen (HeaderPage.var_data [DataOffset + FilenameSize + 4], NewFile.LastLogicalPage, SizeOf(LongWord));
NewFile.TotalPages: = NewFile.LastLogicalPage - NewFile.FirstLogicalPage;
Inc (Startseite, NewFile.TotalPages);
FList.Add(NewFile);
CurrentFilename: = NewFile.ContinuationFile;
Wenn CurrentFilename = '' dann
beginnen
NewFile.LastLogicalPage: = 0;
NewFile.TotalPages: = 0;
Zu brechen;
Ende;
Schließlich
FS. Frei;
Ende;
bis zum False;
Ende;
Funktion TGDBInfo.GetItem (I: Integer): TGDBFileInfo;
beginnen
Ergebnis: = PGDBFile(FList[I]) ^;
Ende;
Ende.









Header-Datei-Format von Interbase/Firebird-Dateien


Header-Datei-Format von Interbase/Firebird-Dateien : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Eine einfache Klasse über die Datenträgerstruktur einer Interbase/Firebird-Datenbank zu informieren.
Diese einfache Klasse können Sie eine Interbase/Firebird-Datenbank angeben und es wird ermittelt werden Informationen über die Datenbank einschließlich
Sekundäre Dateien
Seitenformate
Auf die Anzahl der Datenträger-Struktur
Anzahl der Seiten für jede Datei
etc.
Um es zu benutzen können Sie einfach dazu
GDBInfo: = TGDBInfo.Create('c:\something.gdb');
versuchen Sie
für I: = 0 to GDBInfo.Count - 1
ShowMessage (GDBInfo [I]. Filename);
Schließlich
GDBInfo.Free;
Ende;


Einheit GDBInfo;
Schnittstelle
verwendet
SysUtils, Klassen;
const
cMAX_PAGE_SIZE = 32768;
Typ
SChar = Shortint;
SShort = Smallint;
UShort = Wort;
SLong = Longint;
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] von 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] von SLong;
Ende;
THdrPage = packed Record
Fix_data: THdr;
Var_data: Array [0..cMAX_PAGE_SIZE - 1 - SizeOf(THdr)] Byte;
Ende;
Nicht IB mit Bezug
EGDBError = class(Exception);
PGDBFile = ^ TGDBFileInfo;
TGDBFileInfo = Datensatz
Header: THdr;
Dateiname: ShortString;
ContinuationFile: ShortString;
FirstLogicalPage: LongWord;
LastLogicalPage: LongWord;
TotalPages: LongWord;
Ende;
TGDBInfo = Klasse
Private
FList: TList;
FFilename: String;
Prozedur GetDBFiles;
GetItem (I: Integer), Funktion: TGDBFileInfo;
geschützt
öffentliche
Konstruktor erstellen (const AFilename: String);
Destruktor Destroy; außer Kraft setzen;
Count-Funktion: Integer;
Eigenschaftenelemente [I: Integer]: TGDBFileInfo lesen Sie GetItem; in der Standardeinstellung;
Ende;

Umsetzung
{TGDBInfo}
Funktion TGDBInfo.Count: Integer;
beginnen
Ergebnis: = FList.Count;
Ende;
Konstruktor TGDBInfo.Create (const AFilename: String);
beginnen
geerbte erstellen;
FList: = TList.Create;
FFilename: = AFilename;
GetDBFiles;
Ende;

Destruktor TGDBInfo.Destroy;
var
I: Integer;
beginnen
für I: = Count - 1 Downto 0 tun
beginnen
FreeMem(FList[I]);
FList.Delete(I);
Ende;
erbte;
Ende;
Prozedur TGDBInfo.GetDBFiles;
var
FS: TFileStream;
HeaderPage: THdrPage;
NewFile: PGDBFile;
CurrentFilename: ShortString;
FilenameSize: Byte;
Startseite: LongWord;
SourceDir: String;
DataOffset: Integer;
beginnen
Wenn nicht dann FileExists(FFilename)
Auslösen von EGDBError.Create ('Datei existiert nicht -' + FFilename);
SourceDir: = ExtractFilePath(FFilename);
Wenn SourceDir = '' dann SourceDir: = IncludeTrailingBackSlash(GetCurrentDir);
StartPage: = 0;
CurrentFilename: = SourceDir + ExtractFilename(FFilename);
Wiederholen Sie die
FS: = TFileStream.Create (CurrentFilename, FmOpenRead oder FmShareDenyNone);
versuchen Sie
GetMem (NewFile, SizeOf(TGDBFileInfo));
FS. Lesen (HeaderPage, SizeOf(HeaderPage));
Bewegen Sie (HeaderPage, NewFile.Header, SizeOf(THdr));
DataOffset: = 0;
Format der Var_data wird wiederholt
1 = Wurzel-Dateiname
2 = Journal Server
3 = Fortsetzung-Datei (Dies ist die eine, wir wollen)
4 = Letzte logische Seite
5 = nicht lizenzierte Zugänge
6 = Sweep Interval
7 = Replay Logging-Datei
11 = Shared Cache-Datei
zwar HeaderPage.var_data[DataOffset] tun, <> 3
beginnen
Wenn HeaderPage.var_data[DataOffset + 1] = 0 then Break;
Inc (DataOffset, HeaderPage.var_data[DataOffset + 1] + 2);
Wenn DataOffset > HeaderPage.fix_data.hdr_page_size - SizeOf(HeaderPage.fix_data) dann
EGDBError.Create('Continuation') zu erhöhen;
Ende;
FilenameSize: = HeaderPage.var_data[DataOffset + 1];
NewFile.Filename: = CurrentFileName;
SetLength (NewFile.ContinuationFile, FilenameSize);
Wenn FilenameSize > 0 dann
Bewegen (HeaderPage.var_data [DataOffset + 2], NewFile.ContinuationFile[1], FilenameSize);
NewFile.FirstLogicalPage: = StartPage;
Bewegen (HeaderPage.var_data [DataOffset + FilenameSize + 4], NewFile.LastLogicalPage, SizeOf(LongWord));
NewFile.TotalPages: = NewFile.LastLogicalPage - NewFile.FirstLogicalPage;
Inc (Startseite, NewFile.TotalPages);
FList.Add(NewFile);
CurrentFilename: = NewFile.ContinuationFile;
Wenn CurrentFilename = '' dann
beginnen
NewFile.LastLogicalPage: = 0;
NewFile.TotalPages: = 0;
Zu brechen;
Ende;
Schließlich
FS. Frei;
Ende;
bis zum False;
Ende;
Funktion TGDBInfo.GetItem (I: Integer): TGDBFileInfo;
beginnen
Ergebnis: = PGDBFile(FList[I]) ^;
Ende;
Ende.


Header-Datei-Format von Interbase/Firebird-Dateien

Header-Datei-Format von Interbase/Firebird-Dateien : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Header-Datei-Format von Interbase/Firebird-Dateien
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung