00001 {*********************************************************}
00002 { }
00003 { Zeos Database Objects }
00004 { Delphi plain interface to MSSql using dblib }
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 ZPlainDbLibMsSql7;
00055
00056 interface
00057
00058 {$I ZPlain.inc}
00059
00060 uses Classes, ZCompatibility, ZPlainLoader, ZPlainDBLibDriver;
00061
00062 const
00063 WINDOWS_DLL_LOCATION = 'ntwdblib.dll';
00064
00065 { Macros for dbsetlname() }
00066 DBSETHOST = 1;
00067 DBSETUSER = 2;
00068 DBSETPWD = 3;
00069 DBSETAPP = 4;
00070 DBSETID = 5;
00071 DBSETLANG = 6;
00072
00073 DBSETSECURE = 7;
00074 DBVER42 = 8;
00075 DBVER60 = 9;
00076 DBSET_LOGIN_TIME = 10;
00077 DBSETFALLBACK = 12;
00078
00079 { Macros for setting the PLOGINREC }
00080 function DBSETLHOST(Login: PLOGINREC; ClientHost: PChar): RETCODE;
00081 function DBSETLUSER(Login: PLOGINREC; UserName: PChar): RETCODE;
00082 function DBSETLPWD(Login: PLOGINREC; Passwd: PChar): RETCODE;
00083 function DBSETLAPP(Login: PLOGINREC; AppName: PChar): RETCODE;
00084 function DBSETLNATLANG(Login: PLOGINREC; Lang: PChar): RETCODE;
00085 function DBSETLSECURE(Login: PLOGINREC): RETCODE;
00086 function DBSETLVERSION(Login: PLOGINREC; Version: Byte): RETCODE;
00087 function DBSETLTIME(Login: PLOGINREC; Seconds: LongWord): RETCODE;
00088 function DBSETLFALLBACK(Login: PLOGINREC; Fallback: PChar): RETCODE;
00089
00090 { Function macros }
00091 function dbrbuf(Proc: PDBPROCESS): DBINT;
00092
00093
00094 {************** Plain API Function types definition *************}
00095 type
00096 DBERRHANDLE_PROC = function(Proc: PDBPROCESS; Severity, DbErr, OsErr: Integer;
00097 DbErrStr, OsErrStr: PChar): Integer; cdecl;
00098 DBMSGHANDLE_PROC = function(Proc: PDBPROCESS; MsgNo: DBINT; MsgState,
00099 Severity: Integer; MsgText, SrvName, ProcName: PChar; Line: DBUSMALLINT):
00100 Integer; cdecl;
00101
00102 Tdberrhandle = function(Handler: DBERRHANDLE_PROC): DBERRHANDLE_PROC; cdecl;
00103 Tdbmsghandle = function(Handler: DBMSGHANDLE_PROC): DBMSGHANDLE_PROC; cdecl;
00104
00105 Tdbprocerrhandle = function(DbHandle: PDBHANDLE; Handler: DBERRHANDLE_PROC):
00106 DBERRHANDLE_PROC; cdecl;
00107 Tdbprocmsghandle = function(DbHandle: PDBHANDLE; Handler: DBMSGHANDLE_PROC):
00108 DBMSGHANDLE_PROC; cdecl;
00109
00110 { Two-phase commit functions }
00111 Tabort_xact = function(Proc: PDBPROCESS; CommId: DBINT): RETCODE; cdecl;
00112 Tbuild_xact_string = procedure(XActName, Service: PChar; CommId: DBINT;
00113 Result: PChar); cdecl;
00114 Tclose_commit = procedure(Proc: PDBPROCESS); cdecl;
00115 Tcommit_xact = function(Proc: PDBPROCESS; CommId: DBINT): RETCODE; cdecl;
00116 Topen_commit = function(Login: PLOGINREC; ServerName: PChar): PDBPROCESS; cdecl;
00117 Tremove_xact = function(Proc: PDBPROCESS; CommId: DBINT; SiteCount: Integer):
00118 RETCODE; cdecl;
00119 Tscan_xact = function(Proc: PDBPROCESS; CommId: DBINT): RETCODE; cdecl;
00120 Tstart_xact = function(Proc: PDBPROCESS; AppName, XActName: PChar;
00121 SiteCount: Integer): DBINT; cdecl;
00122 Tstat_xact = function(Proc: PDBPROCESS; CommId: DBINT): Integer; cdecl;
00123
00124 { BCP functions }
00125 Tbcp_batch = function(Proc: PDBPROCESS): DBINT; cdecl;
00126 Tbcp_bind = function(Proc: PDBPROCESS; VarAddr: PByte; PrefixLen: Integer;
00127 VarLen: DBINT; Terminator: PByte; TermLen, Typ, TableColumn: Integer):
00128 RETCODE; cdecl;
00129 Tbcp_colfmt = function(Proc: PDBPROCESS; FileColumn: Integer; FileType: Byte;
00130 FilePrefixLen: Integer; FileColLen: DBINT; FileTerm: PByte; FileTermLen,
00131 TableColumn: Integer): RETCODE; cdecl;
00132 Tbcp_collen = function(Proc: PDBPROCESS; VarLen: DBINT; TableColumn: Integer):
00133 RETCODE; cdecl;
00134 Tbcp_colptr = function(Proc: PDBPROCESS; ColPtr: PByte; TableColumn: Integer):
00135 RETCODE; cdecl;
00136 Tbcp_columns = function(Proc: PDBPROCESS; FileColCount: Integer): RETCODE; cdecl;
00137 Tbcp_control = function(Proc: PDBPROCESS; Field: Integer; Value: DBINT):
00138 RETCODE; cdecl;
00139 Tbcp_done = function(Proc: PDBPROCESS): DBINT; cdecl;
00140 Tbcp_exec = function(Proc: PDBPROCESS; RowsCopied: PDBINT): RETCODE; cdecl;
00141 Tbcp_init = function(Proc: PDBPROCESS; TableName, hFile, ErrFile: PChar;
00142 Direction: Integer): RETCODE; cdecl;
00143 Tbcp_moretext = function(Proc: PDBPROCESS; Size: DBINT; Text: PByte):
00144 RETCODE; cdecl;
00145 Tbcp_readfmt = function(Proc: PDBPROCESS; FileName: PChar): RETCODE; cdecl;
00146 Tbcp_sendrow = function(Proc: PDBPROCESS): RETCODE; cdecl;
00147 Tbcp_setl = function(Login: PLOGINREC; Enable: LongBool): RETCODE; cdecl;
00148 Tbcp_writefmt = function(Proc: PDBPROCESS; FileName: PChar): RETCODE; cdecl;
00149
00150 { Standard DB-Library functions }
00151 Tdbadata = function(Proc: PDBPROCESS; ComputeId, Column: Integer): PByte; cdecl;
00152 Tdbadlen = function(Proc: PDBPROCESS; ComputeId, Column: Integer): DBINT; cdecl;
00153 Tdbaltbind = function(Proc: PDBPROCESS; ComputeId, Column: Integer;
00154 VarType: Integer; VarLen: DBINT; VarAddr: PByte): RETCODE; cdecl;
00155 Tdbaltcolid = function(Proc: PDBPROCESS; ComputeId, Column: Integer): Integer; cdecl;
00156 Tdbaltlen = function(Proc: PDBPROCESS; ComputeId, Column: Integer): DBINT; cdecl;
00157 Tdbaltop = function(Proc: PDBPROCESS; ComputeId, Column: Integer): Integer; cdecl;
00158 Tdbalttype = function(Proc: PDBPROCESS; ComputeId, Column: Integer): Integer; cdecl;
00159 Tdbaltutype = function(Proc: PDBPROCESS; ComputeId, Column: Integer): DBINT; cdecl;
00160 Tdbanullbind = function(Proc: PDBPROCESS; ComputeId, Column: Integer;
00161 Indicator: PDBINT): RETCODE; cdecl;
00162 Tdbbind = function(Proc: PDBPROCESS; Column, VarType, VarLen: Integer;
00163 VarAddr: PByte): RETCODE; cdecl;
00164 Tdbbylist = function(Proc: PDBPROCESS; ComputeId: Integer; Size: PInteger):
00165 PByte; cdecl;
00166 Tdbcancel = function(Proc: PDBPROCESS): RETCODE; cdecl;
00167 Tdbcanquery = function(Proc: PDBPROCESS): RETCODE; cdecl;
00168 Tdbchange = function(Proc: PDBPROCESS): PChar; cdecl;
00169 Tdbclose = function(Proc: PDBPROCESS): RETCODE; cdecl;
00170 Tdbclrbuf = procedure(Proc: PDBPROCESS; N: DBINT); cdecl;
00171 Tdbclropt = function(Proc: PDBPROCESS; Option: Integer; Param: PChar): RETCODE; cdecl;
00172 Tdbcmd = function(Proc: PDBPROCESS; Cmd: PChar): RETCODE; cdecl;
00173 Tdbcmdrow = function(Proc: PDBPROCESS): RETCODE; cdecl;
00174 Tdbcolbrowse = function(Proc: PDBPROCESS; Column: Integer): LongBool; cdecl;
00175 Tdbcolinfo = function(Handle: PDBHANDLE; Typ, Column, ComputeId: Integer;
00176 DbColumn: PDBCOL): RETCODE; cdecl;
00177 Tdbcollen = function(Proc: PDBPROCESS; Column: Integer): DBINT; cdecl;
00178 Tdbcolname = function(Proc: PDBPROCESS; Column: Integer): PChar; cdecl;
00179 Tdbcolsource = function(Proc: PDBPROCESS; Column: Integer): PChar; cdecl;
00180 Tdbcoltype = function(Proc: PDBPROCESS; Column: Integer): Integer; cdecl;
00181 Tdbcolutype = function(Proc: PDBPROCESS; Column: Integer): DBINT; cdecl;
00182 Tdbconvert = function(Proc: PDBPROCESS; SrcType: Integer; Src: PByte;
00183 SrcLen: DBINT; DestType: Integer; Dest: PByte; DestLen: DBINT): Integer; cdecl;
00184 Tdbcount = function(Proc: PDBPROCESS): Integer; cdecl;
00185 Tdbcurcmd = function(Proc: PDBPROCESS): Integer; cdecl;
00186 Tdbcurrow = function(Proc: PDBPROCESS): DBINT; cdecl;
00187
00188 Tdbcursor = function(hCursor: PDBCURSOR; OpType, Row: Integer; Table,
00189 Values: PChar): RETCODE; cdecl;
00190 Tdbcursorbind = function(hCursor: PDBCURSOR; Col, VarType: Integer; VarLen: DBINT;
00191 POutLen: PDBINT; VarAddr: PByte): RETCODE; cdecl;
00192 Tdbcursorclose = function(DbHandle: PDBHANDLE): RETCODE; cdecl;
00193 Tdbcursorcolinfo = function(hCursor: PDBCURSOR; Column: Integer; ColName: PChar;
00194 ColType: PInteger; ColLen: PDBINT; UserType: PInteger): RETCODE; cdecl;
00195 Tdbcursorfetch = function(hCursor: PDBCURSOR; FetchType, RowNum: Integer):
00196 RETCODE; cdecl;
00197 Tdbcursorfetchex = function(hCursor: PDBCURSOR; FetchType: Integer; RowNum,
00198 nFetchRows, Reserved: DBINT): RETCODE; cdecl;
00199 Tdbcursorinfo = function(hCursor: PDBCURSOR; nCols: PInteger; nRows: PDBINT):
00200 RETCODE; cdecl;
00201 Tdbcursorinfoex = function(hCursor: PDBCURSOR; DbCursorInfo: PDBCURSORINFO):
00202 RETCODE; cdecl;
00203 Tdbcursoropen = function(Proc: PDBPROCESS; Sql: PChar; ScrollOpt,
00204 ConCurOpt: Integer; nRows: Cardinal; PStatus: PDBINT): PDBCURSOR; cdecl;
00205 Tdbdata = function(Proc: PDBPROCESS; Column: Integer): PByte; cdecl;
00206 Tdbdataready = function(Proc: PDBPROCESS): LongBool; cdecl;
00207 Tdbdatecrack = function(Proc: PDBPROCESS; DateInfo: PDBDATEREC;
00208 DateType: PDBDATETIME): RETCODE; cdecl;
00209 Tdbdatlen = function(Proc: PDBPROCESS; Column: Integer): Integer; cdecl;
00210 Tdbdead = function(Proc: PDBPROCESS): LongBool; cdecl;
00211 Tdbexit = procedure; cdecl;
00212 TdbWinexit = procedure; cdecl;
00213 Tdbenlisttrans = function(Proc: PDBPROCESS; Transaction: Pointer): RETCODE; cdecl;
00214 Tdbenlistxatrans = function(Proc: PDBPROCESS; EnlistTran: LongBool): RETCODE; cdecl;
00215 Tdbfcmd = function(Proc: PDBPROCESS; CmdString: PChar; var Params): RETCODE; cdecl;
00216 Tdbfirstrow = function(Proc: PDBPROCESS): DBINT; cdecl;
00217 Tdbfreebuf = procedure(Proc: PDBPROCESS); cdecl;
00218 Tdbfreelogin = procedure(Login: PLOGINREC); cdecl;
00219 Tdbfreequal = procedure(Ptr: PChar); cdecl;
00220 Tdbgetchar = function(Proc: PDBPROCESS; N: Integer): PChar; cdecl;
00221 Tdbgetmaxprocs = function: SmallInt; cdecl;
00222 Tdbgetoff = function(Proc: PDBPROCESS; OffType: DBUSMALLINT;
00223 StartFrom: Integer): Integer; cdecl;
00224 Tdbgetpacket = function(Proc: PDBPROCESS): Cardinal; cdecl;
00225 Tdbgetrow = function(Proc: PDBPROCESS; Row: DBINT): STATUS; cdecl;
00226 Tdbgettime = function: Integer; cdecl;
00227 Tdbgetuserdata = function(Proc: PDBPROCESS): Pointer; cdecl;
00228 Tdbhasretstat = function(Proc: PDBPROCESS): LongBool; cdecl;
00229 Tdbinit = function: PChar; cdecl;
00230 Tdbisavail = function(Proc: PDBPROCESS): LongBool; cdecl;
00231 Tdbiscount = function(Proc: PDBPROCESS): LongBool; cdecl;
00232 Tdbisopt = function(Proc: PDBPROCESS; Option: Integer; Param: PChar): LongBool; cdecl;
00233 Tdblastrow = function(Proc: PDBPROCESS): DBINT; cdecl;
00234 Tdblogin = function: PLOGINREC; cdecl;
00235 Tdbmorecmds = function(Proc: PDBPROCESS): RETCODE; cdecl;
00236 Tdbmoretext = function(Proc: PDBPROCESS; Size: DBINT; Text: PByte): RETCODE; cdecl;
00237 Tdbname = function(Proc: PDBPROCESS): PChar; cdecl;
00238 Tdbnextrow = function(Proc: PDBPROCESS): STATUS; cdecl;
00239 Tdbnullbind = function(Proc: PDBPROCESS; Column: Integer; Indicator: PDBINT):
00240 RETCODE; cdecl;
00241 Tdbnumalts = function(Proc: PDBPROCESS; ComputeId: Integer): Integer; cdecl;
00242 Tdbnumcols = function(Proc: PDBPROCESS): Integer; cdecl;
00243 Tdbnumcompute = function(Proc: PDBPROCESS): Integer; cdecl;
00244 Tdbnumorders = function(Proc: PDBPROCESS): Integer; cdecl;
00245 Tdbnumrets = function(Proc: PDBPROCESS): Integer; cdecl;
00246 Tdbopen = function(Login: PLOGINREC; Host: PChar): PDBPROCESS; cdecl;
00247 Tdbordercol = function(Proc: PDBPROCESS; Order: Integer): Integer; cdecl;
00248 Tdbprocinfo = function(Proc: PDBPROCESS; DbProcInfo: PDBPROCINFO): RETCODE; cdecl;
00249 Tdbprhead = procedure(Proc: PDBPROCESS); cdecl;
00250 Tdbprrow = function(Proc: PDBPROCESS): RETCODE; cdecl;
00251 Tdbprtype = function(Token: Integer): PChar; cdecl;
00252 Tdbqual = function(Proc: PDBPROCESS; TabNum: Integer; TabName: PChar): PChar; cdecl;
00253 Tdbreadtext = function(Proc: PDBPROCESS; Buf: Pointer; BufSize: DBINT): DBINT; cdecl;
00254 Tdbresults = function(Proc: PDBPROCESS): RETCODE; cdecl;
00255 Tdbretdata = function(Proc: PDBPROCESS; RetNum: Integer): PByte; cdecl;
00256 Tdbretlen = function(Proc: PDBPROCESS; RetNum: Integer): DBINT; cdecl;
00257 Tdbretname = function(Proc: PDBPROCESS; RetNum: Integer): PChar; cdecl;
00258 Tdbretstatus = function(Proc: PDBPROCESS): DBINT; cdecl;
00259 Tdbrettype = function(Proc: PDBPROCESS; RetNum: Integer): Integer; cdecl;
00260 Tdbrows = function(Proc: PDBPROCESS): RETCODE; cdecl;
00261 Tdbrowtype = function(Proc: PDBPROCESS): STATUS; cdecl;
00262 Tdbrpcinit = function(Proc: PDBPROCESS; ProcName: PChar; Options: DBSMALLINT):
00263 RETCODE; cdecl;
00264 Tdbrpcparam = function(Proc: PDBPROCESS; ParamName: PChar; Status: Byte;
00265 Typ: Integer; MaxLen, DataLen: DBINT; Value: PByte): RETCODE; cdecl;
00266 Tdbrpcsend = function(Proc: PDBPROCESS): RETCODE; cdecl;
00267 Tdbrpcexec = function(Proc: PDBPROCESS): RETCODE; cdecl;
00268
00269 Tdbrpwclr = procedure(Login: PLOGINREC); cdecl;
00270 Tdbserverenum = function(SearchMode: Word; ServNameBuf: PChar;
00271 ServNameBufSize: Word; NumEntries: PWord): Integer; cdecl;
00272 Tdbsetavail = procedure(Proc: PDBPROCESS); cdecl;
00273 Tdbsetmaxprocs = function(MaxProcs: SmallInt): RETCODE; cdecl;
00274 Tdbsetlname = function(Login: PLOGINREC; Value: PChar; Item: Integer): RETCODE; cdecl;
00275 Tdbsetlogintime = function(Seconds: Integer): RETCODE; cdecl;
00276
00277 Tdbsetlpacket = function(Login: PLOGINREC; PacketSize: Word): RETCODE; cdecl;
00278 Tdbsetnull = function(Proc: PDBPROCESS; BindType, BindLen: Integer;
00279 BindVal: PByte): RETCODE; cdecl;
00280 Tdbsetopt = function(Proc: PDBPROCESS; Option: Integer; Param: PChar):
00281 RETCODE; cdecl;
00282 Tdbsettime = function(Seconds: Integer): RETCODE; cdecl;
00283 Tdbsetuserdata = procedure(Proc: PDBPROCESS; Ptr: Pointer); cdecl;
00284 Tdbsqlexec = function(Proc: PDBPROCESS): RETCODE; cdecl;
00285 Tdbsqlok = function(Proc: PDBPROCESS): RETCODE; cdecl;
00286 Tdbsqlsend = function(Proc: PDBPROCESS): RETCODE; cdecl;
00287 Tdbstrcpy = function(Proc: PDBPROCESS; Start, NumBytes: Integer; Dest: PChar):
00288 RETCODE; cdecl;
00289 Tdbstrlen = function(Proc: PDBPROCESS): Integer; cdecl;
00290 Tdbtabbrowse = function(Proc: PDBPROCESS; TabNum: Integer): LongBool; cdecl;
00291 Tdbtabcount = function(Proc: PDBPROCESS): Integer; cdecl;
00292 Tdbtabname = function(Proc: PDBPROCESS; Table: Integer): PChar; cdecl;
00293 Tdbtabsource = function(Proc: PDBPROCESS; Column: Integer; TabNum: PInteger):
00294 PChar; cdecl;
00295 Tdbtsnewlen = function(Proc: PDBPROCESS): Integer; cdecl;
00296 Tdbtsnewval = function(Proc: PDBPROCESS): PDBBINARY; cdecl;
00297 Tdbtsput = function(Proc: PDBPROCESS; NewTs: PDBBINARY; NewTsName,
00298 TabNum: Integer; TableName: PChar): RETCODE; cdecl;
00299 Tdbtxptr = function(Proc: PDBPROCESS; Column: Integer): PDBBINARY; cdecl;
00300 Tdbtxtimestamp = function(Proc: PDBPROCESS; Column: Integer): PDBBINARY; cdecl;
00301 Tdbtxtsnewval = function(Proc: PDBPROCESS): PDBBINARY; cdecl;
00302 Tdbtxtsput = function(Proc: PDBPROCESS; NewTxts: PDBBINARY; Column: Integer):
00303 RETCODE; cdecl;
00304 Tdbuse = function(Proc: PDBPROCESS; DbName: PChar): RETCODE; cdecl;
00305 Tdbvarylen = function(Proc: PDBPROCESS; Column: Integer): LongBool; cdecl;
00306 Tdbwillconvert = function(SrcType, DestType: Integer): LongBool; cdecl;
00307 Tdbwritetext = function(Proc: PDBPROCESS; ObjName: PChar; TextPtr: PDBBINARY;
00308 TextPtrLen: DBTINYINT; Timestamp: PDBBINARY; Log: LongBool; Size: DBINT;
00309 Text: PByte): RETCODE; cdecl;
00310 Tdbupdatetext = function(Proc: PDBPROCESS; DestObject: PChar; DestTextPtr,
00311 DestTimestamp: PDBBINARY; UpdateType: Integer; InsertOffset,
00312 DeleteLength: DBINT; SrcObject: PChar; SrcSize: DBINT; SrcText: PDBBINARY):
00313 RETCODE; cdecl;
00314
00315 {************* Plain API Function variables definition ************}
00316
00317 var
00318 dberrhandle : Tdberrhandle;
00319 dbmsghandle : Tdbmsghandle;
00320
00321 dbprocerrhandle : Tdbprocerrhandle;
00322 dbprocmsghandle : Tdbprocmsghandle;
00323
00324 { Two-phase commit functions }
00325 abort_xact : Tabort_xact;
00326 build_xact_string : Tbuild_xact_string;
00327 close_commit : Tclose_commit;
00328 commit_xact : Tcommit_xact;
00329 open_commit : Topen_commit;
00330 remove_xact : Tremove_xact;
00331 scan_xact : Tscan_xact;
00332 start_xact : Tstart_xact;
00333 stat_xact : Tstat_xact;
00334
00335 { BCP functions }
00336 bcp_batch : Tbcp_batch;
00337 bcp_bind : Tbcp_bind;
00338 bcp_colfmt : Tbcp_colfmt;
00339 bcp_collen : Tbcp_collen;
00340 bcp_colptr : Tbcp_colptr;
00341 bcp_columns : Tbcp_columns;
00342 bcp_control : Tbcp_control;
00343 bcp_done : Tbcp_done;
00344 bcp_exec : Tbcp_exec;
00345 bcp_init : Tbcp_init;
00346 bcp_moretext : Tbcp_moretext;
00347 bcp_readfmt : Tbcp_readfmt;
00348 bcp_sendrow : Tbcp_sendrow;
00349 bcp_setl : Tbcp_setl;
00350 bcp_writefmt : Tbcp_writefmt;
00351
00352 { Standard DB-Library functions }
00353 dbadata : Tdbadata;
00354 dbadlen : Tdbadlen;
00355 dbaltbind : Tdbaltbind;
00356 dbaltcolid : Tdbaltcolid;
00357 dbaltlen : Tdbaltlen;
00358 dbaltop : Tdbaltop;
00359 dbalttype : Tdbalttype;
00360 dbaltutype : Tdbaltutype;
00361 dbanullbind : Tdbanullbind;
00362 dbbind : Tdbbind;
00363 dbbylist : Tdbbylist;
00364 dbcancel : Tdbcancel;
00365 dbcanquery : Tdbcanquery;
00366 dbchange : Tdbchange;
00367 dbclose : Tdbclose;
00368 dbclrbuf : Tdbclrbuf;
00369 dbclropt : Tdbclropt;
00370 dbcmd : Tdbcmd;
00371 dbcmdrow : Tdbcmdrow;
00372 dbcolbrowse : Tdbcolbrowse;
00373 dbcolinfo : Tdbcolinfo;
00374 dbcollen : Tdbcollen;
00375 dbcolname : Tdbcolname;
00376 dbcolsource : Tdbcolsource;
00377 dbcoltype : Tdbcoltype;
00378 dbcolutype : Tdbcolutype;
00379 dbconvert : Tdbconvert;
00380 dbcount : Tdbcount;
00381 dbcurcmd : Tdbcurcmd;
00382 dbcurrow : Tdbcurrow;
00383
00384 dbcursor : Tdbcursor;
00385 dbcursorbind : Tdbcursorbind;
00386 dbcursorclose : Tdbcursorclose;
00387 dbcursorcolinfo : Tdbcursorcolinfo;
00388 dbcursorfetch : Tdbcursorfetch;
00389 dbcursorfetchex : Tdbcursorfetchex;
00390 dbcursorinfo : Tdbcursorinfo;
00391 dbcursorinfoex : Tdbcursorinfoex;
00392 dbcursoropen : Tdbcursoropen;
00393 dbdata : Tdbdata;
00394 dbdataready : Tdbdataready;
00395 dbdatecrack : Tdbdatecrack;
00396 dbdatlen : Tdbdatlen;
00397 dbdead : Tdbdead;
00398 dbexit : Tdbexit;
00399 dbWinexit : TdbWinexit;
00400 dbenlisttrans : Tdbenlisttrans;
00401 dbenlistxatrans : Tdbenlistxatrans;
00402 dbfcmd :Tdbfcmd;
00403 dbfirstrow : Tdbfirstrow;
00404 dbfreebuf : Tdbfreebuf;
00405 dbfreelogin : Tdbfreelogin;
00406 dbfreequal : Tdbfreequal;
00407 dbgetchar : Tdbgetchar;
00408 dbgetmaxprocs : Tdbgetmaxprocs;
00409 dbgetoff : Tdbgetoff;
00410 dbgetpacket : Tdbgetpacket;
00411 dbgetrow : Tdbgetrow;
00412 dbgettime : Tdbgettime;
00413 dbgetuserdata : Tdbgetuserdata;
00414 dbhasretstat : Tdbhasretstat;
00415 dbinit : Tdbinit;
00416 dbisavail : Tdbisavail;
00417 dbiscount : Tdbiscount;
00418 dbisopt : Tdbisopt;
00419 dblastrow : Tdblastrow;
00420 dblogin : Tdblogin;
00421 dbmorecmds : Tdbmorecmds;
00422 dbmoretext : Tdbmoretext;
00423 dbname : Tdbname;
00424 dbnextrow : Tdbnextrow;
00425 dbnullbind : Tdbnullbind;
00426 dbnumalts : Tdbnumalts;
00427 dbnumcols : Tdbnumcols;
00428 dbnumcompute : Tdbnumcompute;
00429 dbnumorders : Tdbnumorders;
00430 dbnumrets : Tdbnumrets;
00431 dbopen : Tdbopen;
00432 dbordercol : Tdbordercol;
00433 dbprocinfo : Tdbprocinfo;
00434 dbprhead : Tdbprhead;
00435 dbprrow : Tdbprrow;
00436 dbprtype : Tdbprtype;
00437 dbqual : Tdbqual;
00438 dbreadtext : Tdbreadtext;
00439 dbresults : Tdbresults;
00440 dbretdata : Tdbretdata;
00441 dbretlen : Tdbretlen;
00442 dbretname : Tdbretname;
00443 dbretstatus : Tdbretstatus;
00444 dbrettype : Tdbrettype;
00445 dbrows : Tdbrows;
00446 dbrowtype : Tdbrowtype;
00447 dbrpcinit : Tdbrpcinit;
00448 dbrpcparam : Tdbrpcparam;
00449 dbrpcsend : Tdbrpcsend;
00450 dbrpcexec : Tdbrpcexec;
00451
00452 dbrpwclr : Tdbrpwclr;
00453 dbserverenum : Tdbserverenum;
00454 dbsetavail : Tdbsetavail;
00455 dbsetmaxprocs : Tdbsetmaxprocs;
00456 dbsetlname : Tdbsetlname;
00457 dbsetlogintime : Tdbsetlogintime;
00458
00459 dbsetlpacket : Tdbsetlpacket;
00460 dbsetnull : Tdbsetnull;
00461 dbsetopt : Tdbsetopt;
00462 dbsettime : Tdbsettime;
00463 dbsetuserdata : Tdbsetuserdata;
00464 dbsqlexec : Tdbsqlexec;
00465 dbsqlok : Tdbsqlok;
00466 dbsqlsend : Tdbsqlsend;
00467 dbstrcpy : Tdbstrcpy;
00468 dbstrlen : Tdbstrlen;
00469 dbtabbrowse : Tdbtabbrowse;
00470 dbtabcount : Tdbtabcount;
00471 dbtabname : Tdbtabname;
00472 dbtabsource : Tdbtabsource;
00473 dbtsnewlen : Tdbtsnewlen;
00474 dbtsnewval : Tdbtsnewval;
00475 dbtsput : Tdbtsput;
00476 dbtxptr : Tdbtxptr;
00477 dbtxtimestamp : Tdbtxtimestamp;
00478 dbtxtsnewval : Tdbtxtsnewval;
00479 dbtxtsput : Tdbtxtsput;
00480 dbuse : Tdbuse;
00481 dbvarylen : Tdbvarylen;
00482 dbwillconvert : Tdbwillconvert;
00483 dbwritetext : Tdbwritetext;
00484 dbupdatetext : Tdbupdatetext;
00485
00486 var
00487 LibraryLoader: TZNativeLibraryLoader;
00488 MSSqlErrors: TList;
00489 MSSqlMessages: TList;
00490
00491 implementation
00492
00493 { Handle sql server errors }
00494 var
00495 OldErrorHandle: DBERRHANDLE_PROC = nil;
00496 OldMessageHandle: DBMSGHANDLE_PROC = nil;
00497
00498 { Handle sql server error messages }
00499 function ErrorHandle(Proc: PDBPROCESS; Severity, DbErr, OsErr: Integer;
00500 DbErrStr, OsErrStr: PChar): Integer; cdecl;
00501 var
00502 MSSqlError: PDBLibError;
00503 begin
00504 New(MSSqlError);
00505 MSSqlError.dbProc := Proc;
00506 MSSqlError.Severity := Severity;
00507 MSSqlError.DbErr := DbErr;
00508 MSSqlError.OsErr := OsErr;
00509 MSSqlError.DbErrStr := DbErrStr;
00510 MSSqlError.OsErrStr := OsErrStr;
00511 MSSqlErrors.Add(MSSqlError);
00512
00513 Result := INT_CANCEL;
00514 end;
00515
00516 { Handle sql server messages }
00517 function MessageHandle(Proc: PDBPROCESS; MsgNo: DBINT; MsgState, Severity: Integer;
00518 MsgText, SrvName, ProcName: PChar; Line: DBUSMALLINT): Integer; cdecl;
00519 var
00520 MSSqlMessage: PDBLibMessage;
00521 begin
00522 New(MSSqlMessage);
00523 MSSqlMessage.dbProc := Proc;
00524 MSSqlMessage.MsgNo := MsgNo;
00525 MSSqlMessage.MsgState := MsgState;
00526 MSSqlMessage.Severity := Severity;
00527 MSSqlMessage.MsgText := MsgText;
00528 MSSqlMessage.SrvName := SrvName;
00529 MSSqlMessage.ProcName := ProcName;
00530 MSSqlMessage.Line := Line;
00531 MSSqlMessages.Add(MSSqlMessage);
00532
00533 Result := 0;
00534 end;
00535
00536 function DBSETLHOST(Login: PLOGINREC; ClientHost: PChar): RETCODE;
00537 begin
00538 Result := dbsetlname(Login, ClientHost, DBSETHOST);
00539 end;
00540
00541 function DBSETLUSER(Login: PLOGINREC; UserName: PChar): RETCODE;
00542 begin
00543 Result := dbsetlname(Login, UserName, DBSETUSER);
00544 end;
00545
00546 function DBSETLPWD(Login: PLOGINREC; Passwd: PChar): RETCODE;
00547 begin
00548 Result := dbsetlname(Login, Passwd, DBSETPWD);
00549 end;
00550
00551 function DBSETLAPP(Login: PLOGINREC; AppName: PChar): RETCODE;
00552 begin
00553 Result := dbsetlname(Login, AppName, DBSETAPP);
00554 end;
00555
00556 function DBSETLNATLANG(Login: PLOGINREC; Lang: PChar): RETCODE;
00557 begin
00558 Result := dbsetlname(Login, Lang, DBSETLANG);
00559 end;
00560
00561 function DBSETLSECURE(Login: PLOGINREC): RETCODE;
00562 begin
00563 Result := dbsetlname(Login, nil, DBSETSECURE);
00564 end;
00565
00566 function DBSETLVERSION(Login: PLOGINREC; Version: Byte): RETCODE;
00567 begin
00568 Result := dbsetlname(Login, nil, Version);
00569 end;
00570
00571 function DBSETLTIME(Login: PLOGINREC; Seconds: LongWord): RETCODE;
00572 begin
00573 Result := dbsetlname(Login, PChar(Cardinal(Seconds)), DBSET_LOGIN_TIME);
00574 end;
00575
00576 function DBSETLFALLBACK(Login: PLOGINREC; Fallback: PChar): RETCODE;
00577 begin
00578 Result := dbsetlname(Login, Fallback, DBSETFALLBACK);
00579 end;
00580
00581 function dbrbuf(Proc: PDBPROCESS): DBINT;
00582 begin
00583 Result := DBINT(dbdataready(Proc));
00584 end;
00585
00586 type
00587 {** Implements a loader for MSSql native library. }
00588 TZMSSqlNativeLibraryLoader = class (TZNativeLibraryLoader)
00589 public
00590 function Load: Boolean; override;
00591 procedure FreeNativeLibrary; override;
00592 end;
00593
00594 { TZMSSqlNativeLibraryLoader }
00595
00596 {**
00597 Loads a library module.
00598 @return <code>True</code> if library was successfully loaded.
00599 }
00600 function TZMSSqlNativeLibraryLoader.Load: Boolean;
00601 begin
00602 Result := inherited Load;
00603 if not Result then
00604 Exit;
00605
00606 @dberrhandle := GetAddress('dberrhandle');
00607 @dbmsghandle := GetAddress('dbmsghandle');
00608 @dbprocerrhandle := GetAddress('dbprocerrhandle');
00609 @dbprocmsghandle := GetAddress('dbprocmsghandle');
00610 @abort_xact := GetAddress('abort_xact');
00611 @build_xact_string := GetAddress('build_xact_string');
00612 @close_commit := GetAddress('close_commit');
00613 @commit_xact := GetAddress('commit_xact');
00614 @open_commit := GetAddress('open_commit');
00615 @remove_xact := GetAddress('remove_xact');
00616 @scan_xact := GetAddress('scan_xact');
00617 @start_xact := GetAddress('start_xact');
00618 @stat_xact := GetAddress('stat_xact');
00619 @bcp_batch := GetAddress('bcp_batch');
00620 @bcp_bind := GetAddress('bcp_bind');
00621 @bcp_colfmt := GetAddress('bcp_colfmt');
00622 @bcp_collen := GetAddress('bcp_collen');
00623 @bcp_colptr := GetAddress('bcp_colptr');
00624 @bcp_columns := GetAddress('bcp_columns');
00625 @bcp_control := GetAddress('bcp_control');
00626 @bcp_done := GetAddress('bcp_done');
00627 @bcp_exec := GetAddress('bcp_exec');
00628 @bcp_init := GetAddress('bcp_init');
00629 @bcp_moretext := GetAddress('bcp_moretext');
00630 @bcp_readfmt := GetAddress('bcp_readfmt');
00631 @bcp_sendrow := GetAddress('bcp_sendrow');
00632 @bcp_setl := GetAddress('bcp_setl');
00633 @bcp_writefmt := GetAddress('bcp_writefmt');
00634 @dbadata := GetAddress('dbadata');
00635 @dbadlen := GetAddress('dbadlen');
00636 @dbaltbind := GetAddress('dbaltbind');
00637 @dbaltcolid := GetAddress('dbaltcolid');
00638 @dbaltlen := GetAddress('dbaltlen');
00639 @dbaltop := GetAddress('dbaltop');
00640 @dbalttype := GetAddress('dbalttype');
00641 @dbaltutype := GetAddress('dbaltutype');
00642 @dbanullbind := GetAddress('dbanullbind');
00643 @dbbind := GetAddress('dbbind');
00644 @dbbylist := GetAddress('dbbylist');
00645 @dbcancel := GetAddress('dbcancel');
00646 @dbcanquery := GetAddress('dbcanquery');
00647 @dbchange := GetAddress('dbchange');
00648 @dbclose := GetAddress('dbclose');
00649 @dbclrbuf := GetAddress('dbclrbuf');
00650 @dbclropt := GetAddress('dbclropt');
00651 @dbcmd := GetAddress('dbcmd');
00652 @dbcmdrow := GetAddress('dbcmdrow');
00653 @dbcolbrowse := GetAddress('dbcolbrowse');
00654 @dbcolinfo := GetAddress('dbcolinfo');
00655 @dbcollen := GetAddress('dbcollen');
00656 @dbcolname := GetAddress('dbcolname');
00657 @dbcolsource := GetAddress('dbcolsource');
00658 @dbcoltype := GetAddress('dbcoltype');
00659 @dbcolutype := GetAddress('dbcolutype');
00660 @dbconvert := GetAddress('dbconvert');
00661 @dbcount := GetAddress('dbcount');
00662 @dbcurcmd := GetAddress('dbcurcmd');
00663 @dbcurrow := GetAddress('dbcurrow');
00664 @dbcursor := GetAddress('dbcursor');
00665 @dbcursorbind := GetAddress('dbcursorbind');
00666 @dbcursorclose := GetAddress('dbcursorclose');
00667 @dbcursorcolinfo := GetAddress('dbcursorcolinfo');
00668 @dbcursorfetch := GetAddress('dbcursorfetch');
00669 @dbcursorfetchex := GetAddress('dbcursorfetchex');
00670 @dbcursorinfo := GetAddress('dbcursorinfo');
00671 @dbcursorinfoex := GetAddress('dbcursorinfoex');
00672 @dbcursoropen := GetAddress('dbcursoropen');
00673 @dbdata := GetAddress('dbdata');
00674 @dbdataready := GetAddress('dbdataready');
00675 @dbdatecrack := GetAddress('dbdatecrack');
00676 @dbdatlen := GetAddress('dbdatlen');
00677 @dbdead := GetAddress('dbdead');
00678 @dbexit := GetAddress('dbexit');
00679 @dbWinexit := GetAddress('dbwinexit');
00680 @dbenlisttrans := GetAddress('dbenlisttrans');
00681 @dbenlistxatrans := GetAddress('dbenlistxatrans');
00682 @dbfcmd := GetAddress('dbfcmd');
00683 @dbfirstrow := GetAddress('dbfirstrow');
00684 @dbfreebuf := GetAddress('dbfreebuf');
00685 @dbfreelogin := GetAddress('dbfreelogin');
00686 @dbfreequal := GetAddress('dbfreequal');
00687 @dbgetchar := GetAddress('dbgetchar');
00688 @dbgetmaxprocs := GetAddress('dbgetmaxprocs');
00689 @dbgetoff := GetAddress('dbgetoff');
00690 @dbgetpacket := GetAddress('dbgetpacket');
00691 @dbgetrow := GetAddress('dbgetrow');
00692 @dbgettime := GetAddress('dbgettime');
00693 @dbgetuserdata := GetAddress('dbgetuserdata');
00694 @dbhasretstat := GetAddress('dbhasretstat');
00695 @dbinit := GetAddress('dbinit');
00696 @dbisavail := GetAddress('dbisavail');
00697 @dbiscount := GetAddress('dbiscount');
00698 @dbisopt := GetAddress('dbisopt');
00699 @dblastrow := GetAddress('dblastrow');
00700 @dblogin := GetAddress('dblogin');
00701 @dbmorecmds := GetAddress('dbmorecmds');
00702 @dbmoretext := GetAddress('dbmoretext');
00703 @dbname := GetAddress('dbname');
00704 @dbnextrow := GetAddress('dbnextrow');
00705 @dbnullbind := GetAddress('dbnullbind');
00706 @dbnumalts := GetAddress('dbnumalts');
00707 @dbnumcols := GetAddress('dbnumcols');
00708 @dbnumcompute := GetAddress('dbnumcompute');
00709 @dbnumorders := GetAddress('dbnumorders');
00710 @dbnumrets := GetAddress('dbnumrets');
00711 @dbopen := GetAddress('dbopen');
00712 @dbordercol := GetAddress('dbordercol');
00713 @dbprocinfo := GetAddress('dbprocinfo');
00714 @dbprhead := GetAddress('dbprhead');
00715 @dbprrow := GetAddress('dbprrow');
00716 @dbprtype := GetAddress('dbprtype');
00717 @dbqual := GetAddress('dbqual');
00718 @dbreadtext := GetAddress('dbreadtext');
00719 @dbresults := GetAddress('dbresults');
00720 @dbretdata := GetAddress('dbretdata');
00721 @dbretlen := GetAddress('dbretlen');
00722 @dbretname := GetAddress('dbretname');
00723 @dbretstatus := GetAddress('dbretstatus');
00724 @dbrettype := GetAddress('dbrettype');
00725 @dbrows := GetAddress('dbrows');
00726 @dbrowtype := GetAddress('dbrowtype');
00727 @dbrpcinit := GetAddress('dbrpcinit');
00728 @dbrpcparam := GetAddress('dbrpcparam');
00729 @dbrpcsend := GetAddress('dbrpcsend');
00730 @dbrpcexec := GetAddress('dbrpcexec');
00731 @dbrpwclr := GetAddress('dbrpwclr');
00732 @dbserverenum := GetAddress('dbserverenum');
00733 @dbsetavail := GetAddress('dbsetavail');
00734 @dbsetmaxprocs := GetAddress('dbsetmaxprocs');
00735 @dbsetlname := GetAddress('dbsetlname');
00736 @dbsetlogintime := GetAddress('dbsetlogintime');
00737 @dbsetlpacket := GetAddress('dbsetlpacket');
00738 @dbsetnull := GetAddress('dbsetnull');
00739 @dbsetopt := GetAddress('dbsetopt');
00740 @dbsettime := GetAddress('dbsettime');
00741 @dbsetuserdata := GetAddress('dbsetuserdata');
00742 @dbsqlexec := GetAddress('dbsqlexec');
00743 @dbsqlok := GetAddress('dbsqlok');
00744 @dbsqlsend := GetAddress('dbsqlsend');
00745 @dbstrcpy := GetAddress('dbstrcpy');
00746 @dbstrlen := GetAddress('dbstrlen');
00747 @dbtabbrowse := GetAddress('dbtabbrowse');
00748 @dbtabcount := GetAddress('dbtabcount');
00749 @dbtabname := GetAddress('dbtabname');
00750 @dbtabsource := GetAddress('dbtabsource');
00751 @dbtsnewlen := GetAddress('dbtsnewlen');
00752 @dbtsnewval := GetAddress('dbtsnewval');
00753 @dbtsput := GetAddress('dbtsput');
00754 @dbtxptr := GetAddress('dbtxptr');
00755 @dbtxtimestamp := GetAddress('dbtxtimestamp');
00756 @dbtxtsnewval := GetAddress('dbtxtsnewval');
00757 @dbtxtsput := GetAddress('dbtxtsput');
00758 @dbuse := GetAddress('dbuse');
00759 @dbvarylen := GetAddress('dbvarylen');
00760 @dbwillconvert := GetAddress('dbwillconvert');
00761 @dbwritetext := GetAddress('dbwritetext');
00762 @dbupdatetext := GetAddress('dbupdatetext');
00763
00764 dbInit;
00765
00766 OldErrorHandle := dberrhandle(ErrorHandle);
00767 OldMessageHandle := dbmsghandle(MessageHandle);
00768 end;
00769
00770 procedure TZMSSqlNativeLibraryLoader.FreeNativeLibrary;
00771 begin
00772 dberrhandle(OldErrorHandle);
00773 dbmsghandle(OldMessageHandle);
00774 dbWinExit;
00775 dbExit;
00776
00777 inherited;
00778 end;
00779
00780 initialization
00781 MSSqlErrors := TList.Create;
00782 MSSqlMessages := TList.Create;
00783 LibraryLoader := TZMSSqlNativeLibraryLoader.Create([WINDOWS_DLL_LOCATION]);
00784 finalization
00785 if Assigned(LibraryLoader) then
00786 LibraryLoader.Free;
00787
00788
00789 while MSSqlMessages.Count > 0 do
00790 begin
00791 Dispose(MSSqlMessages.Items[0]);
00792 MSSqlMessages.Delete(0);
00793 end;
00794 if MSSqlMessages <> nil then
00795 begin
00796 MSSqlMessages.Free;
00797 MSSqlMessages := nil;
00798 end;
00799
00800
00801 while MSSqlErrors.Count > 0 do
00802 begin
00803 Dispose(MSSqlErrors.Items[0]);
00804 MSSqlErrors.Delete(0);
00805 end;
00806 if MSSqlErrors <> nil then
00807 begin
00808 MSSqlErrors.Free;
00809 MSSqlErrors := nil;
00810 end;
00811 end.
00812
00813
00814