database.inc 10 KB

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