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

📄 humdb.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    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
      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.sName;
  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.sName, 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.sName <> '') 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;

end.

⌨️ 快捷键说明

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