dataset.inc 36 KB

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