From 056d6d271645f4ce29670411fab802f16e8d7057 Mon Sep 17 00:00:00 2001 From: michael Date: Thu, 11 Nov 1999 17:31:09 +0000 Subject: [PATCH] + Added Checks for all simple field types. + Initial implementation of Insert/Append --- fcl/db/createds.pp | 23 +++++-- fcl/db/dataset.inc | 167 ++++++++++++++++++++++++++++++++++++++------- fcl/db/db.pp | 10 ++- fcl/db/dbs.inc | 7 +- fcl/db/ddg_ds.pp | 30 +++++++- fcl/db/ddg_rec.pp | 10 ++- fcl/db/fields.inc | 7 +- fcl/db/testds.pp | 8 ++- 8 files changed, 226 insertions(+), 36 deletions(-) diff --git a/fcl/db/createds.pp b/fcl/db/createds.pp index f3f427ceef..836d500e79 100644 --- a/fcl/db/createds.pp +++ b/fcl/db/createds.pp @@ -16,6 +16,8 @@ **********************************************************************} program createds; +{$mode delphi} + uses ddg_rec,sysutils; Type IndexFile = File Of Longint; @@ -41,9 +43,18 @@ begin For I:=1 to 100 do begin S:=Format('This is person %d.',[i]); - ARec.Name:=S; - ARec.ShoeSize:=I; - ARec.height:=I*0.001; + With Arec Do + begin + Name:=S; + height:=I*0.001; + LongField:=i*4; + ShoeSize:=I; + WordField:=i*2; + DateTimeField:=Now; + TimeField:=Time; + DateField:=Date; + Even:=(I mod 2) = 0 + end; Write(F,ARec); end; Close(F); @@ -55,7 +66,11 @@ begin end. { $Log$ - Revision 1.2 1999-10-24 17:07:54 michael + Revision 1.3 1999-11-11 17:31:09 michael + + Added Checks for all simple field types. + + Initial implementation of Insert/Append + + Revision 1.2 1999/10/24 17:07:54 michael + Added copyright header } \ No newline at end of file diff --git a/fcl/db/dataset.inc b/fcl/db/dataset.inc index 0b6d550b4a..4d1fe4faeb 100644 --- a/fcl/db/dataset.inc +++ b/fcl/db/dataset.inc @@ -272,10 +272,22 @@ begin FDefaultFields:=FieldCount=0; DoBeforeOpen; Try + {$ifdef dsdebug} + Writeln ('Calling internal open'); + {$endif} InternalOpen; FBOF:=True; + {$ifdef dsdebug} + Writeln ('Setting state to browse'); + {$endif} SetState(dsBrowse); + {$ifdef dsdebug} + Writeln ('Setting buffer size'); + {$endif} SetBufListSize(DefaultBufferCount); + {$ifdef dsdebug} + Writeln ('Getting next records'); + {$endif} GetNextRecords; DoAfterOpen; DoAfterScroll; @@ -366,7 +378,7 @@ end; function TDataset.GetCanModify: Boolean; begin - //!! To be implemented + Result:=True; end; procedure TDataset.GetChildren(Proc: TGetChildProc; Root: TComponent); @@ -416,9 +428,9 @@ begin Case FieldType of ftUnknown : Result:=Tfield; ftString: Result := TStringField; - ftSmallint: Result := TLongIntField; + ftSmallint: Result := TSmallIntField; ftInteger: Result := TLongintField; - ftWord: Result := TLongintField; + ftWord: Result := TWordField; ftBoolean: Result := TBooleanField; ftFloat: Result := TFloatField; ftDate: Result := TDateField; @@ -455,7 +467,7 @@ begin Shifted:=FRecordCount=FBufferCount; If Shifted then begin - ShiftBuffers(1); + ShiftBuffers(0,1); Dec(FRecordCount); end; {$ifdef dsdebug} @@ -475,7 +487,7 @@ begin begin if shifted then begin - ShiftBuffers(-1); + ShiftBuffers(0,-1); inc(FRecordCount); end; CursorPosChanged; @@ -511,7 +523,7 @@ begin If Shifted Then begin SetCurrentRecord(0); - ShiftBuffers(-1); + ShiftBuffers(0,-1); end; Result:=GetRecord(FBuffers[0],gmPrior,True)=grOK; If Result then @@ -529,7 +541,7 @@ begin begin If Shifted then begin - ShiftBuffers(1); + ShiftBuffers(0,1); end; CursorPosChanged; end; @@ -641,11 +653,26 @@ begin Value:=I; If Value>FBufferCount then begin + {$ifdef dsdebug} + Writeln ('Reallocating memory :',(Value+1)*SizeOf(PChar)); + {$endif} ReAllocMem(FBuffers,(Value+1)*SizeOf(PChar)); - FillChar(FBuffers[FBufferCount+1],(Value-FBufferCount)*SizeOF(Pchar),#0); + {$ifdef dsdebug} + Writeln ('Filling memory :',(Value-FBufferCount)*SizeOf(PChar)); + {$endif} + FillChar(FBuffers[FBufferCount],(Value+1-FBufferCount)*SizeOF(Pchar),#0); + {$ifdef dsdebug} + Writeln ('Filled memory :'); + {$endif} Try + {$ifdef dsdebug} + Writeln ('Assigning buffers :',(Value+1)*SizeOf(PChar)); + {$endif} For I:=FBufferCount to Value do FBuffers[i]:=AllocRecordBuffer; + {$ifdef dsdebug} + Writeln ('Assigned buffers :',(Value+1)*SizeOf(PChar)); + {$endif} except I:=FBufferCount; While (I<=Value) and (FBuffers[i]<>Nil) do @@ -676,7 +703,9 @@ procedure TDataset.SetCurrentRecord(Index: Longint); begin If FCurrentRecord<>Index then begin + {$ifdef DSdebug} Writeln ('Setting current record to',index); + {$endif} Case GetBookMarkFlag(FBuffers[Index]) of bfCurrent : InternalSetToRecord(FBuffers[Index]); bfBOF : InternalFirst; @@ -788,14 +817,12 @@ end; procedure TDataset.Append; - begin - //!! To be implemented + DoInsertAppend(True); end; procedure TDataset.AppendRecord(const Values: array of const); - begin //!! To be implemented end; @@ -838,14 +865,12 @@ end; procedure TDataset.Close; - begin Active:=False; end; function TDataset.CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint; - begin Result:=0; end; @@ -878,11 +903,76 @@ begin //!! To be implemented end; +procedure TDataset.DoInsertAppend(DoAppend : Boolean); + +Var Buffer : PChar; + BookBeforeInsert : TBookmarkStr; +begin + If Not CanModify then + DatabaseError(SDatasetReadOnly,Self); + CheckBrowseMode; + DoBeforeInsert; + DoBeforeScroll; + If Not DoAppend then + begin + // need to scroll up al buffers after current one, + // but copy current bookmark to insert buffer. + BookBeforeInsert:=Bookmark; + ShiftBuffers(FActiveRecord,1); + // Active buffer is now edit buffer. Initialize. + InitRecord(ActiveBuffer); + // Put bookmark in edit buffer. + if FRecordCount=0 then + SetBookmarkFlag(ActiveBuffer,bfBOF) + else + SetBookMarkData(ActiveBuffer,Pointer(BookBeforeInsert)); + // update buffer count. + If FRecordCount #0; end; 1: Move(PDDGData(ActiveBuffer)^.Height, Buffer^, Field.DataSize); - 2: Move(PDDGData(ActiveBuffer)^.ShoeSize, Buffer^, Field.DataSize); + 2: Move(PDDGData(ActiveBuffer)^.LongField, Buffer^, Field.DataSize); + 3: Move(PDDGData(ActiveBuffer)^.ShoeSize, Buffer^, Field.DataSize); + 4: Move(PDDGData(ActiveBuffer)^.WordField, Buffer^, Field.DataSize); + 5: Move(PDDGData(ActiveBuffer)^.DateTimeField, Buffer^, Field.DataSize); + 6: Move(PDDGData(ActiveBuffer)^.TimeField, Buffer^, Field.DataSize); + 7: Move(PDDGData(ActiveBuffer)^.DateField, Buffer^, Field.DataSize); + 8: Move(PDDGData(ActiveBuffer)^.Even, Buffer^, Field.DataSize); end; end; @@ -308,7 +316,13 @@ begin FieldDefs.Clear; TFieldDef.Create(FieldDefs, 'Name', ftString, SizeOf(TNameStr), False, 1); TFieldDef.Create(FieldDefs, 'Height', ftFloat, 0, False, 2); - TFieldDef.Create(FieldDefs, 'ShoeSize', ftInteger, 0, False, 3); + TFieldDef.Create(FieldDefs, 'LongField',ftInteger, 0, False, 3); + TFieldDef.Create(FieldDefs, 'ShoeSize', ftSmallint, 0, False, 4); + TFieldDef.Create(FieldDefs, 'WordField', ftword, 0, false, 5); + TFieldDef.Create(FieldDefs, 'DateTimeField', ftDateTime, 0, false, 6); + TFieldDef.Create(FieldDefs, 'TimeField',ftTime, 0, false, 7); + TFieldDef.Create(FieldDefs, 'DateField',ftDate, 0, false, 8); + TFieldDef.Create(FieldDefs, 'Booleanfield',ftboolean, 0, False, 9); end; procedure TDDGDataSet.InternalLast; @@ -396,13 +410,25 @@ begin BookmarkSize := SizeOf(Integer); // initialize bookmark size for VCL InternalInitFieldDefs; // initialize FieldDef objects // Create TField components when no persistent fields have been created + {$ifdef dsdebug} + writeln ('Creating Fields'); + {$endif} if DefaultFields then CreateFields; + {$ifdef dsdebug} + writeln ('Binding Fields'); + {$endif} BindFields(True); // bind FieldDefs to actual data except + {$ifdef dsdebug} + Writeln ('Caught Exception !!'); + {$endif} CloseFile(FDataFile); FillChar(FDataFile, SizeOf(FDataFile), 0); raise; end; + {$ifdef dsdebug} + Writeln ('End of internalopen'); + {$endif} end; procedure TDDGDataSet.InternalPost; diff --git a/fcl/db/ddg_rec.pp b/fcl/db/ddg_rec.pp index 54ce2b4da6..801db0fc65 100644 --- a/fcl/db/ddg_rec.pp +++ b/fcl/db/ddg_rec.pp @@ -2,6 +2,8 @@ unit DDG_Rec; interface +uses sysutils; + type // arbitary-length array of char used for name field @@ -12,7 +14,13 @@ type TDDGData = record Name: TNameStr; Height: Extended; - ShoeSize: Integer; + LongField : Longint; + ShoeSize: SmallInt; + WordField : Word; + DatetimeField : TDateTime; + TimeField : TDateTime; + DateField : TDateTime; + Even : Boolean; end; // Pascal file of record which holds "table" data: diff --git a/fcl/db/fields.inc b/fcl/db/fields.inc index 69c1eeb0e9..9a0de8bedb 100644 --- a/fcl/db/fields.inc +++ b/fcl/db/fields.inc @@ -1030,6 +1030,7 @@ constructor TBooleanField.Create(AOwner: TComponent); begin Inherited Create(AOwner); + SetDataType(ftBoolean); DisplayValues:='True;False'; end; @@ -1734,7 +1735,11 @@ end; { $Log$ - Revision 1.2 1999-10-24 17:07:54 michael + Revision 1.3 1999-11-11 17:31:09 michael + + Added Checks for all simple field types. + + Initial implementation of Insert/Append + + Revision 1.2 1999/10/24 17:07:54 michael + Added copyright header } \ No newline at end of file diff --git a/fcl/db/testds.pp b/fcl/db/testds.pp index a117dfc504..62cb5886a3 100644 --- a/fcl/db/testds.pp +++ b/fcl/db/testds.pp @@ -44,6 +44,7 @@ Procedure DumpField(F : Tfield); begin With F do begin + writeln ('-------------------------------------'); Writeln ('FieldName : ',FieldName); Writeln ('FieldNo : ',FieldNo); Writeln ('Index : ',Index); @@ -87,6 +88,7 @@ begin With Data do While NOT EOF do begin + Writeln ('================================================'); For I:=0 to FieldCount-1 do DumpFieldData(Fields[I]); Next; @@ -176,7 +178,11 @@ begin end. { $Log$ - Revision 1.2 1999-10-24 17:07:54 michael + Revision 1.3 1999-11-11 17:31:09 michael + + Added Checks for all simple field types. + + Initial implementation of Insert/Append + + Revision 1.2 1999/10/24 17:07:54 michael + Added copyright header }