📄 dbf_idxfile.pas
字号:
// *) assumes FLowerPage <> nil!
begin
FLowerPage.PageNo := GetLowerPageNo;
end;
procedure TIndexPage.SetEntryNo(value: Integer);
begin
// do not bother if no change
if value <> FEntryNo then
begin
// check if out of range
if (value < FLowIndex) then
begin
if FLowerPage = nil then
FEntryNo := FLowIndex - 1;
FEntry := FIndexFile.EntryBof;
end else if value > FHighIndex then begin
FEntryNo := FHighIndex + 1;
FEntry := FIndexFile.EntryEof;
end else begin
FEntryNo := value;
FEntry := GetEntry(value);
// sync lowerpage with entry
if (FLowerPage <> nil) then
SyncLowerPage;
end;
end;
end;
function TIndexPage.PhysicalRecNo: Integer;
var
entryRec: Integer;
begin
// get num entries
entryRec := GetRecNo;
// check if in range
if (FEntryNo >= FLowIndex) and (FEntryNo <= FHighIndex) then
Result := entryRec
else
Result := -1;
end;
function TIndexPage.RecurPrev: Boolean;
begin
EntryNo := EntryNo - 1;
Result := Entry <> FIndexFile.EntryBof;
if Result then
begin
if FLowerPage <> nil then
begin
FLowerPage.RecurLast;
end;
end else begin
if FUpperPage<>nil then
begin
Result := FUpperPage.RecurPrev;
end;
end;
end;
function TIndexPage.RecurNext: Boolean;
begin
EntryNo := EntryNo + 1;
Result := Entry <> FIndexFile.EntryEof;
if Result then
begin
if FLowerPage <> nil then
begin
FLowerPage.RecurFirst;
end;
end else begin
if FUpperPage<>nil then
begin
Result := FUpperPage.RecurNext;
end;
end;
end;
procedure TIndexPage.RecurFirst;
begin
EntryNo := FLowIndex;
if (FLowerPage<>nil) then
FLowerPage.RecurFirst;
end;
procedure TIndexPage.RecurLast;
begin
EntryNo := FHighIndex;
if (FLowerPage<>nil) then
FLowerPage.RecurLast;
end;
procedure TIndexPage.SaveBracket;
begin
FLowPageTemp := FLowPage;
FHighPageTemp := FHighPage;
end;
procedure TIndexPage.RestoreBracket;
begin
FLowPage := FLowPageTemp;
FHighPage := FHighPageTemp;
end;
//==============================================================================
//============ Mdx specific access routines
//==============================================================================
function TMdxPage.GetEntry(AEntryNo: Integer): Pointer;
begin
// get base + offset
Result := PChar(@PMdxPage(PageBuffer)^.FirstEntry) + (SwapWordLE(PIndexHdr(
IndexFile.IndexHeader)^.KeyRecLen) * AEntryNo);
end;
function TMdxPage.GetLowerPageNo: Integer;
// *) assumes LowerPage <> nil
begin
// if LowerPage = nil then
// Result := 0
// else
Result := SwapIntLE(PMdxEntry(Entry)^.RecBlockNo);
end;
function TMdxPage.GetKeyData: PChar;
begin
Result := @PMdxEntry(Entry)^.KeyData;
end;
function TMdxPage.GetNumEntries: Integer;
begin
Result := SwapWordLE(PMdxPage(PageBuffer)^.NumEntries);
end;
function TMdxPage.GetKeyDataFromEntry(AEntry: Integer): PChar;
begin
Result := @PMdxEntry(GetEntry(AEntry))^.KeyData;
end;
function TMdxPage.GetRecNo: Integer;
begin
Result := SwapIntLE(PMdxEntry(Entry)^.RecBlockNo);
end;
procedure TMdxPage.SetNumEntries(NewNum: Integer);
begin
PMdxPage(PageBuffer)^.NumEntries := SwapIntLE(NewNum);
end;
procedure TMdxPage.IncNumEntries;
begin
IncIntLE(PMdxPage(PageBuffer)^.NumEntries, 1);
end;
procedure TMdxPage.SetRecLowerPageNo(NewRecNo, NewPageNo: Integer);
begin
if FLowerPage = nil then
PMdxEntry(Entry)^.RecBlockNo := SwapIntLE(NewRecNo)
else
PMdxEntry(Entry)^.RecBlockNo := SwapIntLE(NewPageNo);
end;
procedure TMdxPage.SetRecLowerPageNoOfEntry(AEntry, NewRecNo, NewPageNo: Integer);
begin
if FLowerPage = nil then
PMdxEntry(GetEntry(AEntry))^.RecBlockNo := SwapIntLE(NewRecNo)
else
PMdxEntry(GetEntry(AEntry))^.RecBlockNo := SwapIntLE(NewPageNo);
end;
{$ifdef TDBF_UPDATE_FIRST_LAST_NODE}
procedure TMdxPage.SetPrevBlock(NewBlock: Integer);
begin
PMdxPage(PageBuffer)^.PrevBlock := SwapIntLE(NewBlock);
end;
{$endif}
//==============================================================================
//============ Ndx specific access routines
//==============================================================================
function TNdxPage.GetEntry(AEntryNo: Integer): Pointer;
begin
// get base + offset
Result := PChar(@PNdxPage(PageBuffer)^.FirstEntry) +
(SwapWordLE(PIndexHdr(FIndexFile.IndexHeader)^.KeyRecLen) * AEntryNo);
end;
function TNdxPage.GetLowerPageNo: Integer;
// *) assumes LowerPage <> nil
begin
// if LowerPage = nil then
// Result := 0
// else
Result := SwapIntLE(PNdxEntry(Entry)^.LowerPageNo)
end;
function TNdxPage.GetRecNo: Integer;
begin
Result := SwapIntLE(PNdxEntry(Entry)^.RecNo);
end;
function TNdxPage.GetKeyData: PChar;
begin
Result := @PNdxEntry(Entry)^.KeyData;
end;
function TNdxPage.GetKeyDataFromEntry(AEntry: Integer): PChar;
begin
Result := @PNdxEntry(GetEntry(AEntry))^.KeyData;
end;
function TNdxPage.GetNumEntries: Integer;
begin
Result := SwapIntLE(PNdxPage(PageBuffer)^.NumEntries);
end;
procedure TNdxPage.IncNumEntries;
begin
IncIntLE(PNdxPage(PageBuffer)^.NumEntries, 1);
end;
procedure TNdxPage.SetNumEntries(NewNum: Integer);
begin
PNdxPage(PageBuffer)^.NumEntries := SwapIntLE(NewNum);
end;
procedure TNdxPage.SetRecLowerPageNo(NewRecNo, NewPageNo: Integer);
begin
PNdxEntry(Entry)^.RecNo := SwapIntLE(NewRecNo);
PNdxEntry(Entry)^.LowerPageNo := SwapIntLE(NewPageNo);
end;
procedure TNdxPage.SetRecLowerPageNoOfEntry(AEntry, NewRecNo, NewPageNo: Integer);
begin
PNdxEntry(GetEntry(AEntry))^.RecNo := SwapIntLE(NewRecNo);
PNdxEntry(GetEntry(AEntry))^.LowerPageNo := SwapIntLE(NewPageNo);
end;
//==============================================================================
//============ MDX version 4 header access routines
//==============================================================================
function TMdx4Tag.GetHeaderPageNo: Integer;
begin
Result := SwapIntLE(PMdx4Tag(Tag)^.HeaderPageNo);
end;
function TMdx4Tag.GetTagName: string;
begin
Result := PMdx4Tag(Tag)^.TagName;
end;
function TMdx4Tag.GetKeyFormat: Byte;
begin
Result := PMdx4Tag(Tag)^.KeyFormat;
end;
function TMdx4Tag.GetForwardTag1: Byte;
begin
Result := PMdx4Tag(Tag)^.ForwardTag1;
end;
function TMdx4Tag.GetForwardTag2: Byte;
begin
Result := PMdx4Tag(Tag)^.ForwardTag2;
end;
function TMdx4Tag.GetBackwardTag: Byte;
begin
Result := PMdx4Tag(Tag)^.BackwardTag;
end;
function TMdx4Tag.GetReserved: Byte;
begin
Result := PMdx4Tag(Tag)^.Reserved;
end;
function TMdx4Tag.GetKeyType: Char;
begin
Result := PMdx4Tag(Tag)^.KeyType;
end;
procedure TMdx4Tag.SetHeaderPageNo(NewPageNo: Integer);
begin
PMdx4Tag(Tag)^.HeaderPageNo := SwapIntLE(NewPageNo);
end;
procedure TMdx4Tag.SetTagName(NewName: string);
begin
StrPLCopy(PMdx4Tag(Tag)^.TagName, NewName, 10);
PMdx4Tag(Tag)^.TagName[10] := #0;
end;
procedure TMdx4Tag.SetKeyFormat(NewFormat: Byte);
begin
PMdx4Tag(Tag)^.KeyFormat := NewFormat;
end;
procedure TMdx4Tag.SetForwardTag1(NewTag: Byte);
begin
PMdx4Tag(Tag)^.ForwardTag1 := NewTag;
end;
procedure TMdx4Tag.SetForwardTag2(NewTag: Byte);
begin
PMdx4Tag(Tag)^.ForwardTag2 := NewTag;
end;
procedure TMdx4Tag.SetBackwardTag(NewTag: Byte);
begin
PMdx4Tag(Tag)^.BackwardTag := NewTag;
end;
procedure TMdx4Tag.SetReserved(NewReserved: Byte);
begin
PMdx4Tag(Tag)^.Reserved := NewReserved;
end;
procedure TMdx4Tag.SetKeyType(NewType: Char);
begin
PMdx4Tag(Tag)^.KeyType := NewType;
end;
//==============================================================================
//============ MDX version 7 headertag access routines
//==============================================================================
function TMdx7Tag.GetHeaderPageNo: Integer;
begin
Result := SwapIntLE(PMdx7Tag(Tag)^.HeaderPageNo);
end;
function TMdx7Tag.GetTagName: string;
begin
Result := PMdx7Tag(Tag)^.TagName;
end;
function TMdx7Tag.GetKeyFormat: Byte;
begin
Result := PMdx7Tag(Tag)^.KeyFormat;
end;
function TMdx7Tag.GetForwardTag1: Byte;
begin
Result := PMdx7Tag(Tag)^.ForwardTag1;
end;
function TMdx7Tag.GetForwardTag2: Byte;
begin
Result := PMdx7Tag(Tag)^.ForwardTag2;
end;
function TMdx7Tag.GetBackwardTag: Byte;
begin
Result := PMdx7Tag(Tag)^.BackwardTag;
end;
function TMdx7Tag.GetReserved: Byte;
begin
Result := PMdx7Tag(Tag)^.Reserved;
end;
function TMdx7Tag.GetKeyType: Char;
begin
Result := PMdx7Tag(Tag)^.KeyType;
end;
procedure TMdx7Tag.SetHeaderPageNo(NewPageNo: Integer);
begin
PMdx7Tag(Tag)^.HeaderPageNo := SwapIntLE(NewPageNo);
end;
procedure TMdx7Tag.SetTagName(NewName: string);
begin
StrPLCopy(PMdx7Tag(Tag)^.TagName, NewName, 32);
PMdx7Tag(Tag)^.TagName[32] := #0;
end;
procedure TMdx7Tag.SetKeyFormat(NewFormat: Byte);
begin
PMdx7Tag(Tag)^.KeyFormat := NewFormat;
end;
procedure TMdx7Tag.SetForwardTag1(NewTag: Byte);
begin
PMdx7Tag(Tag)^.ForwardTag1 := NewTag;
end;
procedure TMdx7Tag.SetForwardTag2(NewTag: Byte);
begin
PMdx7Tag(Tag)^.ForwardTag2 := NewTag;
end;
procedure TMdx7Tag.SetBackwardTag(NewTag: Byte);
begin
PMdx7Tag(Tag)^.BackwardTag := NewTag;
end;
procedure TMdx7Tag.SetReserved(NewReserved: Byte);
begin
PMdx7Tag(Tag)^.Reserved := NewReserved;
end;
procedure TMdx7Tag.SetKeyType(NewType: Char);
begin
PMdx7Tag(Tag)^.KeyType := NewType;
end;
{ TDbfIndexParser }
procedure TDbfIndexParser.ValidateExpression(AExpression: string);
var
TempBuffer: pchar;
begin
FResultLen := inherited ResultLen;
if FResultLen = -1 then
begin
// make empty record
GetMem(TempBuffer, TDbfFile(DbfFile).RecordSize);
try
TDbfFile(DbfFile).InitRecord(TempBuffer);
FResultLen := StrLen(ExtractFromBuffer(TempBuffer));
finally
FreeMem(TempBuffer);
end;
end;
// check if expression not too long
if FResultLen > 100 then
raise EDbfError.CreateFmt(STRING_INDEX_EXPRESSION_TOO_LONG, [AExpression, FResultLen]);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -