Browse Source

* Fix working of dataset when closing/opening

michael 6 years ago
parent
commit
f786a75965
1 changed files with 24 additions and 7 deletions
  1. 24 7
      packages/fcl-db/jsondataset.pas

+ 24 - 7
packages/fcl-db/jsondataset.pas

@@ -172,6 +172,7 @@ type
   protected
     Function GetCount: Integer; virtual;
     Procedure CreateIndex; Virtual; abstract;
+    Procedure ClearIndex;
     Property List : TJSArray Read FList;
     Property Rows : TJSArray Read FRows;
     Property Dataset : TBaseJSONDataset Read FDataset;
@@ -234,6 +235,7 @@ type
   Private
     FIndex : TSortedJSONIndex;
   Protected
+    Procedure ClearIndex;
     Property Index : TSortedJSONIndex Read FIndex Write FIndex;
   Public
     Procedure BuildIndex(aDataset : TBaseJSONDataset);
@@ -437,11 +439,18 @@ uses DateUtils;
 
 { TJSONIndexDef }
 
+procedure TJSONIndexDef.ClearIndex;
+begin
+  FreeAndNil(FIndex);
+end;
+
 procedure TJSONIndexDef.BuildIndex(aDataset : TBaseJSONDataset);
 
 begin
   if Findex=Nil then
-    FIndex:=TSortedJSONIndex.Create(aDataset,aDataset.Rows);
+    FIndex:=TSortedJSONIndex.Create(aDataset,aDataset.Rows)
+  else
+    FIndex.ClearIndex;
   FIndex.CreateComparer(Self);
   FIndex.CreateIndex;
 end;
@@ -953,6 +962,11 @@ begin
   Result:=FList.Length;
 end;
 
+procedure TJSONIndex.ClearIndex;
+begin
+  FList.Length:=0;
+end;
+
 function TJSONIndex.GetRecordIndex(aListIndex : Integer): NativeInt;
 begin
   if isUndefined(FList[aListIndex]) then
@@ -1151,16 +1165,19 @@ begin
 end;
 
 procedure TBaseJSONDataSet.FreeData;
+
+Var
+ I : integer;
+
 begin
   If FOwnsData then
     begin
     FRows:=Nil;
     FMetaData:=Nil;
     end;
-  if (FCurrentIndex<>FDefaultIndex) then
-    FreeAndNil(FCurrentIndex)
-  else
-    FCurrentIndex:=Nil;
+  For I:=0 to FIndexes.Count-1 do
+    FIndexes[i].ClearIndex;
+  FCurrentIndex:=Nil;
   FreeAndNil(FDefaultindex);
   FreeAndNil(FFieldMapper);
   FCurrentIndex:=Nil;
@@ -1334,7 +1351,7 @@ end;
 
 procedure TBaseJSONDataSet.InternalClose;
 begin
-  // disconnet and destroy field objects
+  // disconnect and destroy field objects
   BindFields (False);
   if DefaultFields then
     DestroyFields;
@@ -1690,10 +1707,10 @@ end;
 
 destructor TBaseJSONDataSet.Destroy;
 begin
+  Close;
   FreeAndNil(FFilterExpression);
   FreeAndNil(FIndexes);
   FEditIdx:=-1;
-  FreeData;
   inherited;
 end;