From 545c6b0d646cd4f849da6296c0b51d24a9329daa Mon Sep 17 00:00:00 2001 From: joost Date: Sun, 22 Jun 2008 21:59:12 +0000 Subject: [PATCH] * Added support for ftDateTime fields * Call CreateTable on open when this is not done yet (bug 10958) * Check if the dataset is inactive on CreateTable * Opening a closed dataset is possible again * Implemented BookmarkValid + test (bug 8511) git-svn-id: trunk@11263 - --- packages/fcl-db/src/memds/memds.pp | 32 +++++++++++++++++---- packages/fcl-db/tests/testdbbasics.pas | 39 +++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/packages/fcl-db/src/memds/memds.pp b/packages/fcl-db/src/memds/memds.pp index 25f31e8086..1cacda14f4 100644 --- a/packages/fcl-db/src/memds/memds.pp +++ b/packages/fcl-db/src/memds/memds.pp @@ -45,6 +45,8 @@ type BookmarkFlag: TBookmarkFlag; end; + { TMemDataset } + TMemDataset=class(TDataSet) private FOpenStream : TStream; @@ -57,6 +59,7 @@ type FRecBufferSize: integer; FCurrRecNo: integer; FIsOpen: boolean; + FTableIsCreated: boolean; FFilterBuffer: PChar; ffieldoffsets: PInteger; ffieldsizes: PInteger; @@ -115,6 +118,7 @@ type public constructor Create(AOwner:tComponent); override; destructor Destroy; override; + function BookmarkValid(ABookmark: TBookmark): Boolean; override; procedure CreateTable; Function DataSize : Integer; @@ -257,9 +261,21 @@ end; Destructor TMemDataset.Destroy; begin FStream.Free; + FreeMem(FFieldOffsets); + FreeMem(FFieldSizes); inherited Destroy; end; +function TMemDataset.BookmarkValid(ABookmark: TBookmark): Boolean; +var + ReqBookmark: integer; +begin + Result := False; + if ABookMark=nil then exit; + ReqBookmark:=PInteger(ABookmark)^; + Result := (ReqBookmark>=0) and (ReqBookmark'') then FOpenStream:=TFileStream.Create(FFileName,fmOpenRead); Try @@ -610,8 +628,6 @@ begin if DefaultFields then begin DestroyFields; end; - FreeMem(FFieldOffsets); - FreeMem(FFieldSizes); end; procedure TMemDataset.InternalPost; @@ -819,6 +835,10 @@ var i,count : integer; begin Count := fielddefs.count; + // Avoid mem-leak if CreateTable is called twice + FreeMem(ffieldoffsets); + Freemem(ffieldsizes); + FFieldOffsets:=getmem(Count*sizeof(integer)); FFieldSizes:=getmem(Count*sizeof(integer)); FRecSize:= (Count+7) div 8; //null mask @@ -833,6 +853,7 @@ end; procedure TMemDataset.CreateTable; begin + CheckInactive; FStream.Clear; FRecCount:=0; FCurrRecNo:=-1; @@ -841,6 +862,7 @@ begin FRecInfoOffset:=FRecSize; FRecSize:=FRecSize+SizeRecInfo; FRecBufferSize:=FRecSize; + FTableIsCreated:=True; end; procedure TMemDataset.InternalAddRecord(Buffer: Pointer; DoAppend: Boolean); diff --git a/packages/fcl-db/tests/testdbbasics.pas b/packages/fcl-db/tests/testdbbasics.pas index 9700fdb892..cc131ceee8 100644 --- a/packages/fcl-db/tests/testdbbasics.pas +++ b/packages/fcl-db/tests/testdbbasics.pas @@ -30,7 +30,8 @@ type procedure TestCancelUpdDelete1; procedure TestCancelUpdDelete2; procedure TestBookmarks; - + procedure TestBookmarkValid; + procedure TestLocate; procedure TestFirst; @@ -566,6 +567,42 @@ begin end; end; +procedure TTestDBBasics.TestBookmarkValid; +var BM1,BM2,BM3,BM4,BM5 : TBookmark; +begin + with DBConnector.GetNDataset(true,14) do + begin + BM1 := Nil; + AssertFalse(BookmarkValid(BM1)); + open; + BM1:=GetBookmark; // id=1, BOF + AssertTrue(BookmarkValid(BM1)); + next;next; + BM2:=GetBookmark; // id=3 + AssertTrue(BookmarkValid(BM2)); + next;next;next; + BM3:=GetBookmark; // id=6 + AssertTrue(BookmarkValid(BM3)); + next;next;next;next;next;next;next;next; + BM4:=GetBookmark; // id=14 + AssertTrue(BookmarkValid(BM4)); + next; + BM5:=GetBookmark; // id=14, EOF + AssertTrue(BookmarkValid(BM5)); + + AssertTrue(BookmarkValid(BM4)); + AssertTrue(BookmarkValid(BM3)); + AssertTrue(BookmarkValid(BM2)); + AssertTrue(BookmarkValid(BM1)); + GotoBookmark(BM2); + AssertTrue(BookmarkValid(BM5)); + AssertTrue(BookmarkValid(BM4)); + AssertTrue(BookmarkValid(BM3)); + AssertTrue(BookmarkValid(BM2)); + AssertTrue(BookmarkValid(BM1)); + end; +end; + procedure TTestDBBasics.TestLocate; begin with DBConnector.GetNDataset(true,13) do