zeoslib  UNKNOWN
 All Files
ZPlainFirebirdDriver.pas
Go to the documentation of this file.
1 {*********************************************************}
2 { }
3 { Zeos Database Objects }
4 { Native Plain Drivers for Firebird }
5 { }
6 { Originally written by Sergey Seroukhov }
7 { }
8 {*********************************************************}
9 
10 {@********************************************************}
11 { Copyright (c) 1999-2012 Zeos Development Group }
12 { }
13 { License Agreement: }
14 { }
15 { This library is distributed in the hope that it will be }
16 { useful, but WITHOUT ANY WARRANTY; without even the }
17 { implied warranty of MERCHANTABILITY or FITNESS FOR }
18 { A PARTICULAR PURPOSE. See the GNU Lesser General }
19 { Public License for more details. }
20 { }
21 { The source code of the ZEOS Libraries and packages are }
22 { distributed under the Library GNU General Public }
23 { License (see the file COPYING / COPYING.ZEOS) }
24 { with the following modification: }
25 { As a special exception, the copyright holders of this }
26 { library give you permission to link this library with }
27 { independent modules to produce an executable, }
28 { regardless of the license terms of these independent }
29 { modules, and to copy and distribute the resulting }
30 { executable under terms of your choice, provided that }
31 { you also meet, for each linked independent module, }
32 { the terms and conditions of the license of that module. }
33 { An independent module is a module which is not derived }
34 { from or based on this library. If you modify this }
35 { library, you may extend this exception to your version }
36 { of the library, but you are not obligated to do so. }
37 { If you do not wish to do so, delete this exception }
38 { statement from your version. }
39 { }
40 { }
41 { The project web site is located on: }
42 { http://zeos.firmos.at (FORUM) }
43 { http://sourceforge.net/p/zeoslib/tickets/ (BUGTRACKER)}
44 { svn://svn.code.sf.net/p/zeoslib/code-0/trunk (SVN) }
45 { }
46 { http://www.sourceforge.net/projects/zeoslib. }
47 { }
48 { }
49 { Zeos Development Group. }
50 {********************************************************@}
51 
52 unit ZPlainFirebirdDriver;
53 
54 interface
55 
56 {$I ZPlain.inc}
57 
58 {$IFDEF UNIX}
59 {$IFDEF INTERBASE_CRYPT}
60 {$DEFINE ENABLE_INTERBASE_CRYPT}
61 {$ENDIF}
62 {$ENDIF}
63 
64 uses ZClasses, ZCompatibility, ZPlainDriver, ZPlainLoader, ZPlainFirebirdInterbaseConstants;
65 
66 const
67 
68  WINDOWSIB6_DLL_LOCATION = 'gds32.dll';
69  LINUXIB6_DLL_LOCATION = 'libgds'+SharedSuffix;
70 
71  WINDOWS_DLL_LOCATION = 'gds32.dll';
72  LINUX_DLL_LOCATION = 'libgds32'+SharedSuffix;
73  LINUX_IB_CRYPT_LOCATION = 'libcrypt'+SharedSuffix;
74 
75  WINDOWS2_DLL_LOCATION = 'fbclient.dll';
76  WINDOWS2_DLL_LOCATION_EMBEDDED = 'fbclientd.dll';
77 
78  LINUX2_DLL_LOCATION = 'libfbclient'+SharedSuffix;
79  LINUX2_DLL_LOCATION_EMBEDDED = 'libfbembed'+SharedSuffix;
80  LINUX2_IB_CRYPT_LOCATION = 'libcrypt'+SharedSuffix;
81 
82  WINDOWS15_DLL_LOCATION = 'fbclient15.dll';
83  WINDOWS15_DLL_LOCATION_EMBEDDED = 'fbclientd15.dll';
84  LINUX15_DLL_LOCATION = 'libfbclient'+SharedSuffix+'.15';
85  LINUX15_IB_CRYPT_LOCATION = 'libcrypt'+SharedSuffix+'.15';
86  LINUX15_DLL_LOCATION_EMBEDDED = 'libfbembed'+SharedSuffix+'.15';
87 
88  WINDOWS20_DLL_LOCATION = 'fbclient20.dll';
89  WINDOWS20_DLL_LOCATION_EMBEDDED = 'fbclientd20.dll';
90  LINUX2_DLL_LOCATION2 = 'libfbclient'+SharedSuffix+'.2';
91  LINUX20_DLL_LOCATION = 'libfbclient'+SharedSuffix+'.20';
92  LINUX20_DLL_LOCATION_EMBEDDED = 'libfbembed'+SharedSuffix+'.20';
93  LINUX20_IB_CRYPT_LOCATION = 'libcrypt'+SharedSuffix+'.20';
94 
95  WINDOWS21_DLL_LOCATION = 'fbclient21.dll';
96  WINDOWS21_DLL_LOCATION_EMBEDDED = 'fbclientd21.dll';
97  LINUX21_DLL_LOCATION = 'libfbclient'+SharedSuffix+'.21';
98  LINUX21_DLL_LOCATION_EMBEDDED = 'libfbembed'+SharedSuffix+'.21';
99  LINUX21_IB_CRYPT_LOCATION = 'libcrypt'+SharedSuffix+'.21';
100 
101  WINDOWS25_DLL_LOCATION = 'fbclient25.dll';
102  WINDOWS25_DLL_LOCATION_EMBEDDED = 'fbclientd25.dll';
103  LINUX25_DLL_LOCATION = 'libfbclient'+SharedSuffix+'.25';
104  LINUX25_DLL_LOCATION_EMBEDDED = 'libfbembed'+SharedSuffix+'.25';
105  LINUX25_IB_CRYPT_LOCATION = 'libcrypt'+SharedSuffix+'.25';
106 
107 type
108 
109  {** Represents a generic interface to Interbase native API. }
110  IZInterbasePlainDriver = interface (IZPlainDriver)
111  ['{AE2C4379-4E47-4752-BC01-D405ACC337F5}']
112 
113  function GetFirebirdAPI: TZFirebird_API;
114 
115  function ZPlainString(const AStr: String; ConSettings: PZConSettings; const ToCP: Word): RawByteString; overload;
116  function ZPlainString(const AStr: WideString; ConSettings: PZConSettings; const ToCP: Word): RawByteString; overload;
117 
118  function isc_attach_database (status_vector: PISC_STATUS;
119  db_name_length: Short; db_name: PAnsiChar; db_handle: PISC_DB_HANDLE;
120  parm_buffer_length: Short; parm_buffer: PAnsiChar): ISC_STATUS;
121  function isc_detach_database(status_vector: PISC_STATUS;
122  db_handle: PISC_DB_HANDLE): ISC_STATUS;
123  function isc_drop_database(status_vector: PISC_STATUS;
124  db_handle: PISC_DB_HANDLE): ISC_STATUS;
125  function isc_database_info(status_vector: PISC_STATUS;
126  db_handle: PISC_DB_HANDLE; item_list_buffer_length: Short;
127  item_list_buffer: PByte; result_buffer_length: Short;
128  result_buffer: PAnsiChar): ISC_STATUS;
129  function isc_array_gen_sdl(status_vector: PISC_STATUS;
130  isc_array_desc: PISC_ARRAY_DESC; isc_arg3: PShort;
131  isc_arg4: PAnsiChar; isc_arg5: PShort): ISC_STATUS;
132  function isc_array_get_slice(status_vector: PISC_STATUS;
133  db_handle: PISC_DB_HANDLE; trans_handle: PISC_TR_HANDLE;
134  array_id: PISC_QUAD; descriptor: PISC_ARRAY_DESC;
135  dest_array: PVoid; slice_length: ISC_LONG): ISC_STATUS;
136  function isc_array_lookup_bounds(status_vector: PISC_STATUS;
137  db_handle: PISC_DB_HANDLE; trans_handle: PISC_TR_HANDLE;
138  table_name, column_name: PAnsiChar;
139  descriptor: PISC_ARRAY_DESC): ISC_STATUS;
140  function isc_array_lookup_desc(status_vector: PISC_STATUS;
141  db_handle: PISC_DB_HANDLE; trans_handle: PISC_TR_HANDLE;
142  table_name, column_name: PAnsiChar;
143  descriptor: PISC_ARRAY_DESC): ISC_STATUS;
144  function isc_array_set_desc(status_vector: PISC_STATUS;
145  table_name: PAnsiChar; column_name: PAnsiChar;
146  sql_dtype, sql_length, sql_dimensions: PShort;
147  descriptor: PISC_ARRAY_DESC): ISC_STATUS;
148  function isc_array_put_slice(status_vector: PISC_STATUS;
149  db_handle: PISC_DB_HANDLE; trans_handle: PISC_TR_HANDLE;
150  array_id: PISC_QUAD; descriptor: PISC_ARRAY_DESC;
151  source_array: PVoid; slice_length: PISC_LONG): ISC_STATUS;
152  function isc_free(isc_arg1: PAnsiChar): ISC_LONG;
153  function isc_sqlcode(status_vector: PISC_STATUS): ISC_LONG;
154  procedure isc_sql_interprete(sqlcode: Short; buffer: PAnsiChar; buffer_length: Short);
155  function isc_interprete(buffer: PAnsiChar; status_vector: PPISC_STATUS): ISC_STATUS;
156  function isc_start_transaction(status_vector: PISC_STATUS;
157  tran_handle: PISC_TR_HANDLE; db_handle_count: Short;
158  db_handle: PISC_DB_HANDLE; tpb_length: Word; tpb_address: PAnsiChar): ISC_STATUS;
159  function isc_start_multiple(status_vector: PISC_STATUS;
160  tran_handle: PISC_TR_HANDLE; db_handle_count: Short;
161  teb_vector_address: PISC_TEB): ISC_STATUS;
162  function isc_rollback_transaction(status_vector: PISC_STATUS;
163  tran_handle: PISC_TR_HANDLE): ISC_STATUS;
164  function isc_rollback_retaining(status_vector: PISC_STATUS;
165  tran_handle: PISC_TR_HANDLE): ISC_STATUS;
166  function isc_commit_retaining(status_vector: PISC_STATUS;
167  tran_handle: PISC_TR_HANDLE): ISC_STATUS;
168  function isc_commit_transaction(status_vector: PISC_STATUS;
169  tran_handle: PISC_TR_HANDLE): ISC_STATUS;
170  function isc_dsql_allocate_statement(status_vector: PISC_STATUS;
171  db_handle: PISC_DB_HANDLE; stmt_handle: PISC_STMT_HANDLE): ISC_STATUS;
172  function isc_dsql_alloc_statement2(status_vector: PISC_STATUS;
173  db_handle: PISC_DB_HANDLE; stmt_handle: PISC_STMT_HANDLE): ISC_STATUS;
174  function isc_dsql_describe(status_vector: PISC_STATUS;
175  stmt_handle: PISC_STMT_HANDLE; dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
176  function isc_dsql_describe_bind(status_vector: PISC_STATUS;
177  stmt_handle: PISC_STMT_HANDLE; dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
178  function isc_dsql_execute(status_vector: PISC_STATUS;
179  tran_handle: PISC_TR_HANDLE; stmt_handle: PISC_STMT_HANDLE; dialect: Word;
180  xsqlda: PXSQLDA): ISC_STATUS;
181  function isc_dsql_execute2(status_vector: PISC_STATUS;
182  tran_handle: PISC_TR_HANDLE; stmt_handle: PISC_STMT_HANDLE; dialect: Word;
183  in_xsqlda, out_xsqlda: PXSQLDA): ISC_STATUS;
184  function isc_dsql_execute_immediate(status_vector: PISC_STATUS;
185  db_handle: PISC_DB_HANDLE; tran_handle: PISC_TR_HANDLE; length: Word;
186  statement: PAnsiChar; dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
187  function isc_dsql_fetch(status_vector: PISC_STATUS;
188  stmt_handle: PISC_STMT_HANDLE; dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
189  function isc_dsql_free_statement(status_vector: PISC_STATUS;
190  stmt_handle: PISC_STMT_HANDLE; options: Word): ISC_STATUS;
191  function isc_dsql_prepare(status_vector: PISC_STATUS;
192  tran_handle: PISC_TR_HANDLE; stmt_handle: PISC_STMT_HANDLE;
193  length: Word; statement: PAnsiChar; dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
194  function isc_dsql_set_cursor_name(status_vector: PISC_STATUS;
195  stmt_handle: PISC_STMT_HANDLE; cursor_name: PAnsiChar; _type: Word): ISC_STATUS;
196  function isc_dsql_sql_info(status_vector: PISC_STATUS;
197  stmt_handle: PISC_STMT_HANDLE; item_length: Short; items: PAnsiChar;
198  buffer_length: Short; buffer: PAnsiChar): ISC_STATUS;
199  function isc_open_blob2(status_vector: PISC_STATUS;
200  db_handle: PISC_DB_HANDLE; tran_handle: PISC_TR_HANDLE;
201  blob_handle: PISC_BLOB_HANDLE; blob_id: PISC_QUAD; bpb_length: Short;
202  bpb_buffer: PAnsiChar): ISC_STATUS;
203  function isc_create_blob2(status_vector: PISC_STATUS;
204  db_handle: PISC_DB_HANDLE; tran_handle: PISC_TR_HANDLE;
205  blob_handle: PISC_BLOB_HANDLE; blob_id: PISC_QUAD; bpb_length: Short;
206  bpb_address: PAnsiChar): ISC_STATUS;
207  function isc_blob_info(status_vector: PISC_STATUS;
208  blob_handle: PISC_BLOB_HANDLE; item_list_buffer_length: Short;
209  item_list_buffer: PAnsiChar; result_buffer_length: Short; result_buffer: PAnsiChar): ISC_STATUS;
210  function isc_close_blob(status_vector: PISC_STATUS;
211  blob_handle: PISC_BLOB_HANDLE): ISC_STATUS;
212  function isc_cancel_blob(status_vector: PISC_STATUS;
213  blob_handle: PISC_BLOB_HANDLE): ISC_STATUS;
214  function isc_get_segment(status_vector: PISC_STATUS;
215  blob_handle: PISC_BLOB_HANDLE; actual_seg_length: PWord;
216  seg_buffer_length: Word; seg_buffer: PAnsiChar): ISC_STATUS;
217  function isc_put_segment(status_vector: PISC_STATUS;
218  blob_handle: PISC_BLOB_HANDLE; seg_buffer_len: Word; seg_buffer: PAnsiChar): ISC_STATUS;
219  function isc_event_block(event_buffer: PPAnsiChar; result_buffer: PPAnsiChar;
220  id_count: Word; event_list: array of PAnsiChar): ISC_LONG;
221  procedure isc_event_counts(status_vector: PISC_STATUS;
222  buffer_length: Short; event_buffer: PAnsiChar; result_buffer: PAnsiChar);
223  function isc_cancel_events(status_vector: PISC_STATUS;
224  db_handle: PISC_DB_HANDLE; event_id: PISC_LONG): ISC_STATUS;
225  function isc_que_events(status_vector: PISC_STATUS;
226  db_handle: PISC_DB_HANDLE; event_id: PISC_LONG; length: Short;
227  event_buffer: PAnsiChar; event_function: TISC_CALLBACK;
228  event_function_arg: PVoid): ISC_STATUS;
229  procedure isc_decode_date(ib_date: PISC_QUAD; tm_date: PCTimeStructure);
230  procedure isc_encode_date(tm_date: PCTimeStructure; ib_date: PISC_QUAD);
231  function isc_vax_integer(buffer: PAnsiChar; length: Short): ISC_LONG;
232  function isc_portable_integer(ptr: pbyte; length: Short): ISC_INT64;
233 
234  procedure isc_decode_sql_date(ib_date: PISC_DATE; tm_date: PCTimeStructure);
235  procedure isc_decode_sql_time(ib_time: PISC_TIME; tm_date: PCTimeStructure);
236  procedure isc_decode_timestamp(ib_timestamp: PISC_TIMESTAMP;
237  tm_date: PCTimeStructure);
238  procedure isc_encode_sql_date(tm_date: PCTimeStructure;
239  ib_date: PISC_DATE);
240  procedure isc_encode_sql_time(tm_date: PCTimeStructure;
241  ib_time: PISC_TIME);
242  procedure isc_encode_timestamp(tm_date: PCTimeStructure;
243  ib_timestamp: PISC_TIMESTAMP);
244  end;
245 
246  {** Implements a base driver for Firebird}
247 
248  { TZFirebirdBaseDriver }
249 
250  TZFirebirdBaseDriver = class (TZAbstractPlainDriver, IZPlainDriver,
251  IZInterbasePlainDriver)
252  FIREBIRD_API : TZFIREBIRD_API;
253  protected
254  FPreLoader : TZNativeLibraryLoader;
255  procedure LoadCodePages; override;
256  function GetUnicodeCodePageName: String; override;
257  {$IFDEF ENABLE_INTERBASE_CRYPT}
258  procedure Initialize; virtual;
259  {$ENDIF}
260  procedure LoadApi; override;
261  public
262  constructor Create;
263  {$IFDEF ENABLE_INTERBASE_CRYPT}
264  destructor Destroy; override;
265  {$ENDIF}
266 
267  function GetFirebirdAPI: TZFirebird_API;
268  function isc_attach_database (status_vector: PISC_STATUS;
269  db_name_length: Short; db_name: PAnsiChar; db_handle: PISC_DB_HANDLE;
270  parm_buffer_length: Short; parm_buffer: PAnsiChar): ISC_STATUS;
271  function isc_detach_database(status_vector: PISC_STATUS;
272  db_handle: PISC_DB_HANDLE): ISC_STATUS;
273  function isc_drop_database(status_vector: PISC_STATUS;
274  db_handle: PISC_DB_HANDLE): ISC_STATUS;
275  function isc_database_info(status_vector: PISC_STATUS;
276  db_handle: PISC_DB_HANDLE; item_list_buffer_length: Short;
277  item_list_buffer: PByte; result_buffer_length: Short;
278  result_buffer: PAnsiChar): ISC_STATUS;
279  function isc_transaction_info(status_vector: PISC_STATUS;
280  tr_handle: PISC_TR_HANDLE; item_list_buffer_length: Short;
281  item_list_buffer: PAnsiChar; result_buffer_length: Short;
282  result_buffer: PAnsiChar): ISC_STATUS;
283  function isc_array_gen_sdl(status_vector: PISC_STATUS;
284  isc_array_desc: PISC_ARRAY_DESC; isc_arg3: PShort;
285  isc_arg4: PAnsiChar; isc_arg5: PShort): ISC_STATUS;
286  function isc_array_get_slice(status_vector: PISC_STATUS;
287  db_handle: PISC_DB_HANDLE; trans_handle: PISC_TR_HANDLE;
288  array_id: PISC_QUAD; descriptor: PISC_ARRAY_DESC;
289  dest_array: PVoid; slice_length: ISC_LONG): ISC_STATUS;
290  function isc_array_lookup_bounds(status_vector: PISC_STATUS;
291  db_handle: PISC_DB_HANDLE; trans_handle: PISC_TR_HANDLE;
292  table_name, column_name: PAnsiChar;
293  descriptor: PISC_ARRAY_DESC): ISC_STATUS;
294  function isc_array_lookup_desc(status_vector: PISC_STATUS;
295  db_handle: PISC_DB_HANDLE; trans_handle: PISC_TR_HANDLE;
296  table_name, column_name: PAnsiChar;
297  descriptor: PISC_ARRAY_DESC): ISC_STATUS;
298  function isc_array_set_desc(status_vector: PISC_STATUS;
299  table_name: PAnsiChar; column_name: PAnsiChar;
300  sql_dtype, sql_length, sql_dimensions: PShort;
301  descriptor: PISC_ARRAY_DESC): ISC_STATUS;
302  function isc_array_put_slice(status_vector: PISC_STATUS;
303  db_handle: PISC_DB_HANDLE; trans_handle: PISC_TR_HANDLE;
304  array_id: PISC_QUAD; descriptor: PISC_ARRAY_DESC;
305  source_array: PVoid; slice_length: PISC_LONG): ISC_STATUS;
306  function isc_free(isc_arg1: PAnsiChar): ISC_LONG;
307  function isc_sqlcode(status_vector: PISC_STATUS): ISC_LONG;
308  procedure isc_sql_interprete(sqlcode: Short; buffer: PAnsiChar;
309  buffer_length: Short);
310  function isc_interprete(buffer: PAnsiChar; status_vector: PPISC_STATUS): ISC_STATUS; virtual;
311  function isc_start_transaction(status_vector: PISC_STATUS;
312  tran_handle: PISC_TR_HANDLE; db_handle_count: Short;
313  db_handle: PISC_DB_HANDLE; tpb_length: Word; tpb_address: PAnsiChar): ISC_STATUS;
314  function isc_start_multiple(status_vector: PISC_STATUS;
315  tran_handle: PISC_TR_HANDLE; db_handle_count: Short;
316  teb_vector_address: PISC_TEB): ISC_STATUS;
317  function isc_rollback_transaction(status_vector: PISC_STATUS;
318  tran_handle: PISC_TR_HANDLE): ISC_STATUS;
319  function isc_rollback_retaining(status_vector: PISC_STATUS;
320  tran_handle: PISC_TR_HANDLE): ISC_STATUS;
321  function isc_commit_retaining(status_vector: PISC_STATUS;
322  tran_handle: PISC_TR_HANDLE): ISC_STATUS;
323  function isc_commit_transaction(status_vector: PISC_STATUS;
324  tran_handle: PISC_TR_HANDLE): ISC_STATUS;
325  function isc_dsql_allocate_statement(status_vector: PISC_STATUS;
326  db_handle: PISC_DB_HANDLE; stmt_handle: PISC_STMT_HANDLE): ISC_STATUS;
327  function isc_dsql_alloc_statement2(status_vector: PISC_STATUS;
328  db_handle: PISC_DB_HANDLE; stmt_handle: PISC_STMT_HANDLE): ISC_STATUS;
329  function isc_dsql_describe(status_vector: PISC_STATUS;
330  stmt_handle: PISC_STMT_HANDLE; dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
331  function isc_dsql_describe_bind(status_vector: PISC_STATUS;
332  stmt_handle: PISC_STMT_HANDLE; dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
333  function isc_dsql_execute(status_vector: PISC_STATUS;
334  tran_handle: PISC_TR_HANDLE; stmt_handle: PISC_STMT_HANDLE; dialect: Word;
335  xsqlda: PXSQLDA): ISC_STATUS;
336  function isc_dsql_execute2(status_vector: PISC_STATUS;
337  tran_handle: PISC_TR_HANDLE; stmt_handle: PISC_STMT_HANDLE; dialect: Word;
338  in_xsqlda, out_xsqlda: PXSQLDA): ISC_STATUS;
339  function isc_dsql_execute_immediate(status_vector: PISC_STATUS;
340  db_handle: PISC_DB_HANDLE; tran_handle: PISC_TR_HANDLE; length: Word;
341  statement: PAnsiChar; dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
342  function isc_dsql_fetch(status_vector: PISC_STATUS;
343  stmt_handle: PISC_STMT_HANDLE; dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
344  function isc_dsql_free_statement(status_vector: PISC_STATUS;
345  stmt_handle: PISC_STMT_HANDLE; options: Word): ISC_STATUS;
346  function isc_dsql_prepare(status_vector: PISC_STATUS;
347  tran_handle: PISC_TR_HANDLE; stmt_handle: PISC_STMT_HANDLE;
348  length: Word; statement: PAnsiChar; dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
349  function isc_dsql_set_cursor_name(status_vector: PISC_STATUS;
350  stmt_handle: PISC_STMT_HANDLE; cursor_name: PAnsiChar; _type: Word): ISC_STATUS;
351  function isc_dsql_sql_info(status_vector: PISC_STATUS;
352  stmt_handle: PISC_STMT_HANDLE; item_length: Short; items: PAnsiChar;
353  buffer_length: Short; buffer: PAnsiChar): ISC_STATUS;
354  function isc_open_blob2(status_vector: PISC_STATUS;
355  db_handle: PISC_DB_HANDLE; tran_handle: PISC_TR_HANDLE;
356  blob_handle: PISC_BLOB_HANDLE; blob_id: PISC_QUAD; bpb_length: Short;
357  bpb_buffer: PAnsiChar): ISC_STATUS;
358  function isc_create_blob2(status_vector: PISC_STATUS;
359  db_handle: PISC_DB_HANDLE; tran_handle: PISC_TR_HANDLE;
360  blob_handle: PISC_BLOB_HANDLE; blob_id: PISC_QUAD; bpb_length: Short;
361  bpb_address: PAnsiChar): ISC_STATUS;
362  function isc_blob_info(status_vector: PISC_STATUS;
363  blob_handle: PISC_BLOB_HANDLE; item_list_buffer_length: Short;
364  item_list_buffer: PAnsiChar; result_buffer_length: Short; result_buffer: PAnsiChar): ISC_STATUS;
365  function isc_close_blob(status_vector: PISC_STATUS;
366  blob_handle: PISC_BLOB_HANDLE): ISC_STATUS;
367  function isc_cancel_blob(status_vector: PISC_STATUS;
368  blob_handle: PISC_BLOB_HANDLE): ISC_STATUS;
369  function isc_get_segment(status_vector: PISC_STATUS;
370  blob_handle: PISC_BLOB_HANDLE; actual_seg_length: PWord;
371  seg_buffer_length: Word; seg_buffer: PAnsiChar): ISC_STATUS;
372  function isc_put_segment(status_vector: PISC_STATUS;
373  blob_handle: PISC_BLOB_HANDLE; seg_buffer_len: Word; seg_buffer: PAnsiChar): ISC_STATUS;
374  function isc_event_block(event_buffer: PPAnsiChar; result_buffer: PPAnsiChar;
375  id_count: Word; event_list: array of PAnsiChar): ISC_LONG;
376  procedure isc_event_counts(status_vector: PISC_STATUS;
377  buffer_length: Short; event_buffer: PAnsiChar; result_buffer: PAnsiChar);
378  function isc_cancel_events(status_vector: PISC_STATUS;
379  db_handle: PISC_DB_HANDLE; event_id: PISC_LONG): ISC_STATUS;
380  function isc_que_events(status_vector: PISC_STATUS;
381  db_handle: PISC_DB_HANDLE; event_id: PISC_LONG; length: Short;
382  event_buffer: PAnsiChar; event_function: TISC_CALLBACK;
383  event_function_arg: PVoid): ISC_STATUS;
384  procedure isc_decode_date(ib_date: PISC_QUAD; tm_date: PCTimeStructure);
385  procedure isc_encode_date(tm_date: PCTimeStructure; ib_date: PISC_QUAD);
386  procedure isc_decode_sql_date(ib_date: PISC_DATE; tm_date: PCTimeStructure);
387  procedure isc_decode_sql_time(ib_time: PISC_TIME; tm_date: PCTimeStructure);
388  procedure isc_decode_timestamp(ib_timestamp: PISC_TIMESTAMP;
389  tm_date: PCTimeStructure);
390  procedure isc_encode_sql_date(tm_date: PCTimeStructure;
391  ib_date: PISC_DATE);
392  procedure isc_encode_sql_time(tm_date: PCTimeStructure;
393  ib_time: PISC_TIME);
394  procedure isc_encode_timestamp(tm_date: PCTimeStructure;
395  ib_timestamp: PISC_TIMESTAMP);
396  function isc_vax_integer(buffer: PAnsiChar; length: Short): ISC_LONG;
397  function isc_portable_integer(ptr: pbyte; length: Short): ISC_INT64;
398  end;
399 
400  {** Implements a native driver for Interbase6}
401  TZInterbase6PlainDriver = class (TZFirebirdBaseDriver)
402  protected
403  function Clone: IZPlainDriver; override;
404  public
405  constructor Create;
406 
407  function GetProtocol: string; override;
408  function GetDescription: string; override;
409  end;
410 
411  {** Implements a native driver for Firebird 1.0}
412  TZFirebird10PlainDriver = class (TZFirebirdBaseDriver)
413  protected
414  function Clone: IZPlainDriver; override;
415  public
416  constructor Create;
417 
418  function GetProtocol: string; override;
419  function GetDescription: string; override;
420  end;
421 
422  {** Implements a native driver for Firebird 1.5}
423  TZFirebird15PlainDriver = class (TZFirebirdBaseDriver)
424  protected
425  function Clone: IZPlainDriver; override;
426  procedure LoadCodePages; override;
427  public
428  constructor Create;
429 
430  function GetProtocol: string; override;
431  function GetDescription: string; override;
432  end;
433 
434  TZFirebirdD15PlainDriver = class (TZFirebird15PlainDriver)
435  protected
436  function Clone: IZPlainDriver; override;
437  public
438  constructor Create;
439 
440  function GetProtocol: string; override;
441  function GetDescription: string; override;
442  end;
443 
444 
445  {** Implements a native driver for Firebird 2.0}
446  TZFirebird20PlainDriver = class (TZFirebirdBaseDriver)
447  protected
448  function Clone: IZPlainDriver; override;
449  function GetUnicodeCodePageName: String; override;
450  procedure LoadCodePages; override;
451  public
452  constructor Create;
453 
454  function GetProtocol: string; override;
455  function GetDescription: string; override;
456  end;
457 
458  TZFirebirdD20PlainDriver = class (TZFirebird20PlainDriver)
459  protected
460  function Clone: IZPlainDriver; override;
461  public
462  constructor Create;
463 
464  function GetProtocol: string; override;
465  function GetDescription: string; override;
466  end;
467 
468  {** Represents class to Interbase 6+ native API. }
469 
470  { TZFirebird21PlainDriver }
471 
472  TZFirebird21PlainDriver = class (TZFirebirdBaseDriver)
473  protected
474  function Clone: IZPlainDriver; override;
475  protected
476  function GetUnicodeCodePageName: String; override;
477  procedure LoadCodePages; override;
478  procedure LoadApi; override;
479  public
480  constructor Create;
481 
482  function GetProtocol: string; override;
483  function GetDescription: string; override;
484 
485  function isc_interprete(buffer: PAnsiChar; status_vector: PPISC_STATUS): ISC_STATUS; override;
486  end;
487 
488  TZFirebirdD21PlainDriver = class (TZFirebird21PlainDriver)
489  protected
490  function Clone: IZPlainDriver; override;
491  public
492  constructor Create;
493 
494  function GetProtocol: string; override;
495  function GetDescription: string; override;
496  end;
497 
498  { TZFirebird25PlainDriver }
499 
500  TZFirebird25PlainDriver = class (TZFirebirdBaseDriver)
501  protected
502  function Clone: IZPlainDriver; override;
503  function GetUnicodeCodePageName: String; override;
504  procedure LoadCodePages; override;
505  procedure LoadApi; override;
506  public
507  constructor Create;
508 
509  function GetProtocol: string; override;
510  function GetDescription: string; override;
511 
512  function isc_interprete(buffer: PAnsiChar; status_vector: PPISC_STATUS): ISC_STATUS; override;
513  end;
514 
515  { TZFirebirdD25PlainDriver }
516 
517  TZFirebirdD25PlainDriver = class (TZFirebird25PlainDriver)
518  protected
519  function Clone: IZPlainDriver; override;
520  public
521  constructor Create;
522 
523  function GetProtocol: string; override;
524  function GetDescription: string; override;
525  end;
526 
527 
528  function XSQLDA_LENGTH(Value: LongInt): LongInt;
529 
530 implementation
531 
532 uses SysUtils, ZEncoding;
533 
534 function XSQLDA_LENGTH(Value: LongInt): LongInt;
535 begin
536  Result := SizeOf(TXSQLDA) + ((Value - 1) * SizeOf(TXSQLVAR));
537 end;
538 
539 procedure AddFireBird15CodePages(PlainDriver: TZAbstractPlainDriver);
540 begin
541  PlainDriver.AddCodePage('DOS737', CS_DOS737, ceAnsi, zCP_DOS737); {Greek}
542  PlainDriver.AddCodePage('DOS775', CS_DOS775, ceAnsi, zCP_DOS775); {Baltic}
543  PlainDriver.AddCodePage('DOS858', CS_DOS858, ceAnsi, zCP_DOS858); {Latin I + Euro symbol}
544  PlainDriver.AddCodePage('DOS862', CS_DOS862, ceAnsi, zCP_DOS862); {Hebrew}
545  PlainDriver.AddCodePage('DOS864', CS_DOS864, ceAnsi, zCP_DOS864); {Arabic}
546  PlainDriver.AddCodePage('DOS866', CS_DOS866, ceAnsi, zCP_DOS866); {Russian}
547  PlainDriver.AddCodePage('DOS869', CS_DOS869, ceAnsi, zCP_DOS869); {Modern Greek}
548  PlainDriver.AddCodePage('ISO8859_2', CS_ISO8859_2, ceAnsi, zCP_L2_ISO_8859_2); {Latin 2 — Latin3 — Southern European (Maltese, Esperanto)}
549  PlainDriver.AddCodePage('ISO8859_3', CS_ISO8859_3, ceAnsi, zCP_L3_ISO_8859_3); {Latin 1}
550  PlainDriver.AddCodePage('ISO8859_4', CS_ISO8859_4, ceAnsi, zCP_L4_ISO_8859_4); {Latin 4 — Northern European (Estonian, Latvian, Lithuanian, Greenlandic, Lappish)}
551  PlainDriver.AddCodePage('ISO8859_5', CS_ISO8859_5, ceAnsi, zCP_L5_ISO_8859_5); {Cyrillic (Russian)}
552  PlainDriver.AddCodePage('ISO8859_6', CS_ISO8859_6, ceAnsi, zCP_L6_ISO_8859_6); {Arabic}
553  PlainDriver.AddCodePage('ISO8859_7', CS_ISO8859_7, ceAnsi, zCP_L7_ISO_8859_7); {Greek}
554  PlainDriver.AddCodePage('ISO8859_8', CS_ISO8859_8, ceAnsi, zCP_L8_ISO_8859_8); {Hebrew}
555  PlainDriver.AddCodePage('ISO8859_9', CS_ISO8859_9, ceAnsi, zCP_L5_ISO_8859_9); {Latin 5}
556  PlainDriver.AddCodePage('ISO8859_13', CS_ISO8859_13, ceAnsi, zCP_L7_ISO_8859_13); {Latin 7 — Baltic Rim}
557  PlainDriver.AddCodePage('WIN1255', CS_WIN1255, ceAnsi, zCP_WIN1255); {ANSI Hebrew}
558  PlainDriver.AddCodePage('WIN1256', CS_WIN1256, ceAnsi, cCP_WIN1256); {ANSI Arabic}
559  PlainDriver.AddCodePage('WIN1257', CS_WIN1257, ceAnsi, zCP_WIN1257); {ANSI Baltic}
560 end;
561 
562 procedure AddFireBird2CodePages(PlainDriver: TZAbstractPlainDriver);
563 begin
564  PlainDriver.AddCodePage('WIN1258', CS_WIN1258, ceAnsi, zCP_WIN1258); {Vietnamese}
565  PlainDriver.AddCodePage('KOI8R', CS_KOI8R, ceAnsi, zCP_KOI8R); {Russian}
566  PlainDriver.AddCodePage('KOI8U', CS_KOI8U, ceAnsi, zCP_KOI8U); {Ukrainian}
567  PlainDriver.AddCodePage('UTF8', CS_UTF8, ceUTF8, zCP_UTF8, '', 4); {All}
568 end;
569 
570 procedure AddFireBird21CodePages(PlainDriver: TZAbstractPlainDriver);
571 begin
572  PlainDriver.AddCodePage('CP943C', CS_CP943C, ceAnsi, 943, '', 2); {Japanese}
573  PlainDriver.AddCodePage('GBK', CS_GBK, ceAnsi, zCP_GB2312, '', 2); {Chinese}
574  PlainDriver.AddCodePage('TIS620', CS_TIS620, ceAnsi, zCP_IBM_Thai); {Thai}
575 end;
576 
577 { IZFirebirdPlainDriver }
578 
579 function TZFirebirdBaseDriver.GetUnicodeCodePageName: String;
580 begin
581  Result := 'UNICODE_FSS';
582 end;
583 
584 procedure TZFirebirdBaseDriver.LoadCodePages;
585 begin
586  Self.AddCodePage('ASCII', CS_ASCII, ceAnsi, zCP_WIN1252); {English}
587  Self.AddCodePage('BIG_5', CS_BIG_5, ceAnsi, zCP_Big5); {Chinese, Vietnamese, Korean}
588  Self.AddCodePage('CYRL', CS_CYRL, ceAnsi, zCP_WIN1251, '', 2); {Russian}
589  Self.AddCodePage('DOS437', CS_DOS437, ceAnsi, zCP_DOS437); {English (USA)}
590  Self.AddCodePage('DOS850', CS_DOS850, ceAnsi, zCP_DOS850); {Latin I (no Euro symbol)}
591  Self.AddCodePage('DOS852', CS_DOS852, ceAnsi, zCP_DOS852); {Latin II}
592  Self.AddCodePage('DOS857', CS_DOS857, ceAnsi, zCP_DOS857); {Turkish}
593  Self.AddCodePage('DOS860', CS_DOS860, ceAnsi, zCP_DOS860); {Portuguese}
594  Self.AddCodePage('DOS861', CS_DOS861, ceAnsi, zCP_DOS861); {Icelandic}
595  Self.AddCodePage('DOS863', CS_DOS863, ceAnsi, zCP_DOS863); {French (Canada)}
596  Self.AddCodePage('DOS865', CS_DOS865, ceAnsi, zCP_DOS865); {Nordic}
597  Self.AddCodePage('EUCJ_0208', CS_EUCJ_0208, ceAnsi, zCP_EUC_JP, '', 2); {EUC Japanese}
598  Self.AddCodePage('GB_2312', CS_GB_2312, ceAnsi, zCP_GB2312, '', 2); {Simplified Chinese (Hong Kong, PRC)}
599  Self.AddCodePage('ISO8859_1', CS_ISO8859_1, ceAnsi, zCP_L1_ISO_8859_1); {Latin 1}
600  Self.AddCodePage('KSC_5601', CS_KSC_5601, ceAnsi, zCP_EUCKR, '', 2); {Korean (Unified Hangeul)}
601  Self.AddCodePage('NEXT', CS_NEXT); {NeXTSTEP encoding}
602  Self.AddCodePage('NONE', CS_NONE, ceAnsi, ZDefaultSystemCodePage, '', 1, False); {Codepage-neutral. Uppercasing limited to ASCII codes 97-122}
603  Self.AddCodePage('OCTETS', CS_BINARY); {Binary character}
604  Self.AddCodePage('SJIS_0208', CS_SJIS_0208, ceAnsi, zCP_EUC_JP, '', 2); {Japanese}
605  Self.AddCodePage('UNICODE_FSS', CS_UNICODE_FSS, ceUTF8, zCP_UTF8, '', 3); {UNICODE}
606  Self.AddCodePage('WIN1250', CS_WIN1250, ceAnsi, zCP_WIN1250); {ANSI — Central European}
607  Self.AddCodePage('WIN1251', CS_WIN1251, ceAnsi, zCP_WIN1251); {ANSI — Cyrillic}
608  Self.AddCodePage('WIN1252', CS_WIN1252, ceAnsi, zCP_WIN1252); {ANSI — Latin I}
609  Self.AddCodePage('WIN1253', CS_WIN1253, ceAnsi, zCP_WIN1253); {ANSI Greek}
610  Self.AddCodePage('WIN1254', CS_WIN1254, ceAnsi, zCP_WIN1254); {ANSI Turkish}
611 end;
612 
613 {$IFDEF ENABLE_INTERBASE_CRYPT}
614 procedure TZFirebirdBaseDriver.Initialize;
615 begin
616  If Assigned(FPreLoader) and not FPreLoader.Loaded then
617  FPreLoader.LoadNativeLibrary;
618  inherited Initialize;
619 end;
620 {$ENDIF}
621 
622 procedure TZFirebirdBaseDriver.LoadApi;
623 begin
624  inherited LoadApi;
625  with Loader do
626  begin
627  @FIREBIRD_API.isc_sqlcode := GetAddress('isc_sqlcode');
628  @FIREBIRD_API.isc_sql_interprete := GetAddress('isc_sql_interprete');
629  @FIREBIRD_API.isc_interprete := GetAddress('isc_interprete');
630  @FIREBIRD_API.isc_vax_integer := GetAddress('isc_vax_integer');
631  @FIREBIRD_API.isc_portable_integer:= GetAddress('isc_portable_integer');
632 
633  @FIREBIRD_API.isc_array_gen_sdl := GetAddress( 'isc_array_gen_sdl');
634  @FIREBIRD_API.isc_array_get_slice := GetAddress( 'isc_array_get_slice');
635  @FIREBIRD_API.isc_array_lookup_bounds := GetAddress( 'isc_array_lookup_bounds');
636  @FIREBIRD_API.isc_array_lookup_desc := GetAddress( 'isc_array_lookup_desc');
637  @FIREBIRD_API.isc_array_set_desc := GetAddress( 'isc_array_set_desc');
638  @FIREBIRD_API.isc_array_put_slice := GetAddress( 'isc_array_put_slice');
639 
640  @FIREBIRD_API.isc_blob_info := GetAddress('isc_blob_info');
641  @FIREBIRD_API.isc_open_blob2 := GetAddress('isc_open_blob2');
642  @FIREBIRD_API.isc_close_blob := GetAddress('isc_close_blob');
643  @FIREBIRD_API.isc_cancel_blob := GetAddress('isc_cancel_blob');
644  @FIREBIRD_API.isc_get_segment := GetAddress('isc_get_segment');
645  @FIREBIRD_API.isc_put_segment := GetAddress('isc_put_segment');
646  @FIREBIRD_API.isc_create_blob2 := GetAddress('isc_create_blob2');
647  @FIREBIRD_API.isc_decode_date := GetAddress('isc_decode_date');
648  @FIREBIRD_API.isc_encode_date := GetAddress('isc_encode_date');
649  @FIREBIRD_API.isc_dsql_free_statement := GetAddress('isc_dsql_free_statement');
650  @FIREBIRD_API.isc_dsql_execute2 := GetAddress('isc_dsql_execute2');
651  @FIREBIRD_API.isc_dsql_execute := GetAddress('isc_dsql_execute');
652  @FIREBIRD_API.isc_dsql_set_cursor_name := GetAddress('isc_dsql_set_cursor_name');
653  @FIREBIRD_API.isc_dsql_fetch := GetAddress('isc_dsql_fetch');
654  @FIREBIRD_API.isc_dsql_sql_info := GetAddress('isc_dsql_sql_info');
655  @FIREBIRD_API.isc_dsql_allocate_statement := GetAddress('isc_dsql_allocate_statement');
656  @FIREBIRD_API.isc_dsql_alloc_statement2 := GetAddress('isc_dsql_alloc_statement2');
657  @FIREBIRD_API.isc_dsql_prepare := GetAddress('isc_dsql_prepare');
658  @FIREBIRD_API.isc_dsql_describe_bind := GetAddress('isc_dsql_describe_bind');
659  @FIREBIRD_API.isc_dsql_describe := GetAddress('isc_dsql_describe');
660  @FIREBIRD_API.isc_dsql_execute_immediate := GetAddress('isc_dsql_execute_immediate');
661  @FIREBIRD_API.isc_drop_database := GetAddress('isc_drop_database');
662  @FIREBIRD_API.isc_detach_database := GetAddress('isc_detach_database');
663  @FIREBIRD_API.isc_attach_database := GetAddress('isc_attach_database');
664  @FIREBIRD_API.isc_database_info := GetAddress('isc_database_info');
665  @FIREBIRD_API.isc_transaction_info := GetAddress('isc_transaction_info');
666  @FIREBIRD_API.isc_start_multiple := GetAddress('isc_start_multiple');
667  @FIREBIRD_API.isc_start_transaction := GetAddress('isc_start_transaction');
668  @FIREBIRD_API.isc_commit_transaction := GetAddress('isc_commit_transaction');
669 
670  @FIREBIRD_API.isc_commit_retaining := GetAddress('isc_commit_retaining');
671  @FIREBIRD_API.isc_rollback_transaction := GetAddress('isc_rollback_transaction');
672  @FIREBIRD_API.isc_cancel_events := GetAddress('isc_cancel_events');
673  @FIREBIRD_API.isc_que_events := GetAddress('isc_que_events');
674  @FIREBIRD_API.isc_event_counts := GetAddress('isc_event_counts');
675  @FIREBIRD_API.isc_event_block := GetAddress('isc_event_block');
676  @FIREBIRD_API.isc_free := GetAddress('isc_free');
677 
678  @FIREBIRD_API.isc_rollback_retaining := GetAddress( 'isc_rollback_retaining');
679  @FIREBIRD_API.isc_decode_sql_date := GetAddress('isc_decode_sql_date');
680  @FIREBIRD_API.isc_decode_sql_time := GetAddress('isc_decode_sql_time');
681  @FIREBIRD_API.isc_decode_timestamp := GetAddress('isc_decode_timestamp');
682  @FIREBIRD_API.isc_encode_sql_date := GetAddress('isc_encode_sql_date');
683  @FIREBIRD_API.isc_encode_sql_time := GetAddress('isc_encode_sql_time');
684  @FIREBIRD_API.isc_encode_timestamp := GetAddress('isc_encode_timestamp');
685  end;
686 end;
687 
688 constructor TZFirebirdBaseDriver.Create;
689 begin
690  inherited create;
691  FLoader := TZNativeLibraryLoader.Create([]);
692  {$IFDEF ENABLE_INTERBASE_CRYPT}
693  FPreLoader := TZNativeLibraryLoader.Create([LINUX_IB_CRYPT_LOCATION]);
694  {$ENDIF}
695 end;
696 
697 {$IFDEF ENABLE_INTERBASE_CRYPT}
698 destructor TZFirebirdBaseDriver.Destroy;
699 begin
700  FPreLoader.Free;
701  inherited Destroy;
702 end;
703 {$ENDIF}
704 
705 function TZFirebirdBaseDriver.GetFirebirdAPI: TZFirebird_API;
706 begin
707  result := FIREBIRD_API;
708 end;
709 
710 function TZFirebirdBaseDriver.isc_array_gen_sdl(status_vector: PISC_STATUS;
711  isc_array_desc: PISC_ARRAY_DESC; isc_arg3: PShort;
712  isc_arg4: PAnsiChar; isc_arg5: PShort): ISC_STATUS;
713 begin
714  Result := FIREBIRD_API.isc_array_gen_sdl(status_vector, isc_array_desc,
715  isc_arg3, isc_arg4, isc_arg5);
716 end;
717 
718 function TZFirebirdBaseDriver.isc_array_get_slice(status_vector: PISC_STATUS;
719  db_handle: PISC_DB_HANDLE; trans_handle: PISC_TR_HANDLE; array_id: PISC_QUAD;
720  descriptor: PISC_ARRAY_DESC; dest_array: PVoid;
721  slice_length: ISC_LONG): ISC_STATUS;
722 begin
723  Result := FIREBIRD_API.isc_array_get_slice(status_vector, db_handle,
724  trans_handle, array_id, descriptor, dest_array, slice_length);
725 end;
726 
727 function TZFirebirdBaseDriver.isc_array_lookup_bounds(
728  status_vector: PISC_STATUS; db_handle: PISC_DB_HANDLE;
729  trans_handle: PISC_TR_HANDLE; table_name, column_name: PAnsiChar;
730  descriptor: PISC_ARRAY_DESC): ISC_STATUS;
731 begin
732  Result := FIREBIRD_API.isc_array_lookup_bounds(status_vector, db_handle,
733  trans_handle, table_name, column_name, descriptor);
734 end;
735 
736 function TZFirebirdBaseDriver.isc_array_lookup_desc(
737  status_vector: PISC_STATUS; db_handle: PISC_DB_HANDLE;
738  trans_handle: PISC_TR_HANDLE; table_name, column_name: PAnsiChar;
739  descriptor: PISC_ARRAY_DESC): ISC_STATUS;
740 begin
741  Result := FIREBIRD_API.isc_array_lookup_desc(status_vector, db_handle,
742  trans_handle, table_name, column_name, descriptor);
743 end;
744 
745 function TZFirebirdBaseDriver.isc_array_put_slice(status_vector: PISC_STATUS;
746  db_handle: PISC_DB_HANDLE; trans_handle: PISC_TR_HANDLE; array_id: PISC_QUAD;
747  descriptor: PISC_ARRAY_DESC; source_array: PVoid;
748  slice_length: PISC_LONG): ISC_STATUS;
749 begin
750  Result := FIREBIRD_API.isc_array_put_slice(status_vector, db_handle,
751  trans_handle, array_id, descriptor, source_array, slice_length);
752 end;
753 
754 function TZFirebirdBaseDriver.isc_array_set_desc(status_vector: PISC_STATUS;
755  table_name: PAnsiChar; column_name: PAnsiChar; sql_dtype, sql_length,
756  sql_dimensions: PShort; descriptor: PISC_ARRAY_DESC): ISC_STATUS;
757 begin
758  Result := FIREBIRD_API.isc_array_set_desc(status_vector, table_name,
759  column_name, sql_dtype, sql_length, sql_dimensions, descriptor);
760 end;
761 
762 function TZFirebirdBaseDriver.isc_attach_database(status_vector: PISC_STATUS;
763  db_name_length: Short; db_name: PAnsiChar; db_handle: PISC_DB_HANDLE;
764  parm_buffer_length: Short; parm_buffer: PAnsiChar): ISC_STATUS;
765 begin
766 
767  Result := FIREBIRD_API.isc_attach_database(status_vector, db_name_length,
768  db_name, db_handle, parm_buffer_length, parm_buffer);
769 
770 end;
771 
772 function TZFirebirdBaseDriver.isc_blob_info(status_vector: PISC_STATUS;
773  blob_handle: PISC_BLOB_HANDLE; item_list_buffer_length: Short;
774  item_list_buffer: PAnsiChar; result_buffer_length: Short;
775  result_buffer: PAnsiChar): ISC_STATUS;
776 begin
777  Result :=FIREBIRD_API.isc_blob_info(status_vector, blob_handle,
778  item_list_buffer_length, item_list_buffer, result_buffer_length,
779  result_buffer);
780 end;
781 
782 function TZFirebirdBaseDriver.isc_cancel_blob(status_vector: PISC_STATUS;
783  blob_handle: PISC_BLOB_HANDLE): ISC_STATUS;
784 begin
785  Result := FIREBIRD_API.isc_cancel_blob(status_vector, blob_handle);
786 end;
787 
788 function TZFirebirdBaseDriver.isc_cancel_events(status_vector: PISC_STATUS;
789  db_handle: PISC_DB_HANDLE; event_id: PISC_LONG): ISC_STATUS;
790 begin
791  Result := FIREBIRD_API.isc_cancel_events(status_vector, db_handle,
792  event_id);
793 end;
794 
795 function TZFirebirdBaseDriver.isc_close_blob(status_vector: PISC_STATUS;
796  blob_handle: PISC_BLOB_HANDLE): ISC_STATUS;
797 begin
798  Result := FIREBIRD_API.isc_close_blob(status_vector, blob_handle);
799 end;
800 
801 function TZFirebirdBaseDriver.isc_commit_retaining(
802  status_vector: PISC_STATUS; tran_handle: PISC_TR_HANDLE): ISC_STATUS;
803 begin
804  Result := FIREBIRD_API.isc_commit_retaining(status_vector, tran_handle);
805 end;
806 
807 function TZFirebirdBaseDriver.isc_commit_transaction(
808  status_vector: PISC_STATUS; tran_handle: PISC_TR_HANDLE): ISC_STATUS;
809 begin
810  Result := FIREBIRD_API.isc_commit_transaction(status_vector, tran_handle);
811 end;
812 
813 function TZFirebirdBaseDriver.isc_create_blob2(status_vector: PISC_STATUS;
814  db_handle: PISC_DB_HANDLE; tran_handle: PISC_TR_HANDLE;
815  blob_handle: PISC_BLOB_HANDLE; blob_id: PISC_QUAD; bpb_length: Short;
816  bpb_address: PAnsiChar): ISC_STATUS;
817 begin
818  Result := FIREBIRD_API.isc_create_blob2(status_vector, db_handle,
819  tran_handle, blob_handle, blob_id, bpb_length, bpb_address);
820 end;
821 
822 function TZFirebirdBaseDriver.isc_database_info(status_vector: PISC_STATUS;
823  db_handle: PISC_DB_HANDLE; item_list_buffer_length: Short;
824  item_list_buffer: PByte; result_buffer_length: Short;
825  result_buffer: PAnsiChar): ISC_STATUS;
826 begin
827  Result := FIREBIRD_API.isc_database_info(status_vector, db_handle,
828  item_list_buffer_length, item_list_buffer, result_buffer_length,
829  result_buffer);
830 end;
831 
832 function TZFirebirdBaseDriver.isc_transaction_info(status_vector: PISC_STATUS;
833  tr_handle: PISC_TR_HANDLE; item_list_buffer_length: Short;
834  item_list_buffer: PAnsiChar; result_buffer_length: Short;
835  result_buffer: PAnsiChar): ISC_STATUS;
836 begin
837  Result := FIREBIRD_API.isc_transaction_info(status_vector, tr_handle,
838  item_list_buffer_length, item_list_buffer, result_buffer_length,
839  result_buffer);
840 end;
841 
842 procedure TZFirebirdBaseDriver.isc_decode_date(ib_date: PISC_QUAD;
843  tm_date: PCTimeStructure);
844 begin
845  FIREBIRD_API.isc_decode_date(ib_date, tm_date);
846 end;
847 
848 procedure TZFirebirdBaseDriver.isc_decode_sql_date(ib_date: PISC_DATE;
849  tm_date: PCTimeStructure);
850 begin
851  FIREBIRD_API.isc_decode_sql_date(ib_date, tm_date);
852 end;
853 
854 procedure TZFirebirdBaseDriver.isc_decode_sql_time(ib_time: PISC_TIME;
855  tm_date: PCTimeStructure);
856 begin
857  FIREBIRD_API.isc_decode_sql_time(ib_time, tm_date);
858 end;
859 
860 procedure TZFirebirdBaseDriver.isc_decode_timestamp(
861  ib_timestamp: PISC_TIMESTAMP; tm_date: PCTimeStructure);
862 begin
863  FIREBIRD_API.isc_decode_timestamp(ib_timestamp, tm_date);
864 end;
865 
866 function TZFirebirdBaseDriver.isc_detach_database(status_vector: PISC_STATUS;
867  db_handle: PISC_DB_HANDLE): ISC_STATUS;
868 begin
869  Result := FIREBIRD_API.isc_detach_database(status_vector, db_handle);
870 end;
871 
872 function TZFirebirdBaseDriver.isc_drop_database(status_vector: PISC_STATUS;
873  db_handle: PISC_DB_HANDLE): ISC_STATUS;
874 begin
875  Result := FIREBIRD_API.isc_drop_database(status_vector, db_handle);
876 end;
877 
878 function TZFirebirdBaseDriver.isc_dsql_alloc_statement2(
879  status_vector: PISC_STATUS; db_handle: PISC_DB_HANDLE;
880  stmt_handle: PISC_STMT_HANDLE): ISC_STATUS;
881 begin
882  Result := FIREBIRD_API.isc_dsql_alloc_statement2(status_vector,
883  db_handle, stmt_handle);
884 end;
885 
886 function TZFirebirdBaseDriver.isc_dsql_allocate_statement(
887  status_vector: PISC_STATUS; db_handle: PISC_DB_HANDLE;
888  stmt_handle: PISC_STMT_HANDLE): ISC_STATUS;
889 begin
890  Result := FIREBIRD_API.isc_dsql_allocate_statement(status_vector,
891  db_handle, stmt_handle);
892 end;
893 
894 function TZFirebirdBaseDriver.isc_dsql_describe(status_vector: PISC_STATUS;
895  stmt_handle: PISC_STMT_HANDLE; dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
896 begin
897  Result := FIREBIRD_API.isc_dsql_describe(status_vector, stmt_handle,
898  dialect, xsqlda);
899 end;
900 
901 function TZFirebirdBaseDriver.isc_dsql_describe_bind(
902  status_vector: PISC_STATUS; stmt_handle: PISC_STMT_HANDLE; dialect: Word;
903  xsqlda: PXSQLDA): ISC_STATUS;
904 begin
905  Result := FIREBIRD_API.isc_dsql_describe_bind(status_vector, stmt_handle,
906  dialect, xsqlda);
907 end;
908 
909 function TZFirebirdBaseDriver.isc_dsql_execute(status_vector: PISC_STATUS;
910  tran_handle: PISC_TR_HANDLE; stmt_handle: PISC_STMT_HANDLE; dialect: Word;
911  xsqlda: PXSQLDA): ISC_STATUS;
912 begin
913  Result := FIREBIRD_API.isc_dsql_execute(status_vector, tran_handle,
914  stmt_handle, dialect, xsqlda);
915 end;
916 
917 function TZFirebirdBaseDriver.isc_dsql_execute_immediate(
918  status_vector: PISC_STATUS; db_handle: PISC_DB_HANDLE;
919  tran_handle: PISC_TR_HANDLE; length: Word; statement: PAnsiChar;
920  dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
921 begin
922  Result := FIREBIRD_API.isc_dsql_execute_immediate(status_vector,
923  db_handle, tran_handle, length, statement, dialect, xsqlda);
924 end;
925 
926 function TZFirebirdBaseDriver.isc_dsql_execute2(status_vector: PISC_STATUS;
927  tran_handle: PISC_TR_HANDLE; stmt_handle: PISC_STMT_HANDLE;
928  dialect: Word; in_xsqlda, out_xsqlda: PXSQLDA): ISC_STATUS;
929 begin
930  Result := FIREBIRD_API.isc_dsql_execute2(status_vector, tran_handle,
931  stmt_handle, dialect, in_xsqlda, out_xsqlda);
932 end;
933 
934 function TZFirebirdBaseDriver.isc_dsql_fetch(status_vector: PISC_STATUS;
935  stmt_handle: PISC_STMT_HANDLE; dialect: Word;
936  xsqlda: PXSQLDA): ISC_STATUS;
937 begin
938  Result := FIREBIRD_API.isc_dsql_fetch(status_vector, stmt_handle, dialect,
939  xsqlda);
940 end;
941 
942 function TZFirebirdBaseDriver.isc_dsql_free_statement(
943  status_vector: PISC_STATUS; stmt_handle: PISC_STMT_HANDLE;
944  options: Word): ISC_STATUS;
945 begin
946  Result := FIREBIRD_API.isc_dsql_free_statement(status_vector, stmt_handle,
947  options);
948 end;
949 
950 function TZFirebirdBaseDriver.isc_dsql_prepare(
951  status_vector: PISC_STATUS; tran_handle: PISC_TR_HANDLE;
952  stmt_handle: PISC_STMT_HANDLE; length: Word; statement: PAnsiChar;
953  dialect: Word; xsqlda: PXSQLDA): ISC_STATUS;
954 begin
955  Result := FIREBIRD_API.isc_dsql_prepare(status_vector, tran_handle,
956  stmt_handle, length, statement, dialect, xsqlda);
957 end;
958 
959 function TZFirebirdBaseDriver.isc_dsql_set_cursor_name(
960  status_vector: PISC_STATUS; stmt_handle: PISC_STMT_HANDLE;
961  cursor_name: PAnsiChar; _type: Word): ISC_STATUS;
962 begin
963  Result := FIREBIRD_API.isc_dsql_set_cursor_name(status_vector,
964  stmt_handle, cursor_name, _type);
965 end;
966 
967 function TZFirebirdBaseDriver.isc_dsql_sql_info(
968  status_vector: PISC_STATUS; stmt_handle: PISC_STMT_HANDLE;
969  item_length: Short; items: PAnsiChar; buffer_length: Short;
970  buffer: PAnsiChar): ISC_STATUS;
971 begin
972  Result := FIREBIRD_API.isc_dsql_sql_info(status_vector, stmt_handle,
973  item_length, items, buffer_length, buffer);
974 end;
975 
976 procedure TZFirebirdBaseDriver.isc_encode_date(tm_date: PCTimeStructure;
977  ib_date: PISC_QUAD);
978 begin
979  FIREBIRD_API.isc_encode_date(tm_date, ib_date);
980 end;
981 
982 procedure TZFirebirdBaseDriver.isc_encode_sql_date(
983  tm_date: PCTimeStructure; ib_date: PISC_DATE);
984 begin
985  FIREBIRD_API.isc_encode_sql_date(tm_date, ib_date);
986 end;
987 
988 procedure TZFirebirdBaseDriver.isc_encode_sql_time(
989  tm_date: PCTimeStructure; ib_time: PISC_TIME);
990 begin
991  FIREBIRD_API.isc_encode_sql_time(tm_date, ib_time);
992 end;
993 
994 procedure TZFirebirdBaseDriver.isc_encode_timestamp(
995  tm_date: PCTimeStructure; ib_timestamp: PISC_TIMESTAMP);
996 begin
997  FIREBIRD_API.isc_encode_timestamp(tm_date, ib_timestamp);
998 end;
999 
1000 function TZFirebirdBaseDriver.isc_event_block(event_buffer: PPAnsiChar;
1001  result_buffer: PPAnsiChar; id_count: Word; event_list: array of PAnsiChar
1002  ): ISC_LONG;
1003 begin
1004  Result := FIREBIRD_API.isc_event_block(event_buffer, result_buffer,
1005  id_count, event_list);
1006 end;
1007 
1008 procedure TZFirebirdBaseDriver.isc_event_counts(
1009  status_vector: PISC_STATUS; buffer_length: Short; event_buffer,
1010  result_buffer: PAnsiChar);
1011 begin
1012  FIREBIRD_API.isc_event_counts(status_vector, buffer_length,
1013  event_buffer, result_buffer);
1014 end;
1015 
1016 function TZFirebirdBaseDriver.isc_free(isc_arg1: PAnsiChar): ISC_LONG;
1017 begin
1018  Result := FIREBIRD_API.isc_free(isc_arg1);
1019 end;
1020 
1021 function TZFirebirdBaseDriver.isc_get_segment(
1022  status_vector: PISC_STATUS; blob_handle: PISC_BLOB_HANDLE;
1023  actual_seg_length: PWord; seg_buffer_length: Word;
1024  seg_buffer: PAnsiChar): ISC_STATUS;
1025 begin
1026  Result := FIREBIRD_API.isc_get_segment(status_vector, blob_handle,
1027  actual_seg_length, seg_buffer_length, seg_buffer);
1028 end;
1029 
1030 function TZFirebirdBaseDriver.isc_interprete(buffer: PAnsiChar;
1031  status_vector: PPISC_STATUS): ISC_STATUS;
1032 begin
1033  Result := FIREBIRD_API.isc_interprete(buffer, status_vector);
1034 end;
1035 
1036 function TZFirebirdBaseDriver.isc_open_blob2(status_vector: PISC_STATUS;
1037  db_handle: PISC_DB_HANDLE; tran_handle: PISC_TR_HANDLE;
1038  blob_handle: PISC_BLOB_HANDLE; blob_id: PISC_QUAD; bpb_length: Short;
1039  bpb_buffer: PAnsiChar): ISC_STATUS;
1040 begin
1041  Result := FIREBIRD_API.isc_open_blob2(status_vector, db_handle,
1042  tran_handle, blob_handle, blob_id, bpb_length, bpb_buffer);
1043 end;
1044 
1045 function TZFirebirdBaseDriver.isc_put_segment(
1046  status_vector: PISC_STATUS; blob_handle: PISC_BLOB_HANDLE;
1047  seg_buffer_len: Word; seg_buffer: PAnsiChar): ISC_STATUS;
1048 begin
1049  Result := FIREBIRD_API.isc_put_segment(status_vector, blob_handle,
1050  seg_buffer_len, seg_buffer);
1051 end;
1052 
1053 function TZFirebirdBaseDriver.isc_que_events(status_vector: PISC_STATUS;
1054  db_handle: PISC_DB_HANDLE; event_id: PISC_LONG; length: Short;
1055  event_buffer: PAnsiChar; event_function: TISC_CALLBACK;
1056  event_function_arg: PVoid): ISC_STATUS;
1057 begin
1058  Result := FIREBIRD_API.isc_que_events(status_vector, db_handle,
1059  event_id, length, event_buffer, event_function, event_function_arg)
1060 end;
1061 
1062 function TZFirebirdBaseDriver.isc_rollback_retaining(
1063  status_vector: PISC_STATUS; tran_handle: PISC_TR_HANDLE): ISC_STATUS;
1064 begin
1065  Result := FIREBIRD_API.isc_rollback_retaining(status_vector, tran_handle);
1066 end;
1067 
1068 procedure TZFirebirdBaseDriver.isc_sql_interprete(sqlcode: Short; buffer: PAnsiChar; buffer_length: Short);
1069 begin
1070  FIREBIRD_API.isc_sql_interprete(sqlcode, buffer, buffer_length);
1071 end;
1072 
1073 function TZFirebirdBaseDriver.isc_sqlcode(status_vector: PISC_STATUS): ISC_LONG;
1074 begin
1075  Result := FIREBIRD_API.isc_sqlcode(status_vector);
1076 end;
1077 
1078 function TZFirebirdBaseDriver.isc_rollback_transaction(
1079  status_vector: PISC_STATUS; tran_handle: PISC_TR_HANDLE): ISC_STATUS;
1080 begin
1081  Result := FIREBIRD_API.isc_rollback_transaction(status_vector, tran_handle);
1082 end;
1083 
1084 function TZFirebirdBaseDriver.isc_start_multiple(
1085  status_vector: PISC_STATUS; tran_handle: PISC_TR_HANDLE;
1086  db_handle_count: Short; teb_vector_address: PISC_TEB): ISC_STATUS;
1087 begin
1088  Result := FIREBIRD_API.isc_start_multiple(status_vector, tran_handle,
1089  db_handle_count, teb_vector_address);
1090 end;
1091 
1092 function TZFirebirdBaseDriver.isc_start_transaction(
1093  status_vector: PISC_STATUS; tran_handle: PISC_TR_HANDLE;
1094  db_handle_count: Short; db_handle: PISC_DB_HANDLE; tpb_length: Word;
1095  tpb_address: PAnsiChar): ISC_STATUS;
1096 begin
1097  Result := FIREBIRD_API.isc_start_transaction(status_vector, tran_handle, db_handle_count, db_handle, tpb_length, tpb_address);
1098 end;
1099 
1100 function TZFirebirdBaseDriver.isc_vax_integer(buffer: PAnsiChar;
1101  length: Short): ISC_LONG;
1102 begin
1103  Result := FIREBIRD_API.isc_vax_integer(buffer, length);
1104 end;
1105 
1106 function TZFirebirdBaseDriver.isc_portable_integer(ptr: pbyte;
1107  length: Short): ISC_INT64;
1108 begin
1109  Result := FIREBIRD_API.isc_portable_integer(ptr, length);
1110 end;
1111 { TZInterbase6PlainDriver }
1112 function TZInterbase6PlainDriver.Clone: IZPlainDriver;
1113 begin
1114  Result := TZInterbase6PlainDriver.Create;
1115 end;
1116 
1117 constructor TZInterbase6PlainDriver.Create;
1118 begin
1119  inherited create;
1120  {$IFNDEF UNIX}
1121  FLoader.AddLocation(WINDOWSIB6_DLL_LOCATION);
1122  {$ELSE}
1123  FLoader.AddLocation(LINUXIB6_DLL_LOCATION);
1124  {$IFDEF ENABLE_INTERBASE_CRYPT}
1125  FPreLoader.AddLocation(LINUX_IB_CRYPT_LOCATION);
1126  {$ENDIF}
1127  {$ENDIF}
1128  Self.LoadCodePages;
1129 end;
1130 
1131 function TZInterbase6PlainDriver.GetDescription: string;
1132 begin
1133  Result := 'Native Plain Driver for Interbase 6';
1134 end;
1135 
1136 function TZInterbase6PlainDriver.GetProtocol: string;
1137 begin
1138  Result := 'interbase-6';
1139 end;
1140 
1141 function TZFirebird10PlainDriver.Clone: IZPlainDriver;
1142 begin
1143  Result := TZFirebird10PlainDriver.Create;
1144 end;
1145 
1146 constructor TZFirebird10PlainDriver.Create;
1147 begin
1148  inherited create;
1149  {$IFNDEF UNIX}
1150  FLoader.AddLocation(WINDOWS_DLL_LOCATION);
1151  {$ELSE}
1152  FLoader.AddLocation(LINUX_DLL_LOCATION);
1153  {$IFDEF ENABLE_INTERBASE_CRYPT}
1154  FPreLoader.AddLocation(LINUX_IB_CRYPT_LOCATION);
1155  {$ENDIF}
1156  {$ENDIF}
1157  Self.LoadCodePages;
1158 end;
1159 
1160 function TZFirebird10PlainDriver.GetDescription: string;
1161 begin
1162  Result := 'Native Plain Driver for Firebird 1.0';
1163 end;
1164 
1165 function TZFirebird10PlainDriver.GetProtocol: string;
1166 begin
1167  Result := 'firebird-1.0';
1168 end;
1169 
1170 { IZFirebird15PlainDriver }
1171 
1172 function TZFirebird15PlainDriver.Clone: IZPlainDriver;
1173 begin
1174  Result := TZFirebird15PlainDriver.Create;
1175 end;
1176 
1177 procedure TZFirebird15PlainDriver.LoadCodePages;
1178 begin
1179  inherited;
1180  AddFireBird15CodePages(Self);
1181 end;
1182 
1183 constructor TZFirebird15PlainDriver.Create;
1184 begin
1185  inherited create;
1186  {$IFNDEF UNIX}
1187  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1188  FLoader.AddLocation(WINDOWS2_DLL_LOCATION);
1189  {$ENDIF}
1190  FLoader.AddLocation(WINDOWS15_DLL_LOCATION);
1191  {$ELSE}
1192  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1193  FLoader.AddLocation(LINUX2_DLL_LOCATION);
1194  {$ENDIF}
1195  FLoader.AddLocation(LINUX15_DLL_LOCATION);
1196  {$IFDEF ENABLE_INTERBASE_CRYPT}
1197  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1198  FPreLoader.AddLocation(LINUX2_IB_CRYPT_LOCATION);
1199  {$ENDIF}
1200  FPreLoader.AddLocation(LINUX15_IB_CRYPT_LOCATION);
1201  {$ENDIF}
1202  {$ENDIF}
1203  Self.LoadCodePages;
1204 end;
1205 
1206 function TZFirebird15PlainDriver.GetDescription: string;
1207 begin
1208  Result := 'Native Plain Driver for Firebird 1.5';
1209 end;
1210 
1211 function TZFirebird15PlainDriver.GetProtocol: string;
1212 begin
1213  Result := 'firebird-1.5';
1214 end;
1215 
1216 { IZFirebird15PlainDriver }
1217 
1218 function TZFirebirdD15PlainDriver.Clone: IZPlainDriver;
1219 begin
1220  Result := TZFirebirdD15PlainDriver.Create;
1221 end;
1222 
1223 constructor TZFirebirdD15PlainDriver.Create;
1224 begin
1225  inherited create;
1226  {$IFNDEF UNIX}
1227  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1228  FLoader.AddLocation(WINDOWS2_DLL_LOCATION_EMBEDDED);
1229  {$ENDIF}
1230  FLoader.AddLocation(WINDOWS15_DLL_LOCATION_EMBEDDED);
1231  {$ELSE}
1232  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1233  FLoader.AddLocation(LINUX2_DLL_LOCATION_EMBEDDED);
1234  {$ENDIF}
1235  FLoader.AddLocation(LINUX15_DLL_LOCATION_EMBEDDED);
1236  {$ENDIF}
1237 end;
1238 
1239 function TZFirebirdD15PlainDriver.GetProtocol: string;
1240 begin
1241  Result := 'firebirdd-1.5';
1242 end;
1243 
1244 function TZFirebirdD15PlainDriver.GetDescription: string;
1245 begin
1246  Result := 'Native Plain Driver for Firebird Embedded 1.5';
1247 end;
1248 
1249 { IZFirebird20PlainDriver }
1250 
1251 function TZFirebird20PlainDriver.Clone: IZPlainDriver;
1252 begin
1253  Result := TZFirebird20PlainDriver.Create;
1254 end;
1255 
1256 function TZFirebird20PlainDriver.GetUnicodeCodePageName: String;
1257 begin
1258  Result := 'UTF8';
1259 end;
1260 
1261 procedure TZFirebird20PlainDriver.LoadCodePages;
1262 begin
1263  inherited LoadCodePages;
1264  AddFireBird15CodePages(Self);
1265  AddFireBird2CodePages(Self);
1266 end;
1267 
1268 constructor TZFirebird20PlainDriver.Create;
1269 begin
1270  inherited create;
1271  {$IFNDEF UNIX}
1272  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1273  FLoader.AddLocation(WINDOWS2_DLL_LOCATION);
1274  {$ENDIF}
1275  FLoader.AddLocation(WINDOWS20_DLL_LOCATION);
1276  {$ELSE}
1277  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1278  FLoader.AddLocation(LINUX2_DLL_LOCATION);
1279  {$ENDIF}
1280  FLoader.AddLocation(LINUX20_DLL_LOCATION);
1281  FLoader.AddLocation(LINUX2_DLL_LOCATION2);
1282  {$IFDEF ENABLE_INTERBASE_CRYPT}
1283  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1284  FPreLoader.AddLocation(LINUX2_IB_CRYPT_LOCATION);
1285  {$ENDIF}
1286  FPreLoader.AddLocation(LINUX20_IB_CRYPT_LOCATION);
1287  {$ENDIF}
1288  {$ENDIF}
1289  Self.LoadCodePages;
1290 end;
1291 
1292 function TZFirebird20PlainDriver.GetDescription: string;
1293 begin
1294  Result := 'Native Plain Driver for Firebird 2.0';
1295 end;
1296 
1297 function TZFirebird20PlainDriver.GetProtocol: string;
1298 begin
1299  Result := 'firebird-2.0';
1300 end;
1301 
1302 { IZFirebirdD20PlainDriver }
1303 function TZFirebirdD20PlainDriver.Clone: IZPlainDriver;
1304 begin
1305  Result := TZFirebirdD20PlainDriver.Create;
1306 end;
1307 
1308 constructor TZFirebirdD20PlainDriver.Create;
1309 begin
1310  inherited create;
1311  {$IFNDEF UNIX}
1312  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1313  FLoader.AddLocation(WINDOWS2_DLL_LOCATION_EMBEDDED);
1314  {$ENDIF}
1315  FLoader.AddLocation(WINDOWS20_DLL_LOCATION_EMBEDDED);
1316  {$ELSE}
1317  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1318  FLoader.AddLocation(LINUX2_DLL_LOCATION_EMBEDDED);
1319  {$ENDIF}
1320  FLoader.AddLocation(LINUX20_DLL_LOCATION_EMBEDDED);
1321  {$ENDIF}
1322 end;
1323 
1324 function TZFirebirdD20PlainDriver.GetProtocol: string;
1325 begin
1326  Result := 'firebirdd-2.0';
1327 end;
1328 
1329 function TZFirebirdD20PlainDriver.GetDescription: string;
1330 begin
1331  Result := 'Native Plain Driver for Firebird Embedded 2.0';
1332 end;
1333 
1334 { IZFirebird21PlainDriver }
1335 
1336 function TZFirebird21PlainDriver.Clone: IZPlainDriver;
1337 begin
1338  Result := TZFirebird21PlainDriver.Create;
1339 end;
1340 
1341 function TZFirebird21PlainDriver.GetUnicodeCodePageName: String;
1342 begin
1343  Result := 'UTF8';
1344 end;
1345 
1346 procedure TZFirebird21PlainDriver.LoadCodePages;
1347 begin
1348  inherited;
1349  AddFireBird15CodePages(Self);
1350  AddFireBird2CodePages(Self);
1351  AddFireBird21CodePages(Self);
1352 end;
1353 
1354 procedure TZFirebird21PlainDriver.LoadApi;
1355 begin
1356  inherited LoadApi;
1357 
1358  with Loader do
1359  begin
1360  @FIREBIRD_API.fb_interpret := GetAddress('fb_interpret');
1361  end;
1362 end;
1363 
1364 constructor TZFirebird21PlainDriver.Create;
1365 begin
1366  inherited create;
1367  {$IFNDEF UNIX}
1368  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1369  FLoader.AddLocation(WINDOWS2_DLL_LOCATION);
1370  {$ENDIF}
1371  FLoader.AddLocation(WINDOWS21_DLL_LOCATION);
1372  {$ELSE}
1373  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1374  FLoader.AddLocation(LINUX2_DLL_LOCATION);
1375  {$ENDIF}
1376  FLoader.AddLocation(LINUX21_DLL_LOCATION);
1377  FLoader.AddLocation(LINUX2_DLL_LOCATION2);
1378  {$IFDEF ENABLE_INTERBASE_CRYPT}
1379  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1380  FPreLoader.AddLocation(LINUX2_IB_CRYPT_LOCATION);
1381  {$ENDIF}
1382  FPreLoader.AddLocation(LINUX21_IB_CRYPT_LOCATION);
1383  {$ENDIF}
1384  {$ENDIF}
1385  Self.LoadCodePages;
1386 end;
1387 
1388 
1389 function TZFirebird21PlainDriver.GetDescription: string;
1390 begin
1391  Result := 'Native Plain Driver for Firebird 2.1';
1392 end;
1393 
1394 function TZFirebird21PlainDriver.GetProtocol: string;
1395 begin
1396  Result := 'firebird-2.1';
1397 end;
1398 
1399 function TZFirebird21PlainDriver.isc_interprete(buffer: PAnsiChar;
1400  status_vector: PPISC_STATUS): ISC_STATUS;
1401 var
1402  bufsize : integer;
1403 begin
1404  bufsize := 1024;
1405  Result := FIREBIRD_API.fb_interpret(buffer, bufsize, status_vector);
1406 end;
1407 
1408 { IZFirebirdD21PlainDriver }
1409 function TZFirebirdD21PlainDriver.Clone: IZPlainDriver;
1410 begin
1411  Result := TZFirebirdD21PlainDriver.Create;
1412 end;
1413 
1414 constructor TZFirebirdD21PlainDriver.Create;
1415 begin
1416  inherited create;
1417  {$IFNDEF UNIX}
1418  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1419  FLoader.AddLocation(WINDOWS2_DLL_LOCATION_EMBEDDED);
1420  {$ENDIF}
1421  FLoader.AddLocation(WINDOWS21_DLL_LOCATION_EMBEDDED);
1422  {$ELSE}
1423  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1424  FLoader.AddLocation(LINUX2_DLL_LOCATION_EMBEDDED);
1425  {$ENDIF}
1426  FLoader.AddLocation(LINUX21_DLL_LOCATION_EMBEDDED);
1427  {$ENDIF}
1428 end;
1429 
1430 function TZFirebirdD21PlainDriver.GetProtocol: string;
1431 begin
1432  Result := 'firebirdd-2.1';
1433 end;
1434 
1435 function TZFirebirdD21PlainDriver.GetDescription: string;
1436 begin
1437  Result := 'Native Plain Driver for Firebird Embedded 2.1';
1438 end;
1439 
1440 { TZFirebird25PlainDriver }
1441 function TZFirebird25PlainDriver.Clone: IZPlainDriver;
1442 begin
1443  Result := TZFirebird25PlainDriver.Create;
1444 end;
1445 
1446 function TZFirebird25PlainDriver.GetUnicodeCodePageName: String;
1447 begin
1448  Result := 'UTF8';
1449 end;
1450 
1451 procedure TZFirebird25PlainDriver.LoadCodePages;
1452 begin
1453  inherited;
1454  AddFireBird15CodePages(Self);
1455  AddFireBird2CodePages(Self);
1456  AddFireBird21CodePages(Self);
1457  ResetCodePage(CS_BIG_5, 'BIG_5', CS_BIG_5, ceAnsi, zCP_BIG5, '', 2); {Chinese, Vietnamese, Korean} //Changed Bytes
1458  Self.AddCodePage('GB18030', CS_GB18030, ceAnsi, zCP_GB18030, '', 4); {Chinese}
1459 end;
1460 
1461 procedure TZFirebird25PlainDriver.LoadApi;
1462 begin
1463  inherited LoadApi;
1464 
1465  with Loader do
1466  begin
1467  @FIREBIRD_API.fb_interpret := GetAddress('fb_interpret');
1468  end;
1469 end;
1470 
1471 constructor TZFirebird25PlainDriver.Create;
1472 begin
1473  inherited create;
1474  {$IFNDEF UNIX}
1475  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1476  FLoader.AddLocation(WINDOWS2_DLL_LOCATION);
1477  {$ENDIF}
1478  FLoader.AddLocation(WINDOWS25_DLL_LOCATION);
1479  {$ELSE}
1480  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1481  FLoader.AddLocation(LINUX2_DLL_LOCATION);
1482  {$ENDIF}
1483  FLoader.AddLocation(LINUX25_DLL_LOCATION);
1484  FLoader.AddLocation(LINUX2_DLL_LOCATION2);
1485  {$IFDEF ENABLE_INTERBASE_CRYPT}
1486  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1487  FPreLoader.AddLocation(LINUX2_IB_CRYPT_LOCATION);
1488  {$ENDIF}
1489  FPreLoader.AddLocation(LINUX25_IB_CRYPT_LOCATION);
1490  {$ENDIF}
1491  {$ENDIF}
1492  Self.LoadCodePages;
1493 end;
1494 
1495 function TZFirebird25PlainDriver.GetProtocol: string;
1496 begin
1497  Result := 'firebird-2.5';
1498 end;
1499 
1500 function TZFirebird25PlainDriver.GetDescription: string;
1501 begin
1502  Result := 'Native Plain Driver for Firebird 2.5';
1503 end;
1504 
1505 function TZFirebird25PlainDriver.isc_interprete(buffer: PAnsiChar;
1506  status_vector: PPISC_STATUS): ISC_STATUS;
1507 begin
1508  Result:=inherited isc_interprete(buffer, status_vector);
1509 end;
1510 
1511 { TZFirebirdD25PlainDriver }
1512 function TZFirebirdD25PlainDriver.Clone: IZPlainDriver;
1513 begin
1514  Result := TZFirebirdD25PlainDriver.Create;
1515 end;
1516 
1517 constructor TZFirebirdD25PlainDriver.Create;
1518 begin
1519  inherited create;
1520  {$IFNDEF UNIX}
1521  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1522  FLoader.AddLocation(WINDOWS2_DLL_LOCATION_EMBEDDED);
1523  {$ENDIF}
1524  FLoader.AddLocation(WINDOWS25_DLL_LOCATION_EMBEDDED);
1525  {$ELSE}
1526  {$IFNDEF FIREBIRD_STRICT_DLL_LOADING}
1527  FLoader.AddLocation(LINUX2_DLL_LOCATION_EMBEDDED);
1528  {$ENDIF}
1529  FLoader.AddLocation(LINUX25_DLL_LOCATION_EMBEDDED);
1530  {$ENDIF}
1531 end;
1532 
1533 function TZFirebirdD25PlainDriver.GetProtocol: string;
1534 begin
1535  Result := 'firebirdd-2.5';
1536 end;
1537 
1538 function TZFirebirdD25PlainDriver.GetDescription: string;
1539 begin
1540  Result := 'Native Plain Driver for Firebird Embedded 2.5';
1541 end;
1542 
1543 end.