Browse Source

+ if TBufDataset.PacketRecords is set to -1, all records are fetched
+ TBufDataset.RecNo now always returns 0 for new records
+ TBufDataset.Recordcount does not count a new record anymore
+ EOF and BOF must be true when a dataset is created
+ Close does not call CheckBrowseMode anymore
+ Add a check in MoveBy for distance=0
+ MoveBy calls DoBeforeScroll before it does anything else
+ Send the right dataevent in MoveBy (bug 5048)
+ Check for an edit state in Post
+ Fixed NotInEditState error message
+ added the deConnectChange,deReconcileError,deDisabledStateChange TDataEvents
+ Do not send a deFieldListChange event when opening the dataset

git-svn-id: trunk@3463 -

joost 19 years ago
parent
commit
8b189839aa
4 changed files with 32 additions and 25 deletions
  1. 14 8
      fcl/db/bufdataset.inc
  2. 13 14
      fcl/db/dataset.inc
  3. 4 2
      fcl/db/db.pp
  4. 1 1
      fcl/db/fields.inc

+ 14 - 8
fcl/db/bufdataset.inc

@@ -27,7 +27,7 @@ end;
 
 procedure TBufDataset.SetPacketRecords(aValue : integer);
 begin
-  if aValue > 0 then FPacketRecords := aValue
+  if (aValue = -1) or (aValue > 0) then FPacketRecords := aValue
     else DatabaseError(SInvPacketRecordsValue);
 end;
 
@@ -68,6 +68,7 @@ begin
   FLastRecBuf := FFirstRecBuf;
   FCurrentRecBuf := FLastRecBuf;
 
+  FAllPacketsFetched := False;
   FOpen:=True;
 end;
 
@@ -96,7 +97,7 @@ end;
 procedure TBufDataset.InternalLast;
 begin
   repeat
-  until getnextpacket < FPacketRecords;
+  until (getnextpacket < FPacketRecords) or (FPacketRecords = -1);
   if FLastRecBuf <> FFirstRecBuf then
     FCurrentRecBuf := FLastRecBuf;
 end;
@@ -225,9 +226,14 @@ var i : integer;
     pb : pchar;
     
 begin
+  if FAllPacketsFetched then
+    begin
+    result := 0;
+    exit;
+    end;
   i := 0;
   pb := pchar(pointer(FLastRecBuf)+sizeof(TBufRecLinkItem));
-  while (i < FPacketRecords) and (loadbuffer(pb) = grOk) do
+  while ((i < FPacketRecords) or (FPacketRecords = -1)) and (loadbuffer(pb) = grOk) do
     begin
     FLastRecBuf^.next := pointer(IntAllocRecordBuffer);
     FLastRecBuf^.next^.prior := FLastRecBuf;
@@ -268,6 +274,7 @@ begin
   if not Fetch then
     begin
     Result := grEOF;
+    FAllPacketsFetched := True;
     Exit;
     end;
 
@@ -611,7 +618,7 @@ var recnr        : integer;
 begin
   if value > RecordCount then
     begin
-    repeat until (getnextpacket < FPacketRecords) or (value <= RecordCount);
+    repeat until (getnextpacket < FPacketRecords) or (value <= RecordCount) or (FPacketRecords = -1);
     if value > RecordCount then
       begin
       DatabaseError(SNoSuchRecord,self);
@@ -634,7 +641,7 @@ Var SearchRecBuffer : PBufRecLinkItem;
 begin
   abuf := ActiveBuffer;
   // If abuf isn't assigned, the recordset probably isn't opened.
-  if assigned(abuf) and (FRecordCount>0) then
+  if assigned(abuf) and (FBRecordCount>0) and (state <> dsInsert) then
     begin
     GetBookmarkData(abuf,@SearchRecBuffer);
     TmpRecBuffer := FFirstRecBuf;
@@ -646,7 +653,7 @@ begin
       end;
     result := recnr;
     end
-  else result := -1;
+  else result := 0;
 end;
 
 function TBufDataset.IsCursorOpen: Boolean;
@@ -658,8 +665,7 @@ end;
 Function TBufDataset.GetRecordCount: Longint;
 
 begin
-  if state <> dsInsert then Result := FBRecordCount
-    else Result := FBRecordCount+1;
+  Result := FBRecordCount;
 end;
 
 Function TBufDataset.Locate(const KeyFields: string; const KeyValues: Variant; options: TLocateOptions) : boolean;

+ 13 - 14
fcl/db/dataset.inc

