Procházet zdrojové kódy

* Changes to be able to add an index to an open dataset. Added FMaxIndexesCount.
* Added dummy-BuildIndex

git-svn-id: trunk@9610 -

joost před 17 roky
rodič
revize
5724713259
1 změnil soubory, kde provedl 55 přidání a 16 odebrání
  1. 55 16
      packages/fcl-db/src/base/bufdataset.pas

+ 55 - 16
packages/fcl-db/src/base/bufdataset.pas

@@ -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);