?? datapageut.pas
字號:
unit DataPageUt;
interface
uses
Windows, SysUtils, Variants, Classes;
type
TSlot=Class
PageId: dword;
Num: word;
Offset: word;
FixLen: word;
HasVarFld:boolean;
FixColLen:integer; //系統定長列的總長度
VarColCnt:integer; //系統變長列的總個數
BitColCnt:integer; //系統bit列的總個數
FixFldCnt:integer; //
VarFldCnt:integer;
NullMapSize:integer;
IsPrimary:boolean;
MaxFldNo:integer; //數據行最大列編號
MaxVarNo:integer; //數據行內的最大變長列的序號
// SlotStream:TMemoryStream;
ValueString:WideString;
FieldString:Widestring;
constructor create;
// procedure ReadData;
// destructor free;
// procedure GetColumns;
end;
TPageHead = Class
{0:0f}
m_headerVersion: byte;
m_type: byte;
m_typeFlagBits: byte;
m_level: byte;
m_flagBits: word;
m_indexId: word;
m_prevPage2: dword;
m_prevPage1: word;
pminlen: word; //0:0f
{10:1f}
m_nextPage2: dword;
m_nextPage1: word;
m_slotCnt: word;
ObjId: dword;
m_freeCnt: word;
m_freeData: word;
{20:2F}
m_pageId2: dword;
m_pageId1: word;
m_reservedCnt: word;
m_lsn1: dword;
m_lsn2: dword;
{30:3F}
m_lsn3: word;
m_xactReserved: word;
m_xdesId2: dword;
m_xdesId1: word;
m_ghostRecCnt: word;
m_tornBits: dword;
end;
TPage = Class(Tobject)
FileHandle: integer;
PageHead: TPageHead;
Slots: Tstrings ;
OffsetList: array of word;
PageBuffer: array of byte;
PageStream: TMemoryStream;
FixColLen:integer; //系統定長列的總長度
VarColCnt:integer; //系統變長列的總個數
BitColCnt:integer; //系統bit列的總個數
Size: integer;
ObjName: string;
HasIdentity: boolean;
public
constructor create; virtual;
destructor destroy; override;
procedure ClosePage;
procedure SetPageHead;
procedure SetSlots;
procedure SetOffsetList;
procedure SaveData;
procedure ReplTornBits;
end;
TMemoryBlock = Class
Id:int64;
PageNum:integer;
MaxSize:int64;
DataSize:int64;
PageCnt:int64;
FirstPageId:int64;
pages: TStrings ;
stream:TMemoryStream;
fileHandle:int64;
constructor Create;
destructor free;
procedure ReadFile;
procedure SetPages;
procedure Clear;
end;
TRvTable = Class
TableId: Dword;
TableName:string;
columns: TStrings ;
// procedure AddToTable;
end;
const
PageLen:DWord=8192;
//function ReadBuffer(buffer:pointer;size:byte):pointer;
implementation
uses functionUt, DMUt;
function ReadBuffer(buffer:pointer;size:byte):pointer;
var
pMem: pointer;
begin
pMem:=AllocMem(size);
CopyMemory(pMem,buffer,size);
result:=pMem;
end;
constructor TSlot.create;
begin
inherited;
end;
constructor TPage.create;
begin
inherited;
self.Size:=PageLen;
self.PageHead:=TPageHead.Create;
self.Slots:=TStringList.Create;
// self.Buffer:=AllocMem(PageLen);
self.PageStream:=TMemoryStream.Create;
self.PageStream.SetSize(PageLen);
end;
procedure TPage.ClosePage;
begin
//
end;
procedure TPage.SetPageHead;
begin
{0:0f}
self.PageHead.m_headerVersion:=ReadSQLByte(Pagestream,0,0);
self.PageHead.m_type:=ReadSQLByte(Pagestream,1,0);
self.PageHead.m_typeFlagBits:=ReadSQLByte(Pagestream,2,0);
self.PageHead.m_level:=ReadSQLByte(PageStream,3,0);
self.PageHead.m_flagBits:=ReadSQLword(PageStream,4,0);
self.PageHead.m_indexId:=ReadSQLword(PageStream,6,0);
self.PageHead.m_prevPage2:=ReadSQLdword(PageStream,8,0);
self.PageHead.m_prevPage1:=ReadSQLword(PageStream,12,0);
self.PageHead.pminlen:=ReadSQLword(PageStream,14,0);
{10:1f}
self.PageHead.m_nextPage2:=ReadSQLdword(PageStream,16,0);
self.PageHead.m_nextPage1:=ReadSQLword(PageStream,20,0);
self.PageHead.m_slotCnt:=ReadSQLword(PageStream,22,0);
self.PageHead.ObjId:=ReadSQLdword(PageStream,24,0);
self.PageHead.m_freeCnt:=ReadSQLword(PageStream,28,0);
self.PageHead.m_freeData:=ReadSQLword(PageStream,30,0);
{20:2F}
self.PageHead.m_pageId2:=ReadSQLdword(PageStream,32,0);
self.PageHead.m_pageId1:=ReadSQLword(PageStream,36,0);
self.PageHead.m_reservedCnt:=ReadSQLword(PageStream,38,0);
self.PageHead.m_lsn1:=ReadSQLdword(PageStream,40,0);
self.PageHead.m_lsn2:=ReadSQLdword(PageStream,44,0);
{30:3F}
self.PageHead.m_lsn3:=ReadSQLword(PageStream,48,0);
self.PageHead.m_xactReserved:=ReadSQLword(PageStream,50,0);
self.PageHead.m_xdesId2:=ReadSQLdword(PageStream,52,0);
self.PageHead.m_xdesId1:=ReadSQLword(PageStream,56,0);
self.PageHead.m_ghostRecCnt:=ReadSQLword(PageStream,58,0);
self.PageHead.m_tornBits:=ReadSQLdword(PageStream,60,0);
end;
procedure TPage.ReplTornBits;
var
CheckByte,ValiByte:Byte;
i:integer;
ValiStream:TMemoryStream;
ValiBuffer,DataBuffer:pointer;
shiftpos:integer;
begin
CheckByte:=ReadSQLByte(Pagestream,60,0) mod 4;
ValiBuffer:=allocmem(1);
DataBuffer:=allocmem(1);
ValiStream:=TMemorystream.Create;
ValiStream.SetSize(1);
ValiStream.Clear;
Pagestream.Seek(60,0);
Pagestream.ReadBuffer(ValiBuffer^,1);
try
for i:=2 to 16 do
begin
if (i mod 4 =1) then
begin
Pagestream.Seek(60+((i-1) div 4),0);
Pagestream.ReadBuffer(ValiBuffer^,1);
end;
shiftpos:= (i-1-((i-1) div 4)*4 )*2;
ValiByte:=(byte(ValiBuffer^) shr shiftpos) mod 4;
if ValiByte=CheckByte then
continue;
Pagestream.Seek(i*512-1,0);
PageStream.ReadBuffer(DataBuffer^,1);
Byte(DataBuffer^):= Byte(DataBuffer^)-CheckByte+ValiByte;
ValiStream.WriteBuffer(DataBuffer^,1);
ValiStream.Seek(0,0);
Pagestream.Seek(i*512-1,0);
Pagestream.CopyFrom(ValiStream,1);
ValiStream.Clear;
end;
finally
freemem(ValiBuffer);
freemem(DataBuffer);
freeandnil(ValiStream);
end;
end;
procedure TPage.SetSlots;
var
i,j:integer;
slot:TSlot;
value,valuestr,str:string;
Fld,FldStr:string;
realvalue:Extended;
datatype:integer;
VarNo:integer;
NullVarFldCnt:integer;
VarOffset:integer;
VarEndOffset:integer;
F: TextFile;
ErrFileName:string;
ErrFileHandle:THandle;
begin
ErrFileName:='RecoverErr.log';
DM.CDS_Col.Filtered:=false;
DM.CDS_Col.Filter:='id='+inttostr(self.PageHead.ObjId);
DM.CDS_Col.Filtered:=true;
self.HasIdentity:=false;
self.FixColLen:=0; //系統定長列的總長度
self.VarColCnt:=0; //系統變長列的總個數
self.BitColCnt:=0; //系統bit列的總個數
DM.CDS_Col.First;
while (not DM.CDS_Col.Eof)and(not self.HasIdentity) do
begin
self.HasIdentity:=not varisnull(DM.CDS_Col.FieldValues['autoval']);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -