* Implemented TBufDataset.Refresh + simple test/fixed test

git-svn-id: trunk@14099 -
This commit is contained in:
joost 2009-11-07 13:51:17 +00:00
parent a2ca16be91
commit 5bfbd8e15d
4 changed files with 72 additions and 3 deletions

View File

@ -438,6 +438,8 @@ type
procedure SetOnUpdateError(const aValue: TResolverErrorEvent);
procedure SetFilterText(const Value: String); override; {virtual;}
procedure SetFiltered(Value: Boolean); override; {virtual;}
procedure InternalRefresh; override;
procedure BeforeRefreshOpenCursor; virtual;
{abstracts, must be overidden by descendents}
function Fetch : boolean; virtual;
function LoadField(FieldDef : TFieldDef;buffer : pointer; out CreateBlob : boolean) : boolean; virtual;
@ -2622,7 +2624,7 @@ begin
inherited;
// refilter dataset if filtered
if IsCursorOpen and Filtered then Refresh;
if IsCursorOpen and Filtered then Resync([]);
end;
procedure TBufDataset.SetFiltered(Value: Boolean); {override;}
@ -2635,7 +2637,25 @@ begin
// only refresh if active
if IsCursorOpen then
Refresh;
Resync([]);
end;
procedure TBufDataset.InternalRefresh;
var StoreDefaultFields: boolean;
begin
StoreDefaultFields:=DefaultFields;
SetDefaultFields(False);
FreeFieldBuffers;
ClearBuffers;
InternalClose;
BeforeRefreshOpenCursor;
InternalOpen;
SetDefaultFields(StoreDefaultFields);
end;
procedure TBufDataset.BeforeRefreshOpenCursor;
begin
// Do nothing
end;
function TBufDataset.Fetch: boolean;

View File

@ -259,6 +259,7 @@ type
Function GetDataSource : TDatasource; override;
Procedure SetDataSource(AValue : TDatasource);
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField); override;
procedure BeforeRefreshOpenCursor; override;
public
procedure Prepare; virtual;
procedure UnPrepare; virtual;
@ -1572,6 +1573,16 @@ begin
TSQLConnection(DataBase).LoadBlobIntoBuffer(FieldDef, ABlobBuf, FCursor,(Transaction as tsqltransaction));
end;
procedure TCustomSQLQuery.BeforeRefreshOpenCursor;
begin
// This is only necessary because TIBConnection can not re-open a
// prepared cursor. In fact this is wrong, but has never led to
// problems because in SetActive(false) queries are always
// unprepared. (which is also wrong, but has to be fixed later)
if IsPrepared then with TSQLConnection(DataBase) do
UnPrepareStatement(FCursor);
end;
function TCustomSQLQuery.GetStatementType : TStatementType;
begin

View File

@ -139,7 +139,7 @@ begin
begin
open;
delete;
refresh;
Resync([]);
applyupdates;
AssertTrue(IsEmpty);

View File

@ -57,6 +57,7 @@ type
procedure TestInsertReturningQuery;
procedure TestTemporaryTable;
procedure TestRefresh;
procedure TestParametersAndDates;
procedure TestExceptOnsecClose;
@ -925,6 +926,43 @@ begin
inherited RunTest;
end;
procedure TTestFieldTypes.TestRefresh;
var ADataset: TDataset;
i: integer;
AFldID, AFldName: TField;
begin
ADataset := TSQLDBConnector(DBConnector).GetNDataset(true,5);
Adataset.Open;
AFldId:=Adataset.Fields[0];
AFldName:=Adataset.Fields[1];
for i := 1 to 5 do
begin
AssertEquals(i,AFldID.asinteger);
AssertEquals('TestName'+inttostr(i),AFldName.asstring);
ADataset.Next;
end;
ADataset.Next;
AssertTrue(ADataset.EOF);
TSQLDBConnector(DBConnector).Connection.ExecuteDirect('update FPDEV set NAME=''test'' where ID=2');
ADataset.Refresh;
ADataset.First;
for i := 1 to 5 do
begin
AssertEquals(i,AFldID.AsInteger);
if i = 2 then
AssertEquals('test',AFldName.AsString)
else
AssertEquals('TestName'+inttostr(i),AFldName.AsString);
ADataset.Next;
end;
ADataset.Next;
AssertTrue(ADataset.EOF);
end;
procedure TTestFieldTypes.TestEmptyUpdateQuery;
begin
TSQLDBConnector(DBConnector).Connection.ExecuteDirect('update FPDEV set name=''nothing'' where (1=0)');