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

📄 iddb.pas

📁 传奇源代码的delphi版本
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      end;
    end;
    FileClose(nIdxFileHandle);
  end;
  if Result then begin
    g_n472A6C:=DBHeader.nIDCount;
    g_n472A74:=DBHeader.nIDCount;
  end else m_QuickList.Clear;
end;

//生成数据索引
//0x004580A4
procedure TFileIDDB.LoadQuickList();
var
  nIndex        :Integer;
  n10           :Integer;
  DBHeader      :TDBHeader;
  DBRecord      :TAccountDBRecord;
  DeletedHeader :TRecordDeletedHeader;
begin
  m_nLastReadIdx := 0;
  m_nDeletedIdx  := -1;
  nIndex         := 0;
  g_n472A6C      := 0;
  g_n472A70      := 0;
  g_n472A74      := 0;
  m_QuickList.Clear;
  try
    if Open then begin
      FileSeek(m_nFileHandle,0,0);
      if FileRead(m_nFileHandle,DBHeader,SizeOf(TDBHeader)) = SizeOf(TDBHeader) then begin
        g_n472A74:=DBHeader.nIDCount;
        for nIndex:=0 to DBHeader.nIDCount -1 do begin
          Inc(g_n472A6C);
          if FileRead(m_nFileHandle,DBRecord,SizeOf(TAccountDBRecord)) <> SizeOf(TAccountDBRecord) then begin
            break;
          end;
          if not DBRecord.Header.boDeleted then begin
            if DBRecord.UserEntry.sAccount <> '' then begin
              m_QuickList.AddObject(DBRecord.UserEntry.sAccount,TObject(nIndex));
              Inc(g_n472A70);
            end;
          end else begin //004581D5
            n10:=FileSeek(m_nFileHandle,-SizeOf(TAccountDBRecord),1);
            FileRead(m_nFileHandle,DeletedHeader,SizeOf(TRecordDeletedHeader));
            FileSeek(m_nFileHandle,-SizeOf(TRecordDeletedHeader),1);
            DeletedHeader.nNextDeletedIdx:=m_nDeletedIdx;
            m_nDeletedIdx:=nIndex;
            FileWrite(m_nFileHandle,DeletedHeader,SizeOf(TRecordDeletedHeader));
            FileSeek(m_nFileHandle,n10,0);
          end;
          Application.ProcessMessages;
          if Application.Terminated then begin
            Close;
            exit;
          end;
        end;
      end;
    end;
  finally
    Close();
  end;
  m_QuickList.SortString(0,m_QuickList.Count -1);
  m_nLastIndex    := m_Header.nLastIndex;
  m_dLastDate     := m_Header.dLastDate;
  g_boDataDBReady :=True;

end;
//0045832C
procedure TFileIDDB.SaveDBIndex();
var
  IdxHeader      :TIdxHeader;
  nIdxFileHandle :Integer;
  I              :Integer;
  n10            :Integer;
  IdxRecord      :TIdxRecord;
