mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-08 01:27:59 +02:00
* Changes to be able to add an index to an open dataset. Added FMaxIndexesCount.
* Added dummy-BuildIndex git-svn-id: trunk@9610 -
This commit is contained in:
parent
2cc3f2ebf3
commit
5724713259
@ -131,6 +131,8 @@ type
|
||||
{$IFDEF ARRAYBUF}
|
||||
FInitialBuffers : integer;
|
||||
FGrowBuffer : integer;
|
||||
{$ELSE}
|
||||
FMaxIndexesCount: integer;
|
||||
{$ENDIF ARRAYBUF}
|
||||
|
||||
FIndexesCount : integer;
|
||||
@ -158,6 +160,7 @@ type
|
||||
FBlobBuffers : array of PBlobBuffer;
|
||||
FUpdateBlobBuffers: array of PBlobBuffer;
|
||||
|
||||
procedure BuildIndex(AIndex : TBufIndex);
|
||||
function GetIndexDefs : TIndexDefs;
|
||||
{$IFDEF ARRAYBUF}
|
||||
procedure AddRecordToIndex(var AIndex: TBufIndex; ARecBuf: pchar);
|
||||
@ -282,6 +285,8 @@ begin
|
||||
{$IFDEF ARRAYBUF}
|
||||
FInitialBuffers:=10000;
|
||||
FGrowBuffer:=1000;
|
||||
{$ELSE}
|
||||
FMaxIndexesCount:=2;
|
||||
{$ENDIF}
|
||||
FIndexesCount:=0;
|
||||
InternalAddIndex('DEFAULT_ORDER','');
|
||||
@ -309,6 +314,33 @@ begin
|
||||
inherited destroy;
|
||||
end;
|
||||
|
||||
procedure TBufDataset.BuildIndex(AIndex: TBufIndex);
|
||||
var PCurRecLinkItem : PBufRecLinkItem;
|
||||
begin
|
||||
// This simply copies the index...
|
||||
{$IFNDEF ARRAYBUF}
|
||||
PCurRecLinkItem:=FIndexes[0].FFirstRecBuf;
|
||||
|
||||
if PCurRecLinkItem <> FIndexes[0].FLastRecBuf then
|
||||
begin
|
||||
while PCurRecLinkItem^.next<>FIndexes[0].FLastRecBuf do
|
||||
begin
|
||||
PCurRecLinkItem:=PCurRecLinkItem^.next;
|
||||
|
||||
PCurRecLinkItem[AIndex.IndNr].next := PCurRecLinkItem[0].next;
|
||||
PCurRecLinkItem[AIndex.IndNr].prior := PCurRecLinkItem[0].prior;
|
||||
end;
|
||||
end;
|
||||
|
||||
// Set FirstRecBuf and FCurrentRecBuf
|
||||
AIndex.FFirstRecBuf:=FIndexes[0].FFirstRecBuf;
|
||||
AIndex.FCurrentRecBuf:=FIndexes[0].FCurrentRecBuf;
|
||||
// Link in the FLastRecBuf that belongs to this index
|
||||
PCurRecLinkItem[AIndex.IndNr].next:=AIndex.FLastRecBuf;
|
||||
AIndex.FLastRecBuf:=PCurRecLinkItem;
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
function TBufDataset.GetIndexDefs : TIndexDefs;
|
||||
|
||||
begin
|
||||
@ -339,7 +371,7 @@ begin
|
||||
{$IFDEF ARRAYBUF}
|
||||
result := AllocMem(FRecordsize);
|
||||
{$ELSE}
|
||||
result := AllocMem(FRecordsize+sizeof(TBufRecLinkItem)*FIndexesCount);
|
||||
result := AllocMem(FRecordsize+sizeof(TBufRecLinkItem)*FMaxIndexesCount);
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
@ -597,7 +629,7 @@ begin
|
||||
with FCurrentIndex^ do
|
||||
move((FRecordArray[FCurrentRecInd])^,buffer^,FRecordSize);
|
||||
{$ELSE}
|
||||
move((pointer(FCurrentRecBuf)+sizeof(TBufRecLinkItem)*FIndexesCount)^,buffer^,FRecordSize);
|
||||
move((pointer(FCurrentRecBuf)+sizeof(TBufRecLinkItem)*FMaxIndexesCount)^,buffer^,FRecordSize);
|
||||
{$ENDIF}
|
||||
|
||||
GetCalcFields(Buffer);
|
||||
@ -777,7 +809,7 @@ begin
|
||||
AIndex.FRecordArray[RecInd]:= ARecBuf;
|
||||
inc(AIndex.FLastRecInd)
|
||||
{$ELSE}
|
||||
inc(NewValueBuf,sizeof(TBufRecLinkItem)*FIndexesCount);
|
||||
inc(NewValueBuf,sizeof(TBufRecLinkItem)*FMaxIndexesCount);
|
||||
CompBuf:=AIndex.FFirstRecBuf;
|
||||
|
||||
cp := 1;
|
||||
@ -785,7 +817,7 @@ begin
|
||||
begin
|
||||
if AIndex.Fields.DataType = ftString then
|
||||
begin
|
||||
cp := CompareText0(pointer(NewValueBuf),pchar(CompBuf)+sizeof(TBufRecLinkItem)*FIndexesCount+FFieldBufPositions[AIndex.Fields.FieldNo-1],length(pchar(NewValueBuf)),[]);
|
||||
cp := CompareText0(pointer(NewValueBuf),pchar(CompBuf)+sizeof(TBufRecLinkItem)*FMaxIndexesCount+FFieldBufPositions[AIndex.Fields.FieldNo-1],length(pchar(NewValueBuf)),[]);
|
||||
if cp > 0 then
|
||||
CompBuf := CompBuf[AIndex.IndNr].next;
|
||||
end;
|
||||
@ -819,7 +851,7 @@ begin
|
||||
with FCurrentIndex^ do
|
||||
pb := pchar(FRecordArray[FLastRecInd]);
|
||||
{$ELSE}
|
||||
pb := pchar(pointer(FIndexes[0].FLastRecBuf)+sizeof(TBufRecLinkItem)*FIndexesCount);
|
||||
pb := pchar(pointer(FIndexes[0].FLastRecBuf)+sizeof(TBufRecLinkItem)*FMaxIndexesCount);
|
||||
{$ENDIF}
|
||||
while ((i < FPacketRecords) or (FPacketRecords = -1)) and (loadbuffer(pb) = grOk) do
|
||||
begin
|
||||
@ -847,7 +879,7 @@ begin
|
||||
|
||||
FLastRecBuf := FLastRecBuf^.next;
|
||||
|
||||
pb := pchar(pointer(FLastRecBuf)+sizeof(TBufRecLinkItem)*FIndexesCount);
|
||||
pb := pchar(pointer(FLastRecBuf)+sizeof(TBufRecLinkItem)*FMaxIndexesCount);
|
||||
end;
|
||||
{$ENDIF}
|
||||
inc(i);
|
||||
@ -952,7 +984,7 @@ begin
|
||||
result := false;
|
||||
exit;
|
||||
end;
|
||||
currbuff := FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer+sizeof(TBufRecLinkItem)*FIndexesCount;
|
||||
currbuff := FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer+sizeof(TBufRecLinkItem)*FMaxIndexesCount;
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -1012,7 +1044,7 @@ begin
|
||||
{$IFDEF ARRAYBUF}
|
||||
CurrBuff := FRecordArray[FLastRecInd]
|
||||
{$ELSE}
|
||||
CurrBuff := pointer(FLastRecBuf) + sizeof(TBufRecLinkItem)*FIndexesCount
|
||||
CurrBuff := pointer(FLastRecBuf) + sizeof(TBufRecLinkItem)*FMaxIndexesCount
|
||||
{$ENDIF}
|
||||
else
|
||||
CurrBuff := GetCurrentBuffer;
|
||||
@ -1152,7 +1184,7 @@ begin
|
||||
FRecordArray[Bookmark.BookmarkData] := OldValuesBuffer;
|
||||
end;
|
||||
{$ELSE}
|
||||
move(pchar(OldValuesBuffer+sizeof(TBufRecLinkItem)*FIndexesCount)^,pchar(BookmarkData+sizeof(TBufRecLinkItem)*FIndexesCount)^,FRecordSize);
|
||||
move(pchar(OldValuesBuffer+sizeof(TBufRecLinkItem)*FMaxIndexesCount)^,pchar(BookmarkData+sizeof(TBufRecLinkItem)*FMaxIndexesCount)^,FRecordSize);
|
||||
FreeRecordBuffer(OldValuesBuffer);
|
||||
{$ENDIF}
|
||||
end
|
||||
@ -1423,7 +1455,7 @@ begin
|
||||
{$IFDEF ARRAYBUF}
|
||||
move(FRecordArray[FCurrentRecInd]^,FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer^,FRecordSize);
|
||||
{$ELSE}
|
||||
move(FCurrentRecBuf^,FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer^,FRecordSize+sizeof(TBufRecLinkItem)*FIndexesCount);
|
||||
move(FCurrentRecBuf^,FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer^,FRecordSize+sizeof(TBufRecLinkItem)*FMaxIndexesCount);
|
||||
{$ENDIF}
|
||||
FUpdateBuffer[FCurrentUpdateBuffer].UpdateKind := ukModify;
|
||||
end
|
||||
@ -1436,7 +1468,7 @@ begin
|
||||
move(ActiveBuffer^,FRecordArray[FCurrentRecInd]^,FRecordSize);
|
||||
{$ELSE}
|
||||
CurrBuff := pchar(FCurrentRecBuf);
|
||||
inc(Currbuff,sizeof(TBufRecLinkItem)*FIndexesCount);
|
||||
inc(Currbuff,sizeof(TBufRecLinkItem)*FMaxIndexesCount);
|
||||
move(ActiveBuffer^,CurrBuff^,FRecordSize);
|
||||
{$ENDIF}
|
||||
end;
|
||||
@ -1724,11 +1756,18 @@ begin
|
||||
InitialiseIndex(FIndexes[FIndexesCount-1]);
|
||||
FIndexes[FIndexesCount-1].Name:=AName;
|
||||
FIndexes[FIndexesCount-1].FieldsName:=AFields;
|
||||
if Active then FIndexes[FIndexesCount-1].Fields := FieldByName(AFields);
|
||||
FIndexes[FIndexesCount-1].IndNr:=FIndexesCount-1;
|
||||
{$IFDEF ARRAYBUF}
|
||||
setlength(FIndexes[FIndexesCount-1].FRecordArray,FInitialBuffers);
|
||||
{$ENDIF}
|
||||
if Active then
|
||||
begin
|
||||
FIndexes[FIndexesCount-1].Fields := FieldByName(AFields);
|
||||
FIndexes[FIndexesCount-1].FFirstRecBuf := pointer(IntAllocRecordBuffer);
|
||||
FIndexes[FIndexesCount-1].FLastRecBuf := FIndexes[FIndexesCount-1].FFirstRecBuf;
|
||||
FIndexes[FIndexesCount-1].FCurrentRecBuf := FIndexes[FIndexesCount-1].FLastRecBuf;
|
||||
BuildIndex(FIndexes[FIndexesCount-1]);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TBufDataset.DoFilterRecord(var Acceptable: Boolean);
|
||||
@ -1870,7 +1909,7 @@ begin
|
||||
FieldBufPos := FFieldBufPositions[keyfield.FieldNo-1];
|
||||
VBLength := keyfield.DataSize;
|
||||
ValueBuffer := AllocMem(VBLength);
|
||||
currbuff := pointer(FCurrentIndex^.FLastRecBuf)+sizeof(TBufRecLinkItem)*FIndexesCount+FieldBufPos;
|
||||
currbuff := pointer(FCurrentIndex^.FLastRecBuf)+sizeof(TBufRecLinkItem)*FMaxIndexesCount+FieldBufPos;
|
||||
move(currbuff^,ValueBuffer^,VBLength);
|
||||
end;
|
||||
|
||||
@ -1879,7 +1918,7 @@ begin
|
||||
if CheckNull then
|
||||
begin
|
||||
repeat
|
||||
currbuff := pointer(CurrLinkItem)+sizeof(TBufRecLinkItem)*FIndexesCount;
|
||||
currbuff := pointer(CurrLinkItem)+sizeof(TBufRecLinkItem)*FMaxIndexesCount;
|
||||
if GetFieldIsnull(pbyte(CurrBuff),keyfield.Fieldno-1) then
|
||||
begin
|
||||
result := True;
|
||||
@ -1892,7 +1931,7 @@ begin
|
||||
else if keyfield.DataType = ftString then
|
||||
begin
|
||||
repeat
|
||||
currbuff := pointer(CurrLinkItem)+sizeof(TBufRecLinkItem)*FIndexesCount;
|
||||
currbuff := pointer(CurrLinkItem)+sizeof(TBufRecLinkItem)*FMaxIndexesCount;
|
||||
if not GetFieldIsnull(pbyte(CurrBuff),keyfield.Fieldno-1) then
|
||||
begin
|
||||
inc(CurrBuff,FieldBufPos);
|
||||
@ -1909,7 +1948,7 @@ begin
|
||||
else
|
||||
begin
|
||||
repeat
|
||||
currbuff := pointer(CurrLinkItem)+sizeof(TBufRecLinkItem)*FIndexesCount;
|
||||
currbuff := pointer(CurrLinkItem)+sizeof(TBufRecLinkItem)*FMaxIndexesCount;
|
||||
if not GetFieldIsnull(pbyte(CurrBuff),keyfield.Fieldno-1) then
|
||||
begin
|
||||
inc(CurrBuff,FieldBufPos);
|
||||
|
Loading…
Reference in New Issue
Block a user