* Restore the order of two deleted records bound to the same record properly when reading a dataset from file

git-svn-id: trunk@12417 -
This commit is contained in:
joost 2008-12-22 22:06:31 +00:00
parent fc2409d812
commit 7cd20771b0

View File

@ -2279,35 +2279,56 @@ procedure TBufDataset.GetDatasetPacket(AWriter: TDataPacketReader);
procedure StoreUpdateBuffer(AUpdBuffer : TRecUpdateBuffer; var ARowState: TRowState);
var AThisRowState : TRowState;
AStoreUpdBuf : Integer;
begin
FFilterBuffer:=AUpdBuffer.OldValuesBuffer;
if AUpdBuffer.UpdateKind = ukModify then
begin
AThisRowState := [rsvOriginal];
ARowState:=[rsvUpdated];
end
else if AUpdBuffer.UpdateKind = ukDelete then
AThisRowState := [rsvDeleted]
begin
AStoreUpdBuf:=FCurrentUpdateBuffer;
if GetRecordUpdateBuffer(AUpdBuffer.BookmarkData,True) then
begin
repeat
if FCurrentIndex.CompareBookmarks(@FUpdateBuffer[FCurrentUpdateBuffer].NextBookmarkData, @AUpdBuffer.BookmarkData) then
StoreUpdateBuffer(FUpdateBuffer[FCurrentUpdateBuffer], ARowState);
until not GetRecordUpdateBuffer(AUpdBuffer.BookmarkData,True,True)
end;
FCurrentUpdateBuffer:=AStoreUpdBuf;
AThisRowState := [rsvDeleted];
end
else // ie: updatekind = ukInsert
begin
ARowState := [rsvInserted];
Exit;
end;
FFilterBuffer:=AUpdBuffer.OldValuesBuffer;
FDatasetReader.StoreRecord(Self,AThisRowState,FCurrentUpdateBuffer);
end;
procedure HandleUpdateBuffersFromRecord(ARecBookmark : TBufBookmark; var ARowState: TRowState);
procedure HandleUpdateBuffersFromRecord(AFirstCall : boolean;ARecBookmark : TBufBookmark; var ARowState: TRowState);
var StoreUpdBuf1,StoreUpdBuf2 : Integer;
begin
if GetRecordUpdateBuffer(ARecBookmark,True) then
if AFirstCall then ARowState:=[];
if GetRecordUpdateBuffer(ARecBookmark,True,not AFirstCall) then
begin
// Loop to see if there is more then one update-buffer
// linked to the current record
repeat
StoreUpdateBuffer(FUpdateBuffer[FCurrentUpdateBuffer], ARowState);
until not GetRecordUpdateBuffer(ARecBookmark,True,True)
if FUpdateBuffer[FCurrentUpdateBuffer].UpdateKind=ukDelete then
begin
StoreUpdBuf1:=FCurrentUpdateBuffer;
HandleUpdateBuffersFromRecord(False,ARecBookmark,ARowState);
StoreUpdBuf2:=FCurrentUpdateBuffer;
FCurrentUpdateBuffer:=StoreUpdBuf1;
StoreUpdateBuffer(FUpdateBuffer[StoreUpdBuf1], ARowState);
FCurrentUpdateBuffer:=StoreUpdBuf2;
end
else
begin
StoreUpdateBuffer(FUpdateBuffer[FCurrentUpdateBuffer], ARowState);
HandleUpdateBuffersFromRecord(False,ARecBookmark,ARowState);
end;
end
else
ARowState:=[];
end;
var ScrollResult : TGetResult;
@ -2330,7 +2351,7 @@ begin
begin
RowState:=[];
FCurrentIndex.StoreCurrentRecIntoBookmark(ABookmark);
HandleUpdateBuffersFromRecord(ABookmark^,RowState);
HandleUpdateBuffersFromRecord(True,ABookmark^,RowState);
FFilterBuffer:=FCurrentIndex.CurrentBuffer;
if RowState=[] then
FDatasetReader.StoreRecord(Self,[])
@ -2346,7 +2367,7 @@ begin
end;
// There could be a update-buffer linked to the last (spare) record
FCurrentIndex.StoreSpareRecIntoBookmark(ABookmark);
HandleUpdateBuffersFromRecord(ABookmark^,RowState);
HandleUpdateBuffersFromRecord(True,ABookmark^,RowState);
RestoreState(StoreDSState);
@ -2438,6 +2459,7 @@ var StoreState : TDataSetState;
AddRecordBuffer : boolean;
ARowState : TRowState;
AUpdOrder : integer;
x : integer;
begin
FDatasetReader.InitLoadRecords;
@ -2496,6 +2518,10 @@ begin
FIndexes[0].RemoveRecordFromIndex(FUpdateBuffer[FCurrentUpdateBuffer].BookmarkData);
FIndexes[0].StoreSpareRecIntoBookmark(@FUpdateBuffer[FCurrentUpdateBuffer].NextBookmarkData);
for x := FCurrentUpdateBuffer+1 to length(FUpdateBuffer)-1 do
if Findexes[0].CompareBookmarks(@FUpdateBuffer[FCurrentUpdateBuffer].BookmarkData,@FUpdateBuffer[x].NextBookmarkData) then
FIndexes[0].StoreSpareRecIntoBookmark(@FUpdateBuffer[x].NextBookmarkData);
AddRecordBuffer:=False;
end
else