00001 {*********************************************************}
00002 { }
00003 { Zeos Database Objects }
00004 { Delphi plain driver interface to DBLibrary }
00005 { }
00006 { Originally written by Janos Fegyverneki }
00007 { }
00008 {*********************************************************}
00009
00010 {@********************************************************}
00011 { Copyright (c) 1999-2006 Zeos Development Group }
00012 { }
00013 { License Agreement: }
00014 { }
00015 { This library is distributed in the hope that it will be }
00016 { useful, but WITHOUT ANY WARRANTY; without even the }
00017 { implied warranty of MERCHANTABILITY or FITNESS FOR }
00018 { A PARTICULAR PURPOSE. See the GNU Lesser General }
00019 { Public License for more details. }
00020 { }
00021 { The source code of the ZEOS Libraries and packages are }
00022 { distributed under the Library GNU General Public }
00023 { License (see the file COPYING / COPYING.ZEOS) }
00024 { with the following modification: }
00025 { As a special exception, the copyright holders of this }
00026 { library give you permission to link this library with }
00027 { independent modules to produce an executable, }
00028 { regardless of the license terms of these independent }
00029 { modules, and to copy and distribute the resulting }
00030 { executable under terms of your choice, provided that }
00031 { you also meet, for each linked independent module, }
00032 { the terms and conditions of the license of that module. }
00033 { An independent module is a module which is not derived }
00034 { from or based on this library. If you modify this }
00035 { library, you may extend this exception to your version }
00036 { of the library, but you are not obligated to do so. }
00037 { If you do not wish to do so, delete this exception }
00038 { statement from your version. }
00039 { }
00040 { }
00041 { The project web site is located on: }
00042 { http:
00043 { http:
00044 { svn:
00045 { }
00046 { http:
00047 { http:
00048 { }
00049 { }
00050 { }
00051 { Zeos Development Group. }
00052 {********************************************************@}
00053
00054 unit ZPlainDbLibDriver;
00055
00056 interface
00057
00058 {$I ZPlain.inc}
00059
00060 uses Classes, ZClasses, ZCompatibility, ZPlainDriver;
00061
00062 {***************** Plain API Constants definition ****************}
00063
00064 const
00065 { General #define }
00066 TIMEOUT_IGNORE = Cardinal(-1);
00067 TIMEOUT_INFINITE = 0;
00068 TIMEOUT_MAXIMUM = 1200; { 20 minutes maximum timeout value }
00069
00070 { Used for ServerType in dbgetprocinfo }
00071 SERVTYPE_UNKNOWN = 0;
00072 SERVTYPE_MICROSOFT = 1;
00073
00074 { Used by dbcolinfo }
00075 {enum CI_TYPES }
00076 CI_REGULAR = 1;
00077 CI_ALTERNATE = 2;
00078 CI_CURSOR = 3;
00079
00080 { Bulk Copy Definitions (bcp) }
00081 DB_IN = 1; { Transfer from client to server }
00082 DB_OUT = 2; { Transfer from server to client }
00083
00084 BCPMAXERRS = 1; { bcp_control parameter }
00085 BCPFIRST = 2; { bcp_control parameter }
00086 BCPLAST = 3; { bcp_control parameter }
00087 BCPBATCH = 4; { bcp_control parameter }
00088 BCPKEEPNULLS = 5; { bcp_control parameter }
00089 BCPABORT = 6; { bcp_control parameter }
00090
00091 TINYBIND = 1;
00092 SMALLBIND = 2;
00093 INTBIND = 3;
00094 CHARBIND = 4;
00095 BINARYBIND = 5;
00096 BITBIND = 6;
00097 DATETIMEBIND = 7;
00098 MONEYBIND = 8;
00099 FLT8BIND = 9;
00100 STRINGBIND = 10;
00101 NTBSTRINGBIND = 11;
00102 VARYCHARBIND = 12;
00103 VARYBINBIND = 13;
00104 FLT4BIND = 14;
00105 SMALLMONEYBIND = 15;
00106 SMALLDATETIBIND = 16;
00107 DECIMALBIND = 17;
00108 NUMERICBIND = 18;
00109 SRCDECIMALBIND = 19;
00110 SRCNUMERICBIND = 20;
00111 MAXBIND = SRCNUMERICBIND;
00112
00113 DBSAVE = 1;
00114 DBNOSAVE = 0;
00115
00116 DBNOERR = -1;
00117 DBFAIL = 0;
00118 DBSUCCEED = 1;
00119 DBFINDONE = $04; { Definately done }
00120 DBMORE = $10; { Maybe more commands waiting }
00121 DBMORE_ROWS = $20; { This command returned rows }
00122
00123 MAXNAME = 31;
00124 DBTXTSLEN = 8; { Timestamp length }
00125 DBTXPLEN = 16; { Text pointer length }
00126
00127 { Error code returns }
00128 INT_EXIT = 0;
00129 INT_CONTINUE = 1;
00130 INT_CANCEL = 2;
00131
00132 { dboptions }
00133 DBBUFFER = 0;
00134 DBOFFSET = 1;
00135 DBROWCOUNT = 2;
00136 DBSTAT = 3;
00137 DBTEXTLIMIT = 4;
00138 DBTEXTSIZE = 5;
00139 DBARITHABORT = 6;
00140 DBARITHIGNORE = 7;
00141 DBNOAUTOFREE = 8;
00142 DBNOCOUNT = 9;
00143 DBNOEXEC = 10;
00144 DBPARSEONLY = 11;
00145 DBSHOWPLAN = 12;
00146 DBSTORPROCID = 13;
00147 DBANSITOOEM = 14;
00148 DBOEMTOANSI = 15;
00149 DBCLIENTCURSORS = 16;
00150 DBSET_TIME = 17;
00151 DBQUOTEDIDENT = 18;
00152
00153 { Data Type Tokens }
00154 SQLVOID = $1f;
00155 SQLTEXT = $23;
00156 SQLVARBINARY = $25;
00157 SQLINTN = $26;
00158 SQLVARCHAR = $27;
00159 SQLBINARY = $2d;
00160 SQLIMAGE = $22;
00161 SQLCHAR = $2f;
00162 SQLINT1 = $30;
00163 SQLBIT = $32;
00164 SQLINT2 = $34;
00165 SQLINT4 = $38;
00166 SQLMONEY = $3c;
00167 SQLDATETIME = $3d;
00168 SQLFLT8 = $3e;
00169 SQLFLTN = $6d;
00170 SQLMONEYN = $6e;
00171 SQLDATETIMN = $6f;
00172 SQLFLT4 = $3b;
00173 SQLMONEY4 = $7a;
00174 SQLDATETIM4 = $3a;
00175 SQLDECIMAL = $6a;
00176 SQLNUMERIC = $6c;
00177
00178 { Data stream tokens }
00179 SQLCOLFMT = $a1;
00180 OLD_SQLCOLFMT = $2a;
00181 SQLPROCID = $7c;
00182 SQLCOLNAME = $a0;
00183 SQLTABNAME = $a4;
00184 SQLCOLINFO = $a5;
00185 SQLALTNAME = $a7;
00186 SQLALTFMT = $a8;
00187 SQLERROR = $aa;
00188 SQLINFO = $ab;
00189 SQLRETURNVALUE = $ac;
00190 SQLRETURNSTATUS = $79;
00191 SQLRETURN = $db;
00192 SQLCONTROL = $ae;
00193 SQLALTCONTROL = $af;
00194 SQLROW = $d1;
00195 SQLALTROW = $d3;
00196 SQLDONE = $fd;
00197 SQLDONEPROC = $fe;
00198 SQLDONEINPROC = $ff;
00199 SQLOFFSET = $78;
00200 SQLORDER = $a9;
00201 SQLLOGINACK = $ad; { NOTICE: change to real value }
00202
00203 { Ag op tokens }
00204 SQLAOPCNT = $4b;
00205 SQLAOPSUM = $4d;
00206 SQLAOPAVG = $4f;
00207 SQLAOPMIN = $51;
00208 SQLAOPMAX = $52;
00209 SQLAOPANY = $53;
00210 SQLAOPNOOP = $56;
00211
00212 { Error numbers (dberrs) DB-Library error codes }
00213 SQLEMEM = 10000;
00214 SQLENULL = 10001;
00215 SQLENLOG = 10002;
00216 SQLEPWD = 10003;
00217 SQLECONN = 10004;
00218 SQLEDDNE = 10005;
00219 SQLENULLO = 10006;
00220 SQLESMSG = 10007;
00221 SQLEBTOK = 10008;
00222 SQLENSPE = 10009;
00223 SQLEREAD = 10010;
00224 SQLECNOR = 10011;
00225 SQLETSIT = 10012;
00226 SQLEPARM = 10013;
00227 SQLEAUTN = 10014;
00228 SQLECOFL = 10015;
00229 SQLERDCN = 10016;
00230 SQLEICN = 10017;
00231 SQLECLOS = 10018;
00232 SQLENTXT = 10019;
00233 SQLEDNTI = 10020;
00234 SQLETMTD = 10021;
00235 SQLEASEC = 10022;
00236 SQLENTLL = 10023;
00237 SQLETIME = 10024;
00238 SQLEWRIT = 10025;
00239 SQLEMODE = 10026;
00240 SQLEOOB = 10027;
00241 SQLEITIM = 10028;
00242 SQLEDBPS = 10029;
00243 SQLEIOPT = 10030;
00244 SQLEASNL = 10031;
00245 SQLEASUL = 10032;
00246 SQLENPRM = 10033;
00247 SQLEDBOP = 10034;
00248 SQLENSIP = 10035;
00249 SQLECNULL = 10036;
00250 SQLESEOF = 10037;
00251 SQLERPND = 10038;
00252 SQLECSYN = 10039;
00253 SQLENONET = 10040;
00254 SQLEBTYP = 10041;
00255 SQLEABNC = 10042;
00256 SQLEABMT = 10043;
00257 SQLEABNP = 10044;
00258 SQLEBNCR = 10045;
00259 SQLEAAMT = 10046;
00260 SQLENXID = 10047;
00261 SQLEIFNB = 10048;
00262 SQLEKBCO = 10049;
00263 SQLEBBCI = 10050;
00264 SQLEKBCI = 10051;
00265 SQLEBCWE = 10052;
00266 SQLEBCNN = 10053;
00267 SQLEBCOR = 10054;
00268 SQLEBCPI = 10055;
00269 SQLEBCPN = 10056;
00270 SQLEBCPB = 10057;
00271 SQLEVDPT = 10058;
00272 SQLEBIVI = 10059;
00273 SQLEBCBC = 10060;
00274 SQLEBCFO = 10061;
00275 SQLEBCVH = 10062;
00276 SQLEBCUO = 10063;
00277 SQLEBUOE = 10064;
00278 SQLEBWEF = 10065;
00279 SQLEBTMT = 10066;
00280 SQLEBEOF = 10067;
00281 SQLEBCSI = 10068;
00282 SQLEPNUL = 10069;
00283 SQLEBSKERR = 10070;
00284 SQLEBDIO = 10071;
00285 SQLEBCNT = 10072;
00286 SQLEMDBP = 10073;
00287 SQLINIT = 10074;
00288 SQLCRSINV = 10075;
00289 SQLCRSCMD = 10076;
00290 SQLCRSNOIND = 10077;
00291 SQLCRSDIS = 10078;
00292 SQLCRSAGR = 10079;
00293 SQLCRSORD = 10080;
00294 SQLCRSMEM = 10081;
00295 SQLCRSBSKEY = 10082;
00296 SQLCRSNORES = 10083;
00297 SQLCRSVIEW = 10084;
00298 SQLCRSBUFR = 10085;
00299 SQLCRSFROWN = 10086;
00300 SQLCRSBROL = 10087;
00301 SQLCRSFRAND = 10088;
00302 SQLCRSFLAST = 10089;
00303 SQLCRSRO = 10090;
00304 SQLCRSTAB = 10091;
00305 SQLCRSUPDTAB = 10092;
00306 SQLCRSUPDNB = 10093;
00307 SQLCRSVIIND = 10094;
00308 SQLCRSNOUPD = 10095;
00309 SQLCRSOS2 = 10096;
00310 SQLEBCSA = 10097;
00311 SQLEBCRO = 10098;
00312 SQLEBCNE = 10099;
00313 SQLEBCSK = 10100;
00314 SQLEUVBF = 10101;
00315 SQLEBIHC = 10102;
00316 SQLEBWFF = 10103;
00317 SQLNUMVAL = 10104;
00318 SQLEOLDVR = 10105;
00319 SQLEBCPS = 10106;
00320 SQLEDTC = 10107;
00321 SQLENOTIMPL = 10108;
00322 SQLENONFLOAT = 10109;
00323 SQLECONNFB = 10110;
00324
00325 { The severity levels are defined here }
00326 EXINFO = 1; { Informational, non-error }
00327 EXUSER = 2; { User error }
00328 EXNONFATAL = 3; { Non-fatal error }
00329 EXCONVERSION = 4; { Error in DB-LIBRARY data conversion }
00330 EXSERVER = 5; { The Server has returned an error flag }
00331 EXTIME = 6; { We have exceeded our timeout period while }
00332 { waiting for a response from the Server - the }
00333 { DBPROCESS is still alive }
00334 EXPROGRAM = 7; { Coding error in user program }
00335 EXRESOURCE = 8; { Running out of resources - the DBPROCESS may be dead }
00336 EXCOMM = 9; { Failure in communication with Server - the DBPROCESS is dead }
00337 EXFATAL = 10; { Fatal error - the DBPROCESS is dead }
00338 EXCONSISTENCY = 11; { Internal software error - notify MS Technical Supprt }
00339
00340 { Offset identifiers }
00341 OFF_SELECT = $16d;
00342 OFF_FROM = $14f;
00343 OFF_ORDER = $165;
00344 OFF_COMPUTE = $139;
00345 OFF_TABLE = $173;
00346 OFF_PROCEDURE = $16a;
00347 OFF_STATEMENT = $1cb;
00348 OFF_PARAM = $1c4;
00349 OFF_EXEC = $12c;
00350
00351 { Decimal constants }
00352 MAXNUMERICLEN = 16;
00353 MAXNUMERICDIG = 38;
00354
00355 DEFAULTPRECISION = 18;
00356 DEFAULTSCALE = 0;
00357
00358 { Print lengths for certain fixed length data types }
00359 PRINT4 = 11;
00360 PRINT2 = 6;
00361 PRINT1 = 3;
00362 PRFLT8 = 20;
00363 PRMONEY = 26;
00364 PRBIT = 3;
00365 PRDATETIME = 27;
00366 PRDECIMAL = (MAXNUMERICDIG + 2);
00367 PRNUMERIC = (MAXNUMERICDIG + 2);
00368
00369 SUCCEED = 1;
00370 FAIL = 0;
00371 SUCCEED_ABORT = 2;
00372
00373 DBUNKNOWN = 2;
00374
00375 MORE_ROWS = -1;
00376 NO_MORE_ROWS = -2;
00377 REG_ROW = MORE_ROWS;
00378 BUF_FULL = -3;
00379
00380 { Status code for dbresults(). Possible return values are }
00381 { SUCCEED, FAIL, and NO_MORE_RESULTS. }
00382 NO_MORE_RESULTS = 2;
00383 NO_MORE_RPC_RESULTS = 3;
00384
00385 { Standard exit and error values }
00386 STDEXIT = 0;
00387 ERREXIT = -1;
00388
00389 { dbrpcinit flags }
00390 DBRPCRECOMPILE = $0001;
00391 DBRPCRESET = $0004;
00392 DBRPCCURSOR = $0008;
00393
00394 { dbrpcparam flags }
00395 DBRPCRETURN = $1;
00396 DBRPCDEFAULT = $2;
00397
00398 { Cursor related constants }
00399
00400 { Following flags are used in the concuropt parameter in the dbcursoropen function }
00401 CUR_READONLY = 1; { Read only cursor, no data modifications }
00402 CUR_LOCKCC = 2; { Intent to update, all fetched data locked when }
00403 { dbcursorfetch is called inside a transaction block }
00404 CUR_OPTCC = 3; { Optimistic concurrency control, data modifications }
00405 { succeed only if the row hasn't been updated since }
00406 { the last fetch. }
00407 CUR_OPTCCVAL = 4; { Optimistic concurrency control based on selected column values }
00408
00409 { Following flags are used in the scrollopt parameter in dbcursoropen }
00410 CUR_FORWARD = 0; { Forward only scrolling }
00411 CUR_KEYSET = -1; { Keyset driven scrolling }
00412 CUR_DYNAMIC = 1; { Fully dynamic }
00413 CUR_INSENSITIVE = -2; { Server-side cursors only }
00414
00415 { Following flags define the fetchtype in the dbcursorfetch function }
00416 FETCH_FIRST = 1; { Fetch first n rows }
00417 FETCH_NEXT = 2; { Fetch next n rows }
00418 FETCH_PREV = 3; { Fetch previous n rows }
00419 FETCH_RANDOM = 4; { Fetch n rows beginning with given row # }
00420 FETCH_RELATIVE = 5; { Fetch relative to previous fetch row # }
00421 FETCH_LAST = 6; { Fetch the last n rows }
00422
00423 { Following flags define the per row status as filled by dbcursorfetch and/or dbcursorfetchex }
00424 FTC_EMPTY = $00; { No row available }
00425 FTC_SUCCEED = $01; { Fetch succeeded, (failed if not set) }
00426 FTC_MISSING = $02; { The row is missing }
00427 FTC_ENDOFKEYSET = $04; { End of the keyset reached }
00428 FTC_ENDOFRESULTS = $08; { End of results set reached }
00429
00430 { Following flags define the operator types for the dbcursor function }
00431 CRS_UPDATE = 1; { Update operation }
00432 CRS_DELETE = 2; { Delete operation }
00433 CRS_INSERT = 3; { Insert operation }
00434 CRS_REFRESH = 4; { Refetch given row }
00435 CRS_LOCKCC = 5; { Lock given row }
00436
00437 { Following value can be passed to the dbcursorbind function for NOBIND type }
00438 NOBIND = -2; { Return length and pointer to data }
00439
00440 { Following are values used by DBCURSORINFO's Type parameter }
00441 CU_CLIENT = $00000001;
00442 CU_SERVER = $00000002;
00443 CU_KEYSET = $00000004;
00444 CU_MIXED = $00000008;
00445 CU_DYNAMIC = $00000010;
00446 CU_FORWARD = $00000020;
00447 CU_INSENSITIVE = $00000040;
00448 CU_READONLY = $00000080;
00449 CU_LOCKCC = $00000100;
00450 CU_OPTCC = $00000200;
00451 CU_OPTCCVAL = $00000400;
00452
00453 { Following are values used by DBCURSORINFO's Status parameter }
00454 CU_FILLING = $00000001;
00455 CU_FILLED = $00000002;
00456
00457 { Following are values used by dbupdatetext's type parameter }
00458 UT_TEXTPTR = $0001;
00459 UT_TEXT = $0002;
00460 UT_MORETEXT = $0004;
00461 UT_DELETEONLY = $0008;
00462 UT_LOG = $0010;
00463
00464 { The following values are passed to dbserverenum for searching criteria. }
00465 NET_SEARCH = $0001;
00466 LOC_SEARCH = $0002;
00467
00468 { These constants are the possible return values from dbserverenum. }
00469 ENUM_SUCCESS = $0000;
00470 MORE_DATA = $0001;
00471 NET_NOT_AVAIL = $0002;
00472 OUT_OF_MEMORY = $0004;
00473 NOT_SUPPORTED = $0008;
00474 ENUM_INVALID_PARAM = $0010;
00475
00476 { Netlib Error problem codes. ConnectionError() should return one of }
00477 { these as the dblib-mapped problem code, so the corresponding string }
00478 { is sent to the dblib app's error handler as dberrstr. Return NE_E_NOMAP }
00479 { for a generic DB-Library error string (as in prior versions of dblib). }
00480
00481 NE_E_NOMAP = 0; { No string; uses dblib default. }
00482 NE_E_NOMEMORY = 1; { Insufficient memory. }
00483 NE_E_NOACCESS = 2; { Access denied. }
00484 NE_E_CONNBUSY = 3; { Connection is busy. }
00485 NE_E_CONNBROKEN = 4; { Connection broken. }
00486 NE_E_TOOMANYCONN = 5; { Connection limit exceeded. }
00487 NE_E_SERVERNOTFOUND = 6; { Specified SQL server not found. }
00488 NE_E_NETNOTSTARTED = 7; { The network has not been started. }
00489 NE_E_NORESOURCE = 8; { Insufficient network resources. }
00490 NE_E_NETBUSY = 9; { Network is busy. }
00491 NE_E_NONETACCESS = 10; { Network access denied. }
00492 NE_E_GENERAL = 11; { General network error. Check your documentation. }
00493 NE_E_CONNMODE = 12; { Incorrect connection mode. }
00494 NE_E_NAMENOTFOUND = 13; { Name not found in directory service. }
00495 NE_E_INVALIDCONN = 14; { Invalid connection. }
00496 NE_E_NETDATAERR = 15; { Error reading or writing network data. }
00497 NE_E_TOOMANYFILES = 16; { Too many open file handles. }
00498 NE_E_CANTCONNECT = 17; { SQL Server does not exist or access denied. }
00499
00500 NE_MAX_NETERROR = 17;
00501
00502
00503 { DB-Library datatype definitions }
00504 const
00505 DBMAXCHAR = 256; { Max length of DBVARBINARY and DBVARCHAR, etc. }
00506
00507 const
00508 { Pack the following structures on a word boundary }
00509 MAXCOLNAMELEN = 30;
00510 MAXTABLENAME = 30;
00511
00512 const
00513 MAXSERVERNAME = 30;
00514 MAXNETLIBNAME = 255;
00515 MAXNETLIBCONNSTR = 255;
00516
00517 const
00518 INVALID_UROWNUM = Cardinal(-1);
00519
00520
00521 {****************** Plain API Types definition *****************}
00522 type
00523 { DBPROCESS, LOGINREC and DBCURSOR }
00524 PDBPROCESS = Pointer;
00525 PLOGINREC = Pointer;
00526 PDBCURSOR = Pointer;
00527 PDBHANDLE = Pointer;
00528
00529 type
00530 RETCODE = Integer;
00531 STATUS = Integer;
00532
00533 { DB-Library datatypes }
00534 DBCHAR = Char;
00535 DBBINARY = Byte;
00536 DBTINYINT = Byte;
00537 DBSMALLINT = SmallInt;
00538 DBUSMALLINT = Word;
00539 DBINT = LongInt;
00540 DBFLT8 = Double;
00541 DBBIT = Byte;
00542 DBBOOL = Byte;
00543 DBFLT4 = Single;
00544 DBMONEY4 = LongInt;
00545
00546 DBREAL = DBFLT4;
00547 DBUBOOL = Cardinal;
00548
00549 DBDATETIM4 = packed record
00550 numdays: Word; { No of days since Jan-1-1900 }
00551 nummins: Word; { No. of minutes since midnight }
00552 end;
00553 PDBDATETIM4 = ^DBDATETIM4;
00554
00555 DBVARYCHAR = packed record
00556 Len: DBSMALLINT;
00557 Str: array[0..DBMAXCHAR-1] of DBCHAR;
00558 end;
00559
00560 DBVARYBIN = packed record
00561 Len: DBSMALLINT;
00562 Bytes: array[0..DBMAXCHAR-1] of Byte;
00563 end;
00564
00565 DBMONEY = packed record
00566 mnyhigh: DBINT;
00567 mnylow: Cardinal;
00568 end;
00569
00570 DBDATETIME = packed record
00571 dtdays: DBINT; // Days since Jan 1, 1900
00572 dttime: Cardinal; // 300ths of a second since midnight, 25920000 unit is 1 day
00573 end;
00574 PDBDATETIME = ^DBDATETIME;
00575
00576 { DBDATEREC structure used by dbdatecrack }
00577 DBDATEREC = packed record
00578 year: Integer; { 1753 - 9999 }
00579 quarter: Integer; { 1 - 4 }
00580 month: Integer; { 1 - 12 }
00581 dayofyear: Integer; { 1 - 366 }
00582 day: Integer; { 1 - 31 }
00583 week: Integer; { 1 - 54 (for leap years) }
00584 weekday: Integer; { 1 - 7 (Mon - Sun) }
00585 hour: Integer; { 0 - 23 }
00586 minute: Integer; { 0 - 59 }
00587 second: Integer; { 0 - 59 }
00588 millisecond: Integer; { 0 - 999 }
00589 end;
00590 PDBDATEREC = ^DBDATEREC;
00591
00592 type
00593 DBNUMERIC = packed record
00594 Precision: Byte;
00595 Scale: Byte;
00596 Sign: Byte; { 1 = Positive, 0 = Negative }
00597 Val: array[0..MAXNUMERICLEN-1] of Byte;
00598 end;
00599
00600 DBDECIMAL = DBNUMERIC;
00601
00602
00603
00604 type
00605 { TODO -ofjanos -cAPI :
00606 Strange but I had to insert X1 and X2 into the structure to make it work.
00607 I have not find any reason for this yet. }
00608 DBCOL = packed record
00609 SizeOfStruct: DBINT;
00610 Name: array[0..MAXCOLNAMELEN] of Char;
00611 ActualName: array[0..MAXCOLNAMELEN] of Char;
00612 TableName: array[0..MAXTABLENAME] of Char;
00613 X1: Byte;
00614 Typ: SmallInt;
00615 UserType: DBINT;
00616 MaxLength: DBINT;
00617 Precision: Byte;
00618 Scale: Byte;
00619 VarLength: LongBool;{ TRUE, FALSE }
00620 Null: Byte; { TRUE, FALSE or DBUNKNOWN }
00621 CaseSensitive: Byte; { TRUE, FALSE or DBUNKNOWN }
00622 Updatable: Byte; { TRUE, FALSE or DBUNKNOWN }
00623 Identity: LongBool;{ TRUE, FALSE }
00624 X2: Byte;
00625 end;
00626 PDBCOL = ^DBCOL;
00627
00628
00629 type
00630 DBPROC_INFO = packed record
00631 SizeOfStruct: DBINT;
00632 ServerType: Byte;
00633 ServerMajor: Word;
00634 ServerMinor: Word;
00635 ServerRevision: Word;
00636 ServerName: array[0..MAXSERVERNAME] of Char;
00637 NetLibName: array[0..MAXNETLIBNAME] of Char;
00638 NetLibConnStr: array[0..MAXNETLIBCONNSTR] of Char;
00639 end;
00640 PDBPROCINFO = ^DBPROC_INFO;
00641
00642 DBCURSOR_INFO = packed record
00643 SizeOfStruct: DBINT; { Use sizeof(DBCURSORINFO) }
00644 TotCols: Cardinal; { Total Columns in cursor }
00645 TotRows: Cardinal; { Total Rows in cursor }
00646 CurRow: Cardinal; { Current actual row in server }
00647 TotRowsFetched: Cardinal; { Total rows actually fetched }
00648 CurType: Cardinal; { See CU_... }
00649 Status: Cardinal; { See CU_... }
00650 end;
00651 PDBCURSORINFO = ^DBCURSOR_INFO;
00652
00653 type
00654 { Pointer Datatypes }
00655 PDBINT = ^DBINT;
00656 PDBBINARY = ^DBBINARY;
00657
00658 type
00659 PDBLibError = ^TDBLibError;
00660 TDBLibError = record
00661 dbProc: PDBPROCESS;
00662 Severity: Integer;
00663 DbErr: Integer;
00664 OsErr: Integer;
00665 DbErrStr: string;
00666 OsErrStr: string;
00667 end;
00668
00669 PDBLibMessage = ^TDBLibMessage;
00670 TDBLibMessage = record
00671 dbProc: PDBPROCESS;
00672 MsgNo: DBINT;
00673 MsgState: Integer;
00674 Severity: Integer;
00675 MsgText: string;
00676 SrvName: string;
00677 ProcName: string;
00678 Line: DBUSMALLINT;
00679 end;
00680
00681 type
00682 {** Represents a generic interface to DBLIB native API. }
00683 IZDBLibPlainDriver = interface (IZPlainDriver)
00684 ['{7731C3B4-0608-4B6B-B089-240AC43A3463}']
00685
00686 procedure CheckError;
00687
00688 function dbDead(dbProc: PDBPROCESS): Boolean;
00689 function dbLogin: PLOGINREC;
00690 procedure dbLoginFree(Login: PLOGINREC);
00691 function dbSetLoginTime(Seconds: Integer): RETCODE;
00692 function dbsetLName(Login: PLOGINREC; Value: PChar; Item: Integer): RETCODE;
00693 function dbSetLHost(Login: PLOGINREC; HostName: PChar): RETCODE;
00694 function dbSetLUser(Login: PLOGINREC; UserName: PChar): RETCODE;
00695 function dbSetLPwd(Login: PLOGINREC; Password: PChar): RETCODE;
00696 function dbSetLApp(Login: PLOGINREC; AppName: PChar): RETCODE;
00697 function dbSetLNatLang(Login: PLOGINREC; NatLangName: PChar): RETCODE;
00698 function dbSetLCharSet(Login: PLOGINREC; CharsetName: PChar): RETCODE;
00699 function dbSetLSecure(Login: PLOGINREC): RETCODE;
00700 function dbSetMaxprocs(MaxProcs: SmallInt): RETCODE;
00701 function dbOpen(Login: PLOGINREC; Host: PChar): PDBPROCESS;
00702 function dbCancel(dbProc: PDBPROCESS): RETCODE;
00703 function dbCmd(dbProc: PDBPROCESS; Cmd: PChar): RETCODE;
00704 function dbSqlExec(dbProc: PDBPROCESS): RETCODE;
00705 function dbResults(dbProc: PDBPROCESS): RETCODE;
00706 function dbCanQuery(dbProc: PDBPROCESS): RETCODE;
00707 function dbMoreCmds(dbProc: PDBPROCESS): RETCODE;
00708 function dbUse(dbProc: PDBPROCESS; dbName: PChar): RETCODE;
00709 function dbSetOpt(dbProc: PDBPROCESS; Option: Integer;
00710 Char_Param: PChar = nil; Int_Param: Integer = -1): RETCODE;
00711 function dbClose(dbProc: PDBPROCESS): RETCODE;
00712 function dbName(dbProc: PDBPROCESS): PChar;
00713 function dbCmdRow(dbProc: PDBPROCESS): RETCODE;
00714 function dbNumCols(dbProc: PDBPROCESS): Integer;
00715 function dbColName(dbProc: PDBPROCESS; Column: Integer): PChar;
00716 function dbColType(dbProc: PDBPROCESS; Column: Integer): Integer;
00717 function dbColLen(dbProc: PDBPROCESS; Column: Integer): DBInt;
00718 function dbData(dbProc: PDBPROCESS; Column: Integer): PByte;
00719 function dbDatLen(dbProc: PDBPROCESS; Column: Integer): Integer;
00720 function dbConvert(dbProc: PDBPROCESS; SrcType: Integer; Src: PByte;
00721 SrcLen: DBINT; DestType: Integer; Dest: PByte; DestLen: DBINT): Integer;
00722 function dbNextRow(dbProc: PDBPROCESS): STATUS;
00723 function dbGetRow(dbProc: PDBPROCESS; Row: Integer): STATUS;
00724 function dbCount(dbProc: PDBPROCESS): Integer;
00725
00726 function dbRpcInit(dbProc: PDBPROCESS; RpcName: PChar; Options: SmallInt): RETCODE;
00727 function dbRpcParam(dbProc: PDBPROCESS; ParamName: PChar; Status: Byte;
00728 Type_: Integer; MaxLen: Integer; DataLen: Integer; Value: Pointer): RETCODE;
00729 function dbRpcSend(dbProc: PDBPROCESS): RETCODE;
00730 function dbRpcExec(dbProc: PDBPROCESS): RETCODE;
00731 function dbRetStatus(dbProc: PDBPROCESS): Integer;
00732 function dbHasRetStat(dbProc: PDBPROCESS): Boolean;
00733 function dbRetName(dbProc: PDBPROCESS; RetNum: Integer): PChar;
00734 function dbRetData(dbProc: PDBPROCESS; RetNum: Integer): Pointer;
00735 function dbRetLen(dbProc: PDBPROCESS; RetNum: Integer): Integer;
00736 function dbRetType(dbProc: PDBPROCESS; RetNum: Integer): Integer;
00737
00738 end;
00739
00740 {** Implements a dblib driver for Sybase ASE 12.5 }
00741 TZDBLibSybaseASE125PlainDriver = class (TZAbstractObject, IZPlainDriver,
00742 IZDBLibPlainDriver)
00743 public
00744 constructor Create;
00745
00746 function GetProtocol: string;
00747 function GetDescription: string;
00748 procedure Initialize;
00749
00750 procedure CheckError;
00751
00752 function dbDead(dbProc: PDBPROCESS): Boolean;
00753 function dbLogin: PLOGINREC;
00754 procedure dbLoginFree(Login: PLOGINREC);
00755 function dbSetLoginTime(Seconds: Integer): RETCODE;
00756 function dbsetLName(Login: PLOGINREC; Value: PChar; Item: Integer): RETCODE;
00757 function dbSetLHost(Login: PLOGINREC; HostName: PChar): RETCODE;
00758 function dbSetLUser(Login: PLOGINREC; UserName: PChar): RETCODE;
00759 function dbSetLPwd(Login: PLOGINREC; Password: PChar): RETCODE;
00760 function dbSetLApp(Login: PLOGINREC; AppName: PChar): RETCODE;
00761 function dbSetLNatLang(Login: PLOGINREC; NatLangName: PChar): RETCODE;
00762 function dbSetLCharSet(Login: PLOGINREC; CharsetName: PChar): RETCODE;
00763 function dbSetLSecure(Login: PLOGINREC): RETCODE;
00764 function dbSetMaxprocs(MaxProcs: SmallInt): RETCODE;
00765 function dbOpen(Login: PLOGINREC; Host: PChar): PDBPROCESS;
00766 function dbCancel(dbProc: PDBPROCESS): RETCODE;
00767 function dbCmd(dbProc: PDBPROCESS; Cmd: PChar): RETCODE;
00768 function dbSqlExec(dbProc: PDBPROCESS): RETCODE;
00769 function dbResults(dbProc: PDBPROCESS): RETCODE;
00770 function dbCanQuery(dbProc: PDBPROCESS): RETCODE;
00771 function dbMoreCmds(dbProc: PDBPROCESS): RETCODE;
00772 function dbUse(dbProc: PDBPROCESS; dbName: PChar): RETCODE;
00773 function dbSetOpt(dbProc: PDBPROCESS; Option: Integer; Char_Param: PChar = nil; Int_Param: Integer = -1): RETCODE;
00774 function dbClose(dbProc: PDBPROCESS): RETCODE;
00775 function dbName(dbProc: PDBPROCESS): PChar;
00776 function dbCmdRow(dbProc: PDBPROCESS): RETCODE;
00777 function dbNumCols(dbProc: PDBPROCESS): Integer;
00778 function dbColName(dbProc: PDBPROCESS; Column: Integer): PChar;
00779 function dbColType(dbProc: PDBPROCESS; Column: Integer): Integer;
00780 function dbColLen(dbProc: PDBPROCESS; Column: Integer): DBInt;
00781 function dbData(dbProc: PDBPROCESS; Column: Integer): PByte;
00782 function dbDatLen(dbProc: PDBPROCESS; Column: Integer): Integer;
00783 function dbConvert(dbProc: PDBPROCESS; SrcType: Integer; Src: PByte;
00784 SrcLen: DBINT; DestType: Integer; Dest: PByte; DestLen: DBINT): Integer;
00785 function dbNextRow(dbProc: PDBPROCESS): STATUS;
00786 function dbGetRow(dbProc: PDBPROCESS; Row: Integer): STATUS;
00787 function dbCount(dbProc: PDBPROCESS): Integer;
00788
00789 function dbRpcInit(dbProc: PDBPROCESS; RpcName: PChar; Options: SmallInt): RETCODE;
00790 function dbRpcParam(dbProc: PDBPROCESS; ParamName: PChar; Status: Byte;
00791 Type_: Integer; MaxLen: Integer; DataLen: Integer; Value: Pointer): RETCODE;
00792 function dbRpcSend(dbProc: PDBPROCESS): RETCODE;
00793 function dbRpcExec(dbProc: PDBPROCESS): RETCODE;
00794 function dbRetStatus(dbProc: PDBPROCESS): Integer;
00795 function dbHasRetStat(dbProc: PDBPROCESS): Boolean;
00796 function dbRetName(dbProc: PDBPROCESS; RetNum: Integer): PChar;
00797 function dbRetData(dbProc: PDBPROCESS; RetNum: Integer): Pointer;
00798 function dbRetLen(dbProc: PDBPROCESS; RetNum: Integer): Integer;
00799 function dbRetType(dbProc: PDBPROCESS; RetNum: Integer): Integer;
00800 end;
00801
00802 {** Implements a dblib driver for MSSql7 }
00803 TZDBLibMSSQL7PlainDriver = class (TZAbstractObject, IZPlainDriver,
00804 IZDBLibPlainDriver)
00805 public
00806 constructor Create;
00807
00808 function GetProtocol: string;
00809 function GetDescription: string;
00810 procedure Initialize;
00811
00812 procedure CheckError;
00813
00814 function dbDead(dbProc: PDBPROCESS): Boolean;
00815 function dbLogin: PLOGINREC;
00816 procedure dbLoginFree(Login: PLOGINREC);
00817 function dbSetLoginTime(Seconds: Integer): RETCODE;
00818 function dbsetLName(Login: PLOGINREC; Value: PChar; Item: Integer): RETCODE;
00819 function dbSetLHost(Login: PLOGINREC; HostName: PChar): RETCODE;
00820 function dbSetLUser(Login: PLOGINREC; UserName: PChar): RETCODE;
00821 function dbSetLPwd(Login: PLOGINREC; Password: PChar): RETCODE;
00822 function dbSetLApp(Login: PLOGINREC; AppName: PChar): RETCODE;
00823 function dbSetLNatLang(Login: PLOGINREC; NatLangName: PChar): RETCODE;
00824 function dbSetLCharSet(Login: PLOGINREC; CharsetName: PChar): RETCODE;
00825 function dbSetLSecure(Login: PLOGINREC): RETCODE;
00826 function dbSetMaxprocs(MaxProcs: SmallInt): RETCODE;
00827 function dbOpen(Login: PLOGINREC; Host: PChar): PDBPROCESS;
00828 function dbCancel(dbProc: PDBPROCESS): RETCODE;
00829 function dbCmd(dbProc: PDBPROCESS; Cmd: PChar): RETCODE;
00830 function dbSqlExec(dbProc: PDBPROCESS): RETCODE;
00831 function dbResults(dbProc: PDBPROCESS): RETCODE;
00832 function dbCanQuery(dbProc: PDBPROCESS): RETCODE;
00833 function dbMoreCmds(dbProc: PDBPROCESS): RETCODE;
00834 function dbUse(dbProc: PDBPROCESS; dbName: PChar): RETCODE;
00835 function dbSetOpt(dbProc: PDBPROCESS; Option: Integer; Char_Param: PChar = nil; Int_Param: Integer = -1): RETCODE;
00836 function dbClose(dbProc: PDBPROCESS): RETCODE;
00837 function dbName(dbProc: PDBPROCESS): PChar;
00838 function dbCmdRow(dbProc: PDBPROCESS): RETCODE;
00839 function dbNumCols(dbProc: PDBPROCESS): Integer;
00840 function dbColName(dbProc: PDBPROCESS; Column: Integer): PChar;
00841 function dbColType(dbProc: PDBPROCESS; Column: Integer): Integer;
00842 function dbColLen(dbProc: PDBPROCESS; Column: Integer): DBInt;
00843 function dbData(dbProc: PDBPROCESS; Column: Integer): PByte;
00844 function dbDatLen(dbProc: PDBPROCESS; Column: Integer): Integer;
00845 function dbConvert(dbProc: PDBPROCESS; SrcType: Integer; Src: PByte;
00846 SrcLen: DBINT; DestType: Integer; Dest: PByte; DestLen: DBINT): Integer;
00847 function dbNextRow(dbProc: PDBPROCESS): STATUS;
00848 function dbGetRow(dbProc: PDBPROCESS; Row: Integer): STATUS;
00849 function dbCount(dbProc: PDBPROCESS): Integer;
00850
00851 function dbRpcInit(dbProc: PDBPROCESS; RpcName: PChar; Options: SmallInt): RETCODE;
00852 function dbRpcParam(dbProc: PDBPROCESS; ParamName: PChar; Status: Byte;
00853 Type_: Integer; MaxLen: Integer; DataLen: Integer; Value: Pointer): RETCODE;
00854 function dbRpcSend(dbProc: PDBPROCESS): RETCODE;
00855 function dbRpcExec(dbProc: PDBPROCESS): RETCODE;
00856 function dbRetStatus(dbProc: PDBPROCESS): Integer;
00857 function dbHasRetStat(dbProc: PDBPROCESS): Boolean;
00858 function dbRetName(dbProc: PDBPROCESS; RetNum: Integer): PChar;
00859 function dbRetData(dbProc: PDBPROCESS; RetNum: Integer): Pointer;
00860 function dbRetLen(dbProc: PDBPROCESS; RetNum: Integer): Integer;
00861 function dbRetType(dbProc: PDBPROCESS; RetNum: Integer): Integer;
00862 end;
00863
00864
00865 implementation
00866
00867 uses SysUtils, ZPlainDbLibSybaseAse125, ZPlainDbLibMsSql7;
00868
00869 { TZDBLibSybaseASE125PlainDriver }
00870
00871 constructor TZDBLibSybaseASE125PlainDriver.Create;
00872 begin
00873 end;
00874
00875 function TZDBLibSybaseASE125PlainDriver.GetProtocol: string;
00876 begin
00877 Result := 'sybase';
00878 end;
00879
00880 function TZDBLibSybaseASE125PlainDriver.GetDescription: string;
00881 begin
00882 Result := 'Native dblib driver for Sybase ASE 12.5';
00883 end;
00884
00885 procedure TZDBLibSybaseASE125PlainDriver.Initialize;
00886 begin
00887 ZPlainDBLibSybaseASE125.LibraryLoader.LoadIfNeeded;
00888 end;
00889
00890
00891 procedure TZDBLibSybaseASE125PlainDriver.CheckError;
00892 var
00893 I: Integer;
00894 S: string;
00895 lErrorEntry: PDBLibError;
00896 lMesageEntry: PDBLibMessage;
00897 begin
00898 { TODO -ofjanos -cGeneral : Error handling should be based on connection object.
00899 At the moment it is global. }
00900 if (SybaseErrors.Count = 0) and (SybaseMessages.Count = 0) then
00901 Exit;
00902 S := '';
00903 for I := 0 to SybaseErrors.Count - 1 do
00904 S := S + PDBLibError(SybaseErrors.Items[I]).DbErrStr + ' '
00905 + PDBLibError(SybaseErrors.Items[I]).OsErrStr + ' '#13;
00906 for I := 0 to SybaseMessages.Count - 1 do
00907 if PDBLibMessage(SybaseMessages.Items[I]).Severity > EXINFO then
00908 S := S + PDBLibMessage(SybaseMessages.Items[I]).MsgText + ' '#13;
00909 while SybaseErrors.Count > 0 do
00910 begin
00911 lErrorEntry := SybaseErrors.Items[0];
00912 Dispose(lErrorEntry);
00913 SybaseErrors.Delete(0);
00914 end;
00915 SybaseErrors.Clear;
00916 while SybaseMessages.Count > 0 do
00917 begin
00918 lMesageEntry := SybaseMessages.Items[0];
00919 Dispose(lMesageEntry);
00920 SybaseMessages.Delete(0);
00921 end;
00922 SybaseMessages.Clear;
00923 if S <> '' then
00924 raise Exception.Create(S);
00925 end;
00926
00927
00928 function TZDBLibSybaseASE125PlainDriver.dbDead(dbProc: PDBPROCESS): Boolean;
00929 begin
00930 Result := ZPlainDBLibSybaseASE125.dbDead(dbProc);
00931 end;
00932
00933 function TZDBLibSybaseASE125PlainDriver.dbLogin: PLOGINREC;
00934 begin
00935 Result := ZPlainDBLibSybaseASE125.dbLogin;
00936 end;
00937
00938 procedure TZDBLibSybaseASE125PlainDriver.dbLoginFree(Login: PLOGINREC);
00939 begin
00940 ZPlainDBLibSybaseASE125.dbLoginFree(Login);
00941 end;
00942
00943 function TZDBLibSybaseASE125PlainDriver.dbSetLoginTime(Seconds: Integer): RETCODE;
00944 begin
00945 Result := ZPlainDBLibSybaseASE125.dbsetlogintime(Seconds);
00946 end;
00947
00948 function TZDBLibSybaseASE125PlainDriver.dbsetlname(Login: PLOGINREC; Value: PChar; Item: Integer): RETCODE;
00949 begin
00950 Result := ZPlainDBLibSybaseASE125.dbsetlname(Login, Value, Item);
00951 end;
00952
00953 function TZDBLibSybaseASE125PlainDriver.dbSetLHost(Login: PLOGINREC; HostName: PChar): RETCODE;
00954 begin
00955 Result := ZPlainDBLibSybaseASE125.DBSETLHOST(Login, HostName);
00956 end;
00957
00958 function TZDBLibSybaseASE125PlainDriver.dbsetluser(Login: PLOGINREC; UserName: PChar): RETCODE;
00959 begin
00960 Result := ZPlainDBLibSybaseASE125.dbsetluser(Login, UserName);
00961 end;
00962
00963 function TZDBLibSybaseASE125PlainDriver.dbsetlpwd(Login: PLOGINREC; Password: PChar): RETCODE;
00964 begin
00965 Result := ZPlainDBLibSybaseASE125.dbsetlpwd(Login, Password);
00966 end;
00967
00968 function TZDBLibSybaseASE125PlainDriver.dbSetLApp(Login: PLOGINREC; AppName: PChar): RETCODE;
00969 begin
00970 Result := ZPlainDBLibSybaseASE125.DBSETLAPP(Login, AppName);
00971 end;
00972
00973 function TZDBLibSybaseASE125PlainDriver.dbSetLNatLang(Login: PLOGINREC; NatLangName: PChar): RETCODE;
00974 begin
00975 Result := ZPlainDBLibSybaseASE125.DBSETLNATLANG(Login, NatLangName);
00976 end;
00977
00978 function TZDBLibSybaseASE125PlainDriver.dbSetLCharSet(Login: PLOGINREC; CharsetName: PChar): RETCODE;
00979 begin
00980 Result := ZPlainDBLibSybaseASE125.DBSETLCHARSET(Login, CharsetName);
00981 end;
00982
00983 function TZDBLibSybaseASE125PlainDriver.dbsetlsecure(Login: PLOGINREC): RETCODE;
00984 begin
00985 Result := 0;
00986 end;
00987
00988 function TZDBLibSybaseASE125PlainDriver.dbsetmaxprocs(
00989 MaxProcs: SmallInt): RETCODE;
00990 begin
00991 Result := ZPlainDBLibSybaseASE125.dbsetmaxprocs(MaxProcs);
00992 end;
00993
00994 function TZDBLibSybaseASE125PlainDriver.dbOpen(Login: PLOGINREC; Host: PChar): PDBPROCESS;
00995 begin
00996 Result := ZPlainDBLibSybaseASE125.dbOpen(Login, Host);
00997 end;
00998
00999 function TZDBLibSybaseASE125PlainDriver.dbCancel(dbProc: PDBPROCESS): RETCODE;
01000 begin
01001 Result := ZPlainDBLibSybaseASE125.dbcancel(dbProc);
01002 end;
01003
01004 function TZDBLibSybaseASE125PlainDriver.dbCmd(dbProc: PDBPROCESS; Cmd: PChar): RETCODE;
01005 begin
01006 Result := ZPlainDBLibSybaseASE125.dbcmd(dbProc, Cmd);
01007 end;
01008
01009 function TZDBLibSybaseASE125PlainDriver.dbSqlExec(dbProc: PDBPROCESS): RETCODE;
01010 begin
01011 Result := ZPlainDBLibSybaseASE125.dbSqlExec(dbProc);
01012 end;
01013
01014 function TZDBLibSybaseASE125PlainDriver.dbResults(dbProc: PDBPROCESS): RETCODE;
01015 begin
01016 Result := ZPlainDBLibSybaseASE125.dbResults(dbProc);
01017 end;
01018
01019 function TZDBLibSybaseASE125PlainDriver.dbCanQuery(dbProc: PDBPROCESS): RETCODE;
01020 begin
01021 Result := ZPlainDBLibSybaseASE125.dbCanQuery(dbProc);
01022 end;
01023
01024 function TZDBLibSybaseASE125PlainDriver.dbMoreCmds(dbProc: PDBPROCESS): RETCODE;
01025 begin
01026 Result := ZPlainDBLibSybaseASE125.dbMoreCmds(dbProc);
01027 end;
01028
01029 function TZDBLibSybaseASE125PlainDriver.dbUse(dbProc: PDBPROCESS; dbName: PChar): RETCODE;
01030 begin
01031 Result := ZPlainDBLibSybaseASE125.dbUse(dbProc, dbName);
01032 end;
01033
01034 function TZDBLibSybaseASE125PlainDriver.dbSetOpt(dbProc: PDBPROCESS; Option: Integer; Char_Param: PChar = nil; Int_Param: Integer = -1): RETCODE;
01035 begin
01036 Result := ZPlainDBLibSybaseASE125.dbSetOpt(dbProc, Option, Char_Param, Int_Param);
01037 end;
01038
01039 function TZDBLibSybaseASE125PlainDriver.dbClose(dbProc: PDBPROCESS): RETCODE;
01040 begin
01041 Result := ZPlainDBLibSybaseASE125.dbClose(dbProc);
01042 end;
01043
01044 function TZDBLibSybaseASE125PlainDriver.dbName(dbProc: PDBPROCESS): PChar;
01045 begin
01046 Result := ZPlainDBLibSybaseASE125.dbName(dbProc);
01047 end;
01048
01049 function TZDBLibSybaseASE125PlainDriver.dbCmdRow(dbProc: PDBPROCESS): RETCODE;
01050 begin
01051 Result := ZPlainDBLibSybaseASE125.dbCmdRow(dbProc);
01052 end;
01053
01054 function TZDBLibSybaseASE125PlainDriver.dbNumCols(dbProc: PDBPROCESS): Integer;
01055 begin
01056 Result := ZPlainDBLibSybaseASE125.dbNumCols(dbProc);
01057 end;
01058
01059 function TZDBLibSybaseASE125PlainDriver.dbColName(dbProc: PDBPROCESS; Column: Integer): PChar;
01060 begin
01061 Result := ZPlainDBLibSybaseASE125.dbColName(dbProc, Column);
01062 end;
01063
01064 function TZDBLibSybaseASE125PlainDriver.dbColType(dbProc: PDBPROCESS; Column: Integer): Integer;
01065 begin
01066 Result := ZPlainDBLibSybaseASE125.dbColType(dbProc, Column);
01067 end;
01068
01069 function TZDBLibSybaseASE125PlainDriver.dbColLen(dbProc: PDBPROCESS; Column: Integer): DBInt;
01070 begin
01071 Result := ZPlainDBLibSybaseASE125.dbColLen(dbProc, Column);
01072 end;
01073
01074 function TZDBLibSybaseASE125PlainDriver.dbData(dbProc: PDBPROCESS; Column: Integer): PByte;
01075 begin
01076 Result := ZPlainDBLibSybaseASE125.dbData(dbProc, Column);
01077 end;
01078
01079 function TZDBLibSybaseASE125PlainDriver.dbDatLen(dbProc: PDBPROCESS; Column: Integer): Integer;
01080 begin
01081 Result := ZPlainDBLibSybaseASE125.dbDatLen(dbProc, Column);
01082 end;
01083
01084 function TZDBLibSybaseASE125PlainDriver.dbConvert(dbProc: PDBPROCESS; SrcType: Integer; Src: PByte;
01085 SrcLen: DBINT; DestType: Integer; Dest: PByte; DestLen: DBINT): Integer;
01086 begin
01087 Result := ZPlainDBLibSybaseASE125.dbConvert(dbProc, SrcType, Src, SrcLen, DestType, Dest, DestLen);
01088 end;
01089
01090 function TZDBLibSybaseASE125PlainDriver.dbNextRow(dbProc: PDBPROCESS): STATUS;
01091 begin
01092 Result := ZPlainDBLibSybaseASE125.dbNextRow(dbProc);
01093 end;
01094
01095 function TZDBLibSybaseASE125PlainDriver.dbGetRow(dbProc: PDBPROCESS; Row: Integer): STATUS;
01096 begin
01097 Result := ZPlainDBLibSybaseASE125.dbGetRow(dbProc, Row);
01098 end;
01099
01100 function TZDBLibSybaseASE125PlainDriver.dbCount(dbProc: PDBPROCESS): Integer;
01101 begin
01102 Result := ZPlainDBLibSybaseASE125.dbCount(dbProc);
01103 end;
01104
01105 function TZDBLibSybaseASE125PlainDriver.dbRpcInit(dbProc: PDBPROCESS; RpcName: PChar; Options: SmallInt): RETCODE;
01106 begin
01107 Result := ZPlainDBLibSybaseASE125.dbRpcInit(dbProc, RpcName, Options);
01108 end;
01109
01110 function TZDBLibSybaseASE125PlainDriver.dbRpcParam(dbProc: PDBPROCESS; ParamName: PChar; Status: Byte;
01111 Type_: Integer; MaxLen: Integer; DataLen: Integer; Value: Pointer): RETCODE;
01112 begin
01113 Result := ZPlainDBLibSybaseASE125.dbRpcParam(dbProc, ParamName, Status, Type_, MaxLen, DataLen, Value);
01114 end;
01115
01116 function TZDBLibSybaseASE125PlainDriver.dbRpcSend(dbProc: PDBPROCESS): RETCODE;
01117 begin
01118 Result := ZPlainDBLibSybaseASE125.dbRpcSend(dbProc);
01119 end;
01120
01121 function TZDBLibSybaseASE125PlainDriver.dbRpcExec(dbProc: PDBPROCESS): RETCODE;
01122 begin
01123 Result := ZPlainDBLibSybaseASE125.dbRpcSend(dbProc);
01124 if Result = SUCCEED then
01125 Result := ZPlainDBLibSybaseASE125.dbSqlOk(dbProc);
01126 end;
01127
01128 function TZDBLibSybaseASE125PlainDriver.dbRetStatus(dbProc: PDBPROCESS): Integer;
01129 begin
01130 Result := ZPlainDBLibSybaseASE125.dbRetStatus(dbProc);
01131 end;
01132
01133 function TZDBLibSybaseASE125PlainDriver.dbHasRetStat(dbProc: PDBPROCESS): Boolean;
01134 begin
01135 Result := ZPlainDBLibSybaseASE125.dbHasRetStat(dbProc);
01136 end;
01137
01138 function TZDBLibSybaseASE125PlainDriver.dbRetName(dbProc: PDBPROCESS; RetNum: Integer): PChar;
01139 begin
01140 Result := ZPlainDBLibSybaseASE125.dbRetName(dbProc, RetNum);
01141 end;
01142
01143 function TZDBLibSybaseASE125PlainDriver.dbRetData(dbProc: PDBPROCESS; RetNum: Integer): Pointer;
01144 begin
01145 Result := ZPlainDBLibSybaseASE125.dbRetData(dbProc, RetNum);
01146 end;
01147
01148 function TZDBLibSybaseASE125PlainDriver.dbRetLen(dbProc: PDBPROCESS; RetNum: Integer): Integer;
01149 begin
01150 Result := ZPlainDBLibSybaseASE125.dbRetLen(dbProc, RetNum);
01151 end;
01152
01153 function TZDBLibSybaseASE125PlainDriver.dbRetType(dbProc: PDBPROCESS; RetNum: Integer): Integer;
01154 begin
01155 Result := ZPlainDBLibSybaseASE125.dbRetType(dbProc, RetNum);
01156 end;
01157
01158
01159 {TZDBLibMSSQL7PlainDriver}
01160
01161 constructor TZDBLibMSSQL7PlainDriver.Create;
01162 begin
01163 end;
01164
01165 function TZDBLibMSSQL7PlainDriver.GetProtocol: string;
01166 begin
01167 Result := 'mssql';
01168 end;
01169
01170 function TZDBLibMSSQL7PlainDriver.GetDescription: string;
01171 begin
01172 Result := 'Native dblib driver for MS SQL 7+';
01173 end;
01174
01175 procedure TZDBLibMSSQL7PlainDriver.Initialize;
01176 begin
01177 ZPlainDBLibMSSql7.LibraryLoader.LoadIfNeeded;
01178 end;
01179
01180
01181 procedure TZDBLibMSSQL7PlainDriver.CheckError;
01182 var
01183 I: Integer;
01184 S: string;
01185 lErrorEntry: PDBLibError;
01186 lMesageEntry: PDBLibMessage;
01187 begin
01188 { TODO -ofjanos -cGeneral : Error handling should be based on connection object.
01189 At the moment it is global. }
01190 if (MSSqlErrors.Count = 0) and (MSSqlMessages.Count = 0) then
01191 Exit;
01192 S := '';
01193 for I := 0 to MSSqlErrors.Count - 1 do
01194 S := S + PDBLibError(MSSqlErrors.Items[I]).DbErrStr + ' '
01195 + PDBLibError(MSSqlErrors.Items[I]).OsErrStr + ' '#13;
01196 for I := 0 to MSSqlMessages.Count - 1 do
01197 if PDBLibMessage(MSSqlMessages.Items[I]).Severity > EXINFO then
01198 S := S + PDBLibMessage(MSSqlMessages.Items[I]).MsgText + ' '#13;
01199 while MSSqlErrors.Count > 0 do
01200 begin
01201 lErrorEntry := MSSqlErrors.Items[0];
01202 Dispose(lErrorEntry);
01203 MSSqlErrors.Delete(0);
01204 end;
01205 MSSqlErrors.Clear;
01206 while MSSqlMessages.Count > 0 do
01207 begin
01208 lMesageEntry := MSSqlMessages.Items[0];
01209 Dispose(lMesageEntry);
01210 MSSqlMessages.Delete(0);
01211 end;
01212 MSSqlMessages.Clear;
01213 if S <> '' then
01214 raise Exception.Create(S);
01215 end;
01216
01217
01218 function TZDBLibMSSQL7PlainDriver.dbDead(dbProc: PDBPROCESS): Boolean;
01219 begin
01220 Result := ZPlainDBLibMSSql7.dbDead(dbProc);
01221 end;
01222
01223 function TZDBLibMSSQL7PlainDriver.dbLogin: PLOGINREC;
01224 begin
01225 Result := ZPlainDBLibMSSql7.dbLogin;
01226 end;
01227
01228 procedure TZDBLibMSSQL7PlainDriver.dbLoginFree(Login: PLOGINREC);
01229 begin
01230 ZPlainDBLibMSSql7.dbFreeLogin(Login);
01231 end;
01232
01233 function TZDBLibMSSQL7PlainDriver.dbSetLoginTime(Seconds: Integer): RETCODE;
01234 begin
01235 Result := ZPlainDBLibMSSql7.dbSetLoginTime(Seconds);
01236 end;
01237
01238 function TZDBLibMSSQL7PlainDriver.dbsetlname(Login: PLOGINREC; Value: PChar; Item: Integer): RETCODE;
01239 begin
01240 Result := ZPlainDBLibMSSql7.dbsetlname(Login, Value, Item);
01241 end;
01242
01243 function TZDBLibMSSQL7PlainDriver.dbSetLHost(Login: PLOGINREC; HostName: PChar): RETCODE;
01244 begin
01245 Result := ZPlainDBLibMSSql7.DBSETLHOST(Login, HostName);
01246 end;
01247
01248 function TZDBLibMSSQL7PlainDriver.dbsetluser(Login: PLOGINREC; UserName: PChar): RETCODE;
01249 begin
01250 Result := ZPlainDBLibMSSql7.dbsetluser(Login, UserName);
01251 end;
01252
01253 function TZDBLibMSSQL7PlainDriver.dbsetlpwd(Login: PLOGINREC; Password: PChar): RETCODE;
01254 begin
01255 Result := ZPlainDBLibMSSql7.dbsetlpwd(Login, Password);
01256 end;
01257
01258 function TZDBLibMSSQL7PlainDriver.dbSetLApp(Login: PLOGINREC; AppName: PChar): RETCODE;
01259 begin
01260 Result := ZPlainDBLibMSSql7.DBSETLAPP(Login, AppName);
01261 end;
01262
01263 function TZDBLibMSSQL7PlainDriver.dbSetLNatLang(Login: PLOGINREC; NatLangName: PChar): RETCODE;
01264 begin
01265 Result := ZPlainDBLibMSSql7.DBSETLNATLANG(Login, NatLangName);
01266 end;
01267
01268 function TZDBLibMSSQL7PlainDriver.dbSetLCharSet(Login: PLOGINREC; CharsetName: PChar): RETCODE;
01269 begin
01270 Result := 0;
01271 end;
01272
01273 function TZDBLibMSSQL7PlainDriver.dbsetlsecure(Login: PLOGINREC): RETCODE;
01274 begin
01275 Result := ZPlainDBLibMSSql7.dbsetlsecure(Login);
01276 end;
01277
01278 function TZDBLibMSSQL7PlainDriver.dbsetmaxprocs(
01279 MaxProcs: SmallInt): RETCODE;
01280 begin
01281 Result := ZPlainDBLibSybaseASE125.dbsetmaxprocs(MaxProcs);
01282 end;
01283
01284 function TZDBLibMSSQL7PlainDriver.dbOpen(Login: PLOGINREC; Host: PChar): PDBPROCESS;
01285 begin
01286 Result := ZPlainDBLibMSSql7.dbOpen(Login, Host);
01287 end;
01288
01289
01290 function TZDBLibMSSQL7PlainDriver.dbCancel(dbProc: PDBPROCESS): RETCODE;
01291 begin
01292 Result := ZPlainDBLibMSSql7.dbcancel(dbProc);
01293 end;
01294
01295 function TZDBLibMSSQL7PlainDriver.dbCmd(dbProc: PDBPROCESS; Cmd: PChar): RETCODE;
01296 begin
01297 Result := ZPlainDBLibMSSql7.dbcmd(dbProc, Cmd);
01298 end;
01299
01300 function TZDBLibMSSQL7PlainDriver.dbSqlExec(dbProc: PDBPROCESS): RETCODE;
01301 begin
01302 Result := ZPlainDBLibMSSql7.dbSqlExec(dbProc);
01303 end;
01304
01305 function TZDBLibMSSQL7PlainDriver.dbResults(dbProc: PDBPROCESS): RETCODE;
01306 begin
01307 Result := ZPlainDBLibMSSql7.dbResults(dbProc);
01308 end;
01309
01310 function TZDBLibMSSQL7PlainDriver.dbCanQuery(dbProc: PDBPROCESS): RETCODE;
01311 begin
01312 Result := ZPlainDBLibMSSql7.dbCanQuery(dbProc);
01313 end;
01314
01315 function TZDBLibMSSQL7PlainDriver.dbMoreCmds(dbProc: PDBPROCESS): RETCODE;
01316 begin
01317 Result := ZPlainDBLibMSSql7.dbMoreCmds(dbProc);
01318 end;
01319
01320 function TZDBLibMSSQL7PlainDriver.dbUse(dbProc: PDBPROCESS; dbName: PChar): RETCODE;
01321 begin
01322 Result := ZPlainDBLibMSSql7.dbUse(dbProc, dbName);
01323 end;
01324
01325 function TZDBLibMSSQL7PlainDriver.dbSetOpt(dbProc: PDBPROCESS; Option: Integer; Char_Param: PChar = nil; Int_Param: Integer = -1): RETCODE;
01326 begin
01327 Result := ZPlainDBLibMSSql7.dbSetOpt(dbProc, Option, Char_Param);
01328 end;
01329
01330 function TZDBLibMSSQL7PlainDriver.dbClose(dbProc: PDBPROCESS): RETCODE;
01331 begin
01332 Result := ZPlainDBLibMSSql7.dbClose(dbProc);
01333 end;
01334
01335 function TZDBLibMSSQL7PlainDriver.dbName(dbProc: PDBPROCESS): PChar;
01336 begin
01337 Result := ZPlainDBLibMSSql7.dbName(dbProc);
01338 end;
01339
01340 function TZDBLibMSSQL7PlainDriver.dbCmdRow(dbProc: PDBPROCESS): RETCODE;
01341 begin
01342 Result := ZPlainDBLibMSSql7.dbCmdRow(dbProc);
01343 end;
01344
01345 function TZDBLibMSSQL7PlainDriver.dbNumCols(dbProc: PDBPROCESS): Integer;
01346 begin
01347 Result := ZPlainDBLibMSSql7.dbNumCols(dbProc);
01348 end;
01349
01350 function TZDBLibMSSQL7PlainDriver.dbColName(dbProc: PDBPROCESS; Column: Integer): PChar;
01351 begin
01352 Result := ZPlainDBLibMSSql7.dbColName(dbProc, Column);
01353 end;
01354
01355 function TZDBLibMSSQL7PlainDriver.dbColType(dbProc: PDBPROCESS; Column: Integer): Integer;
01356 begin
01357 Result := ZPlainDBLibMSSql7.dbColType(dbProc, Column);
01358 end;
01359
01360 function TZDBLibMSSQL7PlainDriver.dbColLen(dbProc: PDBPROCESS; Column: Integer): DBInt;
01361 begin
01362 Result := ZPlainDBLibMSSql7.dbColLen(dbProc, Column);
01363 end;
01364
01365 function TZDBLibMSSQL7PlainDriver.dbData(dbProc: PDBPROCESS; Column: Integer): PByte;
01366 begin
01367 Result := ZPlainDBLibMSSql7.dbData(dbProc, Column);
01368 end;
01369
01370 function TZDBLibMSSQL7PlainDriver.dbDatLen(dbProc: PDBPROCESS; Column: Integer): Integer;
01371 begin
01372 Result := ZPlainDBLibMSSql7.dbDatLen(dbProc, Column);
01373 end;
01374
01375 function TZDBLibMSSQL7PlainDriver.dbConvert(dbProc: PDBPROCESS; SrcType: Integer; Src: PByte;
01376 SrcLen: DBINT; DestType: Integer; Dest: PByte; DestLen: DBINT): Integer;
01377 begin
01378 Result := ZPlainDBLibMSSql7.dbConvert(dbProc, SrcType, Src, SrcLen, DestType, Dest, DestLen);
01379 end;
01380
01381 function TZDBLibMSSQL7PlainDriver.dbNextRow(dbProc: PDBPROCESS): STATUS;
01382 begin
01383 Result := ZPlainDBLibMSSql7.dbNextRow(dbProc);
01384 end;
01385
01386 function TZDBLibMSSQL7PlainDriver.dbGetRow(dbProc: PDBPROCESS; Row: Integer): STATUS;
01387 begin
01388 Result := ZPlainDBLibMSSql7.dbGetRow(dbProc, Row);
01389 end;
01390
01391 function TZDBLibMSSQL7PlainDriver.dbCount(dbProc: PDBPROCESS): Integer;
01392 begin
01393 Result := ZPlainDBLibMSSql7.dbCount(dbProc);
01394 end;
01395
01396 function TZDBLibMSSQL7PlainDriver.dbRpcInit(dbProc: PDBPROCESS; RpcName: PChar; Options: SmallInt): RETCODE;
01397 begin
01398 Result := ZPlainDBLibMSSql7.dbRpcInit(dbProc, RpcName, Options);
01399 end;
01400
01401 function TZDBLibMSSQL7PlainDriver.dbRpcParam(dbProc: PDBPROCESS; ParamName: PChar; Status: Byte;
01402 Type_: Integer; MaxLen: Integer; DataLen: Integer; Value: Pointer): RETCODE;
01403 begin
01404 Result := ZPlainDBLibMSSql7.dbRpcParam(dbProc, ParamName, Status, Type_, MaxLen, DataLen, Value);
01405 end;
01406
01407 function TZDBLibMSSQL7PlainDriver.dbRpcSend(dbProc: PDBPROCESS): RETCODE;
01408 begin
01409 Result := ZPlainDBLibMSSql7.dbRpcSend(dbProc);
01410 end;
01411
01412 function TZDBLibMSSQL7PlainDriver.dbRpcExec(dbProc: PDBPROCESS): RETCODE;
01413 begin
01414 Result := ZPlainDBLibMSSql7.dbRpcExec(dbProc);
01415 end;
01416
01417 function TZDBLibMSSQL7PlainDriver.dbRetStatus(dbProc: PDBPROCESS): Integer;
01418 begin
01419 Result := ZPlainDBLibMSSql7.dbRetStatus(dbProc);
01420 end;
01421
01422 function TZDBLibMSSQL7PlainDriver.dbHasRetStat(dbProc: PDBPROCESS): Boolean;
01423 begin
01424 Result := ZPlainDBLibMSSql7.dbHasRetStat(dbProc);
01425 end;
01426
01427 function TZDBLibMSSQL7PlainDriver.dbRetName(dbProc: PDBPROCESS; RetNum: Integer): PChar;
01428 begin
01429 Result := ZPlainDBLibMSSql7.dbRetName(dbProc, RetNum);
01430 end;
01431
01432 function TZDBLibMSSQL7PlainDriver.dbRetData(dbProc: PDBPROCESS; RetNum: Integer): Pointer;
01433 begin
01434 Result := ZPlainDBLibMSSql7.dbRetData(dbProc, RetNum);
01435 end;
01436
01437 function TZDBLibMSSQL7PlainDriver.dbRetLen(dbProc: PDBPROCESS; RetNum: Integer): Integer;
01438 begin
01439 Result := ZPlainDBLibMSSql7.dbRetLen(dbProc, RetNum);
01440 end;
01441
01442 function TZDBLibMSSQL7PlainDriver.dbRetType(dbProc: PDBPROCESS; RetNum: Integer): Integer;
01443 begin
01444 Result := ZPlainDBLibMSSql7.dbRetType(dbProc, RetNum);
01445 end;
01446
01447
01448 initialization
01449 end.