📄 humdb.pas
字号:
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 + -