|
@@ -106,9 +106,11 @@ type
|
|
FLowBracket: Integer; // = FLowIndex if FPageNo = FLowPage
|
|
FLowBracket: Integer; // = FLowIndex if FPageNo = FLowPage
|
|
FLowIndex: Integer;
|
|
FLowIndex: Integer;
|
|
FLowPage: Integer;
|
|
FLowPage: Integer;
|
|
|
|
+ FLowPageTemp: Integer;
|
|
FHighBracket: Integer; // = FHighIndex if FPageNo = FHighPage
|
|
FHighBracket: Integer; // = FHighIndex if FPageNo = FHighPage
|
|
FHighIndex: Integer;
|
|
FHighIndex: Integer;
|
|
FHighPage: Integer;
|
|
FHighPage: Integer;
|
|
|
|
+ FHighPageTemp: Integer;
|
|
|
|
|
|
procedure LocalInsert(RecNo: Integer; Buffer: PChar; LowerPageNo: Integer);
|
|
procedure LocalInsert(RecNo: Integer; Buffer: PChar; LowerPageNo: Integer);
|
|
procedure LocalDelete;
|
|
procedure LocalDelete;
|
|
@@ -164,6 +166,8 @@ type
|
|
procedure RecalcWeight;
|
|
procedure RecalcWeight;
|
|
procedure UpdateWeight;
|
|
procedure UpdateWeight;
|
|
procedure Flush;
|
|
procedure Flush;
|
|
|
|
+ procedure SaveBracket;
|
|
|
|
+ procedure RestoreBracket;
|
|
|
|
|
|
property Key: PChar read GetKeyData;
|
|
property Key: PChar read GetKeyData;
|
|
property Entry: Pointer read FEntry;
|
|
property Entry: Pointer read FEntry;
|
|
@@ -224,6 +228,7 @@ type
|
|
{$endif}
|
|
{$endif}
|
|
protected
|
|
protected
|
|
FIndexName: string;
|
|
FIndexName: string;
|
|
|
|
+ FLastError: string;
|
|
FParsers: array[0..MaxIndexes-1] of TDbfIndexParser;
|
|
FParsers: array[0..MaxIndexes-1] of TDbfIndexParser;
|
|
FIndexHeaders: array[0..MaxIndexes-1] of Pointer;
|
|
FIndexHeaders: array[0..MaxIndexes-1] of Pointer;
|
|
FIndexHeaderModified: array[0..MaxIndexes-1] of Boolean;
|
|
FIndexHeaderModified: array[0..MaxIndexes-1] of Boolean;
|
|
@@ -242,6 +247,7 @@ type
|
|
FTagOffset: Integer;
|
|
FTagOffset: Integer;
|
|
FHeaderPageNo: Integer;
|
|
FHeaderPageNo: Integer;
|
|
FSelectedIndex: Integer;
|
|
FSelectedIndex: Integer;
|
|
|
|
+ FRangeIndex: Integer;
|
|
FIsDescending: Boolean;
|
|
FIsDescending: Boolean;
|
|
FUniqueMode: TIndexUniqueType;
|
|
FUniqueMode: TIndexUniqueType;
|
|
FModifyMode: TIndexModifyMode;
|
|
FModifyMode: TIndexModifyMode;
|
|
@@ -270,6 +276,7 @@ type
|
|
function GetNewPageNo: Integer;
|
|
function GetNewPageNo: Integer;
|
|
procedure TouchHeader(AHeader: Pointer);
|
|
procedure TouchHeader(AHeader: Pointer);
|
|
function CreateTempFile(BaseName: string): TPagedFile;
|
|
function CreateTempFile(BaseName: string): TPagedFile;
|
|
|
|
+ procedure ConstructInsertErrorMsg;
|
|
procedure WriteIndexHeader(AIndex: Integer);
|
|
procedure WriteIndexHeader(AIndex: Integer);
|
|
procedure SelectIndexVars(AIndex: Integer);
|
|
procedure SelectIndexVars(AIndex: Integer);
|
|
procedure CalcKeyProperties;
|
|
procedure CalcKeyProperties;
|
|
@@ -278,11 +285,12 @@ type
|
|
function CalcTagOffset(AIndex: Integer): Pointer;
|
|
function CalcTagOffset(AIndex: Integer): Pointer;
|
|
|
|
|
|
function FindKey(AInsert: boolean): Integer;
|
|
function FindKey(AInsert: boolean): Integer;
|
|
- procedure InsertKey(Buffer: PChar);
|
|
|
|
|
|
+ function InsertKey(Buffer: PChar): Boolean;
|
|
procedure DeleteKey(Buffer: PChar);
|
|
procedure DeleteKey(Buffer: PChar);
|
|
- procedure InsertCurrent;
|
|
|
|
|
|
+ function InsertCurrent: Boolean;
|
|
procedure DeleteCurrent;
|
|
procedure DeleteCurrent;
|
|
- procedure UpdateCurrent(PrevBuffer, NewBuffer: PChar);
|
|
|
|
|
|
+ function UpdateCurrent(PrevBuffer, NewBuffer: PChar): Boolean;
|
|
|
|
+ function UpdateIndex(Index: Integer; PrevBuffer, NewBuffer: PChar): Boolean;
|
|
procedure ReadIndexes;
|
|
procedure ReadIndexes;
|
|
procedure Resync(Relative: boolean);
|
|
procedure Resync(Relative: boolean);
|
|
procedure ResyncRoot;
|
|
procedure ResyncRoot;
|
|
@@ -329,12 +337,12 @@ type
|
|
procedure AddNewLevel;
|
|
procedure AddNewLevel;
|
|
procedure UnlockHeader;
|
|
procedure UnlockHeader;
|
|
procedure InsertError;
|
|
procedure InsertError;
|
|
- procedure Insert(RecNo: Integer; Buffer: PChar);
|
|
|
|
- procedure Update(RecNo: Integer; PrevBuffer, NewBuffer: PChar);
|
|
|
|
|
|
+ function Insert(RecNo: Integer; Buffer: PChar): Boolean;
|
|
|
|
+ function Update(RecNo: Integer; PrevBuffer, NewBuffer: PChar): Boolean;
|
|
procedure Delete(RecNo: Integer; Buffer: PChar);
|
|
procedure Delete(RecNo: Integer; Buffer: PChar);
|
|
function CheckKeyViolation(Buffer: PChar): Boolean;
|
|
function CheckKeyViolation(Buffer: PChar): Boolean;
|
|
procedure RecordDeleted(RecNo: Integer; Buffer: PChar);
|
|
procedure RecordDeleted(RecNo: Integer; Buffer: PChar);
|
|
- procedure RecordRecalled(RecNo: Integer; Buffer: PChar);
|
|
|
|
|
|
+ function RecordRecalled(RecNo: Integer; Buffer: PChar): Boolean;
|
|
procedure DeleteIndex(const AIndexName: string);
|
|
procedure DeleteIndex(const AIndexName: string);
|
|
procedure RepageFile;
|
|
procedure RepageFile;
|
|
procedure CompactFile;
|
|
procedure CompactFile;
|
|
@@ -345,6 +353,8 @@ type
|
|
function SearchKey(Key: PChar; SearchType: TSearchKeyType): Boolean;
|
|
function SearchKey(Key: PChar; SearchType: TSearchKeyType): Boolean;
|
|
function Find(RecNo: Integer; Buffer: PChar): Integer;
|
|
function Find(RecNo: Integer; Buffer: PChar): Integer;
|
|
function IndexOf(const AIndexName: string): Integer;
|
|
function IndexOf(const AIndexName: string): Integer;
|
|
|
|
+ procedure DisableRange;
|
|
|
|
+ procedure EnableRange;
|
|
|
|
|
|
procedure GetIndexNames(const AList: TStrings);
|
|
procedure GetIndexNames(const AList: TStrings);
|
|
procedure GetIndexInfo(const AIndexName: string; IndexDef: TDbfIndexDef);
|
|
procedure GetIndexInfo(const AIndexName: string; IndexDef: TDbfIndexDef);
|
|
@@ -633,7 +643,7 @@ end;
|
|
|
|
|
|
procedure IncIntLE(var AVariable: Integer; Amount: Integer);
|
|
procedure IncIntLE(var AVariable: Integer; Amount: Integer);
|
|
begin
|
|
begin
|
|
- AVariable := SwapIntLE(SwapIntLE(AVariable) + Amount);
|
|
|
|
|
|
+ AVariable := SwapIntLE(DWord(Integer(SwapIntLE(AVariable)) + Amount));
|
|
end;
|
|
end;
|
|
|
|
|
|
//==========================================================
|
|
//==========================================================
|
|
@@ -656,9 +666,8 @@ begin
|
|
EnumSystemLocales(@LocaleCallBack, LCID_SUPPORTED);
|
|
EnumSystemLocales(@LocaleCallBack, LCID_SUPPORTED);
|
|
end;
|
|
end;
|
|
|
|
|
|
-//==========================================================
|
|
|
|
-//============ TIndexPage
|
|
|
|
-//==========================================================
|
|
|
|
|
|
+{ TIndexPage }
|
|
|
|
+
|
|
constructor TIndexPage.Create(Parent: TIndexFile);
|
|
constructor TIndexPage.Create(Parent: TIndexFile);
|
|
begin
|
|
begin
|
|
FIndexFile := Parent;
|
|
FIndexFile := Parent;
|
|
@@ -1386,6 +1395,18 @@ begin
|
|
FLowerPage.RecurLast;
|
|
FLowerPage.RecurLast;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+procedure TIndexPage.SaveBracket;
|
|
|
|
+begin
|
|
|
|
+ FLowPageTemp := FLowPage;
|
|
|
|
+ FHighPageTemp := FHighPage;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TIndexPage.RestoreBracket;
|
|
|
|
+begin
|
|
|
|
+ FLowPage := FLowPageTemp;
|
|
|
|
+ FHighPage := FHighPageTemp;
|
|
|
|
+end;
|
|
|
|
+
|
|
//==============================================================================
|
|
//==============================================================================
|
|
//============ Mdx specific access routines
|
|
//============ Mdx specific access routines
|
|
//==============================================================================
|
|
//==============================================================================
|
|
@@ -1733,6 +1754,7 @@ begin
|
|
FUpdateMode := umCurrent;
|
|
FUpdateMode := umCurrent;
|
|
FModifyMode := mmNormal;
|
|
FModifyMode := mmNormal;
|
|
FTempMode := TDbfFile(ADbfFile).TempMode;
|
|
FTempMode := TDbfFile(ADbfFile).TempMode;
|
|
|
|
+ FRangeIndex := -1;
|
|
SelectIndexVars(-1);
|
|
SelectIndexVars(-1);
|
|
for I := 0 to MaxIndexes - 1 do
|
|
for I := 0 to MaxIndexes - 1 do
|
|
begin
|
|
begin
|
|
@@ -2772,9 +2794,9 @@ begin
|
|
UnlockPage(0);
|
|
UnlockPage(0);
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TIndexFile.Insert(RecNo: Integer; Buffer: PChar); {override;}
|
|
|
|
|
|
+function TIndexFile.Insert(RecNo: Integer; Buffer: PChar): Boolean; {override;}
|
|
var
|
|
var
|
|
- I, curSel: Integer;
|
|
|
|
|
|
+ I, curSel, count: Integer;
|
|
begin
|
|
begin
|
|
// check if updating all or only current
|
|
// check if updating all or only current
|
|
FUserRecNo := RecNo;
|
|
FUserRecNo := RecNo;
|
|
@@ -2782,15 +2804,28 @@ begin
|
|
begin
|
|
begin
|
|
// remember currently selected index
|
|
// remember currently selected index
|
|
curSel := FSelectedIndex;
|
|
curSel := FSelectedIndex;
|
|
- for I := 0 to SwapWordLE(PMdxHdr(Header)^.TagsUsed) - 1 do
|
|
|
|
|
|
+ Result := true;
|
|
|
|
+ I := 0;
|
|
|
|
+ count := SwapWordLE(PMdxHdr(Header)^.TagsUsed);
|
|
|
|
+ while I < count do
|
|
begin
|
|
begin
|
|
SelectIndexVars(I);
|
|
SelectIndexVars(I);
|
|
- InsertKey(Buffer);
|
|
|
|
|
|
+ Result := InsertKey(Buffer);
|
|
|
|
+ if not Result then
|
|
|
|
+ begin
|
|
|
|
+ while I > 0 do
|
|
|
|
+ begin
|
|
|
|
+ Dec(I);
|
|
|
|
+ DeleteKey(Buffer);
|
|
|
|
+ end;
|
|
|
|
+ break;
|
|
|
|
+ end;
|
|
|
|
+ Inc(I);
|
|
end;
|
|
end;
|
|
// restore previous selected index
|
|
// restore previous selected index
|
|
SelectIndexVars(curSel);
|
|
SelectIndexVars(curSel);
|
|
end else begin
|
|
end else begin
|
|
- InsertKey(Buffer);
|
|
|
|
|
|
+ Result := InsertKey(Buffer);
|
|
end;
|
|
end;
|
|
|
|
|
|
// check range, disabled by insert
|
|
// check range, disabled by insert
|
|
@@ -2949,8 +2984,9 @@ begin
|
|
TranslateString(GetACP, FCodePage, Result, Result, KeyLen);
|
|
TranslateString(GetACP, FCodePage, Result, Result, KeyLen);
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TIndexFile.InsertKey(Buffer: PChar);
|
|
|
|
|
|
+function TIndexFile.InsertKey(Buffer: PChar): boolean;
|
|
begin
|
|
begin
|
|
|
|
+ Result := true;
|
|
// ignore deleted records
|
|
// ignore deleted records
|
|
if (FModifyMode = mmNormal) and (FUniqueMode = iuDistinct) and (Buffer^ = '*') then
|
|
if (FModifyMode = mmNormal) and (FUniqueMode = iuDistinct) and (Buffer^ = '*') then
|
|
exit;
|
|
exit;
|
|
@@ -2960,16 +2996,17 @@ begin
|
|
// get key from buffer
|
|
// get key from buffer
|
|
FUserKey := ExtractKeyFromBuffer(Buffer);
|
|
FUserKey := ExtractKeyFromBuffer(Buffer);
|
|
// patch through
|
|
// patch through
|
|
- InsertCurrent;
|
|
|
|
|
|
+ Result := InsertCurrent;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TIndexFile.InsertCurrent;
|
|
|
|
|
|
+function TIndexFile.InsertCurrent: boolean;
|
|
// insert in current index
|
|
// insert in current index
|
|
// assumes: FUserKey is an OEM key
|
|
// assumes: FUserKey is an OEM key
|
|
begin
|
|
begin
|
|
// only insert if not recalling or mode = distinct
|
|
// only insert if not recalling or mode = distinct
|
|
// modify = mmDeleteRecall /\ unique <> distinct -> key already present
|
|
// modify = mmDeleteRecall /\ unique <> distinct -> key already present
|
|
|
|
+ Result := true;
|
|
if (FModifyMode <> mmDeleteRecall) or (FUniqueMode = iuDistinct) then
|
|
if (FModifyMode <> mmDeleteRecall) or (FUniqueMode = iuDistinct) then
|
|
begin
|
|
begin
|
|
// temporarily remove range to find correct location of key
|
|
// temporarily remove range to find correct location of key
|
|
@@ -2989,20 +3026,31 @@ begin
|
|
begin
|
|
begin
|
|
// raising -> reset modify mode
|
|
// raising -> reset modify mode
|
|
FModifyMode := mmNormal;
|
|
FModifyMode := mmNormal;
|
|
- InsertError;
|
|
|
|
|
|
+ ConstructInsertErrorMsg;
|
|
|
|
+ Result := false;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TIndexFile.InsertError;
|
|
|
|
|
|
+procedure TIndexFile.ConstructInsertErrorMsg;
|
|
var
|
|
var
|
|
InfoKey: string;
|
|
InfoKey: string;
|
|
begin
|
|
begin
|
|
- // prepare info for user
|
|
|
|
|
|
+ if Length(FLastError) > 0 then exit;
|
|
InfoKey := FUserKey;
|
|
InfoKey := FUserKey;
|
|
SetLength(InfoKey, KeyLen);
|
|
SetLength(InfoKey, KeyLen);
|
|
- raise EDbfError.CreateFmt(STRING_KEY_VIOLATION, [GetName, PhysicalRecNo, TrimRight(InfoKey)]);
|
|
|
|
|
|
+ FLastError := Format(STRING_KEY_VIOLATION, [GetName,
|
|
|
|
+ PhysicalRecNo, TrimRight(InfoKey)]);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TIndexFile.InsertError;
|
|
|
|
+var
|
|
|
|
+ errorStr: string;
|
|
|
|
+begin
|
|
|
|
+ errorStr := FLastError;
|
|
|
|
+ FLastError := '';
|
|
|
|
+ raise EDbfError.Create(errorStr);
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TIndexFile.Delete(RecNo: Integer; Buffer: PChar);
|
|
procedure TIndexFile.Delete(RecNo: Integer; Buffer: PChar);
|
|
@@ -3059,9 +3107,15 @@ begin
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TIndexFile.Update(RecNo: Integer; PrevBuffer, NewBuffer: PChar);
|
|
|
|
|
|
+function TIndexFile.UpdateIndex(Index: Integer; PrevBuffer, NewBuffer: PChar): Boolean;
|
|
|
|
+begin
|
|
|
|
+ SelectIndexVars(Index);
|
|
|
|
+ Result := UpdateCurrent(PrevBuffer, NewBuffer);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TIndexFile.Update(RecNo: Integer; PrevBuffer, NewBuffer: PChar): Boolean;
|
|
var
|
|
var
|
|
- I, curSel: Integer;
|
|
|
|
|
|
+ I, curSel, count: Integer;
|
|
begin
|
|
begin
|
|
// check if updating all or only current
|
|
// check if updating all or only current
|
|
FUserRecNo := RecNo;
|
|
FUserRecNo := RecNo;
|
|
@@ -3069,42 +3123,60 @@ begin
|
|
begin
|
|
begin
|
|
// remember currently selected index
|
|
// remember currently selected index
|
|
curSel := FSelectedIndex;
|
|
curSel := FSelectedIndex;
|
|
- for I := 0 to SwapWordLE(PMdxHdr(Header)^.TagsUsed) - 1 do
|
|
|
|
|
|
+ Result := true;
|
|
|
|
+ I := 0;
|
|
|
|
+ count := SwapWordLE(PMdxHdr(Header)^.TagsUsed);
|
|
|
|
+ while I < count do
|
|
begin
|
|
begin
|
|
- SelectIndexVars(I);
|
|
|
|
- UpdateCurrent(PrevBuffer, NewBuffer);
|
|
|
|
|
|
+ Result := UpdateIndex(I, PrevBuffer, NewBuffer);
|
|
|
|
+ if not Result then
|
|
|
|
+ begin
|
|
|
|
+ // rollback updates to previous indexes
|
|
|
|
+ while I > 0 do
|
|
|
|
+ begin
|
|
|
|
+ Dec(I);
|
|
|
|
+ UpdateIndex(I, NewBuffer, PrevBuffer);
|
|
|
|
+ end;
|
|
|
|
+ break;
|
|
|
|
+ end;
|
|
|
|
+ Inc(I);
|
|
end;
|
|
end;
|
|
// restore previous selected index
|
|
// restore previous selected index
|
|
SelectIndexVars(curSel);
|
|
SelectIndexVars(curSel);
|
|
end else begin
|
|
end else begin
|
|
- UpdateCurrent(PrevBuffer, NewBuffer);
|
|
|
|
|
|
+ Result := UpdateCurrent(PrevBuffer, NewBuffer);
|
|
end;
|
|
end;
|
|
// check range, disabled by delete/insert
|
|
// check range, disabled by delete/insert
|
|
if (FRoot.LowPage = 0) and (FRoot.HighPage = 0) then
|
|
if (FRoot.LowPage = 0) and (FRoot.HighPage = 0) then
|
|
ResyncRange(true);
|
|
ResyncRange(true);
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TIndexFile.UpdateCurrent(PrevBuffer, NewBuffer: PChar);
|
|
|
|
|
|
+function TIndexFile.UpdateCurrent(PrevBuffer, NewBuffer: PChar): boolean;
|
|
var
|
|
var
|
|
|
|
+ InsertKey, DeleteKey: PChar;
|
|
TempBuffer: array [0..100] of Char;
|
|
TempBuffer: array [0..100] of Char;
|
|
begin
|
|
begin
|
|
|
|
+ Result := true;
|
|
if FCanEdit and (PIndexHdr(FIndexHeader)^.KeyLen <> 0) then
|
|
if FCanEdit and (PIndexHdr(FIndexHeader)^.KeyLen <> 0) then
|
|
begin
|
|
begin
|
|
- // get key from newbuffer
|
|
|
|
- FUserKey := ExtractKeyFromBuffer(NewBuffer);
|
|
|
|
- Move(FUserKey^, TempBuffer, SwapWordLE(PIndexHdr(FIndexHeader)^.KeyLen));
|
|
|
|
- // get key from prevbuffer
|
|
|
|
- FUserKey := ExtractKeyFromBuffer(PrevBuffer);
|
|
|
|
|
|
+ DeleteKey := ExtractKeyFromBuffer(PrevBuffer);
|
|
|
|
+ Move(DeleteKey^, TempBuffer, SwapWordLE(PIndexHdr(FIndexHeader)^.KeyLen));
|
|
|
|
+ DeleteKey := @TempBuffer[0];
|
|
|
|
+ InsertKey := ExtractKeyFromBuffer(NewBuffer);
|
|
|
|
|
|
// compare to see if anything changed
|
|
// compare to see if anything changed
|
|
- if CompareKey(@TempBuffer[0]) <> 0 then
|
|
|
|
|
|
+ if CompareKeys(DeleteKey, InsertKey) <> 0 then
|
|
begin
|
|
begin
|
|
- // first set userkey to key to delete
|
|
|
|
- // FUserKey = KeyFrom(PrevBuffer)
|
|
|
|
|
|
+ FUserKey := DeleteKey;
|
|
DeleteCurrent;
|
|
DeleteCurrent;
|
|
- // now set userkey to key to insert
|
|
|
|
- FUserKey := @TempBuffer[0];
|
|
|
|
- InsertCurrent;
|
|
|
|
|
|
+ FUserKey := InsertKey;
|
|
|
|
+ Result := InsertCurrent;
|
|
|
|
+ if not Result then
|
|
|
|
+ begin
|
|
|
|
+ FUserKey := DeleteKey;
|
|
|
|
+ InsertCurrent;
|
|
|
|
+ FUserKey := InsertKey;
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
@@ -3333,11 +3405,11 @@ begin
|
|
FModifyMode := mmNormal;
|
|
FModifyMode := mmNormal;
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TIndexFile.RecordRecalled(RecNo: Integer; Buffer: PChar);
|
|
|
|
|
|
+function TIndexFile.RecordRecalled(RecNo: Integer; Buffer: PChar): Boolean;
|
|
begin
|
|
begin
|
|
// are we distinct -> then reinsert record in index
|
|
// are we distinct -> then reinsert record in index
|
|
FModifyMode := mmDeleteRecall;
|
|
FModifyMode := mmDeleteRecall;
|
|
- Insert(RecNo, Buffer);
|
|
|
|
|
|
+ Result := Insert(RecNo, Buffer);
|
|
FModifyMode := mmNormal;
|
|
FModifyMode := mmNormal;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -3664,6 +3736,30 @@ begin
|
|
until TempPage = nil;
|
|
until TempPage = nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+procedure TIndexFile.DisableRange;
|
|
|
|
+var
|
|
|
|
+ TempPage: TIndexPage;
|
|
|
|
+begin
|
|
|
|
+ TempPage := FRoot;
|
|
|
|
+ repeat
|
|
|
|
+ TempPage.SaveBracket;
|
|
|
|
+ TempPage := TempPage.LowerPage;
|
|
|
|
+ until TempPage = nil;
|
|
|
|
+ CancelRange;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TIndexFile.EnableRange;
|
|
|
|
+var
|
|
|
|
+ TempPage: TIndexPage;
|
|
|
|
+begin
|
|
|
|
+ TempPage := FRoot;
|
|
|
|
+ repeat
|
|
|
|
+ TempPage.RestoreBracket;
|
|
|
|
+ TempPage := TempPage.LowerPage;
|
|
|
|
+ until TempPage = nil;
|
|
|
|
+ FRangeActive := true;
|
|
|
|
+end;
|
|
|
|
+
|
|
function MemComp(P1, P2: Pointer; const Length: Integer): Integer;
|
|
function MemComp(P1, P2: Pointer; const Length: Integer): Integer;
|
|
var
|
|
var
|
|
I: Integer;
|
|
I: Integer;
|
|
@@ -3781,9 +3877,22 @@ begin
|
|
found := IndexOf(AIndexName);
|
|
found := IndexOf(AIndexName);
|
|
end else
|
|
end else
|
|
found := 0;
|
|
found := 0;
|
|
|
|
+ // if changing index, range is N/A anymore
|
|
|
|
+ if FRangeActive and (found <> FSelectedIndex) then
|
|
|
|
+ begin
|
|
|
|
+ FRangeIndex := FSelectedIndex;
|
|
|
|
+ DisableRange;
|
|
|
|
+ end;
|
|
// we can now select by index
|
|
// we can now select by index
|
|
if found >= 0 then
|
|
if found >= 0 then
|
|
|
|
+ begin
|
|
SelectIndexVars(found);
|
|
SelectIndexVars(found);
|
|
|
|
+ if found = FRangeIndex then
|
|
|
|
+ begin
|
|
|
|
+ EnableRange;
|
|
|
|
+ FRangeIndex := -1;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
function TIndexFile.CalcTagOffset(AIndex: Integer): Pointer;
|
|
function TIndexFile.CalcTagOffset(AIndex: Integer): Pointer;
|