@@ -34,6 +34,8 @@ begin
   FBuffers[0] := nil;
   FActiveRecord := 0;
   FBufferCount := 0;
+  FEOF := True;
+  FBOF := True;
 end;
 
 
@@ -396,16 +398,14 @@ begin
     DoAfterOpen;
     DoAfterScroll;
   except
-    DoInternalClose(false);
+    DoInternalClose;
     raise;
   end;
 end;
 
-Procedure TDataset.DoInternalClose(DoCheck : Boolean);
+Procedure TDataset.DoInternalClose;
 
 begin
-  if DoCheck then
-    CheckBrowsemode;
   DoBeforeScroll;
   DoBeforeClose;
   FreeFieldBuffers;
@@ -822,7 +822,7 @@ begin
       DoInternalOpen;
     end
   else if not value and (Fstate <> dsinactive) then
-    DoInternalClose(True);
+    DoInternalClose;
 end;
 
 procedure TDataset.Loaded;
@@ -1697,10 +1697,11 @@ Var
 begin
   CheckBrowseMode;
   Result:=0; TheResult:=0;
-  If ((Distance>0) and FEOF) or
+  DoBeforeScroll;
+  If (Distance = 0) or
+     ((Distance>0) and FEOF) or
      ((Distance<0) and FBOF) then
     exit;
-  DoBeforeScroll;
   Try
     Scrolled := 0;
     If Distance>0 then
@@ -1711,11 +1712,7 @@ begin
 {$ifdef dsdebug}
     WriteLn('ActiveRecord=', FActiveRecord,' FEOF=',FEOF,' FBOF=',FBOF);
 {$Endif}
-//    If FRecordCount<>PrevRecordCount then
-    if Scrolled = 0 then
-      DataEvent(deDatasetChange,0)
-    else
-      DataEvent(deDatasetScroll,Scrolled);
+    DataEvent(deDatasetScroll,Scrolled);
     DoAfterScroll;
     Result:=TheResult;
   end;
@@ -1772,7 +1769,9 @@ begin
     writeln ('Post: Browse mode set');
 {$endif}
     DoAfterPost;
-    end;
+    end
+  else
+    DatabaseErrorFmt(SNotInEditState, [Name], Self);
 end;
 
 Procedure TDataset.Prior;
@@ -1926,7 +1925,7 @@ Procedure TDataset.UpdateRecord;
 
 begin
   if not (State in dsEditModes) then
-    DatabaseError(SNotInEditState, Self);
+    DatabaseErrorFmt(SNotInEditState, [Name], Self);
   DataEvent(deUpdateRecord, 0);
 end;
 

+ 4 - 2
fcl/db/db.pp

@@ -51,7 +51,7 @@ type
   TDataEvent = (deFieldChange, deRecordChange, deDataSetChange,
     deDataSetScroll, deLayoutChange, deUpdateRecord, deUpdateState,
     deCheckBrowseMode, dePropertyChange, deFieldListChange, deFocusControl,
-    deParentScroll);
+    deParentScroll,deConnectChange,deReconcileError,deDisabledStateChange);
 
   TUpdateStatus = (usUnmodified, usModified, usInserted, usDeleted);
   TUpdateStatusSet = SET OF TUpdateStatus;
@@ -965,7 +965,7 @@ type
     FState : TDataSetState;
     Procedure DoInsertAppend(DoAppend : Boolean);
     Procedure DoInternalOpen;
-    Procedure DoInternalClose(DoCheck : Boolean);
+    Procedure DoInternalClose;
     Function  GetBuffer (Index : longint) : Pchar;
     Function  GetField (Index : Longint) : TField;
     Procedure RegisterDataSource(ADatasource : TDataSource);
@@ -1509,6 +1509,8 @@ type
     FCurrentUpdateBuffer : integer;
 
     FFieldBufPositions : array of longint;
+    
+    FAllPacketsFetched : boolean;
     procedure CalcRecordSize;
     function LoadBuffer(Buffer : PChar): TGetResult;
     function GetFieldSize(FieldDef : TFieldDef) : longint;

+ 1 - 1
fcl/db/fields.inc

@@ -2399,7 +2399,7 @@ end;
 Procedure Tfields.Changed;
 
 begin
-  if (FDataSet <> nil) and not (csDestroying in FDataSet.ComponentState) then
+  if (FDataSet <> nil) and not (csDestroying in FDataSet.ComponentState) and FDataset.Active then
     FDataSet.DataEvent(deFieldListChange, 0);
   If Assigned(FOnChange) then
     FOnChange(Self);