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

📄 humdb.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    Result := False;
end;

function TFileHumDB.FindByAccount(sAccount: string;
  var ChrList: TStringList): Integer;                       //0x0048C4DC
var
  ChrNameList                           : TList;
  QuickID                               : pTQuickID;
  i                                     : Integer;
begin
  ChrNameList := nil;
  m_QuickIDList.GetChrList(sAccount, ChrNameList);
  if ChrNameList <> nil then
  begin
    for i := 0 to ChrNameList.Count - 1 do
    begin
      QuickID := ChrNameList.Items[i];
      ChrList.AddObject(QuickID.sAccount, TObject(QuickID));
    end;
  end;
  Result := ChrList.Count;
end;

function TFileHumDB.ChrCountOfAccount(sAccount: string): Integer; //0x0048C5B0
var
  ChrList                               : TList;
  i, n18                                : Integer;
  HumDBRecord                           : THumInfo;
begin
  n18 := 0;
  ChrList := nil;
  m_QuickIDList.GetChrList(sAccount, ChrList);
  if ChrList <> nil then
  begin
    for i := 0 to ChrList.Count - 1 do
    begin
      if GetBy(pTQuickID(ChrList.Items[i]).nIndex, HumDBRecord) and
        not HumDBRecord.boDeleted then
        Inc(n18);
    end;
  end;
  Result := n18;
end;

function TFileHumDB.Add(HumRecord: THumInfo): Boolean;      //0x0048C1F4
var
  Header                                : TDBHeader;
  nIndex                                : Integer;
begin
  if m_QuickList.GetIndex(HumRecord.Header.sName) >= 0 then
    Result := False
  else
  begin
    Header := m_Header;
    if m_DeletedList.Count > 0 then
    begin
      nIndex := Integer(m_DeletedList.Items[0]);
      m_DeletedList.Delete(0);
    end
    else
    begin
      nIndex := m_Header.nHumCount;
      Inc(m_Header.nHumCount);
    end;
    if UpdateRecord(nIndex, HumRecord, True) then
    begin
      m_QuickList.AddRecord(HumRecord.Header.sName, nIndex);
      //      m_QuickIDList.AddRecord(HumRecord.sAccount,HumRecord.sChrName,nIndex,HumRecord.Header.nSelectID);
      m_QuickIDList.AddRecord(HumRecord.sAccount, HumRecord.sChrName, nIndex);
      Result := True;
    end
    else
    begin
      m_Header := Header;
      Result := False;
    end;
  end;
end;

function TFileHumDB.UpdateRecord(nIndex: Integer; HumRecord: THumInfo;
  boNew: Boolean): Boolean;                                 //0x0048BF5C
var
  HumRcd                                : THumInfo;
  nPosion, n10                          : Integer;
begin
  nPosion := nIndex * SizeOf(THumInfo) + SizeOf(TDBHeader);
  if FileSeek(m_nFileHandle, nPosion, 0) = nPosion then
  begin
    n10 := FileSeek(m_nFileHandle, 0, 1);
    if boNew and
      (FileRead(m_nFileHandle, HumRcd, SizeOf(THumInfo)) = SizeOf(THumInfo)) and
      (not HumRcd.Header.boDeleted) and (HumRcd.Header.sName <> '') then
      Result := True
    else
    begin
      HumRecord.Header.boDeleted := False;
      HumRecord.Header.dCreateDate := Now();
      m_Header.dUpdateDate := Now();
      FileSeek(m_nFileHandle, 0, 0);
      FileWrite(m_nFileHandle, m_Header, SizeOf(TDBHeader));
      FileSeek(m_nFileHandle, n10, 0);
      FileWrite(m_nFileHandle, HumRecord, SizeOf(THumInfo));
      FileSeek(m_nFileHandle, -SizeOf(THumInfo), 1);
      n4 := nIndex;
      m_boChanged := True;
      Result := True;
    end;
  end
  else
    Result := False;
end;

function TFileHumDB.Delete(sName: string): Boolean;         //0x0048BDE0
var
  n10                                   : Integer;
  HumRecord                             : THumInfo;
  ChrNameList                           : TList;
  n14                                   : Integer;
begin
  Result := False;
  n10 := m_QuickList.GetIndex(sName);
  if n10 < 0 then
    exit;
  Get(n10, HumRecord);
  if DeleteRecord(Integer(m_QuickList.Objects[n10])) then
  begin
    m_QuickList.Delete(n10);
    Result := True;
  end;
  n14 := m_QuickIDList.GetChrList(HumRecord.sAccount, ChrNameList);
  if n14 >= 0 then
  begin
    m_QuickIDList.DelRecord(n14, HumRecord.sChrName);
  end;

end;

function TFileHumDB.DeleteRecord(nIndex: Integer): Boolean; //0x0048BD58
var
  HumRcdHeader                          : TRecordHeader;
begin
  Result := False;
  if FileSeek(m_nFileHandle, nIndex * SizeOf(THumInfo) + SizeOf(TDBHeader), 0) =
    -1 then
    exit;
  HumRcdHeader.boDeleted := True;
  HumRcdHeader.dCreateDate := Now();
  FileWrite(m_nFileHandle, HumRcdHeader, SizeOf(TRecordHeader));
  m_DeletedList.Add(Pointer(nIndex));
  m_boChanged := True;
  Result := True;
end;

function TFileHumDB.Update(nIndex: Integer; var HumDBRecord: THumInfo): Boolean;  //0x0048C14C
begin
  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;

function TFileHumDB.AllChrCountOfAccount(sAccount: string): Integer;
var
  ChrList                               : TList;
  i, n18                                : Integer;
  HumDBRecord                           : THumInfo;
begin
  n18 := 0;
  ChrList := nil;
  m_QuickIDList.GetChrList(sAccount, ChrList);
  if ChrList <> nil then
  begin
    for i := 0 to ChrList.Count - 1 do
    begin
      if GetBy(pTQuickID(ChrList.Items[i]).nIndex, HumDBRecord) then
        Inc(n18);
    end;
  end;
  Result := n18;
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.sName <> '' then
            begin
              m_QuickList.AddObject(RecordHeader.sName, 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

⌨️ 快捷键说明

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