dataset.inc 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by Michael Van Canneyt, member of the
  5. Free Pascal development team
  6. Dataset implementation
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. { ---------------------------------------------------------------------
  14. TDataSet
  15. ---------------------------------------------------------------------}
  16. Const
  17. DefaultBufferCount = 10;
  18. constructor TDataSet.Create(AOwner: TComponent);
  19. begin
  20. Inherited Create(AOwner);
  21. FFieldDefs:=TFieldDefs.Create(Self);
  22. FFieldList:=TFields.Create(Self);
  23. FDataSources:=TList.Create;
  24. end;
  25. destructor TDataSet.Destroy;
  26. var
  27. i: Integer;
  28. begin
  29. Active:=False;
  30. FFieldDefs.Free;
  31. FFieldList.Free;
  32. With FDatasources do
  33. begin
  34. While Count>0 do
  35. TDatasource(Items[Count - 1]).DataSet:=Nil;
  36. Free;
  37. end;
  38. if Assigned(FBuffers) then
  39. begin
  40. for i := 0 to FBufferCount do
  41. FreeRecordBuffer(FBuffers[i]);
  42. FreeMem(FBuffers);
  43. end;
  44. Inherited Destroy;
  45. end;
  46. Procedure TDataset.ActivateBuffers;
  47. begin
  48. FBOF:=False;
  49. FEOF:=False;
  50. FRecordCount:=1;
  51. FActiveRecord:=0;
  52. end;
  53. Procedure TDataset.UpdateFieldDefs;
  54. begin
  55. //!! To be implemented
  56. end;
  57. Procedure TDataset.BindFields(Binding: Boolean);
  58. Var I : longint;
  59. begin
  60. {
  61. Here some magic will be needed later; for now just simply set
  62. Just set fieldno from listindex...
  63. Later we should take it from the fielddefs.
  64. // ATM Set by CreateField ...
  65. For I:=0 to FFieldList.Count-1 do
  66. FFieldList[i].FFieldNo:=I;
  67. }
  68. end;
  69. Function TDataset.BookmarkAvailable: Boolean;
  70. Const BookmarkStates = [dsBrowse,dsEdit,dsInsert];
  71. begin
  72. Result:=(Not IsEmpty) and (State in BookmarkStates)
  73. and (getBookMarkFlag(ActiveBuffer)=bfCurrent);
  74. end;
  75. Procedure TDataset.CalculateFields(Buffer: PChar);
  76. begin
  77. { no internal calced fields or caches yet }
  78. DoOnCalcFields;
  79. end;
  80. Procedure TDataset.CheckActive;
  81. begin
  82. If Not Active then
  83. DataBaseError(SInactiveDataset);
  84. end;
  85. Procedure TDataset.CheckInactive;
  86. begin
  87. If Active then
  88. DataBaseError(SActiveDataset);
  89. end;
  90. Procedure TDataset.ClearBuffers;
  91. begin
  92. FRecordCount:=0;
  93. FactiveRecord:=0;
  94. FCurrentRecord:=-1;
  95. FBOF:=True;
  96. FEOF:=True;
  97. end;
  98. Procedure TDataset.ClearCalcFields(Buffer: PChar);
  99. begin
  100. //!! To be implemented
  101. end;
  102. Procedure TDataset.CloseBlob(Field: TField);
  103. begin
  104. //!! To be implemented
  105. end;
  106. Procedure TDataset.CloseCursor;
  107. begin
  108. //!! To be implemented
  109. end;
  110. Procedure TDataset.CreateFields;
  111. Var I : longint;
  112. begin
  113. {$ifdef DSDebug}
  114. Writeln ('Creating fields');
  115. Writeln ('Count : ',fielddefs.Count);
  116. For I:=0 to FieldDefs.Count-1 do
  117. Writeln('Def ',I,' : ',Fielddefs.items[i].Name,'(',Fielddefs.items[i].FieldNo,')');
  118. {$endif}
  119. For I:=0 to fielddefs.Count-1 do
  120. With Fielddefs.Items[I] do
  121. If DataType<>ftUnknown then
  122. begin
  123. {$ifdef DSDebug}
  124. Writeln('About to create field',FieldDefs.Items[i].Name);
  125. {$endif}
  126. CreateField(self);
  127. end;
  128. end;
  129. Procedure TDataset.DataEvent(Event: TDataEvent; Info: Longint);
  130. Var
  131. i : longint;
  132. begin
  133. // Do some bookkeeping;
  134. case Event of
  135. deFieldChange :
  136. begin
  137. if TField(Info).FieldKind in [fkData,fkInternalCalc] then
  138. SetModified(True);
  139. if FInternalCalcFields and (TField(Info).FieldKind = fkData) then
  140. RefreshInternalCalcFields(ActiveBuffer)
  141. else if (FCalcFieldsSize <> 0) and FAutoCalcFields and
  142. (TField(Info).FieldKind = fkData) then
  143. CalculateFields(ActiveBuffer);
  144. TField(Info).Change;
  145. end;
  146. end;
  147. // Distribute event to datasets;
  148. for I := 0 to FDataSources.Count - 1 do
  149. TDataSource(FDataSources[I]).ProcessEvent(Event, Info);
  150. end;
  151. Procedure TDataset.DestroyFields;
  152. begin
  153. FFieldList.Clear;
  154. end;
  155. Procedure TDataset.DoAfterCancel;
  156. begin
  157. If assigned(FAfterCancel) then
  158. FAfterCancel(Self);
  159. end;
  160. Procedure TDataset.DoAfterClose;
  161. begin
  162. If assigned(FAfterClose) then
  163. FAfterClose(Self);
  164. end;
  165. Procedure TDataset.DoAfterDelete;
  166. begin
  167. If assigned(FAfterDelete) then
  168. FAfterDelete(Self);
  169. end;
  170. Procedure TDataset.DoAfterEdit;
  171. begin
  172. If assigned(FAfterEdit) then
  173. FAfterEdit(Self);
  174. end;
  175. Procedure TDataset.DoAfterInsert;
  176. begin
  177. If assigned(FAfterInsert) then
  178. FAfterInsert(Self);
  179. end;
  180. Procedure TDataset.DoAfterOpen;
  181. begin
  182. If assigned(FAfterOpen) then
  183. FAfterOpen(Self);
  184. end;
  185. Procedure TDataset.DoAfterPost;
  186. begin
  187. If assigned(FAfterPost) then
  188. FAfterPost(Self);
  189. end;
  190. Procedure TDataset.DoAfterScroll;
  191. begin
  192. If assigned(FAfterScroll) then
  193. FAfterScroll(Self);
  194. end;
  195. Procedure TDataset.DoBeforeCancel;
  196. begin
  197. If assigned(FBeforeCancel) then
  198. FBeforeCancel(Self);
  199. end;
  200. Procedure TDataset.DoBeforeClose;
  201. begin
  202. If assigned(FBeforeClose) then
  203. FBeforeClose(Self);
  204. end;
  205. Procedure TDataset.DoBeforeDelete;
  206. begin
  207. If assigned(FBeforeDelete) then
  208. FBeforeDelete(Self);
  209. end;
  210. Procedure TDataset.DoBeforeEdit;
  211. begin
  212. If assigned(FBeforeEdit) then
  213. FBeforeEdit(Self);
  214. end;
  215. Procedure TDataset.DoBeforeInsert;
  216. begin
  217. If assigned(FBeforeInsert) then
  218. FBeforeInsert(Self);
  219. end;
  220. Procedure TDataset.DoBeforeOpen;
  221. begin
  222. If assigned(FBeforeOpen) then
  223. FBeforeOpen(Self);
  224. end;
  225. Procedure TDataset.DoBeforePost;
  226. begin
  227. If assigned(FBeforePost) then
  228. FBeforePost(Self);
  229. end;
  230. Procedure TDataset.DoBeforeScroll;
  231. begin
  232. If assigned(FBeforeScroll) then
  233. FBeforeScroll(Self);
  234. end;
  235. Procedure TDataset.DoInternalOpen;
  236. begin
  237. FBufferCount:=0;
  238. FDefaultFields:=FieldCount=0;
  239. DoBeforeOpen;
  240. Try
  241. {$ifdef dsdebug}
  242. Writeln ('Calling internal open');
  243. {$endif}
  244. InternalOpen;
  245. FBOF:=True;
  246. {$ifdef dsdebug}
  247. Writeln ('Setting state to browse');
  248. {$endif}
  249. SetState(dsBrowse);
  250. {$ifdef dsdebug}
  251. Writeln ('Setting buffer size');
  252. {$endif}
  253. (*
  254. SetBufListSize(DefaultBufferCount);
  255. {$ifdef dsdebug}
  256. Writeln ('Getting next records');
  257. {$endif}
  258. GetNextRecords;
  259. *)
  260. RecalcBufListSize;
  261. //SetBufferCount(DefaultBufferCount);
  262. DoAfterOpen;
  263. DoAfterScroll;
  264. except
  265. SetState(dsInactive);
  266. DoInternalClose;
  267. raise;
  268. end;
  269. end;
  270. Function TDataset.RequiredBuffers : longint;
  271. {
  272. If later some datasource requires more buffers (grids etc)
  273. then it should be taken into account here...
  274. }
  275. begin
  276. Result:=0;
  277. end;
  278. Procedure TDataset.DoInternalClose;
  279. begin
  280. FreeFieldBuffers;
  281. ClearBuffers;
  282. SetBufListSize(-1);
  283. SetState(dsInactive);
  284. InternalClose;
  285. end;
  286. Procedure TDataset.DoOnCalcFields;
  287. begin
  288. If assigned(FOnCalcfields) then
  289. FOnCalcFields(Self);
  290. end;
  291. Procedure TDataset.DoOnNewRecord;
  292. begin
  293. If assigned(FOnNewRecord) then
  294. FOnNewRecord(Self);
  295. end;
  296. Function TDataset.FieldByNumber(FieldNo: Longint): TField;
  297. begin
  298. Result:=FFieldList.FieldByNumber(FieldNo);
  299. end;
  300. Function TDataset.FindRecord(Restart, GoForward: Boolean): Boolean;
  301. begin
  302. //!! To be implemented
  303. end;
  304. Procedure TDataset.FreeFieldBuffers;
  305. Var I : longint;
  306. begin
  307. For I:=0 to FFieldList.Count-1 do
  308. FFieldList[i].FreeBuffers;
  309. end;
  310. Function TDataset.GetBookmarkStr: TBookmarkStr;
  311. begin
  312. Result:='';
  313. If BookMarkAvailable then
  314. begin
  315. SetLength(Result,FBookMarkSize);
  316. GetBookMarkData(ActiveBuffer,Pointer(Result));
  317. end
  318. end;
  319. Function TDataset.GetBuffer (Index : longint) : Pchar;
  320. begin
  321. Result:=FBuffers[Index];
  322. end;
  323. Procedure TDataset.GetCalcFields(Buffer: PChar);
  324. begin
  325. //!! To be implemented
  326. end;
  327. Function TDataset.GetCanModify: Boolean;
  328. begin
  329. Result:=True;
  330. end;
  331. Procedure TDataset.GetChildren(Proc: TGetChildProc; Root: TComponent);
  332. begin
  333. //!! To be implemented
  334. end;
  335. Function TDataset.GetDataSource: TDataSource;
  336. begin
  337. Result:=nil;
  338. end;
  339. Function TDataset.GetField (Index : Longint) : TField;
  340. begin
  341. Result:=FFIeldList[index];
  342. end;
  343. {
  344. This is not yet allowed, FPC doesn't allow typed consts of Classes...
  345. Const
  346. DefFieldClasses : Array [TFieldType] of TFieldClass =
  347. ( { ftUnknown} Tfield,
  348. { ftString} TStringField,
  349. { ftSmallint} TLongIntField,
  350. { ftInteger} TLongintField,
  351. { ftWord} TLongintField,
  352. { ftBoolean} TBooleanField,
  353. { ftFloat} TFloatField,
  354. { ftDate} TDateField,
  355. { ftTime} TTimeField,
  356. { ftDateTime} TDateTimeField,
  357. { ftBytes} TBytesField,
  358. { ftVarBytes} TVarBytesField,
  359. { ftAutoInc} TAutoIncField,
  360. { ftBlob} TBlobField,
  361. { ftMemo} TMemoField,
  362. { ftGraphic} TGraphicField,
  363. { ftFmtMemo} TMemoField,
  364. { ftParadoxOle} Nil,
  365. { ftDBaseOle} Nil,
  366. { ftTypedBinary} Nil,
  367. { ftCursor} Nil
  368. );
  369. }
  370. Function TDataset.GetFieldClass(FieldType: TFieldType): TFieldClass;
  371. begin
  372. Case FieldType of
  373. ftUnknown : Result:=Tfield;
  374. ftString: Result := TStringField;
  375. ftSmallint: Result := TSmallIntField;
  376. ftInteger: Result := TLongintField;
  377. ftWord: Result := TWordField;
  378. ftBoolean: Result := TBooleanField;
  379. ftFloat: Result := TFloatField;
  380. ftDate: Result := TDateField;
  381. ftTime: Result := TTimeField;
  382. ftDateTime: Result := TDateTimeField;
  383. ftBytes: Result := TBytesField;
  384. ftVarBytes: Result := TVarBytesField;
  385. ftAutoInc: Result := TAutoIncField;
  386. ftBlob: Result := TBlobField;
  387. ftMemo: Result := TMemoField;
  388. ftGraphic: Result := TGraphicField;
  389. ftFmtMemo: Result := TMemoField;
  390. ftParadoxOle: Result := Nil;
  391. ftDBaseOle: Result := Nil;
  392. ftTypedBinary: Result := Nil;
  393. ftCursor: Result := Nil;
  394. end;
  395. end;
  396. Function TDataset.GetIsIndexField(Field: TField): Boolean;
  397. begin
  398. //!! To be implemented
  399. end;
  400. Function TDataset.GetNextRecord: Boolean;
  401. Var Shifted : Boolean;
  402. begin
  403. {$ifdef dsdebug}
  404. Writeln ('Getting next record. Internal RecordCount : ',FRecordCount);
  405. {$endif}
  406. Shifted:=FRecordCount=FBufferCount;
  407. If Shifted then
  408. begin
  409. ShiftBuffers(0,1);
  410. Dec(FRecordCount);
  411. end;
  412. {$ifdef dsdebug}
  413. Writeln ('Getting data into buffer : ',FRecordCount);
  414. {$endif}
  415. If FRecordCount>0 Then SetCurrentRecord(FRecordCount-1);
  416. Result:=GetRecord(FBuffers[FRecordCount],gmNext,True)=grOK;
  417. If Result then
  418. begin
  419. If FRecordCount=0 then
  420. ActivateBuffers
  421. else
  422. If FRecordCount<FBufferCount then
  423. Inc(FRecordCount);
  424. FCurrentRecord:=FRecordCount - 1;
  425. end
  426. else
  427. begin
  428. if shifted then
  429. begin
  430. ShiftBuffers(0,-1);
  431. inc(FRecordCount);
  432. end;
  433. CursorPosChanged;
  434. end;
  435. {$ifdef dsdebug}
  436. Writeln ('Result getting next record : ',Result);
  437. {$endif}
  438. end;
  439. Function TDataset.GetNextRecords: Longint;
  440. begin
  441. Result:=0;
  442. {$ifdef dsdebug}
  443. Writeln ('Getting next record(s), need :',FBufferCount);
  444. {$endif}
  445. While (FRecordCount<FBufferCount) and GetNextRecord do
  446. Inc(Result);
  447. {$ifdef dsdebug}
  448. Writeln ('Result Getting next record(s), GOT :',RESULT);
  449. {$endif}
  450. end;
  451. Function TDataset.GetPriorRecord: Boolean;
  452. Var Shifted : boolean;
  453. begin
  454. {$ifdef dsdebug}
  455. Writeln ('Getting previous record');
  456. {$endif}
  457. Shifted:=FRecordCount>0;
  458. If Shifted Then
  459. begin
  460. SetCurrentRecord(0);
  461. ShiftBuffers(0,-1);
  462. end;
  463. Result:=GetRecord(FBuffers[0],gmPrior,True)=grOK;
  464. If Result then
  465. begin
  466. If FRecordCount=0 then
  467. ActivateBuffers
  468. else
  469. begin
  470. If FrecordCount<FBufferCount then
  471. Inc(FRecordCount);
  472. end;
  473. FCurrentRecord:=0;
  474. end
  475. else
  476. begin
  477. If Shifted then
  478. begin
  479. ShiftBuffers(0,1);
  480. end;
  481. CursorPosChanged;
  482. end;
  483. end;
  484. Function TDataset.GetPriorRecords: Longint;
  485. begin
  486. Result:=0;
  487. {$ifdef dsdebug}
  488. Writeln ('Getting previous record(s), need :',FBufferCount);
  489. {$endif}
  490. While (FRecordCount<FbufferCount) and GetPriorRecord do
  491. Inc(Result);
  492. end;
  493. Function TDataset.GetRecNo: Longint;
  494. begin
  495. //!! To be implemented
  496. end;
  497. Function TDataset.GetRecordCount: Longint;
  498. begin
  499. //!! To be implemented
  500. end;
  501. Procedure TDataset.InitFieldDefs;
  502. begin
  503. //!! To be implemented
  504. end;
  505. Procedure TDataset.InitRecord(Buffer: PChar);
  506. begin
  507. InternalInitRecord(Buffer);
  508. ClearCalcFields(Buffer);
  509. end;
  510. Procedure TDataset.InternalCancel;
  511. begin
  512. //!! To be implemented
  513. end;
  514. Procedure TDataset.InternalEdit;
  515. begin
  516. //!! To be implemented
  517. end;
  518. Procedure TDataset.InternalRefresh;
  519. begin
  520. //!! To be implemented
  521. end;
  522. Procedure TDataset.Loaded;
  523. begin
  524. //!! To be implemented
  525. end;
  526. Procedure TDataset.OpenCursor(InfoQuery: Boolean);
  527. begin
  528. //!! To be implemented
  529. end;
  530. Procedure TDataset.RefreshInternalCalcFields(Buffer: PChar);
  531. begin
  532. //!! To be implemented
  533. end;
  534. Procedure TDataset.RestoreState(const Value: TDataSetState);
  535. begin
  536. //!! To be implemented
  537. end;
  538. Procedure TDataset.SetActive (Value : Boolean);
  539. begin
  540. If Value<>Factive then
  541. If Value then
  542. DoInternalOpen
  543. else
  544. DoInternalClose;
  545. FActive:=Value;
  546. end;
  547. procedure TDataSet.SetBufferCount(const AValue: Longint);
  548. Var
  549. ShiftCount: Integer;
  550. begin
  551. {$ifdef dsdebug}
  552. Writeln('in SetBufferCount(',AValue,')');
  553. {$endif}
  554. If (FBufferCount=AValue) Then
  555. exit;
  556. If AValue<FRecordCount Then
  557. Begin
  558. If (AValue>0)And(ActiveRecord>AValue-1) Then
  559. begin
  560. // ActiveRecord Will be pointing to a deleted record
  561. // Move Buffers to a safe place and then adjust buffer count
  562. ShiftCount:=FActiveRecord - Avalue + 1;
  563. ShiftBuffers(0, ShiftCount);
  564. FActiveRecord:=AValue-1;
  565. End;
  566. FRecordCount:=AValue;
  567. // Current record Will be pointing to a invalid record
  568. // if we are not in BOF or EOF state then make current record point
  569. // to the last record in buffer
  570. If FCurrentRecord<>-1 Then
  571. Begin
  572. FCurrentRecord:=FRecordCount - 1;
  573. if FCurrentRecord=-1 Then
  574. InternalFirst;
  575. End;
  576. End;
  577. SetBufListSize(Avalue);
  578. GetNextRecords;
  579. {$Ifdef dsDebug}
  580. WriteLn(
  581. 'SetBufferCount: FActiveRecord=',FActiveRecord,
  582. ' FCurrentRecord=',FCurrentRecord,
  583. ' FBufferCount= ',FBufferCount,
  584. ' FRecordCount=',FRecordCount);
  585. {$Endif}
  586. end;
  587. Procedure TDataset.SetBookmarkStr(const Value: TBookmarkStr);
  588. begin
  589. GotoBookMark(Pointer(Value))
  590. end;
  591. Procedure TDataset.SetBufListSize(Value: Longint);
  592. Var I : longint;
  593. begin
  594. {$ifdef dsdebug}
  595. Writeln ('SetBufListSize: ',Value);
  596. {$endif}
  597. If Value=FBufferCount Then
  598. exit;
  599. If Value>FBufferCount then
  600. begin
  601. {$ifdef dsdebug}
  602. Writeln (' Reallocating memory :',(Value+1)*SizeOf(PChar));
  603. {$endif}
  604. ReAllocMem(FBuffers,(Value+1)*SizeOf(PChar));
  605. {$ifdef dsdebug}
  606. Writeln (' Filling memory :',(Value-FBufferCount)*SizeOf(PChar));
  607. {$endif}
  608. FillChar(FBuffers[FBufferCount],(Value+1-FBufferCount)*SizeOF(Pchar),#0);
  609. {$ifdef dsdebug}
  610. Writeln (' Filled memory :');
  611. {$endif}
  612. Try
  613. {$ifdef dsdebug}
  614. Writeln (' Assigning buffers :',(Value+1)*SizeOf(PChar));
  615. {$endif}
  616. For I:=FBufferCount to Value do
  617. FBuffers[i]:=AllocRecordBuffer;
  618. {$ifdef dsdebug}
  619. Writeln (' Assigned buffers ',FBufferCount,' :',(Value+1)*SizeOf(PChar));
  620. {$endif}
  621. except
  622. I:=FBufferCount;
  623. While (I<=Value) and (FBuffers[i]<>Nil) do
  624. begin
  625. FreeRecordBuffer(FBuffers[i]);
  626. Inc(i);
  627. end;
  628. raise;
  629. end;
  630. end
  631. else
  632. begin
  633. {$ifdef dsdebug}
  634. Writeln (' Freeing buffers :',FBufferCount-Value);
  635. {$endif}
  636. If Assigned(FBuffers) then
  637. begin
  638. For I:=Value+1 to FBufferCount do
  639. FreeRecordBuffer(FBuffers[i]);
  640. ReAllocMem(FBuffers,(Value+1)*SizeOf(Pchar));
  641. end;
  642. end;
  643. If Value=-1 then
  644. Value:=0;
  645. FBufferCount:=Value;
  646. {$ifdef dsdebug}
  647. Writeln (' SetBufListSize: Final FBufferCount=',FBufferCount);
  648. {$endif}
  649. end;
  650. Procedure TDataset.SetChildOrder(Component: TComponent; Order: Longint);
  651. begin
  652. //!! To be implemented
  653. end;
  654. Procedure TDataset.SetCurrentRecord(Index: Longint);
  655. begin
  656. If FCurrentRecord<>Index then
  657. begin
  658. {$ifdef DSdebug}
  659. Writeln ('Setting current record to',index);
  660. {$endif}
  661. Case GetBookMarkFlag(FBuffers[Index]) of
  662. bfCurrent : InternalSetToRecord(FBuffers[Index]);
  663. bfBOF : InternalFirst;
  664. bfEOF : InternalLast;
  665. end;
  666. FCurrentRecord:=index;
  667. end;
  668. end;
  669. Procedure TDataset.SetField (Index : Longint;Value : TField);
  670. begin
  671. //!! To be implemented
  672. end;
  673. Procedure TDataset.SetFilterOptions(Value: TFilterOptions);
  674. begin
  675. //!! To be implemented
  676. end;
  677. Procedure TDataset.SetFilterText(const Value: string);
  678. begin
  679. //!! To be implemented
  680. end;
  681. Procedure TDataset.SetFiltered(Value: Boolean);
  682. begin
  683. //!! To be implemented
  684. end;
  685. Procedure TDataset.SetFound(const Value: Boolean);
  686. begin
  687. //!! To be implemented
  688. end;
  689. Procedure TDataset.SetModified(Value: Boolean);
  690. begin
  691. //!! To be implemented
  692. end;
  693. Procedure TDataset.SetName(const Value: TComponentName);
  694. begin
  695. //!! To be implemented
  696. inherited SetName(Value);
  697. end;
  698. Procedure TDataset.SetOnFilterRecord(const Value: TFilterRecordEvent);
  699. begin
  700. //!! To be implemented
  701. end;
  702. Procedure TDataset.SetRecNo(Value: Longint);
  703. begin
  704. //!! To be implemented
  705. end;
  706. Procedure TDataset.SetState(Value: TDataSetState);
  707. begin
  708. If Value<>FState then
  709. begin
  710. FState:=Value;
  711. DataEvent(deUpdateState,0);
  712. end;
  713. end;
  714. Function TDataset.SetTempState(const Value: TDataSetState): TDataSetState;
  715. begin
  716. //!! To be implemented
  717. end;
  718. Function TDataset.TempBuffer: PChar;
  719. begin
  720. //!! To be implemented
  721. end;
  722. Procedure TDataset.UpdateIndexDefs;
  723. begin
  724. //!! To be implemented
  725. end;
  726. Function TDataset.ControlsDisabled: Boolean;
  727. begin
  728. //!! To be implemented
  729. end;
  730. Function TDataset.ActiveBuffer: PChar;
  731. begin
  732. {$ifdef dsdebug}
  733. // Writeln ('Active buffer requested. Returning:',ActiveRecord);
  734. {$endif}
  735. Result:=FBuffers[ActiveRecord];
  736. end;
  737. Procedure TDataset.Append;
  738. begin
  739. DoInsertAppend(True);
  740. end;
  741. Procedure TDataset.AppendRecord(const Values: array of const);
  742. begin
  743. //!! To be implemented
  744. end;
  745. Function TDataset.BookmarkValid(ABookmark: TBookmark): Boolean;
  746. {
  747. Should be overridden by descendant objects.
  748. }
  749. begin
  750. Result:=False
  751. end;
  752. Procedure TDataset.Cancel;
  753. begin
  754. If State in [dsEdit,dsInsert] then
  755. begin
  756. DataEvent(deCheckBrowseMode,0);
  757. DoBeforeCancel;
  758. UpdateCursorPos;
  759. InternalCancel;
  760. FreeFieldBuffers;
  761. SetState(dsBrowse);
  762. Resync([]);
  763. DoAfterCancel;
  764. end;
  765. end;
  766. Procedure TDataset.CheckBrowseMode;
  767. begin
  768. CheckActive;
  769. DataEvent(deCheckBrowseMode,0);
  770. If State In [dsedit,dsinsert] then
  771. begin
  772. UpdateRecord;
  773. If Modified then
  774. Post
  775. else
  776. Cancel;
  777. end;
  778. end;
  779. Procedure TDataset.ClearFields;
  780. begin
  781. //!! To be implemented
  782. end;
  783. Procedure TDataset.Close;
  784. begin
  785. Active:=False;
  786. end;
  787. Function TDataset.CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint;
  788. begin
  789. Result:=0;
  790. end;
  791. Function TDataset.CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream;
  792. begin
  793. Result:=Nil;
  794. end;
  795. Procedure TDataset.CursorPosChanged;
  796. begin
  797. FCurrentRecord:=-1;
  798. end;
  799. Procedure TDataset.Delete;
  800. begin
  801. //!! To be implemented
  802. end;
  803. Procedure TDataset.DisableControls;
  804. begin
  805. If FDisableControlsCount=0 then
  806. begin
  807. { Save current state,
  808. needed to detect change of state when enabling controls.
  809. }
  810. FDisableControlsState:=FState;
  811. FEnableControlsEvent:=deDatasetChange;
  812. end;
  813. Inc(FDisableControlsCount);
  814. end;
  815. Procedure TDataset.DoInsertAppend(DoAppend : Boolean);
  816. Var Buffer : PChar;
  817. BookBeforeInsert : TBookmarkStr;
  818. begin
  819. If Not CanModify then
  820. DatabaseError(SDatasetReadOnly,Self);
  821. CheckBrowseMode;
  822. DoBeforeInsert;
  823. DoBeforeScroll;
  824. If Not DoAppend then
  825. begin
  826. {$ifdef dsdebug}
  827. Writeln ('going to insert mode');
  828. {$endif}
  829. // need to scroll up al buffers after current one,
  830. // but copy current bookmark to insert buffer.
  831. BookBeforeInsert:=Bookmark;
  832. ShiftBuffers(1,FActiveRecord);
  833. // Active buffer is now edit buffer. Initialize.
  834. InitRecord(ActiveBuffer);
  835. // Put bookmark in edit buffer.
  836. if FRecordCount=0 then
  837. SetBookmarkFlag(ActiveBuffer,bfBOF)
  838. else
  839. SetBookMarkData(ActiveBuffer,Pointer(BookBeforeInsert));
  840. // update buffer count.
  841. If FRecordCount<FBufferCount then
  842. Inc(FRecordCount);
  843. end
  844. else
  845. // Tricky, need to get last record and scroll down.
  846. begin
  847. {$ifdef dsdebug}
  848. Writeln ('going to append mode');
  849. {$endif}
  850. Buffer:=FBuffers[0];
  851. InitRecord(Buffer);
  852. // just mark buffer as last. GetPreviousrecords will do an internallast
  853. // Because of this...
  854. SetBookMarkFlag(Buffer,bfEOF);
  855. FRecordCount:=1;
  856. {$ifdef dsdebug}
  857. Writeln ('getting prior records');
  858. {$endif}
  859. GetPriorRecords;
  860. // update active record.
  861. FactiveRecord:=FRecordCount-1;
  862. end;
  863. SetState(dsInsert);
  864. try
  865. DoOnNewRecord;
  866. except
  867. UpdateCursorPos;
  868. resync([]);
  869. raise;
  870. end;
  871. // mark as not modified.
  872. FModified:=False;
  873. // Final events.
  874. DataEvent(deDatasetChange,0);
  875. DoAfterInsert;
  876. DoAfterScroll;
  877. {$ifdef dsdebug}
  878. Writeln ('Done with append');
  879. {$endif}
  880. end;
  881. Procedure TDataset.Edit;
  882. begin
  883. If Not CanModify then
  884. DatabaseError(SDatasetReadOnly,Self);
  885. If State in [dsedit,dsinsert] then exit;
  886. If FRecordCount = 0 then
  887. begin
  888. Insert;
  889. Exit;
  890. end;
  891. CheckBrowseMode;
  892. DoBeforeEdit;
  893. If Not TryDoing(@InternalEdit,OnEditError) then
  894. exit;
  895. SetState(dsedit);
  896. DataEvent(deRecordChange,0);
  897. DoAfterEdit;
  898. end;
  899. Procedure TDataset.EnableControls;
  900. begin
  901. If FDisableControlsCount>0 then
  902. begin
  903. Dec(FDisableControlsCount);
  904. If FDisableControlsCount=0 then
  905. begin
  906. // State changed since disablecontrols ?
  907. If FDisableControlsState<>FState then
  908. DataEvent(deUpdateState,0);
  909. If (FDisableControlsState<>dsInactive) and (FState<>dsInactive) then
  910. DataEvent(FEnableControlsEvent,0);
  911. end;
  912. end;
  913. end;
  914. Function TDataset.FieldByName(const FieldName: string): TField;
  915. begin
  916. Result:=FindField(FieldName);
  917. If Result=Nil then
  918. DatabaseErrorFmt(SFieldNotFound,[FieldName],Self);
  919. end;
  920. Function TDataset.FindField(const FieldName: string): TField;
  921. begin
  922. Result:=FFieldList.FindField(FieldName);
  923. end;
  924. Function TDataset.FindFirst: Boolean;
  925. begin
  926. //!! To be implemented
  927. end;
  928. Function TDataset.FindLast: Boolean;
  929. begin
  930. //!! To be implemented
  931. end;
  932. Function TDataset.FindNext: Boolean;
  933. begin
  934. //!! To be implemented
  935. end;
  936. Function TDataset.FindPrior: Boolean;
  937. begin
  938. //!! To be implemented
  939. end;
  940. Procedure TDataset.First;
  941. begin
  942. CheckBrowseMode;
  943. DoBeforeScroll;
  944. ClearBuffers;
  945. try
  946. InternalFirst;
  947. GetNextRecords;
  948. finally
  949. FBOF:=True;
  950. DataEvent(deDatasetChange,0);
  951. DoAfterScroll;
  952. end;
  953. end;
  954. Procedure TDataset.FreeBookmark(ABookmark: TBookmark);
  955. begin
  956. FreeMem(ABookMark,FBookMarkSize);
  957. end;
  958. Function TDataset.GetBookmark: TBookmark;
  959. begin
  960. if BookmarkAvailable then
  961. begin
  962. GetMem (Result,FBookMarkSize);
  963. GetBookMarkdata(ActiveBuffer,Result);
  964. end
  965. else
  966. Result:=Nil;
  967. end;
  968. Function TDataset.GetCurrentRecord(Buffer: PChar): Boolean;
  969. begin
  970. Result:=False;
  971. end;
  972. Procedure TDataset.GetFieldList(List: TList; const FieldNames: string);
  973. begin
  974. end;
  975. Procedure TDataset.GetFieldNames(List: TStrings);
  976. begin
  977. FFieldList.GetFieldNames(List);
  978. end;
  979. Procedure TDataset.GotoBookmark(ABookmark: TBookmark);
  980. begin
  981. If Assigned(ABookMark) then
  982. begin
  983. CheckBrowseMode;
  984. DoBeforeScroll;
  985. InternalGotoBookMark(ABookMark);
  986. Resync([rmExact,rmCenter]);
  987. DoAfterScroll;
  988. end;
  989. end;
  990. Procedure TDataset.Insert;
  991. begin
  992. DoInsertAppend(False);
  993. end;
  994. Procedure TDataset.InsertRecord(const Values: array of const);
  995. begin
  996. //!! To be implemented
  997. end;
  998. Function TDataset.IsEmpty: Boolean;
  999. begin
  1000. Result:=(Bof and Eof);
  1001. end;
  1002. Function TDataset.IsSequenced: Boolean;
  1003. begin
  1004. //!! To be implemented
  1005. end;
  1006. Procedure TDataset.Last;
  1007. begin
  1008. CheckBrowseMode;
  1009. DoBeforeScroll;
  1010. ClearBuffers;
  1011. try
  1012. InternalLast;
  1013. GetPriorRecords;
  1014. FActiveRecord:=FRecordCount-1;
  1015. finally
  1016. FEOF:=true;
  1017. DataEvent(deDataSetChange, 0);
  1018. DoAfterScroll;
  1019. end;
  1020. end;
  1021. Function TDataset.MoveBy(Distance: Longint): Longint;
  1022. Var
  1023. TheResult: Integer;
  1024. Function Scrollforward : Integer;
  1025. begin
  1026. Result:=0;
  1027. {$ifdef dsdebug}
  1028. Writeln('Scrolling forward :',Distance);
  1029. Writeln('Active buffer : ',FActiveRecord);
  1030. Writeln('RecordCount : ',FRecordCount);
  1031. WriteLn('BufferCount : ',FBufferCount);
  1032. {$endif}
  1033. FBOF:=False;
  1034. While (Distance>0) and not FEOF do
  1035. begin
  1036. If FActiveRecord<FRecordCount-1 then
  1037. begin
  1038. Inc(FActiveRecord);
  1039. Dec(Distance);
  1040. Inc(TheResult); //Inc(Result);
  1041. end
  1042. else
  1043. begin
  1044. {$ifdef dsdebug}
  1045. Writeln('Moveby : need next record');
  1046. {$endif}
  1047. If GetNextRecord then
  1048. begin
  1049. Dec(Distance);
  1050. Dec(Result);
  1051. Inc(TheResult); //Inc(Result);
  1052. end
  1053. else
  1054. FEOF:=true;
  1055. end;
  1056. end
  1057. end;
  1058. Function ScrollBackward : Integer;
  1059. begin
  1060. Result:=0;
  1061. {$ifdef dsdebug}
  1062. Writeln('Scrolling backward:',Abs(Distance));
  1063. Writeln('Active buffer : ',FActiveRecord);
  1064. Writeln('RecordCunt : ',FRecordCount);
  1065. WriteLn('BufferCount : ',FBufferCount);
  1066. {$endif}
  1067. FEOF:=False;
  1068. While (Distance<0) and not FBOF do
  1069. begin
  1070. If FActiveRecord>0 then
  1071. begin
  1072. Dec(FActiveRecord);
  1073. Inc(Distance);
  1074. Dec(TheResult); //Dec(Result);
  1075. end
  1076. else
  1077. begin
  1078. {$ifdef dsdebug}
  1079. Writeln('Moveby : need next record');
  1080. {$endif}
  1081. If GetPriorRecord then
  1082. begin
  1083. Inc(Distance);
  1084. Inc(Result);
  1085. Dec(TheResult); //Dec(Result);
  1086. end
  1087. else
  1088. FBOF:=true;
  1089. end;
  1090. end
  1091. end;
  1092. Var
  1093. PrevRecordCount : Integer;
  1094. Scrolled : Integer;
  1095. begin
  1096. CheckBrowseMode;
  1097. Result:=0; TheResult:=0;
  1098. PrevRecordCount:=FRecordCount;
  1099. DoBeforeScroll;
  1100. If ((Distance>0) and FEOF) or
  1101. ((Distance<0) and FBOF) then
  1102. exit;
  1103. Try
  1104. If Distance>0 then
  1105. Scrolled:=ScrollForward
  1106. else
  1107. Scrolled:=ScrollBackward;
  1108. finally
  1109. {$ifdef dsdebug}
  1110. WriteLn('ActiveRecord=', FActiveRecord,' FEOF=',FEOF,' FBOF=',FBOF);
  1111. {$Endif}
  1112. If FRecordCount<>PrevRecordCount then
  1113. DataEvent(deDatasetChange,0)
  1114. else
  1115. DataEvent(deDatasetScroll,Scrolled);
  1116. DoAfterScroll;
  1117. end;
  1118. Result:=TheResult;
  1119. end;
  1120. Procedure TDataset.Next;
  1121. begin
  1122. MoveBy(1);
  1123. end;
  1124. Procedure TDataset.Open;
  1125. begin
  1126. Active:=True;
  1127. end;
  1128. Procedure TDataset.Post;
  1129. Procedure Checkrequired;
  1130. Var I : longint;
  1131. begin
  1132. For I:=0 to FFieldList.Count-1 do
  1133. With FFieldList[i] do
  1134. // Required fields that are NOT autoinc !! Autoinc cannot be set !!
  1135. if Required and not ReadOnly and
  1136. (FieldKind=fkData) and Not (DataType=ftAutoInc) then
  1137. DatabaseErrorFmt(SNeedField,[DisplayName],Self);
  1138. end;
  1139. begin
  1140. if State in [dsEdit,dsInsert] then
  1141. begin
  1142. DataEvent(deCheckBrowseMode,0);
  1143. {$ifdef dsdebug}
  1144. writeln ('Post: checking required fields');
  1145. {$endif}
  1146. CheckRequired;
  1147. DoBeforePost;
  1148. If Not TryDoing(@InternalPost,OnPostError) then exit;
  1149. {$ifdef dsdebug}
  1150. writeln ('Post: Internalpost succeeded');
  1151. {$endif}
  1152. FreeFieldBuffers;
  1153. {$ifdef dsdebug}
  1154. writeln ('Post: Freeing field buffers');
  1155. {$endif}
  1156. SetState(dsBrowse);
  1157. {$ifdef dsdebug}
  1158. writeln ('Post: Browse mode set');
  1159. {$endif}
  1160. Resync([]);
  1161. DoAfterPost;
  1162. end;
  1163. end;
  1164. Procedure TDataset.Prior;
  1165. begin
  1166. MoveBy(-1);
  1167. end;
  1168. Procedure TDataset.Refresh;
  1169. begin
  1170. CheckbrowseMode;
  1171. UpdateCursorPos;
  1172. InternalRefresh;
  1173. Resync([]);
  1174. end;
  1175. procedure TDataSet.RecalcBufListSize;
  1176. var
  1177. i, j, MaxValue: Integer;
  1178. DataLink: TDataLink;
  1179. begin
  1180. {$ifdef dsdebug}
  1181. Writeln('Recalculating buffer list size - check cursor');
  1182. {$endif}
  1183. If Not IsCursorOpen Then
  1184. Exit;
  1185. {$ifdef dsdebug}
  1186. Writeln('Recalculating buffer list size');
  1187. {$endif}
  1188. MaxValue := DefaultBufferCount;
  1189. for i := 0 to FDataSources.Count - 1 do
  1190. for j := 0 to TDataSource(FDataSources[i]).DataLinks.Count - 1 do
  1191. begin
  1192. DataLink:=TDataLink(TDataSource(FDataSources[i]).DataLinks[j]);
  1193. if DataLink.BufferCount>MaxValue then
  1194. MaxValue:=DataLink.BufferCount;
  1195. end;
  1196. {$ifdef dsdebug}
  1197. Writeln('calling Setbuffercount');
  1198. {$endif}
  1199. SetBufferCount(MaxValue); //SetBufListSize(MaxValue);
  1200. end;
  1201. Procedure TDataset.RegisterDataSource(ADatasource : TDataSource);
  1202. begin
  1203. FDatasources.Add(ADataSource);
  1204. RecalcBufListSize;
  1205. end;
  1206. Procedure TDataset.Resync(Mode: TResyncMode);
  1207. Var Count,ShiftCount : Longint;
  1208. begin
  1209. // See if we can find the requested record.
  1210. If rmExact in Mode then
  1211. begin
  1212. { throw an exception if not found.
  1213. Normally the descendant should do this if DoCheck is true. }
  1214. If GetRecord(Fbuffers[FRecordCount-1],gmcurrent,True)<>grOk Then
  1215. DatabaseError(SNoSuchRecord,Self);
  1216. end
  1217. else
  1218. { Can we find a record in the neighbourhood ?
  1219. Use Shortcut evaluation for this, or we'll have some funny results. }
  1220. If (GetRecord(Fbuffers[FRecordCount-1],gmcurrent,True)<>grOk) and
  1221. (GetRecord(Fbuffers[FRecordCount-1],gmprior,True)<>grOk) and
  1222. (GetRecord(Fbuffers[FRecordCount-1],gmprior,True)<>grOk) then
  1223. begin
  1224. // nothing found, invalidate buffer and bail out.
  1225. ClearBuffers;
  1226. DataEvent(deDatasetChange,0);
  1227. Exit;
  1228. end;
  1229. If (rmCenter in Mode) then
  1230. ShiftCount:=FbufferCount div 2
  1231. else
  1232. // keep current position.
  1233. ShiftCount:=FActiveRecord;
  1234. // Reposition on 0
  1235. ShiftBuffers(0,FRecordCount-1);
  1236. ActivateBuffers;
  1237. try
  1238. Count:=0;
  1239. {$ifdef dsdebug}
  1240. Writeln ('Getting previous',ShiftCount,' records');
  1241. {$endif}
  1242. While (Count<ShiftCount) and GetPriorRecord do
  1243. Inc(Count);
  1244. FActiveRecord:=Count;
  1245. // fill rest of buffers, adjust ActiveBuffer.
  1246. SetCurrentRecord(FRecordCount-1);
  1247. GetNextRecords;
  1248. Inc(FActiveRecord,GetPriorRecords);
  1249. finally
  1250. // Notify Everyone
  1251. DataEvent(deDatasetChange,0);
  1252. end;
  1253. end;
  1254. Procedure TDataset.SetFields(const Values: array of const);
  1255. Var I : longint;
  1256. begin
  1257. For I:=0 to high(Values) do
  1258. Case Values[I].vtype of
  1259. vtInteger : FieldByNumber(i).AsLongInt:=Values[I].VInteger;
  1260. // needs Completion..
  1261. end;
  1262. end;
  1263. Function TDataset.Translate(Src, Dest: PChar; ToOem: Boolean): Integer;
  1264. begin
  1265. //!! To be implemented
  1266. end;
  1267. Function Tdataset.TryDoing (P : TDataOperation; Ev : TDatasetErrorEvent) : Boolean;
  1268. Var Retry : TDataAction;
  1269. begin
  1270. {$ifdef dsdebug}
  1271. Writeln ('Trying to do');
  1272. If P=Nil then writeln ('Procedure to call is nil !!!');
  1273. {$endif dsdebug}
  1274. Result:=True;
  1275. Retry:=daRetry;
  1276. while Retry=daRetry do
  1277. Try
  1278. {$ifdef dsdebug}
  1279. Writeln ('Trying : updatecursorpos');
  1280. {$endif dsdebug}
  1281. UpdateCursorPos;
  1282. {$ifdef dsdebug}
  1283. Writeln ('Trying to do it');
  1284. {$endif dsdebug}
  1285. P;
  1286. exit;
  1287. except
  1288. On E : EDatabaseError do
  1289. begin
  1290. retry:=daFail;
  1291. If Assigned(Ev) then
  1292. Ev(Self,E,Retry);
  1293. Case Retry of
  1294. daFail : Raise;
  1295. daAbort : Result:=False;
  1296. end;
  1297. end;
  1298. else
  1299. Raise;
  1300. end;
  1301. {$ifdef dsdebug}
  1302. Writeln ('Exit Trying to do');
  1303. {$endif dsdebug}
  1304. end;
  1305. Procedure TDataset.UpdateCursorPos;
  1306. begin
  1307. If FRecordCount>0 then
  1308. SetCurrentRecord(FactiveRecord);
  1309. end;
  1310. Procedure TDataset.UpdateRecord;
  1311. begin
  1312. if not (State in dsEditModes) then
  1313. DatabaseError(SNotInEditState, Self);
  1314. DataEvent(deUpdateRecord, 0);
  1315. end;
  1316. Procedure TDataset.RemoveField (Field : TField);
  1317. begin
  1318. //!! To be implemented
  1319. end;
  1320. Function TDataset.Getfieldcount : Longint;
  1321. begin
  1322. Result:=FFieldList.Count;
  1323. end;
  1324. Procedure TDataset.ShiftBuffers (Offset, Distance : longint);
  1325. Var Temp : Pointer;
  1326. MoveSize : Longint;
  1327. Procedure ShiftBuffersUp;
  1328. begin
  1329. {$ifdef DSDEBUG}
  1330. writeln ('Shifting buffers up from ',OffSet,' with distance :',Distance);
  1331. writeln ('Moving ',(FBufferCount-Distance), ' Buffers at ',Distance);
  1332. {$endif}
  1333. Move(FBuffers[Offset],Temp^,MoveSize);
  1334. Move(FBuffers[Offset+Distance],FBuffers[Offset],(FBufferCount-Distance-Offset)*SizeOf(Pchar));
  1335. Move(Temp^,FBuffers[FBufferCount-Distance-Offset],MoveSize);
  1336. end;
  1337. Procedure ShiftBuffersDown;
  1338. begin
  1339. // Distance is NEGATIVE
  1340. {$ifdef DSDEBUG}
  1341. writeln ('Shifting buffers down with distance :',Abs(Distance));
  1342. writeln ('Moving ',Movesize div 4,' Buffers at ',FBufferCount+Distance);
  1343. {$endif}
  1344. Move(FBuffers[FbufferCount+Distance],Temp^ ,MoveSize);
  1345. Move(FBuffers[0],FBuffers[Abs(Distance)],(FBufferCount+Distance)*SizeOf(Pchar));
  1346. Move(Temp^ ,FBuffers[0],MoveSize);
  1347. end;
  1348. begin
  1349. If Abs(Distance)>=BufferCount then
  1350. Exit;
  1351. try
  1352. MoveSize:=SizeOf(Pchar)*Abs(Distance);
  1353. GetMem(Temp,MoveSize);
  1354. If Distance<0 Then
  1355. ShiftBuffersDown
  1356. else If Distance>0 then
  1357. ShiftBuffersUp;
  1358. Finally
  1359. FreeMem(temp);
  1360. end;
  1361. end;
  1362. Procedure TDataset.UnRegisterDataSource(ADatasource : TDatasource);
  1363. begin
  1364. FDataSources.Remove(ADataSource);
  1365. end;
  1366. {
  1367. $Log$
  1368. Revision 1.11 2004-01-05 21:21:38 michael
  1369. + Fix in setbuflistsize for when Value=-1
  1370. Revision 1.10 2003/11/09 21:23:10 michael
  1371. + Patch from Micha Nelissen, fixing some Delphi compatibility issues
  1372. Revision 1.9 2003/10/06 17:04:28 florian
  1373. * small step towards calculated fields
  1374. Revision 1.8 2003/05/06 12:08:52 michael
  1375. + fixed dataset opening buffer issues
  1376. Revision 1.7 2003/02/20 19:25:19 michael
  1377. + Fixes from Jesus Reyes
  1378. Revision 1.6 2002/09/07 15:15:22 peter
  1379. * old logs removed and tabs fixed
  1380. }