📄 humdb.pas
字号:
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;
{ 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.sChrName <> '' then begin
m_QuickList.AddObject(RecordHeader.sChrName,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
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
FillChar(m_Header,SizeOf(TDBHeader),#0);
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.sChrName;
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.sChrName,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.sChrName <> '') 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;
{---- Adjust global SVN revision ----}
initialization
SVNRevision('$Id: HumDB.pas 531 2006-12-19 13:13:36Z damian $');
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -