1 {*********************************************************}
3 { Zeos Database Objects }
4 { Delphi plain driver interface to DBLibrary }
6 { Originally written by Janos Fegyverneki }
7 { FreeTDS supportd by Bogdan Dragulin }
9 {*********************************************************}
11 {@********************************************************}
12 { Copyright (c) 1999-2012 Zeos Development Group }
14 { License Agreement: }
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. }
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. }
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) }
47 { http://www.sourceforge.net/projects/zeoslib. }
50 { Zeos Development Group. }
51 {********************************************************@}
53 unit ZPlainDbLibDriver;
59 uses Classes, ZCompatibility, ZPlainDriver, ZPlainDbLibConstants;
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';
70 {** Represents a generic interface to DBLIB native API. }
71 IZDBLibPlainDriver = interface (IZPlainDriver)
72 ['{7731C3B4-0608-4B6B-B089-240AC43A3463}']
74 procedure CheckError(dbProc: PDBPROCESS);
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;
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;
131 TZDBLibAbstractPlainDriver = class(TZAbstractPlainDriver, IZPlainDriver)
133 DBVariables: TDBVariables;
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;
142 TZDbLibBasePlainDriver = class(TZDBLibAbstractPlainDriver, IZPlainDriver,
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;
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;
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;
202 {** Implements a dblib driver for Sybase ASE 12.5 }
203 TZDBLibSybaseASE125PlainDriver = class (TZDBLibAbstractPlainDriver, IZPlainDriver,
206 SybaseAPI: TSybaseAPI;
208 procedure LoadApi; override;
209 function Clone: IZPlainDriver; override;
210 procedure LoadCodePages; override;
212 constructor Create; override;
213 destructor Destroy; override;
215 function GetProtocol: string; override;
216 function GetDescription: string; override;
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;
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;
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;
274 {** Implements a dblib driver for MSSql7 }
275 TZDBLibMSSQL7PlainDriver = class (TZDbLibBasePlainDriver, IZPlainDriver,
280 function Clone: IZPlainDriver; override;
281 procedure LoadCodePages; override;
283 procedure LoadApi; override;
284 constructor Create; override;
285 destructor Destroy; override;
287 function GetProtocol: string; override;
288 function GetDescription: string; override;
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;
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;
306 {** Implements a generic dblib driver}
307 IZFreeTDSPlainDriver = interface (IZDBLibPlainDriver)
308 ['{12FA5A22-59E5-4CBF-B745-96A7CDF9FBE0}']
310 function dbSetTime(queryTime : Integer): RETCODE;
312 procedure tdsDumpOff;
313 procedure tdsDump_Open(const FileName: String);
314 procedure tdsDump_Close;
318 {** Implements a dblib driver for Sybase/MSSQL }
319 TZFreeTDSBasePlainDriver = class (TZDbLibBasePlainDriver,
320 IZDBLibPlainDriver, IZFreeTDSPlainDriver)
322 FreeTDSAPI: TFreeTDSAPI;
324 function Clone: IZPlainDriver; override; abstract;
326 constructor Create; override;
327 destructor Destroy; override;
329 procedure LoadApi; override;
330 function GetProtocol: string; override;
331 function GetDescription: string; override;
334 function dbsetlversion(Login: PLOGINREC): RETCODE; virtual;
335 function dbsetversion: RETCODE; virtual;
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;
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;
354 function dbHasRetStat(dbProc: PDBPROCESS): Boolean; override;
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);
365 TZFreeTDS42MsSQLPlainDriver = class(TZFreeTDSBasePlainDriver)
367 function Clone: IZPlainDriver; override;
368 procedure LoadCodePages; override;
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;
377 TZFreeTDS42SybasePlainDriver = class(TZFreeTDSBasePlainDriver)
379 function Clone: IZPlainDriver; override;
380 procedure LoadCodePages; override;
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;
389 TZFreeTDS50PlainDriver = class(TZFreeTDS42SybasePlainDriver)
391 function Clone: IZPlainDriver; override;
392 procedure LoadCodePages; override;
394 constructor Create; override;
395 function GetProtocol: string; override;
396 function GetDescription: string; override;
397 function dbsetversion: RETCODE; override;
400 TZFreeTDS70PlainDriver = class(TZFreeTDS42MsSQLPlainDriver)
402 function Clone: IZPlainDriver; override;
403 procedure LoadCodePages; override;
405 function GetProtocol: string; override;
406 function GetDescription: string; override;
407 function dbsetlversion(Login: PLOGINREC): RETCODE; override;
408 function dbsetversion: RETCODE; override;
411 TZFreeTDS71PlainDriver = class(TZFreeTDS70PlainDriver)
413 function Clone: IZPlainDriver; override;
414 procedure LoadCodePages; override;
416 function GetProtocol: string; override;
417 function GetDescription: string; override;
418 function dbsetversion: RETCODE; override;
421 TZFreeTDS72PlainDriver = class(TZFreeTDS70PlainDriver)
423 function Clone: IZPlainDriver; override;
424 procedure LoadCodePages; override;
426 function GetProtocol: string; override;
427 function GetDescription: string; override;
428 function dbsetversion: RETCODE; override;
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;
444 uses SysUtils, ZPlainLoader, ZEncoding, {$IFDEF FPC}DOS{$ELSE}Windows{$ENDIF};
446 procedure AddSybaseCodePages(PlainDriver: TZAbstractPlainDriver);
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}
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}
483 procedure AddmMSCodePages(PlainDriver: TZAbstractPlainDriver);
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}
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};
502 SqlError: PDBLibError;
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);
513 Result := INT_CANCEL;
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};
521 SQLMessage: PDBLibMessage;
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);
537 { Handle sql server error messages }
538 function DbLibErrorHandle(Proc: PDBPROCESS; Severity, DbErr, OsErr: Integer;
539 DbErrStr, OsErrStr: PAnsiChar): Integer; cdecl;
541 SqlError: PDBLibError;
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);
552 Result := INT_CANCEL;
555 { Handle sql server messages }
556 function DbLibMessageHandle(Proc: PDBPROCESS; MsgNo: DBINT; MsgState, Severity: Integer;
557 MsgText, SrvName, ProcName: PAnsiChar; Line: DBUSMALLINT): Integer; cdecl;
559 SQLMessage: PDBLibMessage;
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);
575 constructor TZDBLibAbstractPlainDriver.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;
607 procedure TZDBLibAbstractPlainDriver.CheckError(dbProc: Pointer);
611 lErrorEntry: PDBLibError;
612 lMesageEntry: PDBLibMessage;
614 procedure AddToErrorMsg(const AError: String);
622 if ((SQLErrors = nil) or (SQLErrors.Count = 0)) and
623 ((SQLMessages = nil) or (SQLMessages.Count = 0)) then
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);
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);
653 raise Exception.Create(String(S));
656 function TZDBLibAbstractPlainDriver.GetVariables: TDBVariables;
658 Result := DBVariables;
661 { TZDBLibBasePlainDriver }
663 procedure TZDBLibBasePlainDriver.LoadApi;
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');
791 function TZDBLibBasePlainDriver.dbLogin: PLOGINREC;
793 Result := DBLibAPI.dblogin;
796 function TZDBLibBasePlainDriver.dbSetLoginTime(Seconds: DBINT): RETCODE;
798 Result := DBLibAPI.dbsetlogintime(Seconds);
801 function TZDBLibBasePlainDriver.dbsetlname(Login: PLOGINREC; Value: PAnsiChar; Item: DBINT): RETCODE;
803 Result := DBLibAPI.dbsetlname(Login, Value, Item);
806 function TZDBLibBasePlainDriver.dbSetLHost(Login: PLOGINREC; HostName: PAnsiChar): RETCODE;
808 Result := DBLibAPI.dbsetlname(Login, HostName, Self.DBVariables.dbSetLoginRec[Z_SETHOST]);
811 function TZDBLibBasePlainDriver.dbsetluser(Login: PLOGINREC; UserName: PAnsiChar): RETCODE;
813 Result := DBLibAPI.dbsetlname(Login, UserName, Self.DBVariables.dbSetLoginRec[Z_SETUSER]);
816 function TZDBLibBasePlainDriver.dbsetlpwd(Login: PLOGINREC; Password: PAnsiChar): RETCODE;
818 Result := DBLibAPI.dbsetlname(Login, Password, Self.DBVariables.dbSetLoginRec[Z_SETPWD]);
821 function TZDBLibBasePlainDriver.dbSetLApp(Login: PLOGINREC; AppName: PAnsiChar): RETCODE;
823 Result := DBLibAPI.dbsetlname(Login, AppName, Self.DBVariables.dbSetLoginRec[Z_SETAPP]);
826 function TZDBLibBasePlainDriver.dbSetLNatLang(Login: PLOGINREC; NatLangName: PAnsiChar): RETCODE;
828 Result := DBLibAPI.dbsetlname(Login, NatLangName, Self.DBVariables.dbSetLoginRec[Z_SETLANG]);
831 function TZDBLibBasePlainDriver.dbOpen(Login: PLOGINREC; Host: PAnsiChar): PDBPROCESS;
833 DBLibAPI.dbsetlogintime(10);
834 Result := DBLibAPI.dbOpen(Login, Host);
837 function TZDBLibBasePlainDriver.dbCancel(dbProc: PDBPROCESS): RETCODE;
839 Result := DBLibAPI.dbcancel(dbProc);
842 function TZDBLibBasePlainDriver.dbCmd(dbProc: PDBPROCESS; Cmd: PAnsiChar): RETCODE;
844 Result := DBLibAPI.dbcmd(dbProc, Cmd);
847 function TZDBLibBasePlainDriver.dbSqlExec(dbProc: PDBPROCESS; Async: Boolean=False): RETCODE;
850 Result := dbSqlExecAsync(dbProc)
852 Result := dbSqlExecSync(dbProc);
855 function TZDBLibBasePlainDriver.dbSqlExecSync(dbProc: PDBPROCESS): RETCODE;
857 Result := DBLibAPI.dbSqlExec(dbProc);
860 function TZDBLibBasePlainDriver.dbSqlExecAsync(dbProc: PDBPROCESS): RETCODE;
864 Result := DBLibAPI.dbsqlsend(dbProc);
865 if Result = SUCCEED then begin
866 lStartTick := {$IFDEF FPC}GetMsCount{$ELSE}GetTickCount{$ENDIF};
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);
875 function TZDBLibBasePlainDriver.dbResults(dbProc: PDBPROCESS): RETCODE;
877 Result := DBLibAPI.dbResults(dbProc);
880 function TZDBLibBasePlainDriver.dbCanQuery(dbProc: PDBPROCESS): RETCODE;
882 Result := DBLibAPI.dbCanQuery(dbProc);
885 function TZDBLibBasePlainDriver.dbMoreCmds(dbProc: PDBPROCESS): RETCODE;
887 Result := DBLibAPI.dbMoreCmds(dbProc);
890 function TZDBLibBasePlainDriver.dbUse(dbProc: PDBPROCESS; dbName: PAnsiChar): RETCODE;
892 Result := DBLibAPI.dbUse(dbProc, dbName);
895 function TZDBLibBasePlainDriver.dbName(dbProc: PDBPROCESS): PAnsiChar;
897 Result := DBLibAPI.dbName(dbProc);
900 function TZDBLibBasePlainDriver.dbCmdRow(dbProc: PDBPROCESS): RETCODE;
902 Result := DBLibAPI.dbCmdRow(dbProc);
905 function TZDBLibBasePlainDriver.dbNumCols(dbProc: PDBPROCESS): Integer;
907 Result := DBLibAPI.dbNumCols(dbProc);
910 function TZDBLibBasePlainDriver.dbColName(dbProc: PDBPROCESS; Column: Integer): PAnsiChar;
912 Result := DBLibAPI.dbColName(dbProc, Column);
915 function TZDBLibBasePlainDriver.dbColType(dbProc: PDBPROCESS; Column: Integer): Integer;
917 Result := DBLibAPI.dbColType(dbProc, Column);
920 function TZDBLibBasePlainDriver.dbColLen(dbProc: PDBPROCESS; Column: Integer): DBInt;
922 Result := DBLibAPI.dbColLen(dbProc, Column);
925 function TZDBLibBasePlainDriver.dbData(dbProc: PDBPROCESS; Column: Integer): PByte;
927 Result := DBLibAPI.dbData(dbProc, Column);
930 function TZDBLibBasePlainDriver.dbConvert(dbProc: PDBPROCESS; SrcType: Integer; Src: PByte;
931 SrcLen: DBINT; DestType: Integer; Dest: PByte; DestLen: DBINT): Integer;
933 Result := DBLibAPI.dbConvert(dbProc, SrcType, Src, SrcLen, DestType, Dest, DestLen);
936 function TZDBLibBasePlainDriver.dbNextRow(dbProc: PDBPROCESS): STATUS;
938 Result := DBLibAPI.dbNextRow(dbProc);
941 function TZDBLibBasePlainDriver.dbGetRow(dbProc: PDBPROCESS; Row: Integer): STATUS;
943 Result := DBLibAPI.dbGetRow(dbProc, Row);
946 function TZDBLibBasePlainDriver.dbRpcInit(dbProc: PDBPROCESS; RpcName: PAnsiChar; Options: SmallInt): RETCODE;
948 Result := DBLibAPI.dbRpcInit(dbProc, RpcName, Options);
951 function TZDBLibBasePlainDriver.dbRpcParam(dbProc: PDBPROCESS; ParamName: PAnsiChar; Status: Byte;
952 Type_: Integer; MaxLen: Integer; DataLen: Integer; Value: Pointer): RETCODE;
954 Result := DBLibAPI.dbRpcParam(dbProc, ParamName, Status, Type_, MaxLen, DataLen, Value);
957 function TZDBLibBasePlainDriver.dbRpcSend(dbProc: PDBPROCESS): RETCODE;
959 Result := DBLibAPI.dbRpcSend(dbProc);
962 function TZDBLibBasePlainDriver.dbRpcExec(dbProc: PDBPROCESS): RETCODE;
964 Result := DBLibAPI.dbRpcSend(dbProc);
965 if Result = SUCCEED then
966 Result := DBLibAPI.dbSqlOk(dbProc);
969 function TZDBLibBasePlainDriver.dbRetStatus(dbProc: PDBPROCESS): Integer;
971 Result := DBLibAPI.dbRetStatus(dbProc);
974 function TZDBLibBasePlainDriver.dbRetName(dbProc: PDBPROCESS; RetNum: Integer): PAnsiChar;
976 Result := DBLibAPI.dbRetName(dbProc, RetNum);
979 function TZDBLibBasePlainDriver.dbRetData(dbProc: PDBPROCESS; RetNum: Integer): Pointer;
981 if Assigned(DBLibAPI.dbRetData) then
982 Result := DBLibAPI.dbRetData(dbProc, RetNum)
987 function TZDBLibBasePlainDriver.dbRetLen(dbProc: PDBPROCESS; RetNum: Integer): Integer;
989 Result := DBLibAPI.dbRetLen(dbProc, RetNum);
992 function TZDBLibBasePlainDriver.dbRetType(dbProc: PDBPROCESS; RetNum: Integer): Integer;
994 Result := DBLibAPI.dbRetType(dbProc, RetNum);
997 function TZDBLibBasePlainDriver.dbrbuf(Proc: PDBPROCESS): DBINT;
999 Result := DBINT(dbdataready(Proc));
1003 { TZDBLibSybaseASE125PlainDriver }
1005 procedure TZDBLibSybaseASE125PlainDriver.LoadApi;
1007 { ************** Load adresses of API Functions ************* }
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');
1155 OldSybaseErrorHandle := SybaseAPI.dberrhandle(SybaseErrorHandle);
1156 OldSybaseMessageHandle := SybaseAPI.dbmsghandle(SybaseMessageHandle);
1160 function TZDBLibSybaseASE125PlainDriver.Clone: IZPlainDriver;
1162 Result := TZDBLibSybaseASE125PlainDriver.Create;
1165 constructor TZDBLibSybaseASE125PlainDriver.Create;
1169 Loader.AddLocation(LIBSYBDB_WINDOWS_DLL_LOCATION);
1172 Loader.AddLocation(LIBSYBDB_LINUX_DLL_LOCATION);
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;
1212 destructor TZDBLibSybaseASE125PlainDriver.Destroy;
1214 if Loader.Loaded then
1216 SybaseAPI.dberrhandle(OldSybaseErrorHandle);
1217 SybaseAPI.dbmsghandle(OldSybaseMessageHandle);
1223 procedure TZDBLibSybaseASE125PlainDriver.LoadCodePages;
1225 AddSybaseCodePages(Self);
1228 function TZDBLibSybaseASE125PlainDriver.GetProtocol: string;
1233 function TZDBLibSybaseASE125PlainDriver.GetDescription: string;
1235 Result := 'Native dblib driver for Sybase ASE 12.5';
1238 function TZDBLibSybaseASE125PlainDriver.dbcolbrowse(Proc: PDBPROCESS; Column: Integer): LongBool;
1240 Result := SybaseAPI.dbcolbrowse(Proc, Column);
1243 function TZDBLibSybaseASE125PlainDriver.dbDead(dbProc: PDBPROCESS): Boolean;
1245 Result := SybaseAPI.dbDead(dbProc);
1248 function TZDBLibSybaseASE125PlainDriver.dbLogin: PLOGINREC;
1250 Result := SybaseAPI.dbLogin;
1253 procedure TZDBLibSybaseASE125PlainDriver.dbLoginFree(Login: PLOGINREC);
1255 SybaseAPI.dbLoginFree(Login);
1258 function TZDBLibSybaseASE125PlainDriver.dbSetLoginTime(Seconds: DBINT): RETCODE;
1260 Result := SybaseAPI.dbsetlogintime(Seconds);
1263 function TZDBLibSybaseASE125PlainDriver.dbsetlname(Login: PLOGINREC; Value: PAnsiChar; Item: DBINT): RETCODE;
1265 Result := SybaseAPI.dbsetlname(Login, Value, Item);
1268 function TZDBLibSybaseASE125PlainDriver.dbSetLHost(Login: PLOGINREC; HostName: PAnsiChar): RETCODE;
1270 Result := SybaseAPI.dbsetlname(Login, HostName, Self.DBVariables.dbSetLoginRec[Z_SETHOST]);
1273 function TZDBLibSybaseASE125PlainDriver.dbsetluser(Login: PLOGINREC; UserName: PAnsiChar): RETCODE;
1275 Result := SybaseAPI.dbsetlname(Login, UserName, Self.DBVariables.dbSetLoginRec[Z_SETUSER]);
1278 function TZDBLibSybaseASE125PlainDriver.dbsetlpwd(Login: PLOGINREC; Password: PAnsiChar): RETCODE;
1280 Result := SybaseAPI.dbsetlname(Login, Password, Self.DBVariables.dbSetLoginRec[Z_SETPWD]);
1283 function TZDBLibSybaseASE125PlainDriver.dbSetLApp(Login: PLOGINREC; AppName: PAnsiChar): RETCODE;
1285 Result := SybaseAPI.dbsetlname(Login, AppName, Self.DBVariables.dbSetLoginRec[Z_SETAPP]);
1288 function TZDBLibSybaseASE125PlainDriver.dbSetLNatLang(Login: PLOGINREC; NatLangName: PAnsiChar): RETCODE;
1290 Result := SybaseAPI.dbsetlname(Login, NatLangName, Self.DBVariables.dbSetLoginRec[Z_SETLANG]);
1293 function TZDBLibSybaseASE125PlainDriver.dbSetLCharSet(Login: PLOGINREC; CharsetName: PAnsiChar): RETCODE;
1295 Result := SybaseAPI.dbsetlname(Login, CharsetName, Self.DBVariables.dbSetLoginRec[Z_SETCHARSET]);
1298 function TZDBLibSybaseASE125PlainDriver.dbSetLSecure(Login: PLOGINREC): RETCODE;
1303 function TZDBLibSybaseASE125PlainDriver.dbsetmaxprocs(
1304 MaxProcs: SmallInt): RETCODE;
1306 Result := SybaseAPI.dbsetmaxprocs(MaxProcs);
1309 function TZDBLibSybaseASE125PlainDriver.dbOpen(Login: PLOGINREC; Host: PAnsiChar): PDBPROCESS;
1311 Result := SybaseAPI.dbOpen(Login, Host);
1314 function TZDBLibSybaseASE125PlainDriver.dbCancel(dbProc: PDBPROCESS): RETCODE;
1316 Result := SybaseAPI.dbcancel(dbProc);
1319 function TZDBLibSybaseASE125PlainDriver.dbCmd(dbProc: PDBPROCESS; Cmd: PAnsiChar): RETCODE;
1321 Result := SybaseAPI.dbcmd(dbProc, Cmd);
1324 function TZDBLibSybaseASE125PlainDriver.dbSqlExec(dbProc: PDBPROCESS; Async: Boolean=False): RETCODE;
1327 Result := dbSqlExecSync(dbProc)
1329 Result := dbSqlExecAsync(dbProc);
1332 function TZDBLibSybaseASE125PlainDriver.dbSqlExecSync(dbProc: PDBPROCESS): RETCODE;
1334 Result := SybaseAPI.dbSqlExec(dbProc);
1337 function TZDBLibSybaseASE125PlainDriver.dbSqlExecAsync(dbProc: PDBPROCESS): RETCODE;
1341 Result := SybaseAPI.dbsqlsend(dbProc);
1342 if Result = SUCCEED then begin
1343 lStartTick := {$IFDEF FPC}GetMsCount{$ELSE}GetTickCount{$ENDIF};
1346 until ({$IFDEF FPC}GetMsCount{$ELSE}GetTickCount{$ENDIF} > lStartTick + TIMEOUT_MAXIMUM * 1000) or
1347 (dbdataready(dbProc) = TRUE);
1348 Result := SybaseAPI.dbsqlok(dbProc);
1352 function TZDBLibSybaseASE125PlainDriver.dbResults(dbProc: PDBPROCESS): RETCODE;
1354 Result := SybaseAPI.dbResults(dbProc);
1357 function TZDBLibSybaseASE125PlainDriver.dbCanQuery(dbProc: PDBPROCESS): RETCODE;
1359 Result := SybaseAPI.dbCanQuery(dbProc);
1362 function TZDBLibSybaseASE125PlainDriver.dbMoreCmds(dbProc: PDBPROCESS): RETCODE;
1364 Result := SybaseAPI.dbMoreCmds(dbProc);
1367 function TZDBLibSybaseASE125PlainDriver.dbUse(dbProc: PDBPROCESS; dbName: PAnsiChar): RETCODE;
1369 Result := SybaseAPI.dbUse(dbProc, dbName);
1372 function TZDBLibSybaseASE125PlainDriver.dbSetOpt(dbProc: PDBPROCESS; Option: DBINT; Char_Param: PAnsiChar = nil; Int_Param: DBINT = -1): RETCODE;
1374 Result := SybaseAPI.dbSetOpt(dbProc, Option, Char_Param, Int_Param);
1377 function TZDBLibSybaseASE125PlainDriver.dbClose(dbProc: PDBPROCESS): RETCODE;
1379 Result := SybaseAPI.dbClose(dbProc);
1382 function TZDBLibSybaseASE125PlainDriver.dbName(dbProc: PDBPROCESS): PAnsiChar;
1384 Result := SybaseAPI.dbName(dbProc);
1387 function TZDBLibSybaseASE125PlainDriver.dbCmdRow(dbProc: PDBPROCESS): RETCODE;
1389 Result := SybaseAPI.dbCmdRow(dbProc);
1392 function TZDBLibSybaseASE125PlainDriver.dbNumCols(dbProc: PDBPROCESS): DBINT;
1394 Result := SybaseAPI.dbNumCols(dbProc);
1397 function TZDBLibSybaseASE125PlainDriver.dbColName(dbProc: PDBPROCESS; Column: DBINT): PAnsiChar;
1399 Result := SybaseAPI.dbColName(dbProc, Column);
1402 function TZDBLibSybaseASE125PlainDriver.dbColType(dbProc: PDBPROCESS; Column: DBINT): DBINT;
1404 Result := SybaseAPI.dbColType(dbProc, Column);
1407 function TZDBLibSybaseASE125PlainDriver.dbColLen(dbProc: PDBPROCESS; Column: DBINT): DBInt;
1409 Result := SybaseAPI.dbColLen(dbProc, Column);
1412 function TZDBLibSybaseASE125PlainDriver.dbData(dbProc: PDBPROCESS; Column: DBINT): PByte;
1414 Result := SybaseAPI.dbData(dbProc, Column);
1417 function TZDBLibSybaseASE125PlainDriver.dbDatLen(dbProc: PDBPROCESS; Column: DBINT): DBINT;
1419 Result := SybaseAPI.dbDatLen(dbProc, Column);
1422 function TZDBLibSybaseASE125PlainDriver.dbConvert(dbProc: PDBPROCESS; SrcType: DBINT; Src: PByte;
1423 SrcLen: DBINT; DestType: DBINT; Dest: PByte; DestLen: DBINT): DBINT;
1425 Result := SybaseAPI.dbConvert(dbProc, SrcType, Src, SrcLen, DestType, Dest, DestLen);
1428 function TZDBLibSybaseASE125PlainDriver.dbNextRow(dbProc: PDBPROCESS): STATUS;
1430 Result := SybaseAPI.dbNextRow(dbProc);
1433 function TZDBLibSybaseASE125PlainDriver.dbGetRow(dbProc: PDBPROCESS; Row: DBINT): STATUS;
1435 Result := SybaseAPI.dbGetRow(dbProc, Row);
1438 function TZDBLibSybaseASE125PlainDriver.dbCount(dbProc: PDBPROCESS): DBINT;
1440 Result := SybaseAPI.dbCount(dbProc);
1443 function TZDBLibSybaseASE125PlainDriver.dbRpcInit(dbProc: PDBPROCESS; RpcName: PAnsiChar; Options: SmallInt): RETCODE;
1445 Result := SybaseAPI.dbRpcInit(dbProc, RpcName, Options);
1448 function TZDBLibSybaseASE125PlainDriver.dbRpcParam(dbProc: PDBPROCESS; ParamName: PAnsiChar; Status: Byte;
1449 Type_: DBINT; MaxLen: DBINT; DataLen: DBINT; Value: Pointer): RETCODE;
1451 Result := SybaseAPI.dbRpcParam(dbProc, ParamName, Status, Type_, MaxLen, DataLen, Value);
1454 function TZDBLibSybaseASE125PlainDriver.dbRpcSend(dbProc: PDBPROCESS): RETCODE;
1456 Result := SybaseAPI.dbRpcSend(dbProc);
1459 function TZDBLibSybaseASE125PlainDriver.dbRpcExec(dbProc: PDBPROCESS): RETCODE;
1461 Result := SybaseAPI.dbRpcSend(dbProc);
1462 if Result = SUCCEED then
1463 Result := SybaseAPI.dbSqlOk(dbProc);
1466 function TZDBLibSybaseASE125PlainDriver.dbRetStatus(dbProc: PDBPROCESS): DBINT;
1468 Result := SybaseAPI.dbRetStatus(dbProc);
1471 function TZDBLibSybaseASE125PlainDriver.dbHasRetStat(dbProc: PDBPROCESS): Boolean;
1473 Result := SybaseAPI.dbHasRetStat(dbProc);
1476 function TZDBLibSybaseASE125PlainDriver.dbRetName(dbProc: PDBPROCESS; RetNum: DBINT): PAnsiChar;
1478 Result := SybaseAPI.dbRetName(dbProc, RetNum);
1481 function TZDBLibSybaseASE125PlainDriver.dbRetData(dbProc: PDBPROCESS; RetNum: DBINT): Pointer;
1483 Result := SybaseAPI.dbRetData(dbProc, RetNum);
1486 function TZDBLibSybaseASE125PlainDriver.dbRetLen(dbProc: PDBPROCESS; RetNum: DBINT): DBINT;
1488 Result := SybaseAPI.dbRetLen(dbProc, RetNum);
1491 function TZDBLibSybaseASE125PlainDriver.dbRetType(dbProc: PDBPROCESS; RetNum: DBINT): DBINT;
1493 Result := SybaseAPI.dbRetType(dbProc, RetNum);
1496 function TZDBLibSybaseASE125PlainDriver.dbrbuf(Proc: PDBPROCESS): DBINT;
1501 function TZDBLibSybaseASE125PlainDriver.dbdataready(Proc: PDBPROCESS): LongBool;
1503 Result := Proc <> nil;
1506 {TZDBLibMSSQL7PlainDriver}
1508 procedure TZDBLibMSSQL7PlainDriver.LoadApi;
1511 { ************** Load adresses of API Functions ************* }
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');
1554 OldMsSQLErrorHandle := DBLibAPI.dberrhandle(DbLibErrorHandle);
1555 OldMsSQLMessageHandle := DBLibAPI.dbmsghandle(DbLibMessageHandle);
1558 function TZDBLibMSSQL7PlainDriver.Clone: IZPlainDriver;
1560 Result := TZDBLibMSSQL7PlainDriver.Create;
1563 constructor TZDBLibMSSQL7PlainDriver.Create;
1566 Loader.AddLocation(NTWDBLIB_DLL_LOCATION);
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;
1600 destructor TZDBLibMSSQL7PlainDriver.Destroy;
1602 if Loader.Loaded then
1604 DbLibAPI.dberrhandle(DbLibErrorHandle);
1605 DbLibAPI.dbmsghandle(DbLibMessageHandle);
1612 procedure TZDBLibMSSQL7PlainDriver.LoadCodePages;
1614 AddmMSCodePages(Self);
1617 function TZDBLibMSSQL7PlainDriver.GetProtocol: string;
1622 function TZDBLibMSSQL7PlainDriver.GetDescription: string;
1624 Result := 'Native dblib driver for MS SQL 7+';
1627 function TZDBLibMSSQL7PlainDriver.dbsetlsecure(Login: PLOGINREC): RETCODE;
1629 Result := DBLibAPI.dbsetlname(Login, nil, Self.DBVariables.dbSetLoginRec[Z_SETSECURE]);
1632 function TZDBLibMSSQL7PlainDriver.dbcolbrowse(Proc: PDBPROCESS; Column: Integer): LongBool;
1634 Result := MsSQLAPI.dbcolbrowse(Proc, Column);
1637 function TZDBLibMSSQL7PlainDriver.dbDead(dbProc: PDBPROCESS): Boolean;
1639 Result := MsSQLAPI.dbDead(dbProc);
1642 procedure TZDBLibMSSQL7PlainDriver.dbLoginFree(Login: PLOGINREC);
1644 MsSQLAPI.dbfreelogin(Login);
1647 function TZDBLibMSSQL7PlainDriver.dbSetLCharSet(Login: PLOGINREC; CharsetName: PAnsiChar): RETCODE;
1652 function TZDBLibMSSQL7PlainDriver.dbsetmaxprocs(
1653 MaxProcs: SmallInt): RETCODE;
1655 Result := MsSQLAPI.dbsetmaxprocs(MaxProcs);
1658 function TZDBLibMSSQL7PlainDriver.dbSqlExecAsync(dbProc: PDBPROCESS): RETCODE;
1662 Result := DBLibAPI.dbsqlsend(dbProc);
1663 if Result = SUCCEED then begin
1664 lStartTick := {$IFDEF FPC}GetMsCount{$ELSE}GetTickCount{$ENDIF};
1667 until ({$IFDEF FPC}GetMsCount{$ELSE}GetTickCount{$ENDIF} > lStartTick + TIMEOUT_MAXIMUM * 1000) or
1668 (MsSQLAPI.dbdataready(dbProc) = TRUE);
1669 Result := DBLibAPI.dbsqlok(dbProc);
1673 function TZDBLibMSSQL7PlainDriver.dbSetOpt(dbProc: PDBPROCESS; Option: DBINT; Char_Param: PAnsiChar = nil; Int_Param: DBINT = -1): RETCODE;
1675 Result := MsSQLAPI.dbSetOpt(dbProc, Option, Char_Param);
1678 function TZDBLibMSSQL7PlainDriver.dbClose(dbProc: PDBPROCESS): RETCODE;
1680 Result := MsSQLAPI.dbClose(dbProc);
1683 function TZDBLibMSSQL7PlainDriver.dbDatLen(dbProc: PDBPROCESS; Column: DBINT): DBINT;
1685 Result := MsSQLAPI.dbDatLen(dbProc, Column);
1688 function TZDBLibMSSQL7PlainDriver.dbCount(dbProc: PDBPROCESS): DBINT;
1690 Result := MsSQLAPI.dbCount(dbProc);
1693 function TZDBLibMSSQL7PlainDriver.dbHasRetStat(dbProc: PDBPROCESS): Boolean;
1695 Result := MsSQLAPI.dbHasRetStat(dbProc);
1698 function TZDBLibMSSQL7PlainDriver.dbdataready(Proc: PDBPROCESS): LongBool;
1700 Result := MsSQLAPI.dbdataready(Proc);
1703 { TFreeTGDBasePlainDriver }
1705 { TZFreeTDSBasePlainDriver }
1707 procedure TZFreeTDSBasePlainDriver.LoadApi;
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');
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');
1778 @FreeTDSAPI.dbtds := GetAddress('dbtds');
1779 @FreeTDSAPI.dbtextsize := GetAddress('dbtextsize');
1780 @FreeTDSAPI.dbwillconvert := GetAddress('dbwillconvert');
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');
1794 OldFreeTDSErrorHandle := DBLibAPI.dberrhandle(DbLibErrorHandle);
1795 OldFreeTDSMessageHandle := DBLibAPI.dbmsghandle(DbLibMessageHandle);
1798 constructor TZFreeTDSBasePlainDriver.Create;
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;
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;
1887 destructor TZFreeTDSBasePlainDriver.Destroy;
1889 if Loader.Loaded then
1891 DBLibAPI.dberrhandle(OldFreeTDSErrorHandle);
1892 DBLibAPI.dbmsghandle(OldFreeTDSMessageHandle);
1898 function TZFreeTDSBasePlainDriver.GetProtocol: string;
1900 Result := 'FreeTDS';
1903 function TZFreeTDSBasePlainDriver.GetDescription: string;
1905 Result := 'Native FreeTDS driver for Sybase and MSSQL Servers';
1908 function TZFreeTDSBasePlainDriver.dbLogin: PLOGINREC;
1910 Result := inherited dbLogin;
1911 if not Assigned(Result) then
1912 if not (dbsetlversion(Result) = DBSUCCEED ) then
1914 dbloginfree(Result);
1919 function TZFreeTDSBasePlainDriver.dbSetLCharSet(Login: PLOGINREC; CharsetName: PAnsiChar): RETCODE;
1921 Result := DBLibAPI.dbsetlname(Login, CharsetName, DBVariables.dbSetLoginRec[Z_SETCHARSET]);
1924 function TZFreeTDSBasePlainDriver.dbSetLSecure(Login: PLOGINREC): RETCODE;
1926 Result := DBLibAPI.dbsetlname(Login, nil, DBVariables.dbSetLoginRec[Z_SETSECURE]);
1927 // Result := FreeTDSAPI.dbsetlbool(Login, 1, Self.DBVariables.dbSetLoginRec[Z_SETSECURE]);
1930 function TZFreeTDSBasePlainDriver.dbsetlversion(Login: PLOGINREC): RETCODE;
1932 Result := FreeTDSAPI.dbsetlversion(Login, TDSDBVERSION_UNKNOWN);
1935 function TZFreeTDSBasePlainDriver.dbsetversion: RETCODE;
1937 Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_UNKNOWN);
1940 procedure TZFreeTDSBasePlainDriver.tdsDumpOff;
1942 FreeTDSAPI.tdsdump_off();
1945 procedure TZFreeTDSBasePlainDriver.tdsDumpOn;
1947 FreeTDSAPI.tdsdump_on();
1950 procedure TZFreeTDSBasePlainDriver.tdsDump_Close;
1952 FreeTDSAPI.tdsdump_close();
1955 procedure TZFreeTDSBasePlainDriver.tdsDump_Open(const FileName: String);
1957 FreeTDSAPI.tdsdump_open(PAnsiChar( AnsiString(FileName) ));
1960 function TZFreeTDSBasePlainDriver.dbdataready(Proc: PDBPROCESS): LongBool;
1962 Result := Proc <> nil;
1965 procedure TZFreeTDSBasePlainDriver.dbfreelogin(Login: PLOGINREC);
1967 FreeTDSAPI.dbloginfree(Login);
1970 function TZFreeTDSBasePlainDriver.dbDead(dbProc: PDBPROCESS): Boolean;
1972 Result := FreeTDSAPI.dbDead(dbProc) = 1;
1975 procedure TZFreeTDSBasePlainDriver.dbLoginFree(Login: PLOGINREC);
1977 FreeTDSAPI.dbloginfree(Login);
1980 function TZFreeTDSBasePlainDriver.dbsetmaxprocs(
1981 MaxProcs: SmallInt): RETCODE;
1983 Result := FreeTDSAPI.dbsetmaxprocs(MaxProcs);
1986 function TZFreeTDSBasePlainDriver.dbSetOpt(dbProc: PDBPROCESS; Option: Integer; Char_Param: PAnsiChar = nil; Int_Param: Integer = -1): RETCODE;
1988 Result := FreeTDSAPI.dbSetOpt(dbProc, Option, Char_Param, Int_Param);
1991 function TZFreeTDSBasePlainDriver.dbSetTime(queryTime: Integer): RETCODE;
1993 Result := FreeTDSAPI.dbsetmaxprocs(queryTime);
1996 function TZFreeTDSBasePlainDriver.dbClose(dbProc: PDBPROCESS): RETCODE;
1998 FreeTDSAPI.dbClose(dbProc);
2002 function TZFreeTDSBasePlainDriver.dbDatLen(dbProc: PDBPROCESS; Column: Integer): Integer;
2004 Result := FreeTDSAPI.dbDatLen(dbProc, Column);
2007 function TZFreeTDSBasePlainDriver.dbCount(dbProc: PDBPROCESS): Integer;
2009 Result := FreeTDSAPI.dbCount(dbProc);
2012 function TZFreeTDSBasePlainDriver.dbcolbrowse(Proc: PDBPROCESS; Column: Integer): LongBool;
2014 Result := FreeTDSAPI.dbcolbrowse(Proc, Column) <> 0;
2017 function TZFreeTDSBasePlainDriver.dbHasRetStat(dbProc: PDBPROCESS): Boolean;
2019 if Assigned(FreeTDSAPI.dbHasRetStat) then
2020 Result := FreeTDSAPI.dbHasRetStat(dbProc) <> 0
2025 function TZFreeTDSBasePlainDriver.dbColInfo(dbProc: PDBPROCESS;
2026 Column: Integer; var ADBInfo: DBCOL): RETCODE;
2028 FillChar(ADBInfo, SizeOf(DBCol), #0);
2029 ADBInfo.SizeOfStruct := SizeOf(DBCol);
2030 Result := FreeTDSAPI.dbcolinfo(dbProc, CI_REGULAR, Column, 0, @ADBInfo);
2033 { TZFreeTDS42MsSQLPlainDriver }
2034 function TZFreeTDS42MsSQLPlainDriver.Clone: IZPlainDriver;
2036 Result := TZFreeTDS42MsSQLPlainDriver.Create;
2039 procedure TZFreeTDS42MsSQLPlainDriver.LoadCodePages;
2041 AddmMSCodePages(Self);
2044 constructor TZFreeTDS42MsSQLPlainDriver.Create;
2048 FLoader.AddLocation(FREETDS_MSSQL_WINDOWS_DLL_LOCATION);
2051 FLoader.AddLocation(FREETDS_LINUX_DLL_LOCATION);
2053 FLoader.AddLocation(FREETDS_OSX_DLL_LOCATION);
2059 function TZFreeTDS42MsSQLPlainDriver.GetProtocol: string;
2061 Result := 'FreeTDS_MsSQL<=6.5';
2064 function TZFreeTDS42MsSQLPlainDriver.GetDescription: string;
2066 Result := 'FreeTDS 4.2 protocol for MsSQL <=6.5 Servers';
2069 function TZFreeTDS42MsSQLPlainDriver.dbsetlversion(Login: PLOGINREC): RETCODE;
2071 Result := FreeTDSAPI.dbsetlversion(Login, DBVERSION_42);
2074 function TZFreeTDS42MsSQLPlainDriver.dbsetversion: RETCODE;
2076 Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_42);
2079 { TZFreeTDS42SybasePlainDriver }
2080 function TZFreeTDS42SybasePlainDriver.Clone: IZPlainDriver;
2082 Result := TZFreeTDS42SybasePlainDriver.Create;
2085 procedure TZFreeTDS42SybasePlainDriver.LoadCodePages;
2087 AddCodePage('Not implemented!', -1);
2088 { TODO -oEgonHugeist : Must be completed!!!! }
2091 constructor TZFreeTDS42SybasePlainDriver.Create;
2095 FLoader.AddLocation(FREETDS_SYBASE_WINDOWS_DLL_LOCATION);
2098 FLoader.AddLocation(FREETDS_LINUX_DLL_LOCATION);
2100 FLoader.AddLocation(FREETDS_OSX_DLL_LOCATION);
2105 function TZFreeTDS42SybasePlainDriver.GetProtocol: string;
2107 Result := 'FreeTDS_Sybase<10';
2110 function TZFreeTDS42SybasePlainDriver.GetDescription: string;
2112 Result := 'FreeTDS 4.2 protocol for Sybase <10 Servers';
2115 function TZFreeTDS42SybasePlainDriver.dbsetlversion(Login: PLOGINREC): RETCODE;
2117 Result := DBSUCCEED;
2120 function TZFreeTDS42SybasePlainDriver.dbsetversion: RETCODE;
2122 Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_42);
2125 { TZFreeTDS50PlainDriver }
2126 function TZFreeTDS50PlainDriver.Clone: IZPlainDriver;
2128 Result := TZFreeTDS50PlainDriver.Create;
2131 procedure TZFreeTDS50PlainDriver.LoadCodePages;
2133 AddSybaseCodePages(Self);
2136 constructor TZFreeTDS50PlainDriver.Create;
2142 function TZFreeTDS50PlainDriver.GetProtocol: string;
2144 Result := 'FreeTDS_Sybase-10+';
2147 function TZFreeTDS50PlainDriver.GetDescription: string;
2149 Result := 'FreeTDS 5.0 Protocol for Sybase >= 10 Servers ';
2152 function TZFreeTDS50PlainDriver.dbsetversion: RETCODE;
2154 Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_46);
2157 { TZFreeTDS70PlainDriver }
2158 function TZFreeTDS70PlainDriver.Clone: IZPlainDriver;
2160 Result := TZFreeTDS70PlainDriver.Create;
2163 procedure TZFreeTDS70PlainDriver.LoadCodePages;
2168 function TZFreeTDS70PlainDriver.GetProtocol: string;
2170 Result := 'FreeTDS_MsSQL-7.0';
2173 function TZFreeTDS70PlainDriver.dbsetlversion(Login: PLOGINREC): RETCODE;
2175 Result := FreeTDSAPI.dbsetlversion(Login, DBVERSION_70);
2178 function TZFreeTDS70PlainDriver.GetDescription: string;
2180 Result := 'FreeTDS 7.0 Protocol for MsSQL 7.0 Servers';
2183 function TZFreeTDS70PlainDriver.dbsetversion: RETCODE;
2185 Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_70);
2188 { TZFreeTDS71PlainDriver }
2189 function TZFreeTDS71PlainDriver.Clone: IZPlainDriver;
2191 Result := TZFreeTDS71PlainDriver.Create;
2194 procedure TZFreeTDS71PlainDriver.LoadCodePages;
2199 function TZFreeTDS71PlainDriver.GetProtocol: string;
2201 Result := 'FreeTDS_MsSQL-2000';
2204 function TZFreeTDS71PlainDriver.GetDescription: string;
2206 Result := 'FreeTDS 7.1 Protocol for MsSQL 2000 Servers';
2209 function TZFreeTDS71PlainDriver.dbsetversion: RETCODE;
2211 Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_70);
2214 { TZFreeTDS72PlainDriver }
2215 function TZFreeTDS72PlainDriver.Clone: IZPlainDriver;
2217 Result := TZFreeTDS72PlainDriver.Create;
2220 procedure TZFreeTDS72PlainDriver.LoadCodePages;
2225 function TZFreeTDS72PlainDriver.GetProtocol: string;
2227 Result := 'FreeTDS_MsSQL>=2005';
2230 function TZFreeTDS72PlainDriver.GetDescription: string;
2232 Result := 'FreeTDS 7.2 Protocol for MsSQL 2005, 2008, 2012 Servers';
2235 function TZFreeTDS72PlainDriver.dbsetversion: RETCODE;
2237 Result := FreeTDSAPI.dbsetversion(TDSDBVERSION_72);
2241 SQLErrors := TList.Create;
2242 SQLMessages := TList.Create;
2244 //Free any record in the list if any
2245 while SQLErrors.Count > 0 do
2247 Dispose(SQLErrors.Items[0]);
2248 SQLErrors.Delete(0);
2250 if SQLErrors <> nil then
2251 FreeAndNil(SQLErrors);
2253 //Free any record in the list if any
2254 while SQLMessages.Count > 0 do
2256 Dispose(SQLMessages.Items[0]);
2257 SQLMessages.Delete(0);
2259 if SQLMessages <> nil then
2260 FreeAndNil(SQLMessages);