📄 datapageut.~pas
字号:
if DM.CDS_Col.FieldValues['xoffset']<0 then
self.VarColCnt:=self.VarColCnt+1
else
self.FixColLen:=self.FixColLen+1;
if DM.CDS_Col.FieldValues['xtype']=104 then
self.BitColCnt:=self.BitColCnt+1;
DM.CDS_Col.Next;
end;
if BitColCnt>0 then
self.FixColLen:= self.FixColLen-self.BitColCnt+((self.BitColCnt-1) mod 8)+1;
DM.Q_Insert.Close;
DM.Q_Insert.SQL.Clear;
if self.HasIdentity then
DM.Q_Insert.SQL.Add('set identity_insert dbo.'+self.ObjName+' on');
for i:=1 to self.PageHead.m_slotCnt do
begin
try
slot:=TSlot.create;
Slot.Offset:=offsetList[i];
Slot.Num:=i;
Slot.PageId:=self.PageHead.m_pageId2;
Slot.IsPrimary:=not(ReadSQLbit(Pagestream,slot.Offset,1,2,0)or ReadSQLbit(Pagestream,slot.Offset,1,3,0));
if Slot.offset<96 then
Slot.IsPrimary:=false;
if Slot.IsPrimary then
begin
Slot.FixLen:=ReadSQLword(Pagestream,slot.Offset+2,0);
Slot.MaxFldNo:=ReadSQLword(Pagestream,slot.Offset+Slot.FixLen,0);
Slot.HasVarFld:=ReadSQLbit(Pagestream,slot.Offset,1,5,0);
Slot.NullMapSize:=((Slot.MaxFldNo-1) div 8)+1;
if Slot.HasVarFld then
Slot.MaxVarNo:=ReadSQLword(Pagestream,slot.Offset+Slot.FixLen+2+Slot.NullMapSize,0)
else
Slot.MaxVarNo:=0;
Slot.FixFldCnt:=0;
Slot.VarFldCnt:=0;
NullVarFldCnt:=0;
VarNo:=0;
valuestr:='';
FldStr:='';
DM.CDS_Col.First;
while not DM.CDS_Col.Eof do
begin
if ReadSQLBit(Pagestream,Slot.Offset+Slot.FixLen+2,slot.NullMapSize,DM.CDS_Col.RecNo-1,0)and
(DM.CDS_Col.FieldByName('xoffset').AsInteger<0) then
NullVarFldCnt:=NullVarFldCnt+1;
if DM.CDS_Col.FieldByName('xoffset').AsInteger<0 then
Slot.VarFldCnt:=Slot.VarFldCnt+1
else
Slot.FixFldCnt:=Slot.FixFldCnt+1;
DM.CDS_Col.Next;
end;
DM.CDS_Col.First;
while not DM.CDS_Col.Eof do
begin
datatype:=DM.CDS_Col.FieldByName('xtype').AsInteger;
case datatype of
52: //smallint
value:=inttostr(ReadSQLsmallint(Pagestream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,0) );
56: //int
value:=inttostr(ReadSQLint(Pagestream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,0) );
// 58: //smalldatetime
60: //money
value:=currtostr(ReadSQLmoney(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,0) );
61: //datetime
value:=quotedstr(datetimetostr(ReadSQLdatetime(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,0)));
62: //float
value:=floattostr(ReadSQLfloat(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,0) );
104://bit
if ReadSQLbit(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,1,DM.CDS_Col.FieldByName('bitpos').AsInteger,0) then
value:='1'
else
value:='0';
106://decimal
value:=floattostr(ReadSQLdecimal(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,DM.CDS_Col.FieldByName('length').AsInteger,DM.CDS_Col.FieldByName('xscale').AsInteger,0) );
108://numeric
begin
realvalue:=ReadSQLdecimal(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,DM.CDS_Col.FieldByName('length').AsInteger,DM.CDS_Col.FieldByName('xscale').AsInteger,0);
value:=floattostr(realvalue);
end;
167://varchar
begin
if not Slot.HasVarFld then
value:='Null'
else
begin
if VarNo>=Slot.MaxVarNo then
begin
if ReadSQLBit(PageStream,Slot.Offset+Slot.FixLen+2,slot.NullMapSize,DM.CDS_Col.RecNo,0) then
value:='Null'
else
value:=quotedstr('');
end
else
begin
VarNo:=VarNo+1;
if VarNo=1 then
VarOffset:=Slot.Offset+Slot.FixLen+2+slot.NullMapSize+2+Slot.MaxVarNo*2
else
VarOffset:=VarEndOffset;
VarEndOffset:=Slot.Offset+ReadSQLWord(PageStream,Slot.Offset+Slot.FixLen+2+slot.NullMapSize+VarNo*2,0);
if VarEndOffset>8192 then
VarEndOffset:=VarEndOffset mod 8192;
str:=ReadSQLChar(PageStream,VarOffset,VarEndOffset-VarOffset,0);
value:=quotedstr(str);
end;
end;
end;
175://char
begin
str:=ReadSQLchar(PageStream,slot.Offset+DM.CDS_Col.FieldByName('xoffset').AsInteger,DM.CDS_Col.FieldByName('length').AsInteger,0);
value:=quotedstr(str);
end
else
value:='Null'
end;
if ReadSQLNullMap(PageStream,Slot.Offset+Slot.FixLen+2,DM.CDS_Col.RecNo,0) then
value:='Null';
if DM.CDS_Col.FieldByName('xoffset').AsInteger>=Slot.FixLen then
value:='Null';
if DM.CDS_Col.RecNo>Slot.MaxFldNo then
value:='Null';
if FldStr='' then
FldStr:=DM.CDS_Col.FieldByName('name').AsString
else
FldStr:=FldStr+','+ DM.CDS_Col.FieldByName('name').AsString;
if ValueStr='' then
ValueStr:=value
else
ValueStr:=ValueStr+','+ value;
DM.CDS_Col.Next;
end;
DM.Q_Insert.SQL.Add('insert '+self.ObjName+'( '+fldstr+ ') values('+valuestr+')');
end
finally
freeandnil(slot);
end;
end;
if self.HasIdentity then
DM.Q_Insert.SQL.Add('set identity_insert dbo.'+self.ObjName+' off');
if DM.Q_Insert.SQL.Count>0 then
try
DM.Q_Insert.ExecSQL;
except
if not FileExists(ErrFileName) then
begin
ErrFileHandle:=FileCreate(ErrFileName);
FileClose(FileHandle);
End;
AssignFile(F, ErrFileName);
Rewrite(F);
Writeln(F,'pageid='+inttostr(self.PageHead.m_prevPage2));
for i:=0 to DM.Q_Insert.SQL.Count-1 do
Writeln(F, DM.Q_Insert.SQL[i]);
CloseFile(F);
end;
end;
procedure TPage.SetOffsetList;
var
i:integer;
begin
SetLength(self.OffsetList,self.PageHead.m_slotCnt+1);
for i:=1 to self.PageHead.m_slotCnt do
offsetlist[i]:=ReadSQLword(PageStream,i*(-2),2);
end;
procedure TPage.SaveData;
begin
//
end;
destructor TPage.destroy;
begin
// freemem(self.OffsetList);
// freemem(self.Buffer);
freeandnil(self.PageHead);
freeandnil(self.PageStream);
FreeAndnil(self.Slots);
// inherited;
end;
constructor TMemoryBlock.Create;
begin
inherited;
self.MaxSize:=8192*128;
pages:= TStringList.Create ;
stream:=TMemoryStream.Create;
stream.SetSize(MaxSize);
end;
procedure TMemoryBlock.ReadFile;
var
buffer:pointer;
begin
Buffer:=allocmem(MaxSize);
LongFileSeek(FileHandle,self.Id*self.MaxSize+self.PageNum*8192,0);
self.DataSize:=Fileread(FileHandle, buffer^, MaxSize);//
stream.Clear;
stream.write(Buffer^,self.MaxSize);
freemem(buffer);
self.PageCnt:=self.DataSize div PageLen;
end;
procedure TMemoryBlock.SetPages;
var
page:TPage;
i:integer;
begin
page:=TPage.create;
for i:=1 to self.PageCnt do
begin
stream.Seek((i-1)*PageLen,0);
page.PageStream.Clear;
page.PageStream.CopyFrom(stream,PageLen);
page.SetPageHead;
if page.PageHead.m_type=1 then
begin
if DM.CDS_Tables.Locate('id',page.PageHead.ObjId,[]) then
if DM.CDS_Tables.FieldByName('sele').AsBoolean then
begin
Page.ReplTornBits;
page.ObjName:=DM.CDS_Tables.FieldValues['name'];
page.SetOffsetList;
page.SetSlots;
// pages.Addobject(page.ObjName,page);
end;
end;
end;
freeandnil(page);
self.stream.Clear;
end;
destructor TMemoryBlock.free;
begin
freeandnil(stream);
freeandnil(pages);
end;
procedure TMemoryBlock.Clear;
begin
stream.Clear;
pages.Clear;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -