+ 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 -
This commit is contained in:
joost 2006-05-09 20:01:59 +00:00
parent 73e6645235
commit 8b189839aa
4 changed files with 32 additions and 25 deletions

View File

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

View File

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

View File

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

View File

@ -2399,7 +2399,7 @@ end;
Procedure Tfields.Changed; Procedure Tfields.Changed;
begin 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); FDataSet.DataEvent(deFieldListChange, 0);
If Assigned(FOnChange) then If Assigned(FOnChange) then
FOnChange(Self); FOnChange(Self);