database.inc 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  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. TDatabase and related objects 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. TDatabase
  14. ---------------------------------------------------------------------}
  15. Procedure TDatabase.CheckConnected;
  16. begin
  17. If Not Connected Then
  18. DatabaseError(SNotConnected,Self);
  19. end;
  20. Procedure TDatabase.CheckDisConnected;
  21. begin
  22. If Connected Then
  23. DatabaseError(SConnected,Self);
  24. end;
  25. procedure TDataBase.Loaded;
  26. begin
  27. inherited;
  28. if FOpenAfterRead then
  29. SetConnected(true);
  30. end;
  31. procedure TDataBase.SetConnected (Value : boolean);
  32. begin
  33. If Value<>FConnected then
  34. begin
  35. If Value then
  36. begin
  37. if csReading in ComponentState then
  38. begin
  39. FOpenAfterRead := true;
  40. exit;
  41. end
  42. else
  43. // try
  44. DoInternalConnect;
  45. // except
  46. // on e: EDatabaseError do DoInternalDisconnect;
  47. // raise;
  48. // end; {try}
  49. end
  50. else
  51. begin
  52. Closedatasets;
  53. Closetransactions;
  54. DoInternalDisConnect;
  55. if csloading in ComponentState then
  56. FOpenAfterRead := false;
  57. end;
  58. FConnected:=Value;
  59. end;
  60. end;
  61. procedure TDatabase.Notification(AComponent: TComponent; Operation: TOperation);
  62. begin
  63. //!! To be implemented.
  64. end;
  65. constructor TDatabase.Create(AOwner: TComponent);
  66. begin
  67. Inherited Create(AOwner);
  68. FParams:=TStringlist.Create;
  69. FDatasets:=TList.Create;
  70. FTransactions:=TList.Create;
  71. end;
  72. destructor TDatabase.Destroy;
  73. begin
  74. Connected:=False;
  75. RemoveDatasets;
  76. RemoveTransactions;
  77. FDatasets.Free;
  78. FTransactions.Free;
  79. FParams.Free;
  80. Inherited Destroy;
  81. end;
  82. procedure TDatabase.Close;
  83. begin
  84. Connected:=False;
  85. end;
  86. procedure TDatabase.CloseDataSets;
  87. Var I : longint;
  88. begin
  89. If Assigned(FDatasets) then
  90. begin
  91. For I:=FDatasets.Count-1 downto 0 do
  92. TDBDataset(FDatasets[i]).Close;
  93. end;
  94. end;
  95. procedure TDatabase.CloseTransactions;
  96. Var I : longint;
  97. begin
  98. If Assigned(FTransactions) then
  99. begin
  100. For I:=FTransactions.Count-1 downto 0 do
  101. TDBTransaction(FTransactions[i]).EndTransaction;
  102. end;
  103. end;
  104. procedure TDatabase.RemoveDataSets;
  105. Var I : longint;
  106. begin
  107. If Assigned(FDatasets) then
  108. For I:=FDataSets.Count-1 downto 0 do
  109. TDBDataset(FDataSets[i]).Database:=Nil;
  110. end;
  111. procedure TDatabase.RemoveTransactions;
  112. Var I : longint;
  113. begin
  114. If Assigned(FTransactions) then
  115. For I:=FTransactions.Count-1 downto 0 do
  116. TDBTransaction(FTransactions[i]).Database:=Nil;
  117. end;
  118. procedure TDatabase.Open;
  119. begin
  120. Connected:=True;
  121. end;
  122. Function TDatabase.GetDataSetCount : Longint;
  123. begin
  124. If Assigned(FDatasets) Then
  125. Result:=FDatasets.Count
  126. else
  127. Result:=0;
  128. end;
  129. Function TDatabase.GetTransactionCount : Longint;
  130. begin
  131. If Assigned(FTransactions) Then
  132. Result:=FTransactions.Count
  133. else
  134. Result:=0;
  135. end;
  136. Function TDatabase.GetDataset(Index : longint) : TDBDataset;
  137. begin
  138. If Assigned(FDatasets) then
  139. Result:=TDBDataset(FDatasets[Index])
  140. else
  141. DatabaseError(SNoDatasets);
  142. end;
  143. Function TDatabase.GetTransaction(Index : longint) : TDBtransaction;
  144. begin
  145. If Assigned(FTransactions) then
  146. Result:=TDBTransaction(FTransactions[Index])
  147. else
  148. DatabaseError(SNoTransactions);
  149. end;
  150. procedure TDatabase.RegisterDataset (DS : TDBDataset);
  151. Var I : longint;
  152. begin
  153. I:=FDatasets.IndexOf(DS);
  154. If I=-1 then
  155. FDatasets.Add(DS)
  156. else
  157. DatabaseErrorFmt(SDatasetRegistered,[DS.Name]);
  158. end;
  159. procedure TDatabase.RegisterTransaction (TA : TDBTransaction);
  160. Var I : longint;
  161. begin
  162. I:=FTransactions.IndexOf(TA);
  163. If I=-1 then
  164. FTransactions.Add(TA)
  165. else
  166. DatabaseErrorFmt(STransactionRegistered,[TA.Name]);
  167. end;
  168. procedure TDatabase.UnRegisterDataset (DS : TDBDataset);
  169. Var I : longint;
  170. begin
  171. I:=FDatasets.IndexOf(DS);
  172. If I<>-1 then
  173. FDatasets.Delete(I)
  174. else
  175. DatabaseErrorFmt(SNoDatasetRegistered,[DS.Name]);
  176. end;
  177. procedure TDatabase.UnRegisterTransaction (TA : TDBTransaction);
  178. Var I : longint;
  179. begin
  180. I:=FTransactions.IndexOf(TA);
  181. If I<>-1 then
  182. FTransactions.Delete(I)
  183. else
  184. DatabaseErrorFmt(SNoTransactionRegistered,[TA.Name]);
  185. end;
  186. { ---------------------------------------------------------------------
  187. TDBdataset
  188. ---------------------------------------------------------------------}
  189. Procedure TDBDataset.SetDatabase (Value : TDatabase);
  190. begin
  191. If Value<>FDatabase then
  192. begin
  193. CheckInactive;
  194. If Assigned(FDatabase) then
  195. FDatabase.UnregisterDataset(Self);
  196. If Value<>Nil Then
  197. Value.RegisterDataset(Self);
  198. FDatabase:=Value;
  199. end;
  200. end;
  201. Procedure TDBDataset.SetTransaction (Value : TDBTransaction);
  202. begin
  203. CheckInactive;
  204. If Value<>FTransaction then
  205. begin
  206. If Assigned(FTransaction) then
  207. FTransaction.UnregisterDataset(Self);
  208. If Value<>Nil Then
  209. Value.RegisterDataset(Self);
  210. FTransaction:=Value;
  211. end;
  212. end;
  213. Procedure TDBDataset.CheckDatabase;
  214. begin
  215. If (FDatabase=Nil) then
  216. DatabaseError(SErrNoDatabaseAvailable,Self)
  217. end;
  218. Destructor TDBDataset.Destroy;
  219. begin
  220. Database:=Nil;
  221. Transaction:=Nil;
  222. Inherited;
  223. end;
  224. { ---------------------------------------------------------------------
  225. TDBTransaction
  226. ---------------------------------------------------------------------}
  227. procedure TDBTransaction.SetActive(Value : boolean);
  228. begin
  229. if FActive and (not Value) then
  230. EndTransaction
  231. else if (not FActive) and Value then
  232. if csLoading in ComponentState then
  233. begin
  234. FOpenAfterRead := true;
  235. exit;
  236. end
  237. else
  238. StartTransaction;
  239. end;
  240. procedure TDBTransaction.Loaded;
  241. begin
  242. inherited;
  243. if FOpenAfterRead then SetActive(true);
  244. end;
  245. Procedure TDBTransaction.CheckActive;
  246. begin
  247. If not FActive Then
  248. DatabaseError(STransNotActive,Self);
  249. end;
  250. Procedure TDBTransaction.CheckInActive;
  251. begin
  252. If FActive Then
  253. DatabaseError(STransActive,Self);
  254. end;
  255. Procedure TDBTransaction.CloseTrans;
  256. begin
  257. FActive := false;
  258. end;
  259. Procedure TDBTransaction.OpenTrans;
  260. begin
  261. FActive := true;
  262. end;
  263. Procedure TDBTransaction.SetDatabase (Value : TDatabase);
  264. begin
  265. If Value<>FDatabase then
  266. begin
  267. CheckInactive;
  268. If Assigned(FDatabase) then
  269. FDatabase.UnregisterTransaction(Self);
  270. If Value<>Nil Then
  271. Value.RegisterTransaction(Self);
  272. FDatabase:=Value;
  273. end;
  274. end;
  275. constructor TDBTransaction.create(AOwner : TComponent);
  276. begin
  277. inherited create(AOwner);
  278. FDatasets:=TList.Create;
  279. end;
  280. Procedure TDBTransaction.CheckDatabase;
  281. begin
  282. If (FDatabase=Nil) then
  283. DatabaseError(SErrNoDatabaseAvailable,Self)
  284. end;
  285. procedure TDBTransaction.CloseDataSets;
  286. Var I : longint;
  287. begin
  288. If Assigned(FDatasets) then
  289. begin
  290. For I:=FDatasets.Count-1 downto 0 do
  291. TDBDataset(FDatasets[i]).Close;
  292. end;
  293. end;
  294. Destructor TDBTransaction.Destroy;
  295. begin
  296. Database:=Nil;
  297. RemoveDatasets;
  298. FDatasets.Free;
  299. Inherited;
  300. end;
  301. procedure TDBTransaction.RemoveDataSets;
  302. Var I : longint;
  303. begin
  304. If Assigned(FDatasets) then
  305. For I:=FDataSets.Count-1 downto 0 do
  306. TDBDataset(FDataSets[i]).Transaction:=Nil;
  307. end;
  308. Function TDBTransaction.GetDataSetCount : Longint;
  309. begin
  310. If Assigned(FDatasets) Then
  311. Result:=FDatasets.Count
  312. else
  313. Result:=0;
  314. end;
  315. procedure TDBTransaction.UnRegisterDataset (DS : TDBDataset);
  316. Var I : longint;
  317. begin
  318. I:=FDatasets.IndexOf(DS);
  319. If I<>-1 then
  320. FDatasets.Delete(I)
  321. else
  322. DatabaseErrorFmt(SNoDatasetRegistered,[DS.Name]);
  323. end;
  324. procedure TDBTransaction.RegisterDataset (DS : TDBDataset);
  325. Var I : longint;
  326. begin
  327. I:=FDatasets.IndexOf(DS);
  328. If I=-1 then
  329. FDatasets.Add(DS)
  330. else
  331. DatabaseErrorFmt(SDatasetRegistered,[DS.Name]);
  332. end;
  333. Function TDBTransaction.GetDataset(Index : longint) : TDBDataset;
  334. begin
  335. If Assigned(FDatasets) then
  336. Result:=TDBDataset(FDatasets[Index])
  337. else
  338. DatabaseError(SNoDatasets);
  339. end;
  340. { ---------------------------------------------------------------------
  341. TCustomConnection
  342. ---------------------------------------------------------------------}
  343. procedure TCustomConnection.SetAfterConnect(const AValue: TNotifyEvent);
  344. begin
  345. if FAfterConnect=AValue then exit;
  346. FAfterConnect:=AValue;
  347. end;
  348. procedure TCustomConnection.SetAfterDisconnect(const AValue: TNotifyEvent);
  349. begin
  350. if FAfterDisconnect=AValue then exit;
  351. FAfterDisconnect:=AValue;
  352. end;
  353. procedure TCustomConnection.SetBeforeConnect(const AValue: TNotifyEvent);
  354. begin
  355. if FBeforeConnect=AValue then exit;
  356. FBeforeConnect:=AValue;
  357. end;
  358. procedure TCustomConnection.SetBeforeDisconnect(const AValue: TNotifyEvent);
  359. begin
  360. if FBeforeDisconnect=AValue then exit;
  361. FBeforeDisconnect:=AValue;
  362. end;
  363. procedure TCustomConnection.DoInternalConnect;
  364. begin
  365. if Assigned(BeforeConnect) then
  366. BeforeConnect(self);
  367. DoConnect;
  368. if Assigned(AfterConnect) then
  369. AfterConnect(self);
  370. end;
  371. procedure TCustomConnection.DoInternalDisconnect;
  372. begin
  373. if Assigned(BeforeDisconnect) then
  374. BeforeDisconnect(self);
  375. DoDisconnect;
  376. if Assigned(AfterDisconnect) then
  377. AfterDisconnect(self);
  378. end;
  379. procedure TCustomConnection.DoConnect;
  380. begin
  381. // Do nothing yet
  382. end;
  383. procedure TCustomConnection.DoDisconnect;
  384. begin
  385. // Do nothing yet
  386. end;
  387. function TCustomConnection.GetConnected: boolean;
  388. begin
  389. Result := Connected;
  390. end;
  391. procedure TCustomConnection.StartTransaction;
  392. begin
  393. // Do nothing yet
  394. end;
  395. procedure TCustomConnection.EndTransaction;
  396. begin
  397. // Do nothing yet
  398. end;