dataset.inc 33 KB

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