mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-07 23:30:37 +02:00
* Fix for TField.OldValue state, patch by Lacak2, Mantis #19542
git-svn-id: trunk@20704 -
This commit is contained in:
parent
c968fcbfaf
commit
b2ed134379
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user