📄 iddb.pas
字号:
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;//0x0048BF5C
var
DeletedHeader :TRecordDeletedHeader;
nPosion :Integer;
n10 :Integer;
dDateTime :TDateTime;
begin
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; //0045888B
DBRecord.Header.CreateDate:=dDateTime;
end; //004588B4
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,n10,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;
//0x0048C14C
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;
//00458ADC
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;
{---- Adjust global SVN revision ----}
initialization
SVNRevision('$Id: IDDB.pas 121 2006-08-06 01:10:41Z Dataforce $');
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -