From 8b189839aa4f1cab9898e3778974e44d40084edb Mon Sep 17 00:00:00 2001 From: joost Date: Tue, 9 May 2006 20:01:59 +0000 Subject: [PATCH] + 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 - --- fcl/db/bufdataset.inc | 22 ++++++++++++++-------- fcl/db/dataset.inc | 27 +++++++++++++-------------- fcl/db/db.pp | 6 ++++-- fcl/db/fields.inc | 2 +- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/fcl/db/bufdataset.inc b/fcl/db/bufdataset.inc index 501f96cb68..78faa0f169 100644 --- a/fcl/db/bufdataset.inc +++ b/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; diff --git a/fcl/db/dataset.inc b/fcl/db/dataset.inc index b2dc0e886d..d3dc61750f 100644 --- a/fcl/db/dataset.inc +++ b/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; diff --git a/fcl/db/db.pp b/fcl/db/db.pp index 09272bc87a..6abdd32a57 100644 --- a/fcl/db/db.pp +++ b/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; diff --git a/fcl/db/fields.inc b/fcl/db/fields.inc index a6904b2d6a..24ac4f84e9 100644 --- a/fcl/db/fields.inc +++ b/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);