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

📄 humdb.pas

📁 2009最新 传奇汉化0599代码 传奇汉化
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  Result:=False;
  if nIndex < 0 then exit;
  if m_QuickList.Count <= nIndex then exit;
  if UpdateRecord(Integer(m_QuickList.Objects[nIndex]),HumDBRecord,False) then Result:=True;
end;



function TFileHumDB.UpdateBy(nIndex: Integer;  var HumDBRecord: THumInfo): Boolean;//00048C1B4
begin
  Result:=False;
  if UpdateRecord(nIndex,HumDBRecord,False) then Result:=True;    
end;

{ TFileDB }



constructor TFileDB.Create(sFileName: String);//0x0048A0F4
begin
  n4            := 0;
  boDataDBReady := False;
  m_sDBFileName := sFileName;
  m_sIdxFileName:= sFileName + '.idx';
  m_QuickList   := TQuickList.Create;
  m_DeletedList := TList.Create;
  n4ADAE4       := 0;
  n4ADAF0       := 0;
  m_nLastIndex  := -1;
  if LoadDBIndex then boDataDBReady:=True
  else LoadQuickList();
end;
destructor TFileDB.Destroy;
begin
  if boDataDBReady then SaveIndex();
    
  m_QuickList.Free;
  m_DeletedList.Free;
  inherited;
end;
function TFileDB.LoadDBIndex: Boolean;//0x0048AA6C
var
  nIdxFileHandle :Integer;
  IdxHeader      :TIdxHeader;
  DBHeader       :TDBHeader;
  IdxRecord      :TIdxRecord;
  HumRecord      :THumDataInfo;
  I              :Integer;
  n14            :Integer;
