QBEZEOS.pas 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. {*******************************************************}
  2. { }
  3. { Open QBuilder Engine for ZEOS Sources }
  4. { Lazarus / Free Pascal }
  5. { }
  6. { Created by Jean Patrick }
  7. { Data: 14/02/2013 }
  8. { E-mail: [email protected] }
  9. { }
  10. {*******************************************************}
  11. unit QBEZEOS;
  12. interface
  13. uses
  14. types, SysUtils, Classes, DB, ZDataset, ZConnection, QBuilder;
  15. type
  16. { TOQBEngineZEOS }
  17. TOQBEngineZEOS = class(TOQBEngine)
  18. procedure FResultQueryAfterOpen(DataSet: TDataSet);
  19. procedure GridFloatFieldGetText(Sender: TField; var aText: string;
  20. DisplayText: Boolean);
  21. procedure GridMemoFieldGetText(Sender: TField; var aText: string;
  22. DisplayText: Boolean);
  23. private
  24. FResultQuery: TZQuery;
  25. FZEOSConnection : TZConnection;
  26. public
  27. SchemaPostgreSQL : String;
  28. constructor Create(AOwner: TComponent); override;
  29. destructor Destroy; override;
  30. procedure ClearQuerySQL; override;
  31. procedure CloseResultQuery; override;
  32. procedure OpenResultQuery; override;
  33. procedure ReadFieldList(const ATableName: string); override;
  34. procedure ReadTableList; override;
  35. procedure SaveResultQueryData; override;
  36. procedure SetConnection(Value: TZConnection);
  37. procedure SetQuerySQL(const Value: string); override;
  38. function ResultQuery: TDataSet; override;
  39. function SelectDatabase: Boolean; override;
  40. procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  41. published
  42. // ZEOS connection to be used
  43. // Breaks backward compatibility: used to be DatabaseName
  44. property Connection: TZConnection read FZEOSConnection write SetConnection;
  45. end;
  46. implementation
  47. { TOQBEngineZEOS }
  48. procedure TOQBEngineZEOS.FResultQueryAfterOpen(DataSet: TDataSet);
  49. var
  50. i: Integer;
  51. begin
  52. for i := 0 to DataSet.Fields.Count - 1 do
  53. begin
  54. if DataSet.Fields[i].DataType = ftMemo then
  55. begin
  56. DataSet.Fields[i].OnGetText := @GridMemoFieldGetText;
  57. end;
  58. // Work around Zeos 7.0.3 bug with DOUBLE PRECISION fields in Firebird
  59. if (DataSet.Fields[i].DataType = ftFloat) and
  60. (Pos('firebird',FZEOSConnection.Protocol) > 0) and
  61. (FZEOSConnection.Version = '7.0.3-stable') then
  62. begin
  63. DataSet.Fields[i].OnGetText := @GridFloatFieldGetText;
  64. end;
  65. // ------------------------------------------------------------------
  66. end;
  67. end;
  68. procedure TOQBEngineZEOS.GridFloatFieldGetText(Sender: TField;
  69. var aText: string; DisplayText: Boolean);
  70. begin
  71. // Work around Zeos 7.0.3 bug with DOUBLE PRECISION fields in Firebird
  72. aText := FloatToStr(TField(Sender).AsFloat);
  73. end;
  74. procedure TOQBEngineZEOS.GridMemoFieldGetText(Sender: TField;
  75. var aText: string; DisplayText: Boolean);
  76. begin
  77. // Show memo fields
  78. aText := TField(Sender).AsString;
  79. end;
  80. constructor TOQBEngineZEOS.Create(AOwner: TComponent);
  81. begin
  82. inherited;
  83. FResultQuery := TZQuery.Create(Self);
  84. FResultQuery.AfterOpen := @FResultQueryAfterOpen;
  85. end;
  86. destructor TOQBEngineZEOS.Destroy;
  87. begin
  88. FResultQuery.Free;
  89. inherited;
  90. end;
  91. procedure TOQBEngineZEOS.SetConnection(Value: TZConnection);
  92. begin
  93. FZEOSConnection := Value;
  94. FResultQuery.Connection := Value;
  95. end;
  96. function TOQBEngineZEOS.SelectDatabase: Boolean;
  97. begin
  98. Result := True;
  99. end;
  100. procedure TOQBEngineZEOS.ReadTableList;
  101. var
  102. vTypesTables: TStringDynArray;
  103. begin
  104. SetLength(vTypesTables,2);
  105. vTypesTables[0] := 'TABLE';
  106. vTypesTables[1] := 'VIEW';
  107. if ShowSystemTables then begin
  108. SetLength(vTypesTables,3);
  109. vTypesTables[0] := 'TABLE';
  110. vTypesTables[1] := 'VIEW';
  111. vTypesTables[2] := 'SYSTEM TABLE';
  112. end;
  113. TableList.Clear;
  114. FResultQuery.Connection.GetTableNames(SchemaPostgreSQL,'',vTypesTables,TableList);
  115. end;
  116. procedure TOQBEngineZEOS.ReadFieldList(const ATableName: string);
  117. begin
  118. FieldList.Clear;
  119. FResultQuery.Connection.GetColumnNames(ATableName, '', FieldList);
  120. FieldList.Insert(0, '*');
  121. end;
  122. procedure TOQBEngineZEOS.ClearQuerySQL;
  123. begin
  124. FResultQuery.SQL.Clear;
  125. end;
  126. procedure TOQBEngineZEOS.SetQuerySQL(const Value: string);
  127. begin
  128. FResultQuery.SQL.Text := Value;
  129. end;
  130. function TOQBEngineZEOS.ResultQuery: TDataSet;
  131. begin
  132. Result := FResultQuery;
  133. end;
  134. procedure TOQBEngineZEOS.OpenResultQuery;
  135. begin
  136. try
  137. FResultQuery.Open;
  138. finally
  139. end;
  140. end;
  141. procedure TOQBEngineZEOS.CloseResultQuery;
  142. begin
  143. FResultQuery.Close;
  144. end;
  145. {$WARNINGS OFF}
  146. procedure TOQBEngineZEOS.SaveResultQueryData;
  147. begin
  148. //
  149. end;
  150. {$WARNINGS ON}
  151. procedure TOQBEngineZEOS.Notification(AComponent: TComponent;
  152. Operation: TOperation);
  153. begin
  154. inherited;
  155. if (AComponent = FZEOSConnection) and (Operation = opRemove) then
  156. begin
  157. FZEOSCOnnection := nil;
  158. FResultQuery.Connection := nil;
  159. end;
  160. end;
  161. end.