📄 iddb.pas
字号:
if Result then begin
m_nLastIndex := IdxHeader.nLastIndex;
m_dLastDate := 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.sName, TObject(IdxRecord.nIndex));
end else begin
Result := False;
break;
end;
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;
var
DeletedHeader: TRecordDeletedHeader;
nPosion: Integer;
n10: Integer;
dDateTime: TDateTime;
begin
//MainOutMessage('nIndex '+IntToStr(nIndex));
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;}
DBRecord.Header.CreateDate := dDateTime;
end;
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, nPosion, 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;
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;
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;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -