zeoslib  UNKNOWN
 All Files
ZPlainDbLibDriver.pas
Go to the documentation of this file.
1 {*********************************************************}
2 { }
3 { Zeos Database Objects }
4 { Delphi plain driver interface to DBLibrary }
5 { }
6 { Originally written by Janos Fegyverneki }
7 { FreeTDS supportd by Bogdan Dragulin }
8 { }
9 {*********************************************************}
10 
11 {@********************************************************}
12 { Copyright (c) 1999-2012 Zeos Development Group }
13 { }
14 { License Agreement: }
15 { }
16 { This library is distributed in the hope that it will be }
17 { useful, but WITHOUT ANY WARRANTY; without even the }
18 { implied warranty of MERCHANTABILITY or FITNESS FOR }
19 { A PARTICULAR PURPOSE. See the GNU Lesser General }
20 { Public License for more details. }
21 { }
22 { The source code of the ZEOS Libraries and packages are }
23 { distributed under the Library GNU General Public }
24 { License (see the file COPYING / COPYING.ZEOS) }
25 { with the following modification: }
26 { As a special exception, the copyright holders of this }
27 { library give you permission to link this library with }
28 { independent modules to produce an executable, }
29 { regardless of the license terms of these independent }
30 { modules, and to copy and distribute the resulting }
31 { executable under terms of your choice, provided that }
32 { you also meet, for each linked independent module, }
33 { the terms and conditions of the license of that module. }
34 { An independent module is a module which is not derived }
35 { from or based on this library. If you modify this }
36 { library, you may extend this exception to your version }
37 { of the library, but you are not obligated to do so. }
38 { If you do not wish to do so, delete this exception }
39 { statement from your version. }
40 { }
41 { }
42 { The project web site is located on: }
43 { http://zeos.firmos.at (FORUM) }
44 { http://sourceforge.net/p/zeoslib/tickets/ (BUGTRACKER)}
45 { svn://svn.code.sf.net/p/zeoslib/code-0/trunk (SVN) }
46 { }
47 { http://www.sourceforge.net/projects/zeoslib. }
48 { }
49 { }
50 { Zeos Development Group. }
51 {********************************************************@}
52 
53 unit ZPlainDbLibDriver;
54 
55 interface
56 
57 {$I ZPlain.inc}
58 
59 uses Classes, ZCompatibility, ZPlainDriver, ZPlainDbLibConstants;
60 
61 const
62  NTWDBLIB_DLL_LOCATION ='ntwdblib.dll';
63  LIBSYBDB_WINDOWS_DLL_LOCATION = 'libsybdb.dll';
64  LIBSYBDB_LINUX_DLL_LOCATION = 'libsybdb.so';
65  FREETDS_MSSQL_WINDOWS_DLL_LOCATION = 'msdblibr.dll';
66  FREETDS_LINUX_DLL_LOCATION = 'dblib.so';
67  FREETDS_OSX_DLL_LOCATION = 'dblib.dylib';
68  FREETDS_SYBASE_WINDOWS_DLL_LOCATION = 'sybdblibd.dll';
69 type
70  {** Represents a generic interface to DBLIB native API. }
71  IZDBLibPlainDriver = interface (IZPlainDriver)
72  ['{7731C3B4-0608-4B6B-B089-240AC43A3463}']
73 
74  procedure CheckError(dbProc: PDBPROCESS);
75 
76  function dbDead(dbProc: PDBPROCESS): Boolean;
77  function dbLogin: PLOGINREC;
78  procedure dbLoginFree(Login: PLOGINREC);
79  function dbSetLoginTime(Seconds: DBINT): RETCODE;
80  function dbsetLName(Login: PLOGINREC; Value: PAnsiChar; Item: DBINT): RETCODE;
81  function dbSetLHost(Login: PLOGINREC; HostName: PAnsiChar): RETCODE;
82  function dbSetLUser(Login: PLOGINREC; UserName: PAnsiChar): RETCODE;
83  function dbSetLPwd(Login: PLOGINREC; Password: PAnsiChar): RETCODE;
84  function dbSetLApp(Login: PLOGINREC; AppName: PAnsiChar): RETCODE;
85  function dbSetLNatLang(Login: PLOGINREC; NatLangName: PAnsiChar): RETCODE;
86  function dbSetLCharSet(Login: PLOGINREC; CharsetName: PAnsiChar): RETCODE;
87  function dbSetLSecure(Login: PLOGINREC): RETCODE;
88  function dbSetMaxprocs(MaxProcs: SmallInt): RETCODE;
89  function dbOpen(Login: PLOGINREC; Host: PAnsiChar): PDBPROCESS;
90  function dbCancel(dbProc: PDBPROCESS): RETCODE;
91  function dbCmd(dbProc: PDBPROCESS; Cmd: PAnsiChar): RETCODE;
92  function dbSqlExec(dbProc: PDBPROCESS; Async: Boolean=False): RETCODE;
93  function dbSqlExecSync(dbProc: PDBPROCESS): RETCODE;
94  function dbSqlExecAsync(dbProc: PDBPROCESS): RETCODE;
95  function dbResults(dbProc: PDBPROCESS): RETCODE;
96  function dbCanQuery(dbProc: PDBPROCESS): RETCODE;
97  function dbMoreCmds(dbProc: PDBPROCESS): RETCODE;
98  function dbUse(dbProc: PDBPROCESS; dbName: PAnsiChar): RETCODE;
99  function dbSetOpt(dbProc: PDBPROCESS; Option: DBINT;
100  Char_Param: PAnsiChar = nil; Int_Param: DBINT = -1): RETCODE;
101  function dbClose(dbProc: PDBPROCESS): RETCODE;
102  function dbName(dbProc: PDBPROCESS): PAnsiChar;
103  function dbCmdRow(dbProc: PDBPROCESS): RETCODE;
104  function dbNumCols(dbProc: PDBPROCESS): DBINT;
105  function dbColName(dbProc: PDBPROCESS; Column: DBINT): PAnsiChar;
106  function dbColType(dbProc: PDBPROCESS; Column: DBINT): DBINT;
107  function dbColLen(dbProc: PDBPROCESS; Column: DBINT): DBInt;
108  function dbData(dbProc: PDBPROCESS; Column: DBINT): PByte;
109  function dbDatLen(dbProc: PDBPROCESS; Column: DBINT): DBINT;
110  function dbConvert(dbProc: PDBPROCESS; SrcType: DBINT; Src: PByte;
111  SrcLen: DBINT; DestType: DBINT; Dest: PByte; DestLen: DBINT): DBINT;
112  function dbNextRow(dbProc: PDBPROCESS): STATUS;
113  function dbGetRow(dbProc: PDBPROCESS; Row: DBINT): STATUS;
114  function dbCount(dbProc: PDBPROCESS): DBINT;
115 
116  function dbRpcInit(dbProc: PDBPROCESS; RpcName: PAnsiChar; Options: SmallInt): RETCODE;
117  function dbRpcParam(dbProc: PDBPROCESS; ParamName: PAnsiChar; Status: Byte;
118  Type_: DBINT; MaxLen: DBINT; DataLen: DBINT; Value: Pointer): RETCODE;
119  function dbRpcSend(dbProc: PDBPROCESS): RETCODE;
120  function dbRpcExec(dbProc: PDBPROCESS): RETCODE;
121  function dbRetStatus(dbProc: PDBPROCESS): DBINT;
122  function dbHasRetStat(dbProc: PDBPROCESS): Boolean;
123  function dbRetName(dbProc: PDBPROCESS; RetNum: DBINT): PAnsiChar;
124  function dbRetData(dbProc: PDBPROCESS; RetNum: DBINT): Pointer;
125  function dbRetLen(dbProc: PDBPROCESS; RetNum: DBINT): DBINT;
126  function dbRetType(dbProc: PDBPROCESS; RetNum: DBINT): DBINT;
127  function dbdataready(Proc: PDBPROCESS): LongBool;
128  function GetVariables: TDBVariables;
129  end;
130 
131  TZDBLibAbstractPlainDriver = class(TZAbstractPlainDriver, IZPlainDriver)
132  protected
133  DBVariables: TDBVariables;
134  public
135  function dbDead(dbProc: PDBPROCESS): Boolean; virtual; abstract;
136  procedure dbLoginFree(Login: PLOGINREC); virtual; abstract;
137  constructor Create; virtual;
138  procedure CheckError(dbProc: PDBPROCESS);
139  function GetVariables: TDBVariables;
140  end;
141 
142  TZDbLibBasePlainDriver = class(TZDBLibAbstractPlainDriver, IZPlainDriver,
143  IZDBLibPlainDriver)
144  protected
145  DBLibAPI: TDBLibAPI;
146  public
147  procedure LoadApi; override;
148  function dbLogin: PLOGINREC; virtual;
149  function dbSetLoginTime(Seconds: DBINT): RETCODE;
150  function dbsetLName(Login: PLOGINREC; Value: PAnsiChar; Item: DBINT): RETCODE;
151  function dbSetLHost(Login: PLOGINREC; HostName: PAnsiChar): RETCODE;
152  function dbSetLUser(Login: PLOGINREC; UserName: PAnsiChar): RETCODE;
153  function dbSetLPwd(Login: PLOGINREC; Password: PAnsiChar): RETCODE;
154  function dbSetLApp(Login: PLOGINREC; AppName: PAnsiChar): RETCODE;
155  function dbSetLNatLang(Login: PLOGINREC; NatLangName: PAnsiChar): RETCODE;
156  function dbSetLCharSet(Login: PLOGINREC; CharsetName: PAnsiChar): RETCODE; virtual; abstract;
157  function dbSetLSecure(Login: PLOGINREC): RETCODE; virtual; abstract;
158  function dbSetMaxprocs(MaxProcs: SmallInt): RETCODE; virtual; abstract;
159  function dbOpen(Login: PLOGINREC; Host: PAnsiChar): PDBPROCESS; virtual;
160  function dbCancel(dbProc: PDBPROCESS): RETCODE;
161  function dbCmd(dbProc: PDBPROCESS; Cmd: PAnsiChar): RETCODE;
162  function dbSqlExec(dbProc: PDBPROCESS; Async: Boolean=False): RETCODE;
163  function dbSqlExecSync(dbProc: PDBPROCESS): RETCODE;
164  function dbSqlExecAsync(dbProc: PDBPROCESS): RETCODE;
165  function dbResults(dbProc: PDBPROCESS): RETCODE;
166  function dbCanQuery(dbProc: PDBPROCESS): RETCODE;
167  function dbMoreCmds(dbProc: PDBPROCESS): RETCODE;
168  function dbUse(dbProc: PDBPROCESS; dbName: PAnsiChar): RETCODE;
169  function dbSetOpt(dbProc: PDBPROCESS; Option: DBINT; Char_Param: PAnsiChar = nil; Int_Param: DBINT = -1): RETCODE; virtual; abstract;
170  function dbClose(dbProc: PDBPROCESS): RETCODE; virtual; abstract;
171  function dbName(dbProc: PDBPROCESS): PAnsiChar;
172  function dbCmdRow(dbProc: PDBPROCESS): RETCODE;
173  function dbNumCols(dbProc: PDBPROCESS): DBINT;
174  function dbcolbrowse(Proc: PDBPROCESS; Column: Integer): LongBool; virtual; abstract;
175 
176  function dbColName(dbProc: PDBPROCESS; Column: DBINT): PAnsiChar;
177  function dbColType(dbProc: PDBPROCESS; Column: DBINT): DBINT;
178  function dbColLen(dbProc: PDBPROCESS; Column: DBINT): DBInt;
179  function dbData(dbProc: PDBPROCESS; Column: DBINT): PByte;
180  function dbDatLen(dbProc: PDBPROCESS; Column: DBINT): DBINT; virtual; abstract;
181  function dbConvert(dbProc: PDBPROCESS; SrcType: DBINT; Src: PByte;
182  SrcLen: DBINT; DestType: DBINT; Dest: PByte; DestLen: DBINT): DBINT;
183  function dbNextRow(dbProc: PDBPROCESS): STATUS;
184  function dbGetRow(dbProc: PDBPROCESS; Row: DBINT): STATUS;
185  function dbCount(dbProc: PDBPROCESS): DBINT; virtual; abstract;
186 
187  function dbRpcInit(dbProc: PDBPROCESS; RpcName: PAnsiChar; Options: SmallInt): RETCODE;
188  function dbRpcParam(dbProc: PDBPROCESS; ParamName: PAnsiChar; Status: Byte;
189  Type_: DBINT; MaxLen: DBINT; DataLen: DBINT; Value: Pointer): RETCODE; virtual;
190  function dbRpcSend(dbProc: PDBPROCESS): RETCODE;
191  function dbRpcExec(dbProc: PDBPROCESS): RETCODE;
192  function dbRetStatus(dbProc: PDBPROCESS): DBINT;
193  function dbHasRetStat(dbProc: PDBPROCESS): Boolean; virtual; abstract;
194  function dbRetName(dbProc: PDBPROCESS; RetNum: DBINT): PAnsiChar;
195  function dbRetData(dbProc: PDBPROCESS; RetNum: DBINT): Pointer;
196  function dbRetLen(dbProc: PDBPROCESS; RetNum: DBINT): DBINT;
197  function dbRetType(dbProc: PDBPROCESS; RetNum: DBINT): DBINT;
198  function dbdataready(Proc: PDBPROCESS): LongBool; virtual; abstract;
199  function dbrbuf(Proc: PDBPROCESS): DBINT;
200  end;
201 
202  {** Implements a dblib driver for Sybase ASE 12.5 }
203  TZDBLibSybaseASE125PlainDriver = class (TZDBLibAbstractPlainDriver, IZPlainDriver,
204  IZDBLibPlainDriver)
205  private
206  SybaseAPI: TSybaseAPI;
207  protected
208  procedure LoadApi; override;
209  function Clone: IZPlainDriver; override;
210  procedure LoadCodePages; override;
211  public
212  constructor Create; override;
213  destructor Destroy; override;
214 
215  function GetProtocol: string; override;
216  function GetDescription: string; override;
217 
218  function dbDead(dbProc: PDBPROCESS): Boolean; override;
219  function dbLogin: PLOGINREC;
220  procedure dbLoginFree(Login: PLOGINREC); override;
221  function dbSetLoginTime(Seconds: DBINT): RETCODE;
222  function dbsetLName(Login: PLOGINREC; Value: PAnsiChar; Item: DBINT): RETCODE;
223  function dbSetLHost(Login: PLOGINREC; HostName: PAnsiChar): RETCODE;
224  function dbSetLUser(Login: PLOGINREC; UserName: PAnsiChar): RETCODE;
225  function dbSetLPwd(Login: PLOGINREC; Password: PAnsiChar): RETCODE;
226  function dbSetLApp(Login: PLOGINREC; AppName: PAnsiChar): RETCODE;
227  function dbSetLNatLang(Login: PLOGINREC; NatLangName: PAnsiChar): RETCODE;
228  function dbSetLCharSet(Login: PLOGINREC; CharsetName: PAnsiChar): RETCODE;
229  function dbSetLSecure(Login: PLOGINREC): RETCODE;
230  function dbSetMaxprocs(MaxProcs: SmallInt): RETCODE;
231  function dbOpen(Login: PLOGINREC; Host: PAnsiChar): PDBPROCESS;
232  function dbCancel(dbProc: PDBPROCESS): RETCODE;
233  function dbCmd(dbProc: PDBPROCESS; Cmd: PAnsiChar): RETCODE;
234  function dbSqlExec(dbProc: PDBPROCESS; Async: Boolean=False): RETCODE; virtual;
235  function dbSqlExecSync(dbProc: PDBPROCESS): RETCODE;
236  function dbSqlExecAsync(dbProc: PDBPROCESS): RETCODE;
237  function dbResults(dbProc: PDBPROCESS): RETCODE;
238  function dbCanQuery(dbProc: PDBPROCESS): RETCODE;
239  function dbMoreCmds(dbProc: PDBPROCESS): RETCODE;
240  function dbUse(dbProc: PDBPROCESS; dbName: PAnsiChar): RETCODE;
241  function dbSetOpt(dbProc: PDBPROCESS; Option: DBINT; Char_Param: PAnsiChar = nil; Int_Param: DBINT = -1): RETCODE;
242  function dbClose(dbProc: PDBPROCESS): RETCODE;
243  function dbName(dbProc: PDBPROCESS): PAnsiChar;
244  function dbCmdRow(dbProc: PDBPROCESS): RETCODE;
245  function dbNumCols(dbProc: PDBPROCESS): DBINT;
246  function dbcolbrowse(Proc: PDBPROCESS; Column: Integer): LongBool;
247 
248  function dbColName(dbProc: PDBPROCESS; Column: DBINT): PAnsiChar;
249  function dbColType(dbProc: PDBPROCESS; Column: DBINT): DBINT;
250  function dbColLen(dbProc: PDBPROCESS; Column: DBINT): DBInt;
251  function dbData(dbProc: PDBPROCESS; Column: DBINT): PByte;
252  function dbDatLen(dbProc: PDBPROCESS; Column: DBINT): DBINT;
253  function dbConvert(dbProc: PDBPROCESS; SrcType: DBINT; Src: PByte;
254  SrcLen: DBINT; DestType: DBINT; Dest: PByte; DestLen: DBINT): DBINT;
255  function dbNextRow(dbProc: PDBPROCESS): STATUS;
256  function dbGetRow(dbProc: PDBPROCESS; Row: DBINT): STATUS;
257  function dbCount(dbProc: PDBPROCESS): DBINT;
258 
259  function dbRpcInit(dbProc: PDBPROCESS; RpcName: PAnsiChar; Options: SmallInt): RETCODE;
260  function dbRpcParam(dbProc: PDBPROCESS; ParamName: PAnsiChar; Status: Byte;
261  Type_: DBINT; MaxLen: DBINT; DataLen: DBINT; Value: Pointer): RETCODE;
262  function dbRpcSend(dbProc: PDBPROCESS): RETCODE;
263  function dbRpcExec(dbProc: PDBPROCESS): RETCODE;
264  function dbRetStatus(dbProc: PDBPROCESS): DBINT;
265  function dbHasRetStat(dbProc: PDBPROCESS): Boolean;
266  function dbRetName(dbProc: PDBPROCESS; RetNum: DBINT): PAnsiChar;
267  function dbRetData(dbProc: PDBPROCESS; RetNum: DBINT): Pointer;
268  function dbRetLen(dbProc: PDBPROCESS; RetNum: DBINT): DBINT;
269  function dbRetType(dbProc: PDBPROCESS; RetNum: DBINT): DBINT;
270  function dbrbuf(Proc: PDBPROCESS): DBINT;
271  function dbdataready(Proc: PDBPROCESS): LongBool;
272  end;
273 
274  {** Implements a dblib driver for MSSql7 }
275  TZDBLibMSSQL7PlainDriver = class (TZDbLibBasePlainDriver, IZPlainDriver,
276  IZDBLibPlainDriver)
277  private
278  MsSQLAPI: TMsSQLAPI;
279  protected
280  function Clone: IZPlainDriver; override;
281  procedure LoadCodePages; override;
282  public
283  procedure LoadApi; override;
284  constructor Create; override;
285  destructor Destroy; override;
286 
287  function GetProtocol: string; override;
288  function GetDescription: string; override;
289 
290  function dbDead(dbProc: PDBPROCESS): Boolean; override;
291  procedure dbLoginFree(Login: PLOGINREC); override;
292  function dbSetLCharSet(Login: PLOGINREC; CharsetName: PAnsiChar): RETCODE; override;
293  function dbSetLSecure(Login: PLOGINREC): RETCODE; override;
294  function dbSetMaxprocs(MaxProcs: SmallInt): RETCODE; override;
295  function dbSqlExecAsync(dbProc: PDBPROCESS): RETCODE;
296  function dbSetOpt(dbProc: PDBPROCESS; Option: DBINT; Char_Param: PAnsiChar = nil; Int_Param: DBINT = -1): RETCODE; override;
297  function dbClose(dbProc: PDBPROCESS): RETCODE; override;
298  function dbcolbrowse(Proc: PDBPROCESS; Column: Integer): LongBool; override;
299 
300  function dbDatLen(dbProc: PDBPROCESS; Column: DBINT): DBINT; override;
301  function dbCount(dbProc: PDBPROCESS): DBINT; override;
302  function dbHasRetStat(dbProc: PDBPROCESS): Boolean; override;
303  function dbdataready(Proc: PDBPROCESS): LongBool; override;
304  end;
305 
306  {** Implements a generic dblib driver}
307  IZFreeTDSPlainDriver = interface (IZDBLibPlainDriver)
308  ['{12FA5A22-59E5-4CBF-B745-96A7CDF9FBE0}']
309 
310  function dbSetTime(queryTime : Integer): RETCODE;
311  procedure tdsDumpOn;
312  procedure tdsDumpOff;
313  procedure tdsDump_Open(const FileName: String);
314  procedure tdsDump_Close;
315 
316  end;
317 
318  {** Implements a dblib driver for Sybase/MSSQL }
319  TZFreeTDSBasePlainDriver = class (TZDbLibBasePlainDriver,
320  IZDBLibPlainDriver, IZFreeTDSPlainDriver)
321  private
322  FreeTDSAPI: TFreeTDSAPI;
323  protected
324  function Clone: IZPlainDriver; override; abstract;
325  public
326  constructor Create; override;
327  destructor Destroy; override;
328 
329  procedure LoadApi; override;
330  function GetProtocol: string; override;
331  function GetDescription: string; override;
332 
333  {API functions}
334  function dbsetlversion(Login: PLOGINREC): RETCODE; virtual;
335  function dbsetversion: RETCODE; virtual;
336 
337 
338  function dbDead(dbProc: PDBPROCESS): Boolean; override;
339  function dbLogin: PLOGINREC; override;
340  procedure dbLoginFree(Login: PLOGINREC); override;
341  function dbSetLCharSet(Login: PLOGINREC; CharsetName: PAnsiChar): RETCODE; override;
342  function dbSetLSecure(Login: PLOGINREC): RETCODE; override;
343  function dbSetMaxprocs(MaxProcs: SmallInt): RETCODE; override;
344  function dbSetTime(queryTime : Integer): RETCODE;
345 
346  function dbSetOpt(dbProc: PDBPROCESS; Option: Integer;
347  Char_Param: PAnsiChar = nil; Int_Param: Integer = -1): RETCODE; override;
348  function dbClose(dbProc: PDBPROCESS): RETCODE; override;
349  function dbColInfo(dbProc: PDBPROCESS; Column: Integer; var ADBInfo: DBCOL): RETCODE;
350  function dbDatLen(dbProc: PDBPROCESS; Column: Integer): Integer; override;
351  function dbCount(dbProc: PDBPROCESS): Integer; override;
352  function dbcolbrowse(Proc: PDBPROCESS; Column: Integer): LongBool; override;
353 
354  function dbHasRetStat(dbProc: PDBPROCESS): Boolean; override;
355 
356  procedure tdsDumpOn;
357  procedure tdsDumpOff;
358  procedure tdsDump_Open(const FileName: String);
359  procedure tdsDump_Close;
360  function dbdataready(Proc: PDBPROCESS): LongBool; override;
361  procedure dbfreelogin(Login: PLOGINREC);
362  end;
363 
364 
365  TZFreeTDS42MsSQLPlainDriver = class(TZFreeTDSBasePlainDriver)
366  protected
367  function Clone: IZPlainDriver; override;
368  procedure LoadCodePages; override;
369  public
370  constructor Create; override;
371  function GetProtocol: string; override;
372  function GetDescription: string; override;
373  function dbsetlversion(Login: PLOGINREC): RETCODE; override;
374  function dbsetversion: RETCODE; override;
375  end;
376 
377  TZFreeTDS42SybasePlainDriver = class(TZFreeTDSBasePlainDriver)
378  protected
379  function Clone: IZPlainDriver; override;
380  procedure LoadCodePages; override;
381  public
382  constructor Create; override;
383  function GetProtocol: string; override;
384  function GetDescription: string; override;
385  function dbsetlversion(Login: PLOGINREC): RETCODE; override;
386  function dbsetversion: RETCODE; override;
387  end;
388 
389  TZFreeTDS50PlainDriver = class(TZFreeTDS42SybasePlainDriver)
390  protected
391  function Clone: IZPlainDriver; override;
392  procedure LoadCodePages; override;
393  public
394  constructor Create; override;
395  function GetProtocol: string; override;
396  function GetDescription: string; override;
397  function dbsetversion: RETCODE; override;
398  end;
399 
400  TZFreeTDS70PlainDriver = class(TZFreeTDS42MsSQLPlainDriver)
401  protected
402  function Clone: IZPlainDriver; override;
403  procedure LoadCodePages; override;
404  public
405  function GetProtocol: string; override;
406  function GetDescription: string; override;
407  function dbsetlversion(Login: PLOGINREC): RETCODE; override;
408  function dbsetversion: RETCODE; override;
409  end;
410 
411  TZFreeTDS71PlainDriver = class(TZFreeTDS70PlainDriver)
412  protected
413  function Clone: IZPlainDriver; override;
414  procedure LoadCodePages; override;
415  public
416  function GetProtocol: string; override;
417  function GetDescription: string; override;
418  function dbsetversion: RETCODE; override;
419  end;
420 
421  TZFreeTDS72PlainDriver = class(TZFreeTDS70PlainDriver)
422  protected
423  function Clone: IZPlainDriver; override;
424  procedure LoadCodePages; override;
425  public
426  function GetProtocol: string; override;
427  function GetDescription: string; override;
428  function dbsetversion: RETCODE; override;
429  end;
430 
431 
432 var
433  OldFreeTDSErrorHandle: DBERRHANDLE_PROC = nil;
434  OldFreeTDSMessageHandle: DBMSGHANDLE_PROC = nil;
435  OldSybaseErrorHandle: SYBDBERRHANDLE_PROC = nil;
436  OldSybaseMessageHandle: SYBDBMSGHANDLE_PROC = nil;
437  OldMsSQLMessageHandle: DBMSGHANDLE_PROC = nil;
438  OldMsSQLErrorHandle: DBERRHANDLE_PROC = nil;
439  SQLErrors: TList;
440  SQLMessages: TList;
441 
442 implementation
443 
444 uses SysUtils, ZPlainLoader, ZEncoding, {$IFDEF FPC}DOS{$ELSE}Windows{$ENDIF};
445 
446 procedure AddSybaseCodePages(PlainDriver: TZAbstractPlainDriver);
447 begin
448  { MultiByte }
449  PlainDriver.AddCodePage('874THAIBIN', 1, ceAnsi, 874); {Windows Thailändisch, ISO8859-11, binäre Sortierung}
450  PlainDriver.AddCodePage('932JPN', 2, ceAnsi, 932); {Japanese Shift-JIS mit Microsoft-Erweiterungen}
451  PlainDriver.AddCodePage('936ZHO', 3, ceAnsi, 936); {Vereinfachtes Chinesisch, PRC GBK}
452  PlainDriver.AddCodePage('949KOR', 4, ceAnsi, 949); {Korean KS C 5601-1987-Codierung, Wansung}
453  PlainDriver.AddCodePage('950ZHO_HK', 5, ceAnsi, 950); {Traditionelles Chinesisch, Big 5-Kodierung mit HKSCS}
454  PlainDriver.AddCodePage('950ZHO_TW', 6, ceAnsi, 950); {Traditionelles Chinesisch, Big 5-Kodierung}
455  PlainDriver.AddCodePage('EUC_CHINA', 21, ceAnsi, zCP_GB2312); {GB2312-80 Simplified Chinese}
456  PlainDriver.AddCodePage('EUC_JAPAN', 22, ceAnsi, zCP_SHIFTJS); {Japanisch EUC JIS X 0208-1990 und JIS X 0212-1990-Zeichensatz}
457  PlainDriver.AddCodePage('EUC_KOREA', 23, ceAnsi, 1361); { Koreanisch KS C 5601-1992 8-Bit-Zeichensatz, Johab}
458  PlainDriver.AddCodePage('EUC_TAIWAN', 24, ceAnsi, 964); {EUC-TW-Kodierung}
459  PlainDriver.AddCodePage('UCA', 29, ceUTF16, zCP_UTF16, 'utf8'); {UCA UCA-Standardkollatierung}
460  PlainDriver.AddCodePage('UTF8BIN', 30, ceUTF8, zCP_UTF8); {UTF-8, 8-Bit-Mehrbyte-Zeichensatz für Unicode, binäre Reihenfolge}
461 
462  { SingleByte }
463  PlainDriver.AddCodePage('1250LATIN2', 7, ceAnsi, zCP_WIN1250); {Windows Latin 2, Mittel- und Osteuropa}
464  PlainDriver.AddCodePage('1250POL', 8, ceAnsi, zCP_WIN1251); {Windows Latin 2, Polnisch}
465  PlainDriver.AddCodePage('1251CYR', 9, ceAnsi, 1251); {Windows Kyrillisch}
466  PlainDriver.AddCodePage('1252LATIN1', 10, ceAnsi, 1252); { Windows Latin 1, Western}
467  PlainDriver.AddCodePage('1252LT1ACC', 11, ceAnsi, 1252); {Windows-Spezial Latin 1, Western, Zeichen mit Akzent nicht gleich}
468  PlainDriver.AddCodePage('1252NOR', 12, ceAnsi, 1252); {Windows Latin 1, Norwegisch}
469  PlainDriver.AddCodePage('1252SPA', 13, ceAnsi, 1252); {Windows Latin 1, Spanisch}
470  PlainDriver.AddCodePage('1252SWEFIN', 14, ceAnsi, 1252); {Windows Latin 1, Schwedisch/Finnisch}
471  PlainDriver.AddCodePage('1253ELL', 15, ceAnsi, 1253); {Windows Griechisch, ISO8859-7 mit Erweiterungen}
472  PlainDriver.AddCodePage('1254TRK', 16, ceAnsi, 1254); {Windows Türkisch, ISO8859-9 mit Erweiterungen}
473  PlainDriver.AddCodePage('1254TRKALT', 17, ceAnsi, 1254); {Windows Türkisch, ISO8859-9 mit Erweiterungen, I mit I-Punkt gleich I ohne I-Punkt}
474  PlainDriver.AddCodePage('1255HEB', 18, ceAnsi, 1255); {Windows Hebräisch, ISO8859-8 mit Erweiterungen}
475  PlainDriver.AddCodePage('1256ARA', 19, ceAnsi, 1256); {Windows Arabisch, ISO8859-6 mit Erweiterungen}
476  PlainDriver.AddCodePage('1257LIT', 20, ceAnsi, 1257); {Windows Baltische Staaten, Litauisch}
477  PlainDriver.AddCodePage('ISO1LATIN1', 25, ceAnsi, zCP_L1_ISO_8859_1); {ISO8859-1, ISO Latin 1, Western, Latin 1-Sortierreihenfolge}
478  PlainDriver.AddCodePage('ISO9LATIN1', 26, ceAnsi, zCP_L9_ISO_8859_15); { ISO8859-15, ISO Latin 9, Western, Latin 1-Sortierreihenfolge}
479  PlainDriver.AddCodePage('ISO_1', 27, ceAnsi, zCP_L1_ISO_8859_1); {ISO8859-1, ISO Latin 1, Western}
480  PlainDriver.AddCodePage('ISO_BINENG', 28, ceAnsi, zCP_us_ascii); {Binäre Sortierreihenfolge, Englisch ISO/ASCII 7-Bit-Zuordnung nach Groß- und Kleinschreibung}
481 end;
482 
483 procedure AddmMSCodePages(PlainDriver: TZAbstractPlainDriver);
484 begin
485  { SingleByte }
486  PlainDriver.AddCodePage('WIN1250', 1, ceAnsi, zCP_WIN1250); {Microsoft Windows Codepage 1250 (East European)}
487  PlainDriver.AddCodePage('WIN1251', 2, ceAnsi, zCP_WIN1251); {Microsoft Windows Codepage 1251 (Cyrl)}
488  PlainDriver.AddCodePage('WIN1252', 3, ceAnsi, zCP_WIN1252); {Microsoft Windows Codepage 1252 (ANSI), USASCCI}
489  PlainDriver.AddCodePage('WIN1253', 4, ceAnsi, zCP_WIN1253); {Microsoft Windows Codepage 1253 (Greek)}
490  PlainDriver.AddCodePage('WIN1254', 5, ceAnsi, zCP_WIN1254); {Microsoft Windows Codepage 1254 (Turk)}
491  PlainDriver.AddCodePage('WIN1255', 6, ceAnsi, zCP_WIN1255); {Microsoft Windows Codepage 1255 (Hebrew)}
492  PlainDriver.AddCodePage('WIN1256', 7, ceAnsi, cCP_WIN1256); {Microsoft Windows Codepage 1256 (Arab)}
493  PlainDriver.AddCodePage('WIN1257', 8, ceAnsi, zCP_WIN1257); {Microsoft Windows Codepage 1257 (BaltRim)}
494  PlainDriver.AddCodePage('WIN1258', 9, ceAnsi, zCP_WIN1258); {Microsoft Windows Codepage 1258 (Viet), TCVN-5712}
495 end;
496 
497 { Handle sql server error messages }
498 function SybaseErrorHandle(Proc: PDBPROCESS; Severity, DbErr, OsErr: Integer;
499  DbErrStr, OsErrStr: PAnsiChar): Integer;
500 {$IFNDEF UNIX} stdcall{$ELSE} cdecl{$ENDIF};
501 var
502  SqlError: PDBLibError;
503 begin
504  New(SqlError);
505  SqlError.dbProc := Proc;
506  SqlError.Severity := Severity;
507  SqlError.DbErr := DbErr;
508  SqlError.OsErr := OsErr;
509  SqlError.DbErrStr := DbErrStr;
510  SqlError.OsErrStr := OsErrStr;
511  SQLErrors.Add(SqlError);
512 
513  Result := INT_CANCEL;
514 end;
515 
516 { Handle sql server messages }
517 function SybaseMessageHandle(Proc: PDBPROCESS; MsgNo: DBINT; MsgState,
518  Severity: Integer; MsgText, SrvName, ProcName: PAnsiChar; Line: DBUSMALLINT):
519  Integer; {$IFNDEF UNIX} stdcall {$ELSE} cdecl {$ENDIF};
520 var
521  SQLMessage: PDBLibMessage;
522 begin
523  New(SQLMessage);
524  SQLMessage.dbProc := Proc;
525  SQLMessage.MsgNo := MsgNo;
526  SQLMessage.MsgState := MsgState;
527  SQLMessage.Severity := Severity;
528  SQLMessage.MsgText := MsgText;
529  SQLMessage.SrvName := SrvName;
530  SQLMessage.ProcName := ProcName;
531  SQLMessage.Line := Line;
532  SQLMessages.Add(SQLMessage);
533 
534  Result := 0;
535 end;
536 
537 { Handle sql server error messages }
538 function DbLibErrorHandle(Proc: PDBPROCESS; Severity, DbErr, OsErr: Integer;
539  DbErrStr, OsErrStr: PAnsiChar): Integer; cdecl;
540 var
541  SqlError: PDBLibError;
542 begin
543  New(SqlError);
544  SqlError.dbProc := Proc;
545  SqlError.Severity := Severity;
546  SqlError.DbErr := DbErr;
547  SqlError.OsErr := OsErr;
548  SqlError.DbErrStr := DbErrStr;
549  SqlError.OsErrStr := OsErrStr;
550  SQLErrors.Add(SqlError);
551 
552  Result := INT_CANCEL;
553 end;
554 
555 { Handle sql server messages }
556 function DbLibMessageHandle(Proc: PDBPROCESS; MsgNo: DBINT; MsgState, Severity: Integer;
557  MsgText, SrvName, ProcName: PAnsiChar; Line: DBUSMALLINT): Integer; cdecl;
558 var
559  SQLMessage: PDBLibMessage;
560 begin
561  New(SQLMessage);
562  SQLMessage.dbProc := Proc;
563  SQLMessage.MsgNo := MsgNo;
564  SQLMessage.MsgState := MsgState;
565  SQLMessage.Severity := Severity;
566  SQLMessage.MsgText := MsgText;
567  SQLMessage.SrvName := SrvName;
568  SQLMessage.ProcName := ProcName;
569  SQLMessage.Line := Line;
570  SQLMessages.Add(SQLMessage);
571 
572  Result := 0;
573 end;
574 
575 constructor TZDBLibAbstractPlainDriver.Create;
576 var I: Integer;
577 begin
578  inherited create;
579  FLoader := TZNativeLibraryLoader.Create([]);
580  for i := 0 to high(DBVariables.DBoptions) do DBVariables.DBoptions[i] := -1;
581  for i := 0 to high(DBVariables.DBSetLoginRec) do DBVariables.DBSetLoginRec[i] := -1;
582  DBVariables.datatypes[Z_SQLVOID] := DBLIBSQLVOID;
583  DBVariables.datatypes[Z_SQLTEXT] := DBLIBSQLTEXT;
584  DBVariables.datatypes[Z_SQLVARBINARY] := DBLIBSQLVARBINARY;
585  DBVariables.datatypes[Z_SQLINTN] := DBLIBSQLINTN;
586  DBVariables.datatypes[Z_SQLVARCHAR] := DBLIBSQLVARCHAR;
587  DBVariables.datatypes[Z_SQLBINARY] := DBLIBSQLBINARY;
588  DBVariables.datatypes[Z_SQLIMAGE] := DBLIBSQLIMAGE;
589  DBVariables.datatypes[Z_SQLCHAR] := DBLIBSQLCHAR;
590  DBVariables.datatypes[Z_SQLINT1] := DBLIBSQLINT1;
591  DBVariables.datatypes[Z_SQLBIT] := DBLIBSQLBIT;
592  DBVariables.datatypes[Z_SQLINT2] := DBLIBSQLINT2;
593  DBVariables.datatypes[Z_SQLINT4] := DBLIBSQLINT4;
594  DBVariables.datatypes[Z_SQLMONEY] := DBLIBSQLMONEY;
595  DBVariables.datatypes[Z_SQLDATETIME] := DBLIBSQLDATETIME;
596  DBVariables.datatypes[Z_SQLFLT8] := DBLIBSQLFLT8;
597  DBVariables.datatypes[Z_SQLFLTN] := DBLIBSQLFLTN;
598  DBVariables.datatypes[Z_SQLMONEYN] := DBLIBSQLMONEYN;
599  DBVariables.datatypes[Z_SQLDATETIMN] := DBLIBSQLDATETIMN;
600  DBVariables.datatypes[Z_SQLFLT4] := DBLIBSQLFLT4;
601  DBVariables.datatypes[Z_SQLMONEY4] := DBLIBSQLMONEY4;
602  DBVariables.datatypes[Z_SQLDATETIM4] := DBLIBSQLDATETIM4;
603  DBVariables.datatypes[Z_SQLDECIMAL] := DBLIBSQLDECIMAL;
604  DBVariables.datatypes[Z_SQLNUMERIC] := DBLIBSQLNUMERIC;
605 end;
606 
607 procedure TZDBLibAbstractPlainDriver.CheckError(dbProc: Pointer);
608 var
609  I: Integer;
610  S: String;
611  lErrorEntry: PDBLibError;
612  lMesageEntry: PDBLibMessage;
613 
614  procedure AddToErrorMsg(const AError: String);
615  begin
616  if S > '' then
617  S := S + #13#10;
618  S := S + AError;
619  end;
620 
621 begin
622  if ((SQLErrors = nil) or (SQLErrors.Count = 0)) and
623  ((SQLMessages = nil) or (SQLMessages.Count = 0)) then
624  Exit;
625  S := '';
626  I := 0;
627  while I < SQLErrors.Count do begin
628  lErrorEntry := PDBLibError(SQLErrors[I]);
629  if (dbProc = nil) or (lErrorEntry^.dbProc = dbProc) or (lErrorEntry^.dbProc = nil) then begin
630  if lErrorEntry^.Severity > EXINFO then
631  AddToErrorMsg(Format('DBError : [%4.4d] : %s', [lErrorEntry^.DbErr, String(lErrorEntry^.DbErrStr)]) );
632  if lErrorEntry^.OsErr > EXINFO then
633  AddToErrorMsg(Format('OSError : [%4.4d] : %s', [lErrorEntry^.OsErr, String(lErrorEntry^.OsErrStr)]) );
634  Dispose(lErrorEntry);
635  SQLErrors.Delete(I);
636  end
637  else
638  Inc(I);
639  end;
640  I := 0;
641  while I < SQLMessages.Count do begin
642  lMesageEntry := PDBLibMessage(SQLMessages[I]);
643  if (dbProc = nil) or (lMesageEntry^.dbProc = dbProc) or (lMesageEntry^.dbProc = nil) then begin
644  if lMesageEntry^.Severity > EXINFO then
645  AddToErrorMsg(String(lMesageEntry^.MsgText));
646  Dispose(lMesageEntry);
647  SQLMessages.Delete(I);
648  end
649  else
650  Inc(I);
651  end;
652  if S <> '' then
653  raise Exception.Create(String(S));
654 end;
655 
656 function TZDBLibAbstractPlainDriver.GetVariables: TDBVariables;
657 begin
658  Result := DBVariables;
659 end;
660 
661 { TZDBLibBasePlainDriver }
662 
663 procedure TZDBLibBasePlainDriver.LoadApi;
664 begin
665  inherited LoadAPI;
666  with Loader do
667  begin
668  @DBLibAPI.dberrhandle := GetAddress('dberrhandle');
669  @DBLibAPI.dbmsghandle := GetAddress('dbmsghandle');
670  @DBLibAPI.dbprocerrhandle := GetAddress('dbprocerrhandle');
671  @DBLibAPI.dbprocmsghandle := GetAddress('dbprocmsghandle');
672  @DBLibAPI.abort_xact := GetAddress('abort_xact');
673  @DBLibAPI.build_xact_string := GetAddress('build_xact_string');
674  @DBLibAPI.close_commit := GetAddress('close_commit');
675  @DBLibAPI.commit_xact := GetAddress('commit_xact');
676  @DBLibAPI.open_commit := GetAddress('open_commit');
677  @DBLibAPI.remove_xact := GetAddress('remove_xact');
678  @DBLibAPI.scan_xact := GetAddress('scan_xact');
679  @DBLibAPI.start_xact := GetAddress('start_xact');
680  @DBLibAPI.stat_xact := GetAddress('stat_xact');
681  @DBLibAPI.bcp_batch := GetAddress('bcp_batch');
682  @DBLibAPI.bcp_bind := GetAddress('bcp_bind');
683  @DBLibAPI.bcp_colfmt := GetAddress('bcp_colfmt');
684  @DBLibAPI.bcp_collen := GetAddress('bcp_collen');
685  @DBLibAPI.bcp_colptr := GetAddress('bcp_colptr');
686  @DBLibAPI.bcp_columns := GetAddress('bcp_columns');
687  @DBLibAPI.bcp_control := GetAddress('bcp_control');
688  @DBLibAPI.bcp_done := GetAddress('bcp_done');
689  @DBLibAPI.bcp_exec := GetAddress('bcp_exec');
690  @DBLibAPI.bcp_init := GetAddress('bcp_init');
691  @DBLibAPI.bcp_moretext := GetAddress('bcp_moretext');
692  @DBLibAPI.bcp_readfmt := GetAddress('bcp_readfmt');
693  @DBLibAPI.bcp_sendrow := GetAddress('bcp_sendrow');
694  @DBLibAPI.bcp_setl := GetAddress('bcp_setl');
695  @DBLibAPI.bcp_writefmt := GetAddress('bcp_writefmt');
696  @DBLibAPI.dbadata := GetAddress('dbadata');
697  @DBLibAPI.dbadlen := GetAddress('dbadlen');
698  @DBLibAPI.dbaltbind := GetAddress('dbaltbind');
699  @DBLibAPI.dbaltcolid := GetAddress('dbaltcolid');
700  @DBLibAPI.dbaltlen := GetAddress('dbaltlen');
701  @DBLibAPI.dbaltop := GetAddress('dbaltop');
702  @DBLibAPI.dbalttype := GetAddress('dbalttype');
703  @DBLibAPI.dbaltutype := GetAddress('dbaltutype');
704  @DBLibAPI.dbanullbind := GetAddress('dbanullbind');
705  @DBLibAPI.dbbind := GetAddress('dbbind');
706  @DBLibAPI.dbbylist := GetAddress('dbbylist');
707  @DBLibAPI.dbcancel := GetAddress('dbcancel');
708  @DBLibAPI.dbcanquery := GetAddress('dbcanquery');
709  @DBLibAPI.dbchange := GetAddress('dbchange');
710  @DBLibAPI.dbclrbuf := GetAddress('dbclrbuf');
711  @DBLibAPI.dbclropt := GetAddress('dbclropt');
712  @DBLibAPI.dbcmd := GetAddress('dbcmd');
713  @DBLibAPI.dbcmdrow := GetAddress('dbcmdrow');
714  @DBLibAPI.dbcollen := GetAddress('dbcollen');
715  @DBLibAPI.dbcolname := GetAddress('dbcolname');
716  @DBLibAPI.dbcolsource := GetAddress('dbcolsource');
717  @DBLibAPI.dbcoltype := GetAddress('dbcoltype');
718  @DBLibAPI.dbcolutype := GetAddress('dbcolutype');
719  @DBLibAPI.dbconvert := GetAddress('dbconvert');
720  @DBLibAPI.dbcurcmd := GetAddress('dbcurcmd');
721  @DBLibAPI.dbcurrow := GetAddress('dbcurrow');
722  @DBLibAPI.dbcursor := GetAddress('dbcursor');
723  @DBLibAPI.dbdata := GetAddress('dbdata');
724  @DBLibAPI.dbexit := GetAddress('dbexit');
725  @DBLibAPI.dbfcmd := GetAddress('dbfcmd');
726  @DBLibAPI.dbfirstrow := GetAddress('dbfirstrow');
727  @DBLibAPI.dbfreebuf := GetAddress('dbfreebuf');
728  @DBLibAPI.dbfreequal := GetAddress('dbfreequal');
729  @DBLibAPI.dbgetchar := GetAddress('dbgetchar');
730  @DBLibAPI.dbgetoff := GetAddress('dbgetoff');
731  @DBLibAPI.dbgetrow := GetAddress('dbgetrow');
732  @DBLibAPI.dbgettime := GetAddress('dbgettime');
733  @DBLibAPI.dbiscount := GetAddress('dbiscount');
734  @DBLibAPI.dblastrow := GetAddress('dblastrow');
735  @DBLibAPI.dblogin := GetAddress('dblogin');
736  @DBLibAPI.dbmorecmds := GetAddress('dbmorecmds');
737  @DBLibAPI.dbmoretext := GetAddress('dbmoretext');
738  @DBLibAPI.dbname := GetAddress('dbname');
739  @DBLibAPI.dbnextrow := GetAddress('dbnextrow');
740  @DBLibAPI.dbnullbind := GetAddress('dbnullbind');
741  @DBLibAPI.dbnumalts := GetAddress('dbnumalts');
742  @DBLibAPI.dbnumcols := GetAddress('dbnumcols');
743  @DBLibAPI.dbnumcompute := GetAddress('dbnumcompute');
744  @DBLibAPI.dbnumorders := GetAddress('dbnumorders');
745  @DBLibAPI.dbnumrets := GetAddress('dbnumrets');
746  @DBLibAPI.dbopen := GetAddress('dbopen');
747  @DBLibAPI.dbordercol := GetAddress('dbordercol');
748  @DBLibAPI.dbprhead := GetAddress('dbprhead');
749  @DBLibAPI.dbprrow := GetAddress('dbprrow');
750  @DBLibAPI.dbprtype := GetAddress('dbprtype');
751  @DBLibAPI.dbqual := GetAddress('dbqual');
752  @DBLibAPI.dbreadtext := GetAddress('dbreadtext');
753  @DBLibAPI.dbresults := GetAddress('dbresults');
754  @DBLibAPI.dbretdata := GetAddress('dbretdata');
755  @DBLibAPI.dbretlen := GetAddress('dbretlen');
756  @DBLibAPI.dbretname := GetAddress('dbretname');
757  @DBLibAPI.dbretstatus := GetAddress('dbretstatus');
758  @DBLibAPI.dbrettype := GetAddress('dbrettype');
759  @DBLibAPI.dbrows := GetAddress('dbrows');
760  @DBLibAPI.dbrowtype := GetAddress('dbrowtype');
761  @DBLibAPI.dbrpcinit := GetAddress('dbrpcinit');
762  @DBLibAPI.dbrpcparam := GetAddress('dbrpcparam');
763  @DBLibAPI.dbrpcsend := GetAddress('dbrpcsend');
764  @DBLibAPI.dbrpwclr := GetAddress('dbrpwclr');
765  @DBLibAPI.dbsetavail := GetAddress('dbsetavail');
766  @DBLibAPI.dbsetlname := GetAddress('dbsetlname');
767  @DBLibAPI.dbsetlogintime := GetAddress('dbsetlogintime');
768  @DBLibAPI.dbsetnull := GetAddress('dbsetnull');
769  @DBLibAPI.dbsettime := GetAddress('dbsettime');
770  @DBLibAPI.dbsetuserdata := GetAddress('dbsetuserdata');
771  @DBLibAPI.dbsqlexec := GetAddress('dbsqlexec');
772  @DBLibAPI.dbsqlok := GetAddress('dbsqlok');
773  @DBLibAPI.dbsqlsend := GetAddress('dbsqlsend');
774  @DBLibAPI.dbstrcpy := GetAddress('dbstrcpy');
775  @DBLibAPI.dbstrlen := GetAddress('dbstrlen');
776  @DBLibAPI.dbtabcount := GetAddress('dbtabcount');
777  @DBLibAPI.dbtabname := GetAddress('dbtabname');
778  @DBLibAPI.dbtabsource := GetAddress('dbtabsource');
779  @DBLibAPI.dbtsnewlen := GetAddress('dbtsnewlen');
780  @DBLibAPI.dbtsnewval := GetAddress('dbtsnewval');
781  @DBLibAPI.dbtsput := GetAddress('dbtsput');
782  @DBLibAPI.dbtxptr := GetAddress('dbtxptr');
783  @DBLibAPI.dbtxtimestamp := GetAddress('dbtxtimestamp');
784  @DBLibAPI.dbtxtsnewval := GetAddress('dbtxtsnewval');
785  @DBLibAPI.dbtxtsput := GetAddress('dbtxtsput');
786  @DBLibAPI.dbuse := GetAddress('dbuse');
787  @DBLibAPI.dbwritetext := GetAddress('dbwritetext');
788  end;
789 end;
790 
791 function TZDBLibBasePlainDriver.dbLogin: PLOGINREC;
792 begin
793  Result := DBLibAPI.dblogin;
794 end;
795 
796 function TZDBLibBasePlainDriver.dbSetLoginTime(Seconds: DBINT): RETCODE;
797 begin
798  Result := DBLibAPI.dbsetlogintime(Seconds);
799 end;
800 
801 function TZDBLibBasePlainDriver.dbsetlname(Login: PLOGINREC; Value: PAnsiChar; Item: DBINT): RETCODE;
802 begin
803  Result := DBLibAPI.dbsetlname(Login, Value, Item);
804 end;
805 
806 function TZDBLibBasePlainDriver.dbSetLHost(Login: PLOGINREC; HostName: PAnsiChar): RETCODE;
807 begin
808  Result := DBLibAPI.dbsetlname(Login, HostName, Self.DBVariables.dbSetLoginRec[Z_SETHOST]);
809 end;
810 
811 function TZDBLibBasePlainDriver.dbsetluser(Login: PLOGINREC; UserName: PAnsiChar): RETCODE;
812 begin
813  Result := DBLibAPI.dbsetlname(Login, UserName, Self.DBVariables.dbSetLoginRec[Z_SETUSER]);
814 end;
815 
816 function TZDBLibBasePlainDriver.dbsetlpwd(Login: PLOGINREC; Password: PAnsiChar): RETCODE;
817 begin
818  Result := DBLibAPI.dbsetlname(Login, Password, Self.DBVariables.dbSetLoginRec[Z_SETPWD]);
819 end;
820 
821 function TZDBLibBasePlainDriver.dbSetLApp(Login: PLOGINREC; AppName: PAnsiChar): RETCODE;
822 begin
823  Result := DBLibAPI.dbsetlname(Login, AppName, Self.DBVariables.dbSetLoginRec[Z_SETAPP]);
824 end;
825 
826 function TZDBLibBasePlainDriver.dbSetLNatLang(Login: PLOGINREC; NatLangName: PAnsiChar): RETCODE;
827 begin
828  Result := DBLibAPI.dbsetlname(Login, NatLangName, Self.DBVariables.dbSetLoginRec[Z_SETLANG]);
829 end;
830 
831 function TZDBLibBasePlainDriver.dbOpen(Login: PLOGINREC; Host: PAnsiChar): PDBPROCESS;
832 begin
833  DBLibAPI.dbsetlogintime(10);
834  Result := DBLibAPI.dbOpen(Login, Host);
835 end;
836 
837 function TZDBLibBasePlainDriver.dbCancel(dbProc: PDBPROCESS): RETCODE;
838 begin
839  Result := DBLibAPI.dbcancel(dbProc);
840 end;
841 
842 function TZDBLibBasePlainDriver.dbCmd(dbProc: PDBPROCESS; Cmd: PAnsiChar): RETCODE;
843 begin
844  Result := DBLibAPI.dbcmd(dbProc, Cmd);
845 end;
846 
847 function TZDBLibBasePlainDriver.dbSqlExec(dbProc: PDBPROCESS; Async: Boolean=False): RETCODE;
848 begin
849  if Async then
850  Result := dbSqlExecAsync(dbProc)
851  else
852  Result := dbSqlExecSync(dbProc);
853 end;
854 
855 function TZDBLibBasePlainDriver.dbSqlExecSync(dbProc: PDBPROCESS): RETCODE;
856 begin
857  Result := DBLibAPI.dbSqlExec(dbProc);
858 end;
859 
860 function TZDBLibBasePlainDriver.dbSqlExecAsync(dbProc: PDBPROCESS): RETCODE;
861 var
862  lStartTick : Int64;
863 begin
864  Result := DBLibAPI.dbsqlsend(dbProc);
865  if Result = SUCCEED then begin
866  lStartTick := {$IFDEF FPC}GetMsCount{$ELSE}GetTickCount{$ENDIF};
867  repeat
868  //DBApplication.ProcessMessages;
869  until ({$IFDEF FPC}GetMsCount{$ELSE}GetTickCount{$ENDIF} > lStartTick + TIMEOUT_MAXIMUM * 1000) or
870  (dbdataready(dbProc) = TRUE);
871  Result := DBLibAPI.dbsqlok(dbProc);
872  end;
873 end;
874 
875 function TZDBLibBasePlainDriver.dbResults(dbProc: PDBPROCESS): RETCODE;
876 begin
877  Result := DBLibAPI.dbResults(dbProc);
878 end;
879 
880 function TZDBLibBasePlainDriver.dbCanQuery(dbProc: PDBPROCESS): RETCODE;
881 begin
882  Result := DBLibAPI.dbCanQuery(dbProc);
883 end;
884 
885 function TZDBLibBasePlainDriver.dbMoreCmds(dbProc: PDBPROCESS): RETCODE;
886 begin
887  Result := DBLibAPI.dbMoreCmds(dbProc);
888 end;
889 
890 function TZDBLibBasePlainDriver.dbUse(dbProc: PDBPROCESS; dbName: PAnsiChar): RETCODE;
891 begin
892  Result := DBLibAPI.dbUse(dbProc, dbName);
893 end;
894 
895 function TZDBLibBasePlainDriver.dbName(dbProc: PDBPROCESS): PAnsiChar;
896 begin
897  Result := DBLibAPI.dbName(dbProc);
898 end;
899 
900 function TZDBLibBasePlainDriver.dbCmdRow(dbProc: PDBPROCESS): RETCODE;
901 begin
902  Result := DBLibAPI.dbCmdRow(dbProc);
903 end;
904 
905 function TZDBLibBasePlainDriver.dbNumCols(dbProc: PDBPROCESS): Integer;
906 begin
907  Result := DBLibAPI.dbNumCols(dbProc);
908 end;
909 
910 function TZDBLibBasePlainDriver.dbColName(dbProc: PDBPROCESS; Column: Integer): PAnsiChar;
911 begin
912  Result := DBLibAPI.dbColName(dbProc, Column);
913 end;
914 
915 function TZDBLibBasePlainDriver.dbColType(dbProc: PDBPROCESS; Column: Integer): Integer;
916 begin
917  Result := DBLibAPI.dbColType(dbProc, Column);
918 end;
919 
920 function TZDBLibBasePlainDriver.dbColLen(dbProc: PDBPROCESS; Column: Integer): DBInt;
921 begin
922  Result := DBLibAPI.dbColLen(dbProc, Column);
923 end;
924 
925 function TZDBLibBasePlainDriver.dbData(dbProc: PDBPROCESS; Column: Integer): PByte;
926 begin
927  Result := DBLibAPI.dbData(dbProc, Column);
928 end;
929 
930 function TZDBLibBasePlainDriver.dbConvert(dbProc: PDBPROCESS; SrcType: Integer; Src: PByte;
931  SrcLen: DBINT; DestType: Integer; Dest: PByte; DestLen: DBINT): Integer;
932 begin
933  Result := DBLibAPI.dbConvert(dbProc, SrcType, Src, SrcLen, DestType, Dest, DestLen);
934 end;
935 
936 function TZDBLibBasePlainDriver.dbNextRow(dbProc: PDBPROCESS): STATUS;
937 begin
938  Result := DBLibAPI.dbNextRow(dbProc);
939 end;
940 
941 function TZDBLibBasePlainDriver.dbGetRow(dbProc: PDBPROCESS; Row: Integer): STATUS;
942 begin
943  Result := DBLibAPI.dbGetRow(dbProc, Row);
944 end;
945 
946 function TZDBLibBasePlainDriver.dbRpcInit(dbProc: PDBPROCESS; RpcName: PAnsiChar; Options: SmallInt): RETCODE;
947 begin
948  Result := DBLibAPI.dbRpcInit(dbProc, RpcName, Options);
949 end;
950 
951 function TZDBLibBasePlainDriver.dbRpcParam(dbProc: PDBPROCESS; ParamName: PAnsiChar; Status: Byte;
952  Type_: Integer; MaxLen: Integer; DataLen: Integer; Value: Pointer): RETCODE;
953 begin
954  Result := DBLibAPI.dbRpcParam(dbProc, ParamName, Status, Type_, MaxLen, DataLen, Value);
955 end;
956 
957 function TZDBLibBasePlainDriver.dbRpcSend(dbProc: PDBPROCESS): RETCODE;
958 begin
959  Result := DBLibAPI.dbRpcSend(dbProc);
960 end;
961 
962 function TZDBLibBasePlainDriver.dbRpcExec(dbProc: PDBPROCESS): RETCODE;
963 begin
964  Result := DBLibAPI.dbRpcSend(dbProc);
965  if Result = SUCCEED then
966  Result := DBLibAPI.dbSqlOk(dbProc);
967 end;
968 
969 function TZDBLibBasePlainDriver.dbRetStatus(dbProc: PDBPROCESS): Integer;
970 begin
971  Result := DBLibAPI.dbRetStatus(dbProc);
972 end;
973 
974 function TZDBLibBasePlainDriver.dbRetName(dbProc: PDBPROCESS; RetNum: Integer): PAnsiChar;
975 begin
976  Result := DBLibAPI.dbRetName(dbProc, RetNum);
977 end;
978 
979 function TZDBLibBasePlainDriver.dbRetData(dbProc: PDBPROCESS; RetNum: Integer): Pointer;
980 begin
981  if Assigned(DBLibAPI.dbRetData) then
982  Result := DBLibAPI.dbRetData(dbProc, RetNum)
983  else
984  Result := nil;
985 end;
986 
987 function TZDBLibBasePlainDriver.dbRetLen(dbProc: PDBPROCESS; RetNum: Integer): Integer;
988 begin
989  Result := DBLibAPI.dbRetLen(dbProc, RetNum);
990 end;
991 
992 function TZDBLibBasePlainDriver.dbRetType(dbProc: PDBPROCESS; RetNum: Integer): Integer;
993 begin
994  Result := DBLibAPI.dbRetType(dbProc, RetNum);
995 end;
996 
997 function TZDBLibBasePlainDriver.dbrbuf(Proc: PDBPROCESS): DBINT;
998 begin
999  Result := DBINT(dbdataready(Proc));
1000 end;
1001 
1002 
1003 { TZDBLibSybaseASE125PlainDriver }
1004 
1005 procedure TZDBLibSybaseASE125PlainDriver.LoadApi;
1006 begin
1007 { ************** Load adresses of API Functions ************* }
1008  with Loader do
1009  begin
1010  @SybaseAPI.db12hour := GetAddress('db12hour');
1011  @SybaseAPI.dberrhandle := GetAddress('dberrhandle');
1012  @SybaseAPI.dbmsghandle := GetAddress('dbmsghandle');
1013  @SybaseAPI.abort_xact := GetAddress('abort_xact');
1014  @SybaseAPI.build_xact_string := GetAddress('build_xact_string');
1015  @SybaseAPI.close_commit := GetAddress('close_commit');
1016  @SybaseAPI.commit_xact := GetAddress('commit_xact');
1017  @SybaseAPI.open_commit := GetAddress('open_commit');
1018  @SybaseAPI.remove_xact := GetAddress('remove_xact');
1019  @SybaseAPI.scan_xact := GetAddress('scan_xact');
1020  @SybaseAPI.start_xact := GetAddress('start_xact');
1021  @SybaseAPI.stat_xact := GetAddress('stat_xact');
1022  @SybaseAPI.bcp_batch := GetAddress('bcp_batch');
1023  @SybaseAPI.bcp_bind := GetAddress('bcp_bind');
1024  @SybaseAPI.bcp_colfmt := GetAddress('bcp_colfmt');
1025  @SybaseAPI.bcp_collen := GetAddress('bcp_collen');
1026  @SybaseAPI.bcp_colptr := GetAddress('bcp_colptr');
1027  @SybaseAPI.bcp_columns := GetAddress('bcp_columns');
1028  @SybaseAPI.bcp_control := GetAddress('bcp_control');
1029  @SybaseAPI.bcp_done := GetAddress('bcp_done');
1030  @SybaseAPI.bcp_exec := GetAddress('bcp_exec');
1031  @SybaseAPI.bcp_init := GetAddress('bcp_init');
1032  @SybaseAPI.bcp_moretext := GetAddress('bcp_moretext');
1033  @SybaseAPI.bcp_readfmt := GetAddress('bcp_readfmt');
1034  @SybaseAPI.bcp_sendrow := GetAddress('bcp_sendrow');
1035  @SybaseAPI.bcp_writefmt := GetAddress('bcp_writefmt');
1036  @SybaseAPI.dbadata := GetAddress('dbadata');
1037  @SybaseAPI.dbadlen := GetAddress('dbadlen');
1038  @SybaseAPI.dbaltbind := GetAddress('dbaltbind');
1039  @SybaseAPI.dbaltcolid := GetAddress('dbaltcolid');
1040  @SybaseAPI.dbaltlen := GetAddress('dbaltlen');
1041  @SybaseAPI.dbaltop := GetAddress('dbaltop');
1042  @SybaseAPI.dbalttype := GetAddress('dbalttype');
1043  @SybaseAPI.dbaltutype := GetAddress('dbaltutype');
1044  @SybaseAPI.dbanullbind := GetAddress('dbanullbind');
1045  @SybaseAPI.dbbind := GetAddress('dbbind');
1046  @SybaseAPI.dbbylist := GetAddress('dbbylist');
1047  @SybaseAPI.dbcancel := GetAddress('dbcancel');
1048  @SybaseAPI.dbcanquery := GetAddress('dbcanquery');
1049  @SybaseAPI.dbchange := GetAddress('dbchange');
1050  @SybaseAPI.dbclose := GetAddress('dbclose');
1051  @SybaseAPI.dbclrbuf := GetAddress('dbclrbuf');
1052  @SybaseAPI.dbclropt := GetAddress('dbclropt');
1053  @SybaseAPI.dbcmd := GetAddress('dbcmd');
1054  @SybaseAPI.dbcmdrow := GetAddress('dbcmdrow');
1055  @SybaseAPI.dbcolbrowse := GetAddress('dbcolbrowse');
1056  @SybaseAPI.dbcollen := GetAddress('dbcollen');
1057  @SybaseAPI.dbcolname := GetAddress('dbcolname');
1058  @SybaseAPI.dbcolsource := GetAddress('dbcolsource');
1059  // @SybaseAPI.dbcoltypeinfo := GetAddress('dbcoltypeinfo');
1060  @SybaseAPI.dbcoltype := GetAddress('dbcoltype');
1061  @SybaseAPI.dbcolutype := GetAddress('dbcolutype');
1062  @SybaseAPI.dbconvert := GetAddress('dbconvert');
1063  @SybaseAPI.dbcount := GetAddress('dbcount');
1064  @SybaseAPI.dbcurcmd := GetAddress('dbcurcmd');
1065  @SybaseAPI.dbcurrow := GetAddress('dbcurrow');
1066  @SybaseAPI.dbcursor := GetAddress('dbcursor');
1067  @SybaseAPI.dbcursorbind := GetAddress('dbcursorbind');
1068  @SybaseAPI.dbcursorclose := GetAddress('dbcursorclose');
1069  @SybaseAPI.dbcursorcolinfo := GetAddress('dbcursorcolinfo');
1070  @SybaseAPI.dbcursorfetch := GetAddress('dbcursorfetch');
1071  @SybaseAPI.dbcursorinfo := GetAddress('dbcursorinfo');
1072  @SybaseAPI.dbcursoropen := GetAddress('dbcursoropen');
1073  @SybaseAPI.dbdata := GetAddress('dbdata');
1074  @SybaseAPI.dbdatecrack := GetAddress('dbdatecrack');
1075  @SybaseAPI.dbdatlen := GetAddress('dbdatlen');
1076  @SybaseAPI.dbdead := GetAddress('dbdead');
1077  @SybaseAPI.dbexit := GetAddress('dbexit');
1078  @SybaseAPI.dbfcmd := GetAddress('dbfcmd');
1079  @SybaseAPI.dbfirstrow := GetAddress('dbfirstrow');
1080  @SybaseAPI.dbfreebuf := GetAddress('dbfreebuf');
1081  @SybaseAPI.dbloginfree := GetAddress('dbloginfree');
1082  @SybaseAPI.dbfreequal := GetAddress('dbfreequal');
1083  @SybaseAPI.dbgetchar := GetAddress('dbgetchar');
1084  @SybaseAPI.dbgetmaxprocs := GetAddress('dbgetmaxprocs');
1085  @SybaseAPI.dbgetoff := GetAddress('dbgetoff');
1086  @SybaseAPI.dbgetpacket := GetAddress('dbgetpacket');
1087  @SybaseAPI.dbgetrow := GetAddress('dbgetrow');
1088  @SybaseAPI.dbgetuserdata := GetAddress('dbgetuserdata');
1089  @SybaseAPI.dbhasretstat := GetAddress('dbhasretstat');
1090  @SybaseAPI.dbinit := GetAddress('dbinit');
1091  @SybaseAPI.dbisavail := GetAddress('dbisavail');
1092  @SybaseAPI.dbisopt := GetAddress('dbisopt');
1093  @SybaseAPI.dblastrow := GetAddress('dblastrow');
1094  @SybaseAPI.dblogin := GetAddress('dblogin');
1095  @SybaseAPI.dbmorecmds := GetAddress('dbmorecmds');
1096  @SybaseAPI.dbmoretext := GetAddress('dbmoretext');
1097  @SybaseAPI.dbname := GetAddress('dbname');
1098  @SybaseAPI.dbnextrow := GetAddress('dbnextrow');
1099  @SybaseAPI.dbnullbind := GetAddress('dbnullbind');
1100  @SybaseAPI.dbnumalts := GetAddress('dbnumalts');
1101  @SybaseAPI.dbnumcols := GetAddress('dbnumcols');
1102  @SybaseAPI.dbnumcompute := GetAddress('dbnumcompute');
1103  @SybaseAPI.dbnumorders := GetAddress('dbnumorders');
1104  @SybaseAPI.dbnumrets := GetAddress('dbnumrets');
1105  @SybaseAPI.dbopen := GetAddress('dbopen');
1106  @SybaseAPI.dbordercol := GetAddress('dbordercol');
1107  @SybaseAPI.dbprhead := GetAddress('dbprhead');
1108  @SybaseAPI.dbprrow := GetAddress('dbprrow');
1109  @SybaseAPI.dbprtype := GetAddress('dbprtype');
1110  @SybaseAPI.dbqual := GetAddress('dbqual');
1111  @SybaseAPI.dbreadtext := GetAddress('dbreadtext');
1112  @SybaseAPI.dbresults := GetAddress('dbresults');
1113  @SybaseAPI.dbretdata := GetAddress('dbretdata');
1114  @SybaseAPI.dbretlen := GetAddress('dbretlen');
1115  @SybaseAPI.dbretname := GetAddress('dbretname');
1116  @SybaseAPI.dbretstatus := GetAddress('dbretstatus');
1117  @SybaseAPI.dbrettype := GetAddress('dbrettype');
1118  @SybaseAPI.dbrows := GetAddress('dbrows');
1119  @SybaseAPI.dbrowtype := GetAddress('dbrowtype');
1120  @SybaseAPI.dbrpcinit := GetAddress('dbrpcinit');
1121  @SybaseAPI.dbrpcparam := GetAddress('dbrpcparam');
1122  @SybaseAPI.dbrpcsend := GetAddress('dbrpcsend');
1123  @SybaseAPI.dbrpwclr := GetAddress('dbrpwclr');
1124  @SybaseAPI.dbsetavail := GetAddress('dbsetavail');
1125  @SybaseAPI.dbsetmaxprocs := GetAddress('dbsetmaxprocs');
1126  @SybaseAPI.dbsetlname := GetAddress('dbsetlname');
1127  @SybaseAPI.dbsetlogintime := GetAddress('dbsetlogintime');
1128  @SybaseAPI.dbsetnull := GetAddress('dbsetnull');
1129  @SybaseAPI.dbsetopt := GetAddress('dbsetopt');
1130  @SybaseAPI.dbsettime := GetAddress('dbsettime');
1131  @SybaseAPI.dbsetuserdata := GetAddress('dbsetuserdata');
1132  @SybaseAPI.dbsqlexec := GetAddress('dbsqlexec');
1133  @SybaseAPI.dbsqlok := GetAddress('dbsqlok');
1134  @SybaseAPI.dbsqlsend := GetAddress('dbsqlsend');
1135  @SybaseAPI.dbstrcpy := GetAddress('dbstrcpy');
1136  @SybaseAPI.dbstrlen := GetAddress('dbstrlen');
1137  @SybaseAPI.dbtabbrowse := GetAddress('dbtabbrowse');
1138  @SybaseAPI.dbtabcount := GetAddress('dbtabcount');
1139  @SybaseAPI.dbtabname := GetAddress('dbtabname');
1140  @SybaseAPI.dbtabsource := GetAddress('dbtabsource');
1141  @SybaseAPI.dbtsnewlen := GetAddress('dbtsnewlen');
1142  @SybaseAPI.dbtsnewval := GetAddress('dbtsnewval');
1143  @SybaseAPI.dbtsput := GetAddress('dbtsput');
1144  @SybaseAPI.dbtxptr := GetAddress('dbtxptr');
1145  @SybaseAPI.dbtxtimestamp := GetAddress('dbtxtimestamp');
1146  @SybaseAPI.dbtxtsnewval := GetAddress('dbtxtsnewval');
1147  @SybaseAPI.dbtxtsput := GetAddress('dbtxtsput');
1148  @SybaseAPI.dbuse := GetAddress('dbuse');
1149  @SybaseAPI.dbvarylen := GetAddress('dbvarylen');
1150  @SybaseAPI.dbwillconvert := GetAddress('dbwillconvert');
1151  @SybaseAPI.dbwritetext := GetAddress('dbwritetext');
1152 
1153  SybaseAPI.dbinit;
1154 
1155  OldSybaseErrorHandle := SybaseAPI.dberrhandle(SybaseErrorHandle);
1156  OldSybaseMessageHandle := SybaseAPI.dbmsghandle(SybaseMessageHandle);
1157  end;
1158 end;
1159 
1160 function TZDBLibSybaseASE125PlainDriver.Clone: IZPlainDriver;
1161 begin
1162  Result := TZDBLibSybaseASE125PlainDriver.Create;
1163 end;
1164 
1165 constructor TZDBLibSybaseASE125PlainDriver.Create;
1166 begin
1167  inherited Create;
1168  {$IFDEF MSWINDOWS}
1169  Loader.AddLocation(LIBSYBDB_WINDOWS_DLL_LOCATION);
1170  {$ELSE}
1171  {$IFDEF UNIX}
1172  Loader.AddLocation(LIBSYBDB_LINUX_DLL_LOCATION);
1173  {$ENDIF}
1174  {$ENDIF}
1175 
1176  DBVariables.DBoptions[Z_PARSEONLY] := DBLIBDBPARSEONLY;
1177  DBVariables.DBoptions[Z_SHOWPLAN] := DBLIBDBSHOWPLAN;
1178  DBVariables.DBoptions[Z_NOEXEC] := DBLIBDBNOEXEC;
1179  DBVariables.DBoptions[Z_ARITHIGNORE] := DBLIBDBARITHIGNORE;
1180  DBVariables.DBoptions[Z_NOCOUNT] := DBLIBDBNOCOUNT;
1181  DBVariables.DBoptions[Z_ARITHABORT] := DBLIBDBARITHABORT;
1182  DBVariables.DBoptions[Z_TEXTLIMIT] := DBLIBDBTEXTLIMIT;
1183  DBVariables.DBoptions[Z_OFFSET] := DBLIBDBOFFSET;
1184  DBVariables.DBoptions[Z_STAT] := DBLIBDBSTAT;
1185  DBVariables.DBoptions[Z_STORPROCID] := DBLIBDBSTORPROCID;
1186  DBVariables.DBoptions[Z_BUFFER] := DBLIBDBBUFFER;
1187  DBVariables.DBoptions[Z_NOAUTOFREE] := DBLIBDBNOAUTOFREE;
1188  DBVariables.DBoptions[Z_ROWCOUNT] := DBLIBDBROWCOUNT;
1189  DBVariables.DBoptions[Z_TEXTSIZE] := DBLIBDBTEXTSIZE;
1190  DBVariables.DBoptions[Z_CLIENTCURSORS] := DBLIBDBCLIENTCURSORS;
1191  DBVariables.DBoptions[Z_SETTIME] := DBLIBDBSET_TIME;
1192  DBVariables.DBoptions[Z_QUOTEDIDENT] := DBLIBDBQUOTEDIDENT;
1193  DBVariables.DBoptions[Z_ANSITOOEM] := DBLIBDBANSITOOEM;
1194  DBVariables.DBoptions[Z_OEMTOANSI] := DBLIBDBOEMTOANSI;
1195  {MSSQL Loginrec manipulations}
1196  DBVariables.DBSetLoginRec[Z_SETHOST] := SYBDBSETHOST;
1197  DBVariables.DBSetLoginRec[Z_SETUSER] := SYBDBSETUSER;
1198  DBVariables.DBSetLoginRec[Z_SETPWD] := SYBDBSETPWD;
1199  DBVariables.DBSetLoginRec[Z_SETHID] := SYBDBSETHID;
1200  DBVariables.DBSetLoginRec[Z_SETAPP] := SYBDBSETAPP;
1201  DBVariables.DBSetLoginRec[Z_SETBCP] := SYBDBSETBCP;
1202  DBVariables.DBSetLoginRec[Z_SETLANG] := SYBDBSETLANG;
1203  DBVariables.DBSetLoginRec[Z_SETNOSHORT] := SYBDBSETNOSHORT;
1204  DBVariables.DBSetLoginRec[Z_SETHIER] := SYBDBSETHIER;
1205  DBVariables.DBSetLoginRec[Z_SETCHARSET] := SYBDBSETCHARSET;
1206  DBVariables.DBSetLoginRec[Z_SETPACKET] := SYBDBSETPACKET;
1207  DBVariables.DBSetLoginRec[Z_SETENCRYPT] := SYBDBSETENCRYPT;
1208  DBVariables.dbSetLoginRec[Z_SETLABELED] := SYBDBSETLABELED;
1209  LoadCodePages;
1210 end;
1211 
1212 destructor TZDBLibSybaseASE125PlainDriver.Destroy;
1213 begin
1214  if Loader.Loaded then
1215  begin
1216  SybaseAPI.dberrhandle(OldSybaseErrorHandle);
1217  SybaseAPI.dbmsghandle(OldSybaseMessageHandle);
1218  SybaseAPI.dbexit;
1219  end;
1220  inherited Destroy;
1221 end;
1222 
1223 procedure TZDBLibSybaseASE125PlainDriver.LoadCodePages;
1224 begin
1225  AddSybaseCodePages(Self);
1226 end;
1227 
1228 function TZDBLibSybaseASE125PlainDriver.GetProtocol: string;
1229 begin
1230  Result := 'sybase';
1231 end;
1232 
1233 function TZDBLibSybaseASE125PlainDriver.GetDescription: string;
1234 begin
1235  Result := 'Native dblib driver for Sybase ASE 12.5';
1236 end;
1237 
1238 function TZDBLibSybaseASE125PlainDriver.dbcolbrowse(Proc: PDBPROCESS; Column: Integer): LongBool;
1239 begin
1240  Result := SybaseAPI.dbcolbrowse(Proc, Column);
1241 end;
1242 
1243 function TZDBLibSybaseASE125PlainDriver.dbDead(dbProc: PDBPROCESS): Boolean;
1244 begin
1245  Result := SybaseAPI.dbDead(dbProc);
1246 end;
1247 
1248 function TZDBLibSybaseASE125PlainDriver.dbLogin: PLOGINREC;
1249 begin
1250  Result := SybaseAPI.dbLogin;
1251 end;
1252 
1253 procedure TZDBLibSybaseASE125PlainDriver.dbLoginFree(Login: PLOGINREC);
1254 begin
1255  SybaseAPI.dbLoginFree(Login);
1256 end;
1257 
1258 function TZDBLibSybaseASE125PlainDriver.dbSetLoginTime(Seconds: DBINT): RETCODE;
1259 begin
1260  Result := SybaseAPI.dbsetlogintime(Seconds);
1261 end;
1262 
1263 function TZDBLibSybaseASE125PlainDriver.dbsetlname(Login: PLOGINREC; Value: PAnsiChar; Item: DBINT): RETCODE;
1264 begin
1265  Result := SybaseAPI.dbsetlname(Login, Value, Item);
1266 end;
1267 
1268 function TZDBLibSybaseASE125PlainDriver.dbSetLHost(Login: PLOGINREC; HostName: PAnsiChar): RETCODE;
1269 begin
1270  Result := SybaseAPI.dbsetlname(Login, HostName, Self.DBVariables.dbSetLoginRec[Z_SETHOST]);
1271 end;
1272 
1273 function TZDBLibSybaseASE125PlainDriver.dbsetluser(Login: PLOGINREC; UserName: PAnsiChar): RETCODE;
1274 begin
1275  Result := SybaseAPI.dbsetlname(Login, UserName, Self.DBVariables.dbSetLoginRec[Z_SETUSER]);
1276 end;
1277 
1278 function TZDBLibSybaseASE125PlainDriver.dbsetlpwd(Login: PLOGINREC; Password: PAnsiChar): RETCODE;
1279 begin
1280  Result := SybaseAPI.dbsetlname(Login, Password, Self.DBVariables.dbSetLoginRec[Z_SETPWD]);
1281 end;
1282 
1283 function TZDBLibSybaseASE125PlainDriver.dbSetLApp(Login: PLOGINREC; AppName: PAnsiChar): RETCODE;
1284 begin
1285  Result := SybaseAPI.dbsetlname(Login, AppName, Self.DBVariables.dbSetLoginRec[Z_SETAPP]);
1286 end;
1287 
1288 function TZDBLibSybaseASE125PlainDriver.dbSetLNatLang(Login: PLOGINREC; NatLangName: PAnsiChar): RETCODE;
1289 begin
1290  Result := SybaseAPI.dbsetlname(Login, NatLangName, Self.DBVariables.dbSetLoginRec[Z_SETLANG]);
1291 end;
1292 
1293 function TZDBLibSybaseASE125PlainDriver.dbSetLCharSet(Login: PLOGINREC; CharsetName: PAnsiChar): RETCODE;
1294 begin
1295  Result := SybaseAPI.dbsetlname(Login, CharsetName, Self.DBVariables.dbSetLoginRec[Z_SETCHARSET]);
1296 end;
1297 
1298 function TZDBLibSybaseASE125PlainDriver.dbSetLSecure(Login: PLOGINREC): RETCODE;
1299 begin
1300  Result := 0
1301 end;
1302 
1303 function TZDBLibSybaseASE125PlainDriver.dbsetmaxprocs(
1304  MaxProcs: SmallInt): RETCODE;
1305 begin
1306  Result := SybaseAPI.dbsetmaxprocs(MaxProcs);
1307 end;
1308 
1309 function TZDBLibSybaseASE125PlainDriver.dbOpen(Login: PLOGINREC; Host: PAnsiChar): PDBPROCESS;
1310 begin
1311  Result := SybaseAPI.dbOpen(Login, Host);
1312 end;
1313 
1314 function TZDBLibSybaseASE125PlainDriver.dbCancel(dbProc: PDBPROCESS): RETCODE;
1315 begin
1316  Result := SybaseAPI.dbcancel(dbProc);
1317 end;
1318 
1319 function TZDBLibSybaseASE125PlainDriver.dbCmd(dbProc: PDBPROCESS; Cmd: PAnsiChar): RETCODE;
1320 begin
1321  Result := SybaseAPI.dbcmd(dbProc, Cmd);
1322 end;
1323 
1324 function TZDBLibSybaseASE125PlainDriver.dbSqlExec(dbProc: PDBPROCESS; Async: Boolean=False): RETCODE;
1325 begin
1326  if Async then
1327  Result := dbSqlExecSync(dbProc)
1328  else
1329  Result := dbSqlExecAsync(dbProc);
1330 end;
1331 
1332 function TZDBLibSybaseASE125PlainDriver.dbSqlExecSync(dbProc: PDBPROCESS): RETCODE;
1333 begin
1334  Result := SybaseAPI.dbSqlExec(dbProc);
1335 end;
1336 
1337 function TZDBLibSybaseASE125PlainDriver.dbSqlExecAsync(dbProc: PDBPROCESS): RETCODE;
1338 var
1339  lStartTick : Int64;
1340 begin
1341  Result := SybaseAPI.dbsqlsend(dbProc);
1342  if Result = SUCCEED then begin
1343  lStartTick := {$IFDEF FPC}GetMsCount{$ELSE}GetTickCount{$ENDIF};
1344  repeat
1345  continue;
1346  until ({$IFDEF FPC}GetMsCount{$ELSE}GetTickCount{$ENDIF} > lStartTick + TIMEOUT_MAXIMUM * 1000) or
1347  (dbdataready(dbProc) = TRUE);
1348  Result := SybaseAPI.dbsqlok(dbProc);
1349  end;
1350 end;
1351 
1352 function TZDBLibSybaseASE125PlainDriver.dbResults(dbProc: PDBPROCESS): RETCODE;
1353 begin
1354  Result := SybaseAPI.dbResults(dbProc);
1355 end;
1356 
1357 function TZDBLibSybaseASE125PlainDriver.dbCanQuery(dbProc: PDBPROCESS): RETCODE;
1358 begin
1359  Result := SybaseAPI.dbCanQuery(dbProc);
1360 end;
1361 
1362 function TZDBLibSybaseASE125PlainDriver.dbMoreCmds(dbProc: PDBPROCESS): RETCODE;
1363 begin
1364  Result := SybaseAPI.dbMoreCmds(dbProc);
1365 end;
1366 
1367 function TZDBLibSybaseASE125PlainDriver.dbUse(dbProc: PDBPROCESS; dbName: PAnsiChar): RETCODE;
1368 begin
1369  Result := SybaseAPI.dbUse(dbProc, dbName);
1370 end;
1371 
1372 function TZDBLibSybaseASE125PlainDriver.dbSetOpt(dbProc: PDBPROCESS; Option: DBINT; Char_Param: PAnsiChar = nil; Int_Param: DBINT = -1): RETCODE;
1373 begin
1374  Result := SybaseAPI.dbSetOpt(dbProc, Option, Char_Param, Int_Param);
1375 end;
1376 
1377 function TZDBLibSybaseASE125PlainDriver.dbClose(dbProc: PDBPROCESS): RETCODE;
1378 begin
1379  Result := SybaseAPI.dbClose(dbProc);
1380 end;
1381 
1382 function TZDBLibSybaseASE125PlainDriver.dbName(dbProc: PDBPROCESS): PAnsiChar;
1383 begin
1384  Result := SybaseAPI.dbName(dbProc);
1385 end;
1386 
1387 function TZDBLibSybaseASE125PlainDriver.dbCmdRow(dbProc: PDBPROCESS): RETCODE;
1388 begin
1389  Result := SybaseAPI.dbCmdRow(dbProc);
1390 end;
1391 
1392 function TZDBLibSybaseASE125PlainDriver.dbNumCols(dbProc: PDBPROCESS): DBINT;
1393 begin
1394  Result := SybaseAPI.dbNumCols(dbProc);
1395 end;
1396 
1397 function TZDBLibSybaseASE125PlainDriver.dbColName(dbProc: PDBPROCESS; Column: DBINT): PAnsiChar;
1398 begin
1399  Result := SybaseAPI.dbColName(dbProc, Column);
1400 end;
1401 
1402 function TZDBLibSybaseASE125PlainDriver.dbColType(dbProc: PDBPROCESS; Column: DBINT): DBINT;
1403 begin
1404  Result := SybaseAPI.dbColType(dbProc, Column);
1405 end;
1406 
1407 function TZDBLibSybaseASE125PlainDriver.dbColLen(dbProc: PDBPROCESS; Column: DBINT): DBInt;
1408 begin
1409  Result := SybaseAPI.dbColLen(dbProc, Column);
1410 end;
1411 
1412 function TZDBLibSybaseASE125PlainDriver.dbData(dbProc: PDBPROCESS; Column: DBINT): PByte;
1413 begin
1414  Result := SybaseAPI.dbData(dbProc, Column);
1415 end;
1416 
1417 function TZDBLibSybaseASE125PlainDriver.dbDatLen(dbProc: PDBPROCESS; Column: DBINT): DBINT;
1418 begin
1419  Result := SybaseAPI.dbDatLen(dbProc, Column);
1420 end;
1421 
1422 function TZDBLibSybaseASE125PlainDriver.dbConvert(dbProc: PDBPROCESS; SrcType: DBINT; Src: PByte;
1423  SrcLen: DBINT; DestType: DBINT; Dest: PByte; DestLen: DBINT): DBINT;
1424 begin
1425  Result := SybaseAPI.dbConvert(dbProc, SrcType, Src, SrcLen, DestType, Dest, DestLen);
1426 end;
1427 
1428 function TZDBLibSybaseASE125PlainDriver.dbNextRow(dbProc: PDBPROCESS): STATUS;
1429 begin
1430  Result := SybaseAPI.dbNextRow(dbProc);
1431 end;
1432 
1433 function TZDBLibSybaseASE125PlainDriver.dbGetRow(dbProc: PDBPROCESS; Row: DBINT): STATUS;
1434 begin
1435  Result := SybaseAPI.dbGetRow(dbProc, Row);
1436 end;
1437 
1438 function TZDBLibSybaseASE125PlainDriver.dbCount(dbProc: PDBPROCESS): DBINT;
1439 begin
1440  Result := SybaseAPI.dbCount(dbProc);
1441 end;
1442 
1443 function TZDBLibSybaseASE125PlainDriver.dbRpcInit(dbProc: PDBPROCESS; RpcName: PAnsiChar; Options: SmallInt): RETCODE;
1444 begin
1445  Result := SybaseAPI.dbRpcInit(dbProc, RpcName, Options);
1446 end;
1447 
1448 function TZDBLibSybaseASE125PlainDriver.dbRpcParam(dbProc: PDBPROCESS; ParamName: PAnsiChar; Status: Byte;
1449  Type_: DBINT; MaxLen: DBINT; DataLen: DBINT; Value: Pointer): RETCODE;
1450 begin
1451  Result := SybaseAPI.dbRpcParam(dbProc, ParamName, Status, Type_, MaxLen, DataLen, Value);
1452 end;
1453 
1454 function TZDBLibSybaseASE125PlainDriver.dbRpcSend(dbProc: PDBPROCESS): RETCODE;
1455 begin
1456  Result := SybaseAPI.dbRpcSend(dbProc);
1457 end;
1458 
1459 function TZDBLibSybaseASE125PlainDriver.dbRpcExec(dbProc: PDBPROCESS): RETCODE;
1460 begin
1461  Result := SybaseAPI.dbRpcSend(dbProc);
1462  if Result = SUCCEED then
1463  Result := SybaseAPI.dbSqlOk(dbProc);
1464 end;
1465 
1466 function TZDBLibSybaseASE125PlainDriver.dbRetStatus(dbProc: PDBPROCESS): DBINT;
1467 begin
1468  Result := SybaseAPI.dbRetStatus(dbProc);
1469 end;
1470 
1471 function TZDBLibSybaseASE125PlainDriver.dbHasRetStat(dbProc: PDBPROCESS): Boolean;
1472 begin
1473  Result := SybaseAPI.dbHasRetStat(dbProc);
1474 end;
1475 
1476 function TZDBLibSybaseASE125PlainDriver.dbRetName(dbProc: PDBPROCESS; RetNum: DBINT): PAnsiChar;
1477 begin
1478  Result := SybaseAPI.dbRetName(dbProc, RetNum);
1479 end;
1480 
1481 function TZDBLibSybaseASE125PlainDriver.dbRetData(dbProc: PDBPROCESS; RetNum: DBINT): Pointer;
1482 begin
1483  Result := SybaseAPI.dbRetData(dbProc, RetNum);
1484 end;
1485 
1486 function TZDBLibSybaseASE125PlainDriver.dbRetLen(dbProc: PDBPROCESS; RetNum: DBINT): DBINT;
1487 begin
1488  Result := SybaseAPI.dbRetLen(dbProc, RetNum);
1489 end;
1490 
1491 function TZDBLibSybaseASE125PlainDriver.dbRetType(dbProc: PDBPROCESS; RetNum: DBINT): DBINT;
1492 begin
1493  Result := SybaseAPI.dbRetType(dbProc, RetNum);
1494 end;
1495 
1496 function TZDBLibSybaseASE125PlainDriver.dbrbuf(Proc: PDBPROCESS): DBINT;
1497 begin
1498  Result := 0;
1499 end;
1500 
1501 function TZDBLibSybaseASE125PlainDriver.dbdataready(Proc: PDBPROCESS): LongBool;
1502 begin
1503  Result := Proc <> nil;
1504 end;
1505 
1506 {TZDBLibMSSQL7PlainDriver}
1507 
1508 procedure TZDBLibMSSQL7PlainDriver.LoadApi;
1509 begin
1510  inherited LoadAPI;
1511 { ************** Load adresses of API Functions ************* }
1512  with Loader do
1513  begin
1514  //@MsSQLAPI.dbtablecolinfo := GetAddress('dbtablecolinfo');
1515  @MsSQLAPI.dbdataready := GetAddress('dbdataready');
1516  @MsSQLAPI.dbdatecrack := GetAddress('dbdatecrack');
1517  @MsSQLAPI.dbdatlen := GetAddress('dbdatlen');
1518  @MsSQLAPI.dbdead := GetAddress('dbdead');
1519  @MsSQLAPI.dbclose := GetAddress('dbclose');
1520  @MsSQLAPI.dbcolbrowse := GetAddress('dbcolbrowse');
1521  @MsSQLAPI.dbcolinfo := GetAddress('dbcolinfo');
1522  @MsSQLAPI.dbcount := GetAddress('dbcount');
1523  @MsSQLAPI.dbcursorbind := GetAddress('dbcursorbind');
1524  @MsSQLAPI.dbcursorclose := GetAddress('dbcursorclose');
1525  @MsSQLAPI.dbcursorcolinfo := GetAddress('dbcursorcolinfo');
1526  @MsSQLAPI.dbcursorfetch := GetAddress('dbcursorfetch');
1527  @MsSQLAPI.dbcursorfetchex := GetAddress('dbcursorfetchex');
1528  @MsSQLAPI.dbcursorinfo := GetAddress('dbcursorinfo');
1529  @MsSQLAPI.dbcursorinfoex := GetAddress('dbcursorinfoex');
1530  @MsSQLAPI.dbcursoropen := GetAddress('dbcursoropen');
1531  @MsSQLAPI.dbWinexit := GetAddress('dbwinexit');
1532  @MsSQLAPI.dbenlisttrans := GetAddress('dbenlisttrans');
1533  @MsSQLAPI.dbenlistxatrans := GetAddress('dbenlistxatrans');
1534  @MsSQLAPI.dbfreelogin := GetAddress('dbfreelogin');
1535  @MsSQLAPI.dbgetmaxprocs := GetAddress('dbgetmaxprocs');
1536  @MsSQLAPI.dbgetpacket := GetAddress('dbgetpacket');
1537  @MsSQLAPI.dbgetuserdata := GetAddress('dbgetuserdata');
1538  @MsSQLAPI.dbhasretstat := GetAddress('dbhasretstat');
1539  @MsSQLAPI.dbinit := GetAddress('dbinit');
1540  @MsSQLAPI.dbisavail := GetAddress('dbisavail');
1541  @MsSQLAPI.dbisopt := GetAddress('dbisopt');
1542  @MsSQLAPI.dbprocinfo := GetAddress('dbprocinfo');
1543  @MsSQLAPI.dbrpcexec := GetAddress('dbrpcexec');
1544  @MsSQLAPI.dbserverenum := GetAddress('dbserverenum');
1545  @MsSQLAPI.dbsetmaxprocs := GetAddress('dbsetmaxprocs');
1546  @MsSQLAPI.dbsetlpacket := GetAddress('dbsetlpacket');
1547  @MsSQLAPI.dbsetopt := GetAddress('dbsetopt');
1548  @MsSQLAPI.dbtabbrowse := GetAddress('dbtabbrowse');
1549  @MsSQLAPI.dbvarylen := GetAddress('dbvarylen');
1550  @MsSQLAPI.dbwillconvert := GetAddress('dbwillconvert');
1551  @MsSQLAPI.dbupdatetext := GetAddress('dbupdatetext');
1552  MsSQLAPI.dbinit;
1553  end;
1554  OldMsSQLErrorHandle := DBLibAPI.dberrhandle(DbLibErrorHandle);
1555  OldMsSQLMessageHandle := DBLibAPI.dbmsghandle(DbLibMessageHandle);
1556 end;
1557 
1558 function TZDBLibMSSQL7PlainDriver.Clone: IZPlainDriver;
1559 begin
1560  Result := TZDBLibMSSQL7PlainDriver.Create;
1561 end;
1562 
1563 constructor TZDBLibMSSQL7PlainDriver.Create;
1564 begin
1565  inherited Create;
1566  Loader.AddLocation(NTWDBLIB_DLL_LOCATION);
1567 
1568  DBVariables.DBoptions[Z_PARSEONLY] := DBLIBDBPARSEONLY;
1569  DBVariables.DBoptions[Z_SHOWPLAN] := DBLIBDBSHOWPLAN;
1570  DBVariables.DBoptions[Z_NOEXEC] := DBLIBDBNOEXEC;
1571  DBVariables.DBoptions[Z_ARITHIGNORE] := DBLIBDBARITHIGNORE;
1572  DBVariables.DBoptions[Z_NOCOUNT] := DBLIBDBNOCOUNT;
1573  DBVariables.DBoptions[Z_ARITHABORT] := DBLIBDBARITHABORT;
1574  DBVariables.DBoptions[Z_TEXTLIMIT] := DBLIBDBTEXTLIMIT;
1575  DBVariables.DBoptions[Z_OFFSET] := DBLIBDBOFFSET;
1576  DBVariables.DBoptions[Z_STAT] := DBLIBDBSTAT;
1577  DBVariables.DBoptions[Z_STORPROCID] := DBLIBDBSTORPROCID;
1578  DBVariables.DBoptions[Z_BUFFER] := DBLIBDBBUFFER;
1579  DBVariables.DBoptions[Z_NOAUTOFREE] := DBLIBDBNOAUTOFREE;
1580  DBVariables.DBoptions[Z_ROWCOUNT] := DBLIBDBROWCOUNT;
1581  DBVariables.DBoptions[Z_TEXTSIZE] := DBLIBDBTEXTSIZE;
1582  DBVariables.DBoptions[Z_CLIENTCURSORS] := DBLIBDBCLIENTCURSORS;
1583  DBVariables.DBoptions[Z_SETTIME] := DBLIBDBSET_TIME;
1584  DBVariables.DBoptions[Z_QUOTEDIDENT] := DBLIBDBQUOTEDIDENT;
1585  DBVariables.DBoptions[Z_ANSITOOEM] := DBLIBDBANSITOOEM;
1586  DBVariables.DBoptions[Z_OEMTOANSI] := DBLIBDBOEMTOANSI;
1587  {MsSQL Loginrec manipulations}
1588  DBVariables.DBSetLoginRec[Z_SETHOST] := MSDBSETHOST;
1589  DBVariables.DBSetLoginRec[Z_SETUSER] := MSDBSETUSER;
1590  DBVariables.DBSetLoginRec[Z_SETPWD] := MSDBSETPWD;
1591  DBVariables.DBSetLoginRec[Z_SETHID] := MSDBSETID;
1592  DBVariables.DBSetLoginRec[Z_SETAPP] := MSDBSETAPP;
1593  DBVariables.DBSetLoginRec[Z_SETSECURE] := MSDBSETSECURE;
1594  DBVariables.DBSetLoginRec[Z_SETLANG] := MSDBSETLANG;
1595  DBVariables.DBSetLoginRec[Z_SETLOGINTIME]:= MSDBSET_LOGIN_TIME;
1596  DBVariables.DBSetLoginRec[Z_SETFALLBACK]:= MSDBSETFALLBACK;
1597  LoadCodePages;
1598 end;
1599 
1600 destructor TZDBLibMSSQL7PlainDriver.Destroy;
1601 begin
1602  if Loader.Loaded then
1603  begin
1604  DbLibAPI.dberrhandle(DbLibErrorHandle);
1605  DbLibAPI.dbmsghandle(DbLibMessageHandle);
1606  MsSQLAPI.dbWinexit;
1607  DbLibAPI.dbExit;
1608  end;
1609  inherited Destroy;
1610 end;
1611 
1612 procedure TZDBLibMSSQL7PlainDriver.LoadCodePages;
1613 begin
1614  AddmMSCodePages(Self);
1615 end;
1616 
1617 function TZDBLibMSSQL7PlainDriver.GetProtocol: string;
1618 begin
1619  Result := 'mssql';
1620 end;
1621 
1622 function TZDBLibMSSQL7PlainDriver.GetDescription: string;
1623 begin
1624  Result := 'Native dblib driver for MS SQL 7+';
1625 end;
1626 
1627 function TZDBLibMSSQL7PlainDriver.dbsetlsecure(Login: PLOGINREC): RETCODE;
1628 begin
1629  Result := DBLibAPI.dbsetlname(Login, nil, Self.DBVariables.dbSetLoginRec[Z_SETSECURE]);
1630 end;
1631 
1632 function TZDBLibMSSQL7PlainDriver.dbcolbrowse(Proc: PDBPROCESS; Column: Integer): LongBool;
1633 begin
1634  Result := MsSQLAPI.dbcolbrowse(Proc, Column);
1635 end;
1636 
1637 function TZDBLibMSSQL7PlainDriver.dbDead(dbProc: PDBPROCESS): Boolean;
1638 begin
1639  Result := MsSQLAPI.dbDead(dbProc);
1640 end;
1641 
1642 procedure TZDBLibMSSQL7PlainDriver.dbLoginFree(Login: PLOGINREC);
1643 begin
1644  MsSQLAPI.dbfreelogin(Login);
1645 end;
1646 
1647 function TZDBLibMSSQL7PlainDriver.dbSetLCharSet(Login: PLOGINREC; CharsetName: PAnsiChar): RETCODE;
1648 begin
1649  Result := DBFAIL;
1650 end;
1651 
1652 function TZDBLibMSSQL7PlainDriver.dbsetmaxprocs(
1653  MaxProcs: SmallInt): RETCODE;
1654 begin
1655  Result := MsSQLAPI.dbsetmaxprocs(MaxProcs);
1656 end;
1657 
1658 function TZDBLibMSSQL7PlainDriver.dbSqlExecAsync(dbProc: PDBPROCESS): RETCODE;
1659 var
1660  lStartTick : Int64;
1661 begin
1662  Result := DBLibAPI.dbsqlsend(dbProc);
1663  if Result = SUCCEED then begin
1664  lStartTick := {$IFDEF FPC}GetMsCount{$ELSE}GetTickCount{$ENDIF};
1665  repeat
1666  continue;
1667  until ({$IFDEF FPC}GetMsCount{$ELSE}GetTickCount{$ENDIF} > lStartTick + TIMEOUT_MAXIMUM * 1000) or
1668  (MsSQLAPI.dbdataready(dbProc) = TRUE);
1669  Result := DBLibAPI.dbsqlok(dbProc);
1670  end;
1671 end;
1672 
1673 function TZDBLibMSSQL7PlainDriver.dbSetOpt(dbProc: PDBPROCESS; Option: DBINT; Char_Param: PAnsiChar = nil; Int_Param: DBINT = -1): RETCODE;
1674 begin
1675  Result := MsSQLAPI.dbSetOpt(dbProc, Option, Char_Param);
1676 end;
1677 
1678 function TZDBLibMSSQL7PlainDriver.dbClose(dbProc: PDBPROCESS): RETCODE;
1679 begin
1680  Result := MsSQLAPI.dbClose(dbProc);
1681 end;
1682 
1683 function TZDBLibMSSQL7PlainDriver.dbDatLen(dbProc: PDBPROCESS; Column: DBINT): DBINT;
1684 begin
1685  Result := MsSQLAPI.dbDatLen(dbProc, Column);
1686 end;
1687 
1688 function TZDBLibMSSQL7PlainDriver.dbCount(dbProc: PDBPROCESS): DBINT;
1689 begin
1690  Result := MsSQLAPI.dbCount(dbProc);
1691 end;
1692 
1693 function TZDBLibMSSQL7PlainDriver.dbHasRetStat(dbProc: PDBPROCESS): Boolean;
1694 begin
1695  Result := MsSQLAPI.dbHasRetStat(dbProc);
1696 end;
1697 
1698 function TZDBLibMSSQL7PlainDriver.dbdataready(Proc: PDBPROCESS): LongBool;
1699 begin
1700  Result := MsSQLAPI.dbdataready(Proc);
1701 end;
1702 
1703 { TFreeTGDBasePlainDriver }
1704 
1705 { TZFreeTDSBasePlainDriver }
1706 
1707 procedure TZFreeTDSBasePlainDriver.LoadApi;
1708 begin
1709  inherited LoadAPI;
1710  with Loader do
1711  begin
1712  @FreeTDSAPI.db12hour := GetAddress('db12hour');
1713  @FreeTDSAPI.dbaltbind_ps := GetAddress('dbaltbind_ps');
1714  @FreeTDSAPI.dbbufsize := GetAddress('dbbufsize');
1715  @FreeTDSAPI.dbclose := GetAddress('dbclose');
1716  @FreeTDSAPI.dbtablecolinfo := GetAddress('dbtablecolinfo');
1717  @FreeTDSAPI.dbcolbrowse := GetAddress('dbcolbrowse');
1718  @FreeTDSAPI.dbcolinfo := GetAddress('dbcolinfo');
1719  @FreeTDSAPI.dbconvert_ps := GetAddress('dbconvert_ps');
1720  @FreeTDSAPI.dbcount := GetAddress('dbcount');
1721  @FreeTDSAPI.dbdatecmp := GetAddress('dbdatecmp');
1722  @FreeTDSAPI.dbdatecrack := GetAddress('dbdatecrack');
1723  @FreeTDSAPI.dbdatlen := GetAddress('dbdatlen');
1724  @FreeTDSAPI.dbdead := GetAddress('dbdead');
1725  @FreeTDSAPI.dbgetcharset := GetAddress('dbgetcharset');
1726  @FreeTDSAPI.dbgetlusername := GetAddress('dbgetlusername');
1727  @FreeTDSAPI.dbgetmaxprocs := GetAddress('dbgetmaxprocs');
1728  @FreeTDSAPI.dbgetnatlanf := GetAddress('dbgetnatlanf');
1729  @FreeTDSAPI.dbgetpacket := GetAddress('dbgetpacket');
1730  @FreeTDSAPI.dbgetuserdata := GetAddress('dbgetuserdata');
1731  @FreeTDSAPI.dbhasretstat := GetAddress('dbhasretstat');
1732  @FreeTDSAPI.dbinit := GetAddress('dbinit');
1733  @FreeTDSAPI.dbiordesc := GetAddress('dbiordesc');
1734  @FreeTDSAPI.dbiowdesc := GetAddress('dbiowdesc');
1735  @FreeTDSAPI.dbisavail := GetAddress('dbisavail');
1736  @FreeTDSAPI.dbisopt := GetAddress('dbisopt');
1737  @FreeTDSAPI.dbloginfree := GetAddress('dbloginfree');
1738  @FreeTDSAPI.dbmny4cmp := GetAddress('dbmny4cmp');
1739  @FreeTDSAPI.dbmnycmp := GetAddress('dbmnycmp');
1740  @FreeTDSAPI.dbmny4add := GetAddress('dbmny4add');
1741  @FreeTDSAPI.dbmnydec := GetAddress('dbmnydec');
1742  @FreeTDSAPI.dbmnyinc := GetAddress('dbmnyinc');
1743  @FreeTDSAPI.dbmnymaxpos := GetAddress('dbmnymaxpos');
1744  @FreeTDSAPI.dbmnymaxneg := GetAddress('dbmnymaxneg');
1745  @FreeTDSAPI.dbmny4minus := GetAddress('dbmny4minus');
1746  @FreeTDSAPI.dbmnyminus := GetAddress('dbmnyminus');
1747  @FreeTDSAPI.dbmny4sub := GetAddress('dbmny4sub');
1748  @FreeTDSAPI.dbmnysub := GetAddress('dbmnysub');
1749  @FreeTDSAPI.dbmny4copy := GetAddress('dbmny4copy');
1750  @FreeTDSAPI.dbmnycopy := GetAddress('dbmnycopy');
1751  @FreeTDSAPI.dbmny4zero := GetAddress('dbmny4zero');
1752  @FreeTDSAPI.dbmnyzero := GetAddress('dbmnyzero');
1753  @FreeTDSAPI.dbmonthname := GetAddress('dbmonthname');
1754  @FreeTDSAPI.tdsdbopen := GetAddress('tdsdbopen');
1755 
1756 
1757  @FreeTDSAPI.DRBUF := GetAddress('DRBUF');
1758  @FreeTDSAPI.dbrecftos := GetAddress('dbrecftos');
1759  @FreeTDSAPI.dbresults_r := GetAddress('dbresults_r');
1760  //@FreeTDSAPI.dbsechandle := GetAddress('dbsechandle');
1761  @FreeTDSAPI.dbservcharset := GetAddress('dbservcharset');
1762  @FreeTDSAPI.dbsafestr := GetAddress('dbsafestr');
1763  //@FreeTDSAPI.dbsetbusy := GetAddress('dbsetbusy');
1764  @FreeTDSAPI.dbsetdefcharset := GetAddress('dbsetdefcharset');
1765  @FreeTDSAPI.dbsetifile := GetAddress('dbsetifile');
1766  //@FreeTDSAPI.dbsetinterrupt := GetAddress('dbsetinterrupt');
1767  @FreeTDSAPI.dbsetmaxprocs := GetAddress('dbsetmaxprocs');
1768  @FreeTDSAPI.dbsetopt := GetAddress('dbsetopt');
1769  @FreeTDSAPI.dbsetrow := GetAddress('dbsetrow');
1770  @FreeTDSAPI.dbsetversion := GetAddress('dbsetversion');
1771  @FreeTDSAPI.dbspid := GetAddress('dbspid');
1772  @FreeTDSAPI.dbspr1row := GetAddress('dbspr1row');
1773  @FreeTDSAPI.dbspr1rowlen := GetAddress('dbspr1rowlen');
1774  @FreeTDSAPI.dbsprhead := GetAddress('dbsprhead');
1775  @FreeTDSAPI.dbsprline := GetAddress('dbsprline');
1776  @FreeTDSAPI.dbvarylen := GetAddress('dbvarylen');
1777 
1778  @FreeTDSAPI.dbtds := GetAddress('dbtds');
1779  @FreeTDSAPI.dbtextsize := GetAddress('dbtextsize');
1780  @FreeTDSAPI.dbwillconvert := GetAddress('dbwillconvert');
1781 
1782  (* LOGINREC manipulation *)
1783  @FreeTDSAPI.dbsetlbool := GetAddress('dbsetlbool');
1784  @FreeTDSAPI.dbsetllong := GetAddress('dbsetllong');
1785  @FreeTDSAPI.dbsetlversion := GetAddress('dbsetlversion');
1786  @FreeTDSAPI.tdsdump_open := GetAddress('tdsdump_open');
1787  @FreeTDSAPI.tdsdump_on := GetAddress('tdsdump_on');
1788  @FreeTDSAPI.tdsdump_off := GetAddress('tdsdump_off');
1789  @FreeTDSAPI.tdsdump_close := GetAddress('tdsdump_close');
1790 
1791  end;
1792  FreeTDSAPI.dbinit;
1793 
1794  OldFreeTDSErrorHandle := DBLibAPI.dberrhandle(DbLibErrorHandle);
1795  OldFreeTDSMessageHandle := DBLibAPI.dbmsghandle(DbLibMessageHandle);
1796 end;
1797 
1798 constructor TZFreeTDSBasePlainDriver.Create;
1799 begin
1800  inherited create;
1801 
1802  DBVariables.DBoptions[Z_PARSEONLY] := TDSPARSEONLY;
1803  DBVariables.DBoptions[Z_ESTIMATE] := TDSESTIMATE;
1804  DBVariables.DBoptions[Z_SHOWPLAN] := TDSSHOWPLAN;
1805  DBVariables.DBoptions[Z_NOEXEC] := TDSNOEXEC;
1806  DBVariables.DBoptions[Z_ARITHIGNORE] := TDSARITHIGNORE;
1807  DBVariables.DBoptions[Z_NOCOUNT] := TDSNOCOUNT;
1808  DBVariables.DBoptions[Z_ARITHABORT] := TDSARITHABORT;
1809  DBVariables.DBoptions[Z_TEXTLIMIT] := TDSTEXTLIMIT;
1810  DBVariables.DBoptions[Z_BROWSE] := TDSBROWSE;
1811  DBVariables.DBoptions[Z_OFFSET] := TDSOFFSET;
1812  DBVariables.DBoptions[Z_STAT] := TDSSTAT;
1813  DBVariables.DBoptions[Z_ERRLVL] := TDSERRLVL;
1814  DBVariables.DBoptions[Z_CONFIRM] := TDSCONFIRM;
1815  DBVariables.DBoptions[Z_STORPROCID] := TDSSTORPROCID;
1816  DBVariables.DBoptions[Z_BUFFER] := TDSBUFFER;
1817  DBVariables.DBoptions[Z_NOAUTOFREE] := TDSNOAUTOFREE;
1818  DBVariables.DBoptions[Z_ROWCOUNT] := TDSROWCOUNT;
1819  DBVariables.DBoptions[Z_TEXTSIZE] := TDSTEXTSIZE;
1820  DBVariables.DBoptions[Z_NATLANG] := TDSNATLANG;
1821  DBVariables.DBoptions[Z_DATEFORMAT] := TDSDATEFORMAT;
1822  DBVariables.DBoptions[Z_PRPAD] := TDSPRPAD;
1823  DBVariables.DBoptions[Z_PRCOLSEP] := TDSPRCOLSEP;
1824  DBVariables.DBoptions[Z_PRLINELEN] := TDSPRLINELEN;
1825  DBVariables.DBoptions[Z_PRLINESEP] := TDSPRLINESEP;
1826  DBVariables.DBoptions[Z_LFCONVERT] := TDSLFCONVERT;
1827  DBVariables.DBoptions[Z_DATEFIRST] := TDSDATEFIRST;
1828  DBVariables.DBoptions[Z_CHAINXACTS] := TDSCHAINXACTS;
1829  DBVariables.DBoptions[Z_FIPSFLAG] := TDSFIPSFLAG;
1830  DBVariables.DBoptions[Z_ISOLATION] := TDSISOLATION;
1831  DBVariables.DBoptions[Z_AUTH] := TDSAUTH;
1832  DBVariables.DBoptions[Z_IDENTITY] := TDSIDENTITY;
1833  DBVariables.DBoptions[Z_NOIDCOL] := TDSNOIDCOL;
1834  DBVariables.DBoptions[Z_DATESHORT] := TDSDATESHORT;
1835  DBVariables.DBoptions[Z_CLIENTCURSORS] := TDSCLIENTCURSORS;
1836  DBVariables.DBoptions[Z_SETTIME] := TDSSETTIME;
1837  DBVariables.DBoptions[Z_QUOTEDIDENT] := TDSQUOTEDIDENT;
1838  DBVariables.DBoptions[Z_NUMOPTIONS] := TDSNUMOPTIONS;
1839  DBVariables.DBoptions[Z_PADOFF] := TDSPADOFF;
1840  DBVariables.DBoptions[Z_PADON] := TDSPADON;
1841  DBVariables.DBoptions[Z_OFF] := TDSOFF;
1842  DBVariables.DBoptions[Z_ON] := TDSON;
1843  DBVariables.DBoptions[Z_NOSUCHOPTION] := NOSUCHOPTION;
1844  DBVariables.DBoptions[Z_MAXOPTTEXT] := MAXOPTTEXT;
1845  {TDS Loginrec manipulations}
1846  DBVariables.DBSetLoginRec[Z_SETHOST] := TDSDBSETHOST;
1847  DBVariables.DBSetLoginRec[Z_SETUSER] := TDSDBSETUSER;
1848  DBVariables.DBSetLoginRec[Z_SETPWD] := TDSDBSETPWD;
1849  DBVariables.DBSetLoginRec[Z_SETHID] := TDSDBSETHID;
1850  DBVariables.DBSetLoginRec[Z_SETAPP] := TDSDBSETAPP;
1851  DBVariables.DBSetLoginRec[Z_SETBCP] := TDSDBSETBCP;
1852  DBVariables.DBSetLoginRec[Z_SETSECURE] := TDSDBSETSECURE;
1853  DBVariables.DBSetLoginRec[Z_SETLANG] := TDSDBSETLANG;
1854  DBVariables.DBSetLoginRec[Z_SETNOSHORT] := TDSDBSETNOSHORT;
1855  DBVariables.DBSetLoginRec[Z_SETHIER] := TDSDBSETHIER;
1856  DBVariables.DBSetLoginRec[Z_SETCHARSET] := TDSDBSETCHARSET;
1857  DBVariables.DBSetLoginRec[Z_SETPACKET] := TDSDBSETPACKET;
1858  DBVariables.DBSetLoginRec[Z_SETENCRYPT] := TDSDBSETENCRYPT;
1859  DBVariables.DBSetLoginRec[Z_SETLABELED] := TDSDBSETLABELED;
1860  DBVariables.DBSetLoginRec[Z_SETDBNAME] := TDSDBSETDBNAME;
1861  {datatypes}
1862  DBVariables.datatypes[Z_SQLVOID] := TDSSQLVOID;
1863  DBVariables.datatypes[Z_SQLTEXT] := TDSSQLTEXT;
1864  DBVariables.datatypes[Z_SQLVARBINARY] := TDSSQLVARBINARY;
1865  DBVariables.datatypes[Z_SQLINTN] := TDSSQLINTN;
1866  DBVariables.datatypes[Z_SQLVARCHAR] := TDSSQLVARCHAR;
1867  DBVariables.datatypes[Z_SQLBINARY] := TDSSQLBINARY;
1868  DBVariables.datatypes[Z_SQLIMAGE] := TDSSQLIMAGE;
1869  DBVariables.datatypes[Z_SQLCHAR] := TDSSQLCHAR;
1870  DBVariables.datatypes[Z_SQLINT1] := TDSSQLINT1;
1871  DBVariables.datatypes[Z_SQLBIT] := TDSSQLBIT;
1872  DBVariables.datatypes[Z_SQLINT2] := TDSSQLINT2;
1873  DBVariables.datatypes[Z_SQLINT4] := TDSSQLINT4;
1874  DBVariables.datatypes[Z_SQLMONEY] := TDSSQLMONEY;
1875  DBVariables.datatypes[Z_SQLDATETIME] := TDSSQLDATETIME;
1876  DBVariables.datatypes[Z_SQLFLT8] := TDSSQLFLT8;
1877  DBVariables.datatypes[Z_SQLFLTN] := TDSSQLFLTN;
1878  DBVariables.datatypes[Z_SQLMONEYN] := TDSSQLMONEYN;
1879  DBVariables.datatypes[Z_SQLDATETIMN] := TDSSQLDATETIMN;
1880  DBVariables.datatypes[Z_SQLFLT4] := TDSSQLFLT4;
1881  DBVariables.datatypes[Z_SQLMONEY4] := TDSSQLMONEY4;
1882  DBVariables.datatypes[Z_SQLDATETIM4] := TDSSQLDATETIM4;
1883  DBVariables.datatypes[Z_SQLDECIMAL] := TDSSQLDECIMAL;
1884  DBVariables.datatypes[Z_SQLNUMERIC] := TDSSQLNUMERIC;
1885 end;
1886 
1887 destructor TZFreeTDSBasePlainDriver.Destroy;
1888 begin
1889  if Loader.Loaded then
1890  begin
1891  DBLibAPI.dberrhandle(OldFreeTDSErrorHandle);
1892  DBLibAPI.dbmsghandle(OldFreeTDSMessageHandle);
1893  DBLibAPI.dbexit;
1894  end;
1895  inherited Destroy;
1896 end;
1897 
1898 function TZFreeTDSBasePlainDriver.GetProtocol: string;
1899 begin
1900  Result := 'FreeTDS';
1901 end;
1902 
1903 function TZFreeTDSBasePlainDriver.GetDescription: string;
1904 begin
1905  Result := 'Native FreeTDS driver for Sybase and MSSQL Servers';
1906 end;
1907 
1908 function TZFreeTDSBasePlainDriver.dbLogin: PLOGINREC;
1909 begin
1910  Result := inherited dbLogin;
1911  if not Assigned(Result) then
1912  if not (dbsetlversion(Result) = DBSUCCEED ) then
1913  begin
1914  dbloginfree(Result);
1915  Result := nil;
1916  end;
1917 end;
1918 
1919 function TZFreeTDSBasePlainDriver.dbSetLCharSet(Login: PLOGINREC; CharsetName: PAnsiChar): RETCODE;
1920 begin
1921  Result := DBLibAPI.dbsetlname(Login, CharsetName, DBVariables.dbSetLoginRec[Z_SETCHARSET]);
1922 end;
1923 
1924 function TZFreeTDSBasePlainDriver.dbSetLSecure(Login: PLOGINREC): RETCODE;
1925 begin
1926  Result := DBLibAPI.dbsetlname(Login, nil, DBVariables.dbSetLoginRec[Z_SETSECURE]);
1927 // Result := FreeTDSAPI.dbsetlbool(Login, 1, Self.DBVariables.dbSetLoginRec[Z_SETSECURE]);
1928 end;
1929 
1930 function TZFreeTDSBasePlainDriver.dbsetlversion(Login: PLOGINREC): RETCODE;
1931 begin
1932  Result := FreeTDSAPI.dbsetlversion(Login, TDSDBVERSION_UNKNOWN);
1933 end;
1934 
1935 function TZFreeTDSBasePlainDriver.dbsetversion: RETCODE;
1936 begin
1937  Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_UNKNOWN);
1938 end;
1939 
1940 procedure TZFreeTDSBasePlainDriver.tdsDumpOff;
1941 begin
1942  FreeTDSAPI.tdsdump_off();
1943 end;
1944 
1945 procedure TZFreeTDSBasePlainDriver.tdsDumpOn;
1946 begin
1947  FreeTDSAPI.tdsdump_on();
1948 end;
1949 
1950 procedure TZFreeTDSBasePlainDriver.tdsDump_Close;
1951 begin
1952  FreeTDSAPI.tdsdump_close();
1953 end;
1954 
1955 procedure TZFreeTDSBasePlainDriver.tdsDump_Open(const FileName: String);
1956 begin
1957  FreeTDSAPI.tdsdump_open(PAnsiChar( AnsiString(FileName) ));
1958 end;
1959 
1960 function TZFreeTDSBasePlainDriver.dbdataready(Proc: PDBPROCESS): LongBool;
1961 begin
1962  Result := Proc <> nil;
1963 end;
1964 
1965 procedure TZFreeTDSBasePlainDriver.dbfreelogin(Login: PLOGINREC);
1966 begin
1967  FreeTDSAPI.dbloginfree(Login);
1968 end;
1969 
1970 function TZFreeTDSBasePlainDriver.dbDead(dbProc: PDBPROCESS): Boolean;
1971 begin
1972  Result := FreeTDSAPI.dbDead(dbProc) = 1;
1973 end;
1974 
1975 procedure TZFreeTDSBasePlainDriver.dbLoginFree(Login: PLOGINREC);
1976 begin
1977  FreeTDSAPI.dbloginfree(Login);
1978 end;
1979 
1980 function TZFreeTDSBasePlainDriver.dbsetmaxprocs(
1981  MaxProcs: SmallInt): RETCODE;
1982 begin
1983  Result := FreeTDSAPI.dbsetmaxprocs(MaxProcs);
1984 end;
1985 
1986 function TZFreeTDSBasePlainDriver.dbSetOpt(dbProc: PDBPROCESS; Option: Integer; Char_Param: PAnsiChar = nil; Int_Param: Integer = -1): RETCODE;
1987 begin
1988  Result := FreeTDSAPI.dbSetOpt(dbProc, Option, Char_Param, Int_Param);
1989 end;
1990 
1991 function TZFreeTDSBasePlainDriver.dbSetTime(queryTime: Integer): RETCODE;
1992 begin
1993  Result := FreeTDSAPI.dbsetmaxprocs(queryTime);
1994 end;
1995 
1996 function TZFreeTDSBasePlainDriver.dbClose(dbProc: PDBPROCESS): RETCODE;
1997 begin
1998  FreeTDSAPI.dbClose(dbProc);
1999  Result := DBNOERR;
2000 end;
2001 
2002 function TZFreeTDSBasePlainDriver.dbDatLen(dbProc: PDBPROCESS; Column: Integer): Integer;
2003 begin
2004  Result := FreeTDSAPI.dbDatLen(dbProc, Column);
2005 end;
2006 
2007 function TZFreeTDSBasePlainDriver.dbCount(dbProc: PDBPROCESS): Integer;
2008 begin
2009  Result := FreeTDSAPI.dbCount(dbProc);
2010 end;
2011 
2012 function TZFreeTDSBasePlainDriver.dbcolbrowse(Proc: PDBPROCESS; Column: Integer): LongBool;
2013 begin
2014  Result := FreeTDSAPI.dbcolbrowse(Proc, Column) <> 0;
2015 end;
2016 
2017 function TZFreeTDSBasePlainDriver.dbHasRetStat(dbProc: PDBPROCESS): Boolean;
2018 begin
2019  if Assigned(FreeTDSAPI.dbHasRetStat) then
2020  Result := FreeTDSAPI.dbHasRetStat(dbProc) <> 0
2021  else
2022  Result := False;
2023 end;
2024 
2025 function TZFreeTDSBasePlainDriver.dbColInfo(dbProc: PDBPROCESS;
2026  Column: Integer; var ADBInfo: DBCOL): RETCODE;
2027 begin
2028  FillChar(ADBInfo, SizeOf(DBCol), #0);
2029  ADBInfo.SizeOfStruct := SizeOf(DBCol);
2030  Result := FreeTDSAPI.dbcolinfo(dbProc, CI_REGULAR, Column, 0, @ADBInfo);
2031 end;
2032 
2033 { TZFreeTDS42MsSQLPlainDriver }
2034 function TZFreeTDS42MsSQLPlainDriver.Clone: IZPlainDriver;
2035 begin
2036  Result := TZFreeTDS42MsSQLPlainDriver.Create;
2037 end;
2038 
2039 procedure TZFreeTDS42MsSQLPlainDriver.LoadCodePages;
2040 begin
2041  AddmMSCodePages(Self);
2042 end;
2043 
2044 constructor TZFreeTDS42MsSQLPlainDriver.Create;
2045 begin
2046  inherited Create;
2047  {$IFDEF MSWINDOWS}
2048  FLoader.AddLocation(FREETDS_MSSQL_WINDOWS_DLL_LOCATION);
2049  {$ELSE}
2050  {$IFDEF UNIX}
2051  FLoader.AddLocation(FREETDS_LINUX_DLL_LOCATION);
2052  {$ELSE}
2053  FLoader.AddLocation(FREETDS_OSX_DLL_LOCATION);
2054  {$ENDIF}
2055  {$ENDIF}
2056  LoadCodePages;
2057 end;
2058 
2059 function TZFreeTDS42MsSQLPlainDriver.GetProtocol: string;
2060 begin
2061  Result := 'FreeTDS_MsSQL<=6.5';
2062 end;
2063 
2064 function TZFreeTDS42MsSQLPlainDriver.GetDescription: string;
2065 begin
2066  Result := 'FreeTDS 4.2 protocol for MsSQL <=6.5 Servers';
2067 end;
2068 
2069 function TZFreeTDS42MsSQLPlainDriver.dbsetlversion(Login: PLOGINREC): RETCODE;
2070 begin
2071  Result := FreeTDSAPI.dbsetlversion(Login, DBVERSION_42);
2072 end;
2073 
2074 function TZFreeTDS42MsSQLPlainDriver.dbsetversion: RETCODE;
2075 begin
2076  Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_42);
2077 end;
2078 
2079 { TZFreeTDS42SybasePlainDriver }
2080 function TZFreeTDS42SybasePlainDriver.Clone: IZPlainDriver;
2081 begin
2082  Result := TZFreeTDS42SybasePlainDriver.Create;
2083 end;
2084 
2085 procedure TZFreeTDS42SybasePlainDriver.LoadCodePages;
2086 begin
2087  AddCodePage('Not implemented!', -1);
2088  { TODO -oEgonHugeist : Must be completed!!!! }
2089 end;
2090 
2091 constructor TZFreeTDS42SybasePlainDriver.Create;
2092 begin
2093  inherited Create;
2094  {$IFDEF MSWINDOWS}
2095  FLoader.AddLocation(FREETDS_SYBASE_WINDOWS_DLL_LOCATION);
2096  {$ELSE}
2097  {$IFDEF UNIX}
2098  FLoader.AddLocation(FREETDS_LINUX_DLL_LOCATION);
2099  {$ELSE}
2100  FLoader.AddLocation(FREETDS_OSX_DLL_LOCATION);
2101  {$ENDIF}
2102  {$ENDIF}
2103 end;
2104 
2105 function TZFreeTDS42SybasePlainDriver.GetProtocol: string;
2106 begin
2107  Result := 'FreeTDS_Sybase<10';
2108 end;
2109 
2110 function TZFreeTDS42SybasePlainDriver.GetDescription: string;
2111 begin
2112  Result := 'FreeTDS 4.2 protocol for Sybase <10 Servers';
2113 end;
2114 
2115 function TZFreeTDS42SybasePlainDriver.dbsetlversion(Login: PLOGINREC): RETCODE;
2116 begin
2117  Result := DBSUCCEED;
2118 end;
2119 
2120 function TZFreeTDS42SybasePlainDriver.dbsetversion: RETCODE;
2121 begin
2122  Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_42);
2123 end;
2124 
2125 { TZFreeTDS50PlainDriver }
2126 function TZFreeTDS50PlainDriver.Clone: IZPlainDriver;
2127 begin
2128  Result := TZFreeTDS50PlainDriver.Create;
2129 end;
2130 
2131 procedure TZFreeTDS50PlainDriver.LoadCodePages;
2132 begin
2133  AddSybaseCodePages(Self);
2134 end;
2135 
2136 constructor TZFreeTDS50PlainDriver.Create;
2137 begin
2138  inherited Create;
2139  LoadCodePages;
2140 end;
2141 
2142 function TZFreeTDS50PlainDriver.GetProtocol: string;
2143 begin
2144  Result := 'FreeTDS_Sybase-10+';
2145 end;
2146 
2147 function TZFreeTDS50PlainDriver.GetDescription: string;
2148 begin
2149  Result := 'FreeTDS 5.0 Protocol for Sybase >= 10 Servers ';
2150 end;
2151 
2152 function TZFreeTDS50PlainDriver.dbsetversion: RETCODE;
2153 begin
2154  Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_46);
2155 end;
2156 
2157 { TZFreeTDS70PlainDriver }
2158 function TZFreeTDS70PlainDriver.Clone: IZPlainDriver;
2159 begin
2160  Result := TZFreeTDS70PlainDriver.Create;
2161 end;
2162 
2163 procedure TZFreeTDS70PlainDriver.LoadCodePages;
2164 begin
2165  inherited;
2166 end;
2167 
2168 function TZFreeTDS70PlainDriver.GetProtocol: string;
2169 begin
2170  Result := 'FreeTDS_MsSQL-7.0';
2171 end;
2172 
2173 function TZFreeTDS70PlainDriver.dbsetlversion(Login: PLOGINREC): RETCODE;
2174 begin
2175  Result := FreeTDSAPI.dbsetlversion(Login, DBVERSION_70);
2176 end;
2177 
2178 function TZFreeTDS70PlainDriver.GetDescription: string;
2179 begin
2180  Result := 'FreeTDS 7.0 Protocol for MsSQL 7.0 Servers';
2181 end;
2182 
2183 function TZFreeTDS70PlainDriver.dbsetversion: RETCODE;
2184 begin
2185  Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_70);
2186 end;
2187 
2188 { TZFreeTDS71PlainDriver }
2189 function TZFreeTDS71PlainDriver.Clone: IZPlainDriver;
2190 begin
2191  Result := TZFreeTDS71PlainDriver.Create;
2192 end;
2193 
2194 procedure TZFreeTDS71PlainDriver.LoadCodePages;
2195 begin
2196  Inherited;
2197 end;
2198 
2199 function TZFreeTDS71PlainDriver.GetProtocol: string;
2200 begin
2201  Result := 'FreeTDS_MsSQL-2000';
2202 end;
2203 
2204 function TZFreeTDS71PlainDriver.GetDescription: string;
2205 begin
2206  Result := 'FreeTDS 7.1 Protocol for MsSQL 2000 Servers';
2207 end;
2208 
2209 function TZFreeTDS71PlainDriver.dbsetversion: RETCODE;
2210 begin
2211  Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_70);
2212 end;
2213 
2214 { TZFreeTDS72PlainDriver }
2215 function TZFreeTDS72PlainDriver.Clone: IZPlainDriver;
2216 begin
2217  Result := TZFreeTDS72PlainDriver.Create;
2218 end;
2219 
2220 procedure TZFreeTDS72PlainDriver.LoadCodePages;
2221 begin
2222  inherited;
2223 end;
2224 
2225 function TZFreeTDS72PlainDriver.GetProtocol: string;
2226 begin
2227  Result := 'FreeTDS_MsSQL>=2005';
2228 end;
2229 
2230 function TZFreeTDS72PlainDriver.GetDescription: string;
2231 begin
2232  Result := 'FreeTDS 7.2 Protocol for MsSQL 2005, 2008, 2012 Servers';
2233 end;
2234 
2235 function TZFreeTDS72PlainDriver.dbsetversion: RETCODE;
2236 begin
2237  Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_72);
2238 end;
2239 
2240 initialization
2241  SQLErrors := TList.Create;
2242  SQLMessages := TList.Create;
2243 finalization
2244 //Free any record in the list if any
2245  while SQLErrors.Count > 0 do
2246  begin
2247  Dispose(SQLErrors.Items[0]);
2248  SQLErrors.Delete(0);
2249  end;
2250  if SQLErrors <> nil then
2251  FreeAndNil(SQLErrors);
2252 
2253 //Free any record in the list if any
2254  while SQLMessages.Count > 0 do
2255  begin
2256  Dispose(SQLMessages.Items[0]);
2257  SQLMessages.Delete(0);
2258  end;
2259  if SQLMessages <> nil then
2260  FreeAndNil(SQLMessages);
2261 end.