⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datapageut.~pas

📁 读取大智慧股票软件中的日线数据进行分析的源代码。代码仅有读取数据部分
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
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 + -