begin
  Result:=False;
  nIdxFileHandle:=0;
  FillChar(IdxHeader,SizeOf(TIdxHeader),#0);
  if FileExists(m_sIdxFileName) then
    nIdxFileHandle:=FileOpen(m_sIdxFileName,fmOpenReadWrite or fmShareDenyNone);
  if nIdxFileHandle > 0 then begin
    Result:=True;
    FileRead(nIdxFileHandle,IdxHeader,SizeOf(TIdxHeader));

    try
      if Open then begin
        FileSeek(m_nFileHandle,0,0);
        if FileRead(m_nFileHandle,DBHeader,SizeOf(TDBHeader)) = SizeOf(TDBHeader) then begin
          if IdxHeader.nHumCount <> DBHeader.nHumCount then
            Result:=False;
          if IdxHeader.sDesc <> sDBIdxHeaderDesc then
            Result:=False;
        end;//0x0048AB65
        if IdxHeader.nLastIndex <> DBHeader.nLastIndex then begin
          Result:=False;
        end;
        if IdxHeader.nLastIndex > -1 then begin
          FileSeek(m_nFileHandle,IdxHeader.nLastIndex * SizeOf(THumDataInfo) + SizeOf(TDBHeader),0);
          if FileRead(m_nFileHandle,HumRecord,SizeOf(THumDataInfo)) = SizeOf(THumDataInfo) then
            if IdxHeader.dUpdateDate <> HumRecord.Header.dCreateDate then
              Result:=False;
        end;
      end; //0x0048ABD7
    finally
      Close();
    end;
    if Result then begin
      m_nLastIndex:=IdxHeader.nLastIndex;
      m_dUpdateTime:=IdxHeader.dUpdateDate;
      for i:=0 to IdxHeader.nQuickCount -1 do begin
        if FileRead(nIdxFileHandle,IdxRecord,SizeOf(TIdxRecord)) = SizeOf(TIdxRecord) then begin
          m_QuickList.AddObject(IdxRecord.sChrName,TObject(IdxRecord.nIndex));
        end else begin
          Result:=False;
          break;
        end;
      end; //0048AC7A
      for i:=0 to IdxHeader.nDeleteCount -1 do begin
        if FileRead(nIdxFileHandle,n14,SizeOf(Integer)) = SizeOf(Integer) then
          m_DeletedList.Add(Pointer(n14))
        else begin
          Result:=False;
          break;
        end;
      end;
    end; //0048ACC5
    FileClose(nIdxFileHandle);
  end; //0048ACCD
  if Result then begin
    n4ADAE4:=m_QuickList.Count;
    n4ADAE8:=m_QuickList.Count;
    n4ADAF0:=DBHeader.nHumCount;
    m_QuickList.SortString(0,m_QuickList.Count -1);
  end else m_QuickList.Clear;
end;

procedure TFileDB.LoadQuickList;//0x0048A440
var
  nIndex       :Integer;
  DBHeader     :TDBHeader;
  RecordHeader :TRecordHeader;
begin
  n4:=0;
  m_QuickList.Clear;
  m_DeletedList.Clear;
  n4ADAE4:=0;
  n4ADAE8:=0;
  n4ADAF0:=0;
  try
    if Open then begin
      FileSeek(m_nFileHandle,0,0);
      if FileRead(m_nFileHandle,DBHeader,SizeOf(TDBHeader)) = SizeOf(TDBHeader) then begin
        n4ADAF0:=DBHeader.nHumCount;
        for nIndex:=0 to DBHeader.nHumCount - 1 do begin
          Inc(n4ADAE4);
          if FileSeek(m_nFileHandle,nIndex * SizeOf(THumDataInfo) + SizeOf(TDBHeader),0) = -1 then break;
          if FileRead(m_nFileHandle,RecordHeader,SizeOf(TRecordHeader)) <> SizeOf(TRecordHeader) then break;
          if not RecordHeader.boDeleted then begin
            if RecordHeader.sChrName <> '' then begin
              m_QuickList.AddObject(RecordHeader.sChrName,TObject(nIndex));
              Inc(n4ADAE8);
            end else m_DeletedList.Add(TObject(nIndex));
          end else begin
            m_DeletedList.Add(TObject(nIndex));
            Inc(n4ADAEC);
          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_dUpdateTime:=m_Header.dLastDate;
  boDataDBReady:=True;
end;

procedure TFileDB.Lock;//00048A254
begin
  EnterCriticalSection(HumDB_CS);
end;
procedure TFileDB.UnLock;//0048A268
begin
  LeaveCriticalSection(HumDB_CS);
end;

function TFileDB.Open: Boolean;//0048A304
begin
  Lock();
  n4:=0;
  m_boChanged:=False;
  if FileExists(m_sDBFileName) then begin
    m_nFileHandle:=FileOpen(m_sDBFileName,fmOpenReadWrite or fmShareDenyNone);
    if m_nFileHandle > 0 then
      FileRead(m_nFileHandle,m_Header,SizeOf(TDBHeader));
  end else begin //0048B999
    m_nFileHandle:=FileCreate(m_sDBFileName);
    if m_nFileHandle > 0 then begin
      FillChar(m_Header,SizeOf(TDBHeader),#0);
      m_Header.sDesc:= sDBHeaderDesc;
      m_Header.nHumCount:=0;
      m_Header.n6C:=0;
      FileWrite(m_nFileHandle,m_Header,SizeOf(TDBHeader));
    end;
  end;
  if m_nFileHandle > 0 then Result:=True
  else Result:=False;
end;

procedure TFileDB.Close;//0x0048A400
begin
  FileClose(m_nFileHandle);
  if m_boChanged and Assigned(m_OnChange) then begin
    m_OnChange(Self);
  end;
  UnLock();
end;


function TFileDB.OpenEx: Boolean;//0x0048A27C
var
  DBHeader:TDBHeader;
begin
  Lock();
  m_boChanged:=False;
  m_nFileHandle:=FileOpen(m_sDBFileName,fmOpenReadWrite or fmShareDenyNone);
  if m_nFileHandle > 0 then begin
    Result:=True;
    if FileRead(m_nFileHandle,DBHeader,SizeOf(TDBHeader)) = SizeOf(TDBHeader) then
      m_Header:=DBHeader;
    n4:=0;
  end else Result:=False;
end;

function TFileDB.Index(sName: String): Integer;//0x0048B534
begin
  Result:=m_QuickList.GetIndex(sName);
end;

function TFileDB.Get(nIndex: Integer; var HumanRCD: THumDataInfo):Integer;//0x0048B320
var
  nIdx:Integer;
begin
  nIdx:=Integer(m_QuickList.Objects[nIndex]);
  if GetRecord(nIdx,HumanRCD) then Result:=nIdx
  else Result:= -1;
end;

function TFileDB.Update(nIndex: Integer;
  var HumanRCD: THumDataInfo): Boolean;//0x0048B36C
begin
  Result:=False;
  if (nIndex >= 0) and (m_QuickList.Count > nIndex) then
    if UpdateRecord(Integer(m_QuickList.Objects[nIndex]),HumanRCD,False) then Result:=True;
end;

function TFileDB.Add(var HumanRCD: THumDataInfo): Boolean;//0x0048B3E0
var
  sHumanName :String;
  DBHeader   :TDBHeader;
  nIdx       :Integer;
begin
  sHumanName:=HumanRCD.Header.sChrName;
  if m_QuickList.GetIndex(sHumanName) >= 0 then begin
    Result:=False;
  end else begin
    DBHeader:=m_Header;
    if m_DeletedList.Count > 0 then begin
      nIdx:=Integer(m_DeletedList.Items[0]);
      m_DeletedList.Delete(0);
    end else begin
      nIdx:=m_Header.nHumCount;
      Inc(m_Header.nHumCount);
    end;
    if UpdateRecord(nIdx,HumanRCD,True) then begin
      m_QuickList.AddRecord(HumanRCD.Header.sChrName,nIdx);
      Result:=True;
    end else begin
      m_Header:=DBHeader;
      Result:=False;
    end;
  end;
end;

function TFileDB.GetRecord(nIndex: Integer;
  var HumanRCD: THumDataInfo): Boolean;//0x0048B0C8
begin
  if FileSeek(m_nFileHandle,nIndex * SizeOf(THumDataInfo) + SizeOf(TDBHeader),0) <> -1 then begin
    FileRead(m_nFileHandle,HumanRCD,SizeOf(THumDataInfo));
    FileSeek(m_nFileHandle,-SizeOf(THumDataInfo),1);
    n4:=nIndex;
    Result:=True;
  end else Result:=False;
end;

function TFileDB.UpdateRecord(nIndex: Integer;
  var HumanRCD: THumDataInfo;boNew:Boolean): Boolean;//0x0048B134
var
  nPosion,n10:Integer;
  dt20     :TDateTime;
  ReadRCD  :THumDataInfo;
begin
  nPosion:=nIndex * SizeOf(THumDataInfo) + SizeOf(TDBHeader);
  if FileSeek(m_nFileHandle,nPosion,0) = nPosion then begin
    dt20:=Now();
    m_nLastIndex:=nIndex;
    m_dUpdateTime:=dt20;
    n10:=FileSeek(m_nFileHandle,0,1);
    if boNew
       and (FileRead(m_nFileHandle,ReadRCD,SizeOf(THumDataInfo)) = SizeOf(THumDataInfo))
       and not ReadRCD.Header.boDeleted and (ReadRCD.Header.sChrName <> '') then begin
      Result:=False;
    end else begin //0048B1F5
      HumanRCD.Header.boDeleted   :=False;
      HumanRCD.Header.dCreateDate :=Now();
      m_Header.nLastIndex         :=m_nLastIndex;
      m_Header.dLastDate          :=m_dUpdateTime;
      m_Header.dUpdateDate        :=Now();
      FileSeek(m_nFileHandle,0,0);
      FileWrite(m_nFileHandle,m_Header,SizeOf(TDBHeader));
      FileSeek(m_nFileHandle,n10,0);
      FileWrite(m_nFileHandle,HumanRCD,SizeOf(THumDataInfo));
      FileSeek(m_nFileHandle,-SizeOf(THumDataInfo),1);
      n4:=nIndex;
      m_boChanged:=True;
      Result:=True;
    end;
  end else Result:=False;
end;



function TFileDB.Find(sChrName: String;
  List: TStrings): Integer;//0x0048B590
var
  I: Integer;
begin
  for I := 0 to m_QuickList.Count - 1 do begin
    if CompareLStr(m_QuickList.Strings[i],sChrName,length(sChrName)) then begin
      List.AddObject(m_QuickList.Strings[i],m_QuickList.Objects[i]);
    end;
  end;
  Result:=List.Count;  
end;

function TFileDB.Delete(nIndex: Integer): Boolean;//0x0048AF4C
var
  I: Integer;
  s14:String;
begin
  Result:=False;
  for I := 0 to m_QuickList.Count - 1 do begin
    if Integer(m_QuickList.Objects[i]) = nIndex then begin
      s14:=m_QuickList.Strings[i];
      if DeleteRecord(nIndex) then begin
        m_QuickList.Delete(i);
        Result:=True;
        break;
      end;
    end;
  end;
end;

function TFileDB.DeleteRecord(nIndex: Integer): Boolean;//0x0048AD8C
var
  ChrRecordHeader:TRecordHeader;
begin
  Result:=False;
  if FileSeek(m_nFileHandle,nIndex * SizeOf(THumDataInfo) + SizeOf(TDBHeader),0) = -1 then exit;
  m_nLastIndex                :=nIndex;
  m_dUpdateTime               :=Now();
  ChrRecordHeader.boDeleted   :=True;
  ChrRecordHeader.dCreateDate :=Now();
  FileWrite(m_nFileHandle,ChrRecordHeader,SizeOf(TRecordHeader));
  m_DeletedList.Add(Pointer(nIndex));
  m_Header.nLastIndex           :=m_nLastIndex;
  m_Header.dLastDate            :=m_dUpdateTime;
  m_Header.dUpdateDate          :=Now();
  FileSeek(m_nFileHandle,0,0);
  FileWrite(m_nFileHandle,m_Header,SizeOf(TDBHeader));
  m_boChanged:=True;
  Result:=True;
end;

procedure TFileDB.Rebuild;//0x0048A688
var
  sTempFileName:String;
  nHandle,n10:Integer;
  DBHeader:TDBHeader;
  ChrRecord:THumDataInfo;
begin
  sTempFileName:='Mir#$00.DB';
  if FileExists(sTempFileName) then
    DeleteFile(sTempFileName);
  nHandle:=FileCreate(sTempFileName);
  n10:=0;
  if nHandle < 0 then exit;
  try
    if Open then begin
      FileSeek(m_nFileHandle,0,0);
      if FileRead(m_nFileHandle,DBHeader,SizeOf(TDBHeader)) = SizeOf(TDBHeader) then begin
        FileWrite(nHandle,DBHeader,SizeOf(TDBHeader));
        while(True) do begin
          if FileRead(m_nFileHandle,ChrRecord,SizeOf(THumDataInfo)) = SizeOf(THumDataInfo) then begin
            if ChrRecord.Header.boDeleted then Continue;
            FileWrite(nHandle,ChrRecord,SizeOf(THumDataInfo));
            Inc(n10);
          end else break;
        end;
        DBHeader.nHumCount:=n10;
        DBHeader.dUpdateDate:=Now();
        FileSeek(nHandle,0,0);
        FileWrite(nHandle,DBHeader,SizeOf(TDBHeader));
      end;
    end;
  finally
    Close;
  end;
  FileClose(nHandle);
  FileCopy(sTempFileName,m_sDBFileName);
  DeleteFile(sTempFileName);
end;

function TFileDB.Count: Integer;
begin
  Result:=m_QuickList.Count;
end;

function TFileDB.Delete(sChrName: String): Boolean;//0x0048AEB4
var
  n10:Integer;
begin
  Result:=False;
  n10:=m_QuickList.GetIndex(sChrName);
  if n10 < 0 then exit;
  if DeleteRecord(Integer(m_QuickList.Objects[n10])) then begin
    m_QuickList.Delete(n10);
    Result:=True;
  end;    
end;



procedure TFileDB.SaveIndex;//0x0048A83C
var
  IdxHeader      :TIdxHeader;
  nIdxFileHandle :Integer;
  I              :Integer;
  nDeletedIdx    :Integer;
  IdxRecord      :TIdxRecord;
begin
  FillChar(IdxHeader,SizeOf(TIdxHeader),#0);
  IdxHeader.sDesc        := sDBIdxHeaderDesc;
  IdxHeader.nQuickCount  := m_QuickList.Count;
  IdxHeader.nHumCount    := m_Header.nHumCount;
  IdxHeader.nDeleteCount := m_DeletedList.Count;
  IdxHeader.nLastIndex   := m_nLastIndex;
  IdxHeader.dUpdateDate  := m_dUpdateTime;
  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
      IdxRecord.sChrName:=m_QuickList.Strings[I];
      IdxRecord.nIndex:=Integer(m_QuickList.Objects[I]);
      FileWrite(nIdxFileHandle,IdxRecord,SizeOf(TIdxRecord));
    end;
    for I := 0 to  m_DeletedList.Count - 1 do begin
      nDeletedIdx:=Integer(m_DeletedList.Items[I]);
      FileWrite(nIdxFileHandle,nDeletedIdx,SizeOf(Integer));
    end;
    FileClose(nIdxFileHandle);
  end;
end;


{---- Adjust global SVN revision ----}
initialization
  SVNRevision('$Id: HumDB.pas 531 2006-12-19 13:13:36Z damian $');
end.

⌨️ 快捷键说明

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