begin
  FillChar(IdxHeader,SizeOf(TIdxHeader),#0);
  IdxHeader.sDesc       := sDBIdxHeaderDesc;
  IdxHeader.nQuickCount := m_QuickList.Count;
  IdxHeader.nIDCount    := m_Header.nIDCount;
  IdxHeader.nLastIndex  := m_nLastIndex;
  IdxHeader.dUpdateDate := m_dLastDate;
  if FileExists(m_sIdxFileName) then
    nIdxFileHandle:=FileOpen(m_sIdxFileName,fmOpenReadWrite or fmShareDenyNone)
  else nIdxFileHandle:=FileCreate(m_sIdxFileName);

  if nIdxFileHandle > 0 then begin
    FileWrite(nIdxFileHandle,IdxHeader,SizeOf(TIdxHeader));
    for I := 0 to  m_QuickList.Count - 1 do begin
      FillChar(IdxRecord,SizeOf(TIdxRecord),#0);
      IdxRecord.sName:=m_QuickList.Strings[I];
      IdxRecord.nIndex:=Integer(m_QuickList.Objects[I]);
      FileWrite(nIdxFileHandle,IdxRecord,SizeOf(TIdxRecord));
    end;
    FileClose(nIdxFileHandle);
  end;
end;
//0x00458C6C
function TFileIDDB.FindByName(sName: string;
  var List: TStringList): Integer;
var
  I:Integer;
begin
  for I:= 0 to m_QuickList.Count - 1 do begin
    if CompareLStr(m_QuickList.Strings[I],sName,length(sName)) then begin
      List.AddObject(m_QuickList.Strings[I],m_QuickList.Objects[I]);
    end;
  end;
  Result:=List.Count;
end;
//0x00458A34
function TFileIDDB.GetBy(nIndex: Integer;
  var DBRecord: TAccountDBRecord): Boolean;
begin
  if nIndex >= 0 then
    Result:=GetRecord(nIndex,DBRecord)
  else Result:= False;
end;
function TFileIDDB.GetRecord(nIndex: Integer;
  var DBRecord: TAccountDBRecord): Boolean;
begin
  if FileSeek(m_nFileHandle,SizeOf(TAccountDBRecord) * nIndex + SizeOf(TDBHeader),0) <> -1 then begin
    FileRead(m_nFileHandle,DBRecord,SizeOf(TAccountDBRecord));
    FileSeek(m_nFileHandle,-SizeOf(TAccountDBRecord) * nIndex + SizeOf(TDBHeader),1);
    m_nLastReadIdx:=nIndex;
    Result:=True;
  end else Result:=False;
end;
//0x00458C10
function TFileIDDB.Index(sName: String): Integer;
begin
  Result:=m_QuickList.GetIndex(sName);
end;
//0x004589E8
function TFileIDDB.Get(nIndex: Integer; var DBRecord: TAccountDBRecord): Integer;
var
  nRecordIndex:Integer;
begin
  nRecordIndex:=Integer(m_QuickList.Objects[nIndex]);
  if GetRecord(nRecordIndex,DBRecord) then Result:=nRecordIndex
  else Result:= -1;
end;
//00457ED8
function TFileIDDB.OpenEx: Boolean;
var
  DBHeader:TDBHeader;
begin
  Lock();
  m_boChanged:=False;
  m_nFileHandle:=FileOpen(m_sDBFileName,fmOpenRead or fmShareDenyNone);
  if m_nFileHandle > 0 then begin
    Result:=True;
    if FileRead(m_nFileHandle,DBHeader,SizeOf(TDBHeader)) = SizeOf(TDBHeader) then
      m_Header:=DBHeader;
    m_nLastReadIdx:=0;
  end else Result:=False;
end;
function TFileIDDB.UpdateRecord(nIndex: Integer; DBRecord: TAccountDBRecord;
  boNew: Boolean): Boolean;//0x0048BF5C
var
  DeletedHeader :TRecordDeletedHeader;
  nPosion       :Integer;
  n10           :Integer;
  dDateTime     :TDateTime;
begin
  nPosion:=nIndex * SizeOf(TAccountDBRecord) + SizeOf(TDBHeader);
  if FileSeek(m_nFileHandle,nPosion,0) = nPosion then begin
    m_nLastIndex  := nIndex;
    dDateTime     := Now();
    m_dLastDate   := dDateTime;
    n10:=FileSeek(m_nFileHandle,0,1);
    if boNew then begin
       if FileRead(m_nFileHandle,DeletedHeader,SizeOf(TRecordDeletedHeader)) = SizeOf(TRecordDeletedHeader) then begin
         if DeletedHeader.boDeleted then begin
           m_nDeletedIdx:=DeletedHeader.nNextDeletedIdx;
         end else begin
           m_nDeletedIdx:= -1;
           Result:=False;
           exit;
         end;
       end; //0045888B
       DBRecord.Header.CreateDate:=dDateTime;
    end; //004588B4
    DBRecord.Header.boDeleted    := False;
    DBRecord.Header.UpdateDate   := dDateTime;
    m_Header.nLastIndex          := m_nLastIndex;
    m_Header.dLastDate           := m_dLastDate;
    m_Header.nDeletedIdx         := m_nDeletedIdx;
    m_Header.dUpdateDate         := Now();
    FileSeek(m_nFileHandle,0,0);
    FileWrite(m_nFileHandle,m_Header,SizeOf(TDBHeader));
    FileSeek(m_nFileHandle,n10,0);
    FileWrite(m_nFileHandle,DBRecord,SizeOf(TAccountDBRecord));
    FileSeek(m_nFileHandle,-SizeOf(TAccountDBRecord),1);
    m_nLastReadIdx  := nIndex;
    m_boChanged     := True;
    Result:=True;
  end else Result:=False;
end;

function TFileIDDB.Update(nIndex: Integer;
  var DBRecord: TAccountDBRecord): Boolean;
//0x0048C14C
begin
  Result:=False;
  if nIndex < 0 then exit;
  if m_QuickList.Count <= nIndex then exit;
  if UpdateRecord(Integer(m_QuickList.Objects[nIndex]),DBRecord,False) then Result:=True;
end;

//00458ADC
function TFileIDDB.Add(var DBRecord: TAccountDBRecord): Boolean;
var
  sAccountName :String;
  DBHeader     :TDBHeader;
  nC           :Integer;
begin
  sAccountName:=DBRecord.UserEntry.sAccount;
  if m_QuickList.GetIndex(sAccountName) >= 0 then begin
    Result:=False;
  end else begin
    DBHeader:=m_Header;
    if m_nDeletedIdx = -1 then begin
      nC:=m_Header.nIDCount;
      Inc(m_Header.nIDCount);
    end else nC:= m_nDeletedIdx;
      
    if UpdateRecord(nC,DBRecord,True) then begin
      m_QuickList.AddRecord(DBRecord.UserEntry.sAccount,nC);
      Result:=True;
    end else begin
      m_Header := DBHeader;
      Result   := False;
    end;
  end;
end;


{---- Adjust global SVN revision ----}
initialization
  SVNRevision('$Id: IDDB.pas 121 2006-08-06 01:10:41Z Dataforce $');
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -