Browse Source

--- Merging r20704 into 'packages/fcl-db/src':
U packages/fcl-db/src/base/bufdataset.pas

# revisions: 20704
------------------------------------------------------------------------
r20704 | marco | 2012-04-04 17:00:23 +0200 (Wed, 04 Apr 2012) | 2 lines
Changed paths:
M /trunk/packages/fcl-db/src/base/bufdataset.pas

* Fix for TField.OldValue state, patch by Lacak2, Mantis #19542

------------------------------------------------------------------------

git-svn-id: branches/fixes_2_6@21209 -

marco 13 years ago
parent
commit
9e7d7e7693
1 changed files with 27 additions and 12 deletions
  1. 27 12
      packages/fcl-db/src/base/bufdataset.pas

+ 27 - 12
packages/fcl-db/src/base/bufdataset.pas

@@ -39,7 +39,7 @@ type
     Size    : ptrint;
   end;
 
-   TBufBlobStream = class(TStream)
+  TBufBlobStream = class(TStream)
   private
     FBlobBuffer : PBlobBuffer;
     FPosition   : ptrint;
@@ -86,6 +86,7 @@ type
 }
     OldValuesBuffer    : TRecordBuffer;
   end;
+  TRecordsUpdateBuffer = array of TRecUpdateBuffer;
 
   PBufBlobField = ^TBufBlobField;
   TBufBlobField = record
@@ -94,7 +95,6 @@ type
   end;
 
   TCompareFunc = function(subValue, aValue: pointer; options: TLocateOptions): int64;
-  TRecordsUpdateBuffer = array of TRecUpdateBuffer;
 
   TDBCompareRec = record
                    Comparefunc : TCompareFunc;
@@ -408,13 +408,14 @@ type
     FFilterBuffer   : TRecordBuffer;
     FBRecordCount   : integer;
 
+    FOldState          : TDatasetState;
     FPacketRecords  : integer;
     FRecordSize     : Integer;
     FNullmaskSize   : byte;
     FOpen           : Boolean;
     FUpdateBuffer   : TRecordsUpdateBuffer;
     FCurrentUpdateBuffer : integer;
-    
+
     FIndexDefs      : TIndexDefs;
 
     FParser         : TBufDatasetParser;
@@ -426,7 +427,7 @@ type
 
     FBlobBuffers      : array of PBlobBuffer;
     FUpdateBlobBuffers: array of PBlobBuffer;
-    
+
     procedure FetchAll;
     procedure BuildIndex(var AIndex : TBufIndex);
     function GetIndexDefs : TIndexDefs;
@@ -460,7 +461,7 @@ type
     procedure SetRecNo(Value: Longint); override;
     function  GetRecNo: Longint; override;
     function GetChangeCount: integer; virtual;
-    function  AllocRecordBuffer: TRecordBuffer override;
+    function  AllocRecordBuffer: TRecordBuffer; override;
     procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
     procedure ClearCalcFields(Buffer: TRecordBuffer); override;
     procedure InternalInitRecord(Buffer: TRecordBuffer); override;
@@ -491,6 +492,7 @@ type
     procedure SetFilterText(const Value: String); override; {virtual;}
     procedure SetFiltered(Value: Boolean); override; {virtual;}
     procedure InternalRefresh; override;
+    procedure DataEvent(Event: TDataEvent; Info: Ptrint); override;
     procedure BeforeRefreshOpenCursor; virtual;
     procedure DoFilterRecord(out Acceptable: Boolean); virtual;
   {abstracts, must be overidden by descendents}
@@ -1816,12 +1818,17 @@ var CurrBuff : TRecordBuffer;
 
 begin
   Result := False;
-  if state = dsOldValue then
-    begin
-    if not GetActiveRecordUpdateBuffer then
-      Exit; // There is no old value available
-    CurrBuff := FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer;
-    end
+  if State = dsOldValue then
+  begin
+    if FOldState = dsInsert then
+      CurrBuff := nil // old values = null
+    else if GetActiveRecordUpdateBuffer then
+      CurrBuff := FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer
+    else
+      // There is no UpdateBuffer for ActiveRecord, so there are no explicit old values available
+      // then we can assume, that old values = current values
+      CurrBuff := FCurrentIndex.CurrentBuffer;
+  end
   else
     CurrBuff := GetCurrentBuffer;
 
@@ -2213,7 +2220,7 @@ begin
     if state = dsEdit then
       begin
       // Create an oldvalues buffer with the old values of the record
-      FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer := intAllocRecordBuffer;
+      FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer := IntAllocRecordBuffer;
       with FCurrentIndex do
         // Move only the real data
         move(CurrentBuffer^,FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer^,FRecordSize);
@@ -2905,6 +2912,14 @@ begin
   // Do nothing
 end;
 
+procedure TCustomBufDataset.DataEvent(Event: TDataEvent; Info: Ptrint);
+begin
+  if Event = deUpdateState then
+    // Save DataSet.State set by DataSet.SetState (filter out State set by DataSet.SetTempState)
+    FOldState := State;
+  inherited;
+end;
+
 function TCustomBufDataset.Fetch: boolean;
 begin
   // Empty procedure to make it possible to use TCustomBufDataset as a memory dataset