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