dataset.inc 32 KB

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