00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _tds_h_
00022 #define _tds_h_
00023
00024
00025
00026 #include <stdarg.h>
00027 #include <stdio.h>
00028 #include <time.h>
00029
00030 #if HAVE_NETINET_IN_H
00031 #include <netinet/in.h>
00032 #endif
00033 #if HAVE_ARPA_INET_H
00034 #include <arpa/inet.h>
00035 #endif
00036
00037
00038 typedef struct tdsiconvinfo TDSICONV;
00039 typedef struct tds_socket TDSSOCKET;
00040
00041 #include "tdsver.h"
00042 #include "tds_sysdep_public.h"
00043 #ifdef _FREETDS_LIBRARY_SOURCE
00044 #include "tds_sysdep_private.h"
00045 #endif
00046
00047 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
00048 #pragma GCC visibility push(hidden)
00049 #endif
00050
00051 #ifdef __cplusplus
00052 extern "C"
00053 {
00054 #if 0
00055 }
00056 #endif
00057 #endif
00058
00064 typedef struct tds_compiletime_settings
00065 {
00066 const char *freetds_version;
00067 const char *sysconfdir;
00068 const char *last_update;
00069 int msdblib;
00070 int sybase_compat;
00071 int threadsafe;
00072 int libiconv;
00073 const char *tdsver;
00074 int iodbc;
00075 int unixodbc;
00076
00077 } TDS_COMPILETIME_SETTINGS;
00078
00079 typedef struct tds_dstr {
00080 char *dstr_s;
00081 size_t dstr_size;
00082 } DSTR;
00083
00099
00100
00101
00102
00103
00104
00105
00106
00107 typedef char TDS_CHAR;
00108 typedef unsigned char TDS_UCHAR;
00109 typedef unsigned char TDS_TINYINT;
00110 typedef tds_sysdep_int16_type TDS_SMALLINT;
00111 typedef unsigned tds_sysdep_int16_type TDS_USMALLINT;
00112 typedef tds_sysdep_int32_type TDS_INT;
00113 typedef unsigned tds_sysdep_int32_type TDS_UINT;
00114 typedef tds_sysdep_real32_type TDS_REAL;
00115 typedef tds_sysdep_real64_type TDS_FLOAT;
00116 typedef tds_sysdep_int64_type TDS_INT8;
00117 typedef unsigned tds_sysdep_int64_type TDS_UINT8;
00118 typedef tds_sysdep_intptr_type TDS_INTPTR;
00119
00120 typedef struct tdsnumeric
00121 {
00122 unsigned char precision;
00123 unsigned char scale;
00124 unsigned char array[33];
00125 } TDS_NUMERIC;
00126
00127 typedef struct tdsoldmoney
00128 {
00129 TDS_INT mnyhigh;
00130 TDS_UINT mnylow;
00131 } TDS_OLD_MONEY;
00132
00133 typedef union tdsmoney
00134 {
00135 TDS_OLD_MONEY tdsoldmoney;
00136 TDS_INT8 mny;
00137 } TDS_MONEY;
00138
00139 typedef struct tdsmoney4
00140 {
00141 TDS_INT mny4;
00142 } TDS_MONEY4;
00143
00144 typedef struct tdsdatetime
00145 {
00146 TDS_INT dtdays;
00147 TDS_INT dttime;
00148 } TDS_DATETIME;
00149
00150 typedef struct tdsdatetime4
00151 {
00152 TDS_USMALLINT days;
00153 TDS_USMALLINT minutes;
00154 } TDS_DATETIME4;
00155
00156 typedef struct tdsvarbinary
00157 {
00158 TDS_SMALLINT len;
00159 TDS_CHAR array[256];
00160 } TDS_VARBINARY;
00161 typedef struct tdsvarchar
00162 {
00163 TDS_SMALLINT len;
00164 TDS_CHAR array[256];
00165 } TDS_VARCHAR;
00166
00167 typedef struct tdsunique
00168 {
00169 TDS_UINT Data1;
00170 TDS_USMALLINT Data2;
00171 TDS_USMALLINT Data3;
00172 TDS_UCHAR Data4[8];
00173 } TDS_UNIQUE;
00174
00176 typedef struct tdsdaterec
00177 {
00178 TDS_INT year;
00179 TDS_INT quarter;
00180 TDS_INT month;
00181 TDS_INT day;
00182 TDS_INT dayofyear;
00183 TDS_INT week;
00184 TDS_INT weekday;
00185 TDS_INT hour;
00186 TDS_INT minute;
00187 TDS_INT second;
00188 TDS_INT millisecond;
00189 TDS_INT tzone;
00190 } TDSDATEREC;
00191
00197 extern const int tds_numeric_bytes_per_prec[];
00198
00199 #define TDS_SUCCEED 1
00200 #define TDS_FAIL 0
00201 #define TDS_NO_MORE_RESULTS 2
00202 #define TDS_CANCELLED 3
00203
00204 #define TDS_INT_CONTINUE 1
00205 #define TDS_INT_CANCEL 2
00206 #define TDS_INT_TIMEOUT 3
00207
00208
00209 #define TDS_NO_COUNT -1
00210
00211 #define TDS_ROW_RESULT 4040
00212 #define TDS_PARAM_RESULT 4042
00213 #define TDS_STATUS_RESULT 4043
00214 #define TDS_MSG_RESULT 4044
00215 #define TDS_COMPUTE_RESULT 4045
00216 #define TDS_CMD_DONE 4046
00217 #define TDS_CMD_SUCCEED 4047
00218 #define TDS_CMD_FAIL 4048
00219 #define TDS_ROWFMT_RESULT 4049
00220 #define TDS_COMPUTEFMT_RESULT 4050
00221 #define TDS_DESCRIBE_RESULT 4051
00222 #define TDS_DONE_RESULT 4052
00223 #define TDS_DONEPROC_RESULT 4053
00224 #define TDS_DONEINPROC_RESULT 4054
00225 #define TDS_OTHERS_RESULT 4055
00226
00227 enum tds_token_results
00228 {
00229 TDS_TOKEN_RES_OTHERS,
00230 TDS_TOKEN_RES_ROWFMT,
00231 TDS_TOKEN_RES_COMPUTEFMT,
00232 TDS_TOKEN_RES_PARAMFMT,
00233 TDS_TOKEN_RES_DONE,
00234 TDS_TOKEN_RES_ROW,
00235 TDS_TOKEN_RES_COMPUTE,
00236 TDS_TOKEN_RES_PROC,
00237 TDS_TOKEN_RES_MSG
00238 };
00239
00240 #define TDS_TOKEN_FLAG(flag) TDS_RETURN_##flag = (1 << (TDS_TOKEN_RES_##flag*2)), TDS_STOPAT_##flag = (2 << (TDS_TOKEN_RES_##flag*2))
00241
00242 enum tds_token_flags
00243 {
00244 TDS_HANDLE_ALL = 0,
00245 TDS_TOKEN_FLAG(OTHERS),
00246 TDS_TOKEN_FLAG(ROWFMT),
00247 TDS_TOKEN_FLAG(COMPUTEFMT),
00248 TDS_TOKEN_FLAG(PARAMFMT),
00249 TDS_TOKEN_FLAG(DONE),
00250 TDS_TOKEN_FLAG(ROW),
00251 TDS_TOKEN_FLAG(COMPUTE),
00252 TDS_TOKEN_FLAG(PROC),
00253 TDS_TOKEN_FLAG(MSG),
00254 TDS_TOKEN_RESULTS = TDS_RETURN_ROWFMT|TDS_RETURN_COMPUTEFMT|TDS_RETURN_DONE|TDS_STOPAT_ROW|TDS_STOPAT_COMPUTE|TDS_RETURN_PROC,
00255 TDS_TOKEN_TRAILING = TDS_STOPAT_ROWFMT|TDS_STOPAT_COMPUTEFMT|TDS_STOPAT_ROW|TDS_STOPAT_COMPUTE|TDS_STOPAT_MSG|TDS_STOPAT_OTHERS
00256 };
00257
00261 enum tds_end
00262 {
00263 TDS_DONE_FINAL = 0x00
00264 , TDS_DONE_MORE_RESULTS = 0x01
00265 , TDS_DONE_ERROR = 0x02
00266 , TDS_DONE_INXACT = 0x04
00267 , TDS_DONE_PROC = 0x08
00268 , TDS_DONE_COUNT = 0x10
00269 , TDS_DONE_CANCELLED = 0x20
00270 , TDS_DONE_EVENT = 0x40
00271 , TDS_DONE_SRVERROR = 0x100
00273
00274 , TDS_DONE_NO_TRAN = 0
00275 , TDS_DONE_TRAN_SUCCEED = 1
00276 , TDS_DONE_TRAN_PROGRESS= 2
00277 , TDS_DONE_STMT_ABORT = 3
00278 , TDS_DONE_TRAN_ABORT = 4
00279 };
00280
00281
00282
00283
00284
00285
00286
00287
00288 typedef enum { TDSEOK = TDS_SUCCEED,
00289 TDSEVERDOWN = 100,
00290 TDSEICONVIU = 2400,
00291 TDSEICONVAVAIL = 2401,
00292 TDSEICONVO = 2402,
00293 TDSEICONVI = 2403,
00294 TDSEICONV2BIG = 2404,
00295 TDSEPORTINSTANCE = 2500,
00296 TDSESYNC = 20001,
00297 TDSEFCON = 20002,
00298 TDSETIME = 20003,
00299 TDSEREAD = 20004,
00300 TDSEWRIT = 20006,
00301 TDSESOCK = 20008,
00302 TDSECONN = 20009,
00303 TDSEMEM = 20010,
00304 TDSEINTF = 20012,
00305 TDSEUHST = 20013,
00306 TDSEPWD = 20014,
00307 TDSESEOF = 20017,
00308 TDSERPND = 20019,
00309 TDSEBTOK = 20020,
00310 TDSEOOB = 20022,
00311 TDSECLOS = 20056,
00312 TDSEUSCT = 20058,
00313 TDSEUTDS = 20146,
00314 TDSEEUNR = 20185,
00315 TDSECAP = 20203,
00316 TDSENEG = 20210,
00317 TDSEUMSG = 20212,
00318 TDSECAPTYP = 20213,
00319 TDSEBPROBADTYP = 20250,
00320 TDSECLOSEIN = 20292
00321 } TDSERRNO;
00322
00323 #define TDS5_PARAMFMT2_TOKEN 32
00324 #define TDS_LANGUAGE_TOKEN 33
00325 #define TDS_ORDERBY2_TOKEN 34
00326 #define TDS_ROWFMT2_TOKEN 97
00327 #define TDS_LOGOUT_TOKEN 113
00328 #define TDS_RETURNSTATUS_TOKEN 121
00329 #define TDS_PROCID_TOKEN 124
00330 #define TDS7_RESULT_TOKEN 129
00331 #define TDS7_COMPUTE_RESULT_TOKEN 136
00332 #define TDS_COLNAME_TOKEN 160
00333 #define TDS_COLFMT_TOKEN 161
00334 #define TDS_DYNAMIC2_TOKEN 163
00335 #define TDS_TABNAME_TOKEN 164
00336 #define TDS_COLINFO_TOKEN 165
00337 #define TDS_OPTIONCMD_TOKEN 166
00338 #define TDS_COMPUTE_NAMES_TOKEN 167
00339 #define TDS_COMPUTE_RESULT_TOKEN 168
00340 #define TDS_ORDERBY_TOKEN 169
00341 #define TDS_ERROR_TOKEN 170
00342 #define TDS_INFO_TOKEN 171
00343 #define TDS_PARAM_TOKEN 172
00344 #define TDS_LOGINACK_TOKEN 173
00345 #define TDS_CONTROL_TOKEN 174
00346 #define TDS_ROW_TOKEN 209
00347 #define TDS_NBC_ROW_TOKEN 210
00348 #define TDS_CMP_ROW_TOKEN 211
00349 #define TDS5_PARAMS_TOKEN 215
00350 #define TDS_CAPABILITY_TOKEN 226
00351 #define TDS_ENVCHANGE_TOKEN 227
00352 #define TDS_EED_TOKEN 229
00353 #define TDS_DBRPC_TOKEN 230
00354 #define TDS5_DYNAMIC_TOKEN 231
00355 #define TDS5_PARAMFMT_TOKEN 236
00356 #define TDS_AUTH_TOKEN 237
00357 #define TDS_RESULT_TOKEN 238
00358 #define TDS_DONE_TOKEN 253
00359 #define TDS_DONEPROC_TOKEN 254
00360 #define TDS_DONEINPROC_TOKEN 255
00361
00362
00363 #define TDS_CURCLOSE_TOKEN 128
00364 #define TDS_CURDELETE_TOKEN 129
00365 #define TDS_CURFETCH_TOKEN 130
00366 #define TDS_CURINFO_TOKEN 131
00367 #define TDS_CUROPEN_TOKEN 132
00368 #define TDS_CURDECLARE_TOKEN 134
00369
00370 enum {
00371 TDS_CUR_ISTAT_UNUSED = 0x00,
00372 TDS_CUR_ISTAT_DECLARED = 0x01,
00373 TDS_CUR_ISTAT_OPEN = 0x02,
00374 TDS_CUR_ISTAT_CLOSED = 0x04,
00375 TDS_CUR_ISTAT_RDONLY = 0x08,
00376 TDS_CUR_ISTAT_UPDATABLE = 0x10,
00377 TDS_CUR_ISTAT_ROWCNT = 0x20,
00378 TDS_CUR_ISTAT_DEALLOC = 0x40
00379 };
00380
00381
00382
00383 enum {
00384 TDS_CUR_TYPE_KEYSET = 0x0001,
00385 TDS_CUR_TYPE_DYNAMIC = 0x0002,
00386 TDS_CUR_TYPE_FORWARD = 0x0004,
00387 TDS_CUR_TYPE_STATIC = 0x0008,
00388 TDS_CUR_TYPE_FASTFORWARDONLY = 0x0010,
00389 TDS_CUR_TYPE_PARAMETERIZED = 0x1000,
00390 TDS_CUR_TYPE_AUTO_FETCH = 0x2000
00391 };
00392
00393 enum {
00394 TDS_CUR_CONCUR_READ_ONLY = 1,
00395 TDS_CUR_CONCUR_SCROLL_LOCKS = 2,
00396 TDS_CUR_CONCUR_OPTIMISTIC = 4,
00397 TDS_CUR_CONCUR_OPTIMISTIC_VALUES = 8
00398 };
00399
00400
00401 #define TDS_MAXNAME 30
00402 #define TDS_PROGNLEN 10
00403 #define TDS_PKTLEN 6
00404
00405
00406 #define TDS_ENV_DATABASE 1
00407 #define TDS_ENV_LANG 2
00408 #define TDS_ENV_CHARSET 3
00409 #define TDS_ENV_PACKSIZE 4
00410 #define TDS_ENV_LCID 5
00411 #define TDS_ENV_SQLCOLLATION 7
00412 #define TDS_ENV_BEGINTRANS 8
00413 #define TDS_ENV_COMMITTRANS 9
00414 #define TDS_ENV_ROLLBACKTRANS 10
00415
00416
00417 #define TDS_NULLTERM -9
00418
00419
00420
00421 #define TDS_SP_CURSOR 1
00422 #define TDS_SP_CURSOROPEN 2
00423 #define TDS_SP_CURSORPREPARE 3
00424 #define TDS_SP_CURSOREXECUTE 4
00425 #define TDS_SP_CURSORPREPEXEC 5
00426 #define TDS_SP_CURSORUNPREPARE 6
00427 #define TDS_SP_CURSORFETCH 7
00428 #define TDS_SP_CURSOROPTION 8
00429 #define TDS_SP_CURSORCLOSE 9
00430 #define TDS_SP_EXECUTESQL 10
00431 #define TDS_SP_PREPARE 11
00432 #define TDS_SP_EXECUTE 12
00433 #define TDS_SP_PREPEXEC 13
00434 #define TDS_SP_PREPEXECRPC 14
00435 #define TDS_SP_UNPREPARE 15
00436
00437
00438
00439
00440
00441 typedef enum
00442 {
00443 SYBCHAR = 47,
00444 #define SYBCHAR SYBCHAR
00445 SYBVARCHAR = 39,
00446 #define SYBVARCHAR SYBVARCHAR
00447 SYBINTN = 38,
00448 #define SYBINTN SYBINTN
00449 SYBINT1 = 48,
00450 #define SYBINT1 SYBINT1
00451 SYBINT2 = 52,
00452 #define SYBINT2 SYBINT2
00453 SYBINT4 = 56,
00454 #define SYBINT4 SYBINT4
00455 SYBFLT8 = 62,
00456 #define SYBFLT8 SYBFLT8
00457 SYBDATETIME = 61,
00458 #define SYBDATETIME SYBDATETIME
00459 SYBBIT = 50,
00460 #define SYBBIT SYBBIT
00461 SYBTEXT = 35,
00462 #define SYBTEXT SYBTEXT
00463 SYBNTEXT = 99,
00464 #define SYBNTEXT SYBNTEXT
00465 SYBIMAGE = 34,
00466 #define SYBIMAGE SYBIMAGE
00467 SYBMONEY4 = 122,
00468 #define SYBMONEY4 SYBMONEY4
00469 SYBMONEY = 60,
00470 #define SYBMONEY SYBMONEY
00471 SYBDATETIME4 = 58,
00472 #define SYBDATETIME4 SYBDATETIME4
00473 SYBREAL = 59,
00474 #define SYBREAL SYBREAL
00475 SYBBINARY = 45,
00476 #define SYBBINARY SYBBINARY
00477 SYBVOID = 31,
00478 #define SYBVOID SYBVOID
00479 SYBVARBINARY = 37,
00480 #define SYBVARBINARY SYBVARBINARY
00481 SYBBITN = 104,
00482 #define SYBBITN SYBBITN
00483 SYBNUMERIC = 108,
00484 #define SYBNUMERIC SYBNUMERIC
00485 SYBDECIMAL = 106,
00486 #define SYBDECIMAL SYBDECIMAL
00487 SYBFLTN = 109,
00488 #define SYBFLTN SYBFLTN
00489 SYBMONEYN = 110,
00490 #define SYBMONEYN SYBMONEYN
00491 SYBDATETIMN = 111,
00492 #define SYBDATETIMN SYBDATETIMN
00493
00494
00495
00496
00497 SYBNVARCHAR = 103,
00498 #define SYBNVARCHAR SYBNVARCHAR
00499 SYBINT8 = 127,
00500 #define SYBINT8 SYBINT8
00501 XSYBCHAR = 175,
00502 #define XSYBCHAR XSYBCHAR
00503 XSYBVARCHAR = 167,
00504 #define XSYBVARCHAR XSYBVARCHAR
00505 XSYBNVARCHAR = 231,
00506 #define XSYBNVARCHAR XSYBNVARCHAR
00507 XSYBNCHAR = 239,
00508 #define XSYBNCHAR XSYBNCHAR
00509 XSYBVARBINARY = 165,
00510 #define XSYBVARBINARY XSYBVARBINARY
00511 XSYBBINARY = 173,
00512 #define XSYBBINARY XSYBBINARY
00513 SYBUNIQUE = 36,
00514 #define SYBUNIQUE SYBUNIQUE
00515 SYBVARIANT = 98,
00516 #define SYBVARIANT SYBVARIANT
00517 SYBMSUDT = 240,
00518 #define SYBMSUDT SYBMSUDT
00519 SYBMSXML = 241,
00520 #define SYBMSXML SYBMSXML
00521
00522
00523
00524
00525 SYBLONGBINARY = 225,
00526 #define SYBLONGBINARY SYBLONGBINARY
00527 SYBUINT1 = 64,
00528 #define SYBUINT1 SYBUINT1
00529 SYBUINT2 = 65,
00530 #define SYBUINT2 SYBUINT2
00531 SYBUINT4 = 66,
00532 #define SYBUINT4 SYBUINT4
00533 SYBUINT8 = 67,
00534 #define SYBUINT8 SYBUINT8
00535 SYBBLOB = 36,
00536 #define SYBBLOB SYBBLOB
00537 SYBBOUNDARY = 104,
00538 #define SYBBOUNDARY SYBBOUNDARY
00539 SYBDATE = 49,
00540 #define SYBDATE SYBDATE
00541 SYBDATEN = 123,
00542 #define SYBDATEN SYBDATEN
00543 SYB5INT8 = 191,
00544 #define SYB5INT8 SYB5INT8
00545 SYBINTERVAL = 46,
00546 #define SYBINTERVAL SYBINTERVAL
00547 SYBLONGCHAR = 175,
00548 #define SYBLONGCHAR SYBLONGCHAR
00549 SYBSENSITIVITY = 103,
00550 #define SYBSENSITIVITY SYBSENSITIVITY
00551 SYBSINT1 = 176,
00552 #define SYBSINT1 SYBSINT1
00553 SYBTIME = 51,
00554 #define SYBTIME SYBTIME
00555 SYBTIMEN = 147,
00556 #define SYBTIMEN SYBTIMEN
00557 SYBUINTN = 68,
00558 #define SYBUINTN SYBUINTN
00559 SYBUNITEXT = 174,
00560 #define SYBUNITEXT SYBUNITEXT
00561 SYBXML = 163,
00562 #define SYBXML SYBXML
00563
00564 } TDS_SERVER_TYPE;
00565
00566
00567 typedef enum
00568 {
00569 USER_UNICHAR_TYPE = 34,
00570 USER_UNIVARCHAR_TYPE = 35
00571 } TDS_USER_TYPE;
00572
00573 #define SYBAOPCNT 0x4b
00574 #define SYBAOPCNTU 0x4c
00575 #define SYBAOPSUM 0x4d
00576 #define SYBAOPSUMU 0x4e
00577 #define SYBAOPAVG 0x4f
00578 #define SYBAOPAVGU 0x50
00579 #define SYBAOPMIN 0x51
00580 #define SYBAOPMAX 0x52
00581
00582
00583 #define SYBAOPCNT_BIG 0x09
00584 #define SYBAOPSTDEV 0x30
00585 #define SYBAOPSTDEVP 0x31
00586 #define SYBAOPVAR 0x32
00587 #define SYBAOPVARP 0x33
00588 #define SYBAOPCHECKSUM_AGG 0x72
00589
00590
00594 typedef enum
00595 {
00596 TDS_OPT_SET = 1
00597 , TDS_OPT_DEFAULT = 2
00598 , TDS_OPT_LIST = 3
00599 , TDS_OPT_INFO = 4
00600 } TDS_OPTION_CMD;
00601
00602 typedef enum
00603 {
00604 TDS_OPT_DATEFIRST = 1
00605 , TDS_OPT_TEXTSIZE = 2
00606 , TDS_OPT_STAT_TIME = 3
00607 , TDS_OPT_STAT_IO = 4
00608 , TDS_OPT_ROWCOUNT = 5
00609 , TDS_OPT_NATLANG = 6
00610 , TDS_OPT_DATEFORMAT = 7
00611 , TDS_OPT_ISOLATION = 8
00612 , TDS_OPT_AUTHON = 9
00613 , TDS_OPT_CHARSET = 10
00614 , TDS_OPT_SHOWPLAN = 13
00615 , TDS_OPT_NOEXEC = 14
00616 , TDS_OPT_ARITHIGNOREON = 15
00617 , TDS_OPT_ARITHABORTON = 17
00618 , TDS_OPT_PARSEONLY = 18
00619 , TDS_OPT_GETDATA = 20
00620 , TDS_OPT_NOCOUNT = 21
00621 , TDS_OPT_FORCEPLAN = 23
00622 , TDS_OPT_FORMATONLY = 24
00623 , TDS_OPT_CHAINXACTS = 25
00624 , TDS_OPT_CURCLOSEONXACT = 26
00625 , TDS_OPT_FIPSFLAG = 27
00626 , TDS_OPT_RESTREES = 28
00627 , TDS_OPT_IDENTITYON = 29
00628 , TDS_OPT_CURREAD = 30
00629 , TDS_OPT_CURWRITE = 31
00630 , TDS_OPT_IDENTITYOFF = 32
00631 , TDS_OPT_AUTHOFF = 33
00632 , TDS_OPT_ANSINULL = 34
00633 , TDS_OPT_QUOTED_IDENT = 35
00634 , TDS_OPT_ARITHIGNOREOFF = 36
00635 , TDS_OPT_ARITHABORTOFF = 37
00636 , TDS_OPT_TRUNCABORT = 38
00637 } TDS_OPTION;
00638
00639 typedef union tds_option_arg
00640 {
00641 TDS_TINYINT ti;
00642 TDS_INT i;
00643 TDS_CHAR *c;
00644 } TDS_OPTION_ARG;
00645
00646 enum {
00647 TDS_OPT_ARITHOVERFLOW = 0x01,
00648 TDS_OPT_NUMERICTRUNC = 0x02
00649 };
00650
00651 enum TDS_OPT_DATEFIRST_CHOICE
00652 {
00653 TDS_OPT_MONDAY = 1, TDS_OPT_TUESDAY = 2, TDS_OPT_WEDNESDAY = 3, TDS_OPT_THURSDAY = 4, TDS_OPT_FRIDAY = 5, TDS_OPT_SATURDAY =
00654 6, TDS_OPT_SUNDAY = 7
00655 };
00656
00657 enum TDS_OPT_DATEFORMAT_CHOICE
00658 {
00659 TDS_OPT_FMTMDY = 1, TDS_OPT_FMTDMY = 2, TDS_OPT_FMTYMD = 3, TDS_OPT_FMTYDM = 4, TDS_OPT_FMTMYD = 5, TDS_OPT_FMTDYM = 6
00660 };
00661 enum TDS_OPT_ISOLATION_CHOICE
00662 {
00663 TDS_OPT_LEVEL1 = 1, TDS_OPT_LEVEL3 = 3
00664 };
00665
00666 typedef enum tds_packet_type
00667 {
00668 TDS_QUERY = 1,
00669 TDS_LOGIN = 2,
00670 TDS_RPC = 3,
00671 TDS_REPLY = 4,
00672 TDS_CANCEL = 6,
00673 TDS_BULK = 7,
00674 TDS_NORMAL = 15,
00675 TDS7_LOGIN = 16,
00676 TDS7_AUTH = 17,
00677 TDS8_PRELOGIN = 18
00678 } TDS_PACKET_TYPE;
00679
00680 typedef enum tds_encryption_level {
00681 TDS_ENCRYPTION_OFF, TDS_ENCRYPTION_REQUEST, TDS_ENCRYPTION_REQUIRE
00682 } TDS_ENCRYPTION_LEVEL;
00683
00684 #define TDS_ZERO_FREE(x) do {free((x)); (x) = NULL;} while(0)
00685 #define TDS_VECTOR_SIZE(x) (sizeof(x)/sizeof(x[0]))
00686
00687 #if defined(__GNUC__) && __GNUC__ >= 3
00688 # define TDS_LIKELY(x) __builtin_expect(!!(x), 1)
00689 # define TDS_UNLIKELY(x) __builtin_expect(!!(x), 0)
00690 #else
00691 # define TDS_LIKELY(x) (x)
00692 # define TDS_UNLIKELY(x) (x)
00693 #endif
00694
00695
00696
00697
00698
00699
00700 #define TDS_BYTE_SWAP16(value) \
00701 (((((unsigned short)value)<<8) & 0xFF00) | \
00702 ((((unsigned short)value)>>8) & 0x00FF))
00703
00704 #define TDS_BYTE_SWAP32(value) \
00705 (((((unsigned long)value)<<24) & 0xFF000000) | \
00706 ((((unsigned long)value)<< 8) & 0x00FF0000) | \
00707 ((((unsigned long)value)>> 8) & 0x0000FF00) | \
00708 ((((unsigned long)value)>>24) & 0x000000FF))
00709
00710 #define is_end_token(x) (x==TDS_DONE_TOKEN || \
00711 x==TDS_DONEPROC_TOKEN || \
00712 x==TDS_DONEINPROC_TOKEN)
00713
00714 #define is_hard_end_token(x) (x==TDS_DONE_TOKEN || \
00715 x==TDS_DONEPROC_TOKEN)
00716
00717 #define is_msg_token(x) (x==TDS_INFO_TOKEN || \
00718 x==TDS_ERROR_TOKEN || \
00719 x==TDS_EED_TOKEN)
00720
00721 #define is_result_token(x) (x==TDS_RESULT_TOKEN || \
00722 x==TDS_ROWFMT2_TOKEN || \
00723 x==TDS7_RESULT_TOKEN || \
00724 x==TDS_COLFMT_TOKEN || \
00725 x==TDS_COLNAME_TOKEN || \
00726 x==TDS_RETURNSTATUS_TOKEN)
00727
00728
00729 #define is_fixed_type(x) (x==SYBINT1 || \
00730 x==SYBINT2 || \
00731 x==SYBINT4 || \
00732 x==SYBINT8 || \
00733 x==SYBREAL || \
00734 x==SYBFLT8 || \
00735 x==SYBDATETIME || \
00736 x==SYBDATETIME4 || \
00737 x==SYBBIT || \
00738 x==SYBMONEY || \
00739 x==SYBMONEY4 || \
00740 x==SYBVOID || \
00741 x==SYBUNIQUE)
00742 #define is_nullable_type(x) ( \
00743 x==SYBBITN || \
00744 x==SYBINTN || \
00745 x==SYBFLTN || \
00746 x==SYBMONEYN || \
00747 x==SYBDATETIMN || \
00748 x==SYBVARCHAR || \
00749 x==SYBVARBINARY || \
00750 x==SYBTEXT || \
00751 x==SYBNTEXT || \
00752 x==SYBIMAGE)
00753
00754 #define is_variable_type(x) ( \
00755 (x)==SYBTEXT || \
00756 (x)==SYBIMAGE || \
00757 (x)==SYBNTEXT || \
00758 (x)==SYBCHAR || \
00759 (x)==SYBVARCHAR || \
00760 (x)==SYBBINARY || \
00761 (x)==SYBVARBINARY || \
00762 (x)==SYBLONGBINARY || \
00763 (x)==XSYBCHAR || \
00764 (x)==XSYBVARCHAR || \
00765 (x)==XSYBNVARCHAR || \
00766 (x)==XSYBNCHAR)
00767
00768 #define is_blob_type(x) (x==SYBTEXT || x==SYBIMAGE || x==SYBNTEXT)
00769 #define is_blob_col(x) ((x)->column_varint_size > 2)
00770
00771
00772 #define is_numeric_type(x) (x==SYBNUMERIC || x==SYBDECIMAL)
00773 #define is_unicode_type(x) (x==XSYBNVARCHAR || x==XSYBNCHAR || x==SYBNTEXT || x==SYBMSXML)
00774 #define is_collate_type(x) (x==XSYBVARCHAR || x==XSYBCHAR || x==SYBTEXT || x==XSYBNVARCHAR || x==XSYBNCHAR || x==SYBNTEXT)
00775 #define is_ascii_type(x) ( x==XSYBCHAR || x==XSYBVARCHAR || x==SYBTEXT || x==SYBCHAR || x==SYBVARCHAR)
00776 #define is_char_type(x) (is_unicode_type(x) || is_ascii_type(x))
00777 #define is_similar_type(x, y) ((is_char_type(x) && is_char_type(y)) || ((is_unicode_type(x) && is_unicode_type(y))))
00778
00779
00780 #define TDS_MAX_CAPABILITY 22
00781 #define MAXPRECISION 77
00782 #define TDS_MAX_CONN 4096
00783 #define TDS_MAX_DYNID_LEN 30
00784
00785
00786 #define TDS_DEF_SERVER "SYBASE"
00787 #define TDS_DEF_BLKSZ 512
00788 #define TDS_DEF_CHARSET "iso_1"
00789 #define TDS_DEF_LANG "us_english"
00790 #if TDS42
00791 #define TDS_DEFAULT_VERSION 0x402
00792 #define TDS_DEF_PORT 1433
00793 #elif TDS46
00794 #define TDS_DEFAULT_VERSION 0x406
00795 #define TDS_DEF_PORT 4000
00796 #elif TDS70
00797 #define TDS_DEFAULT_VERSION 0x700
00798 #define TDS_DEF_PORT 1433
00799 #elif TDS71
00800 #define TDS_DEFAULT_VERSION 0x701
00801 #define TDS_DEF_PORT 1433
00802 #elif TDS72
00803 #define TDS_DEFAULT_VERSION 0x702
00804 #define TDS_DEF_PORT 1433
00805 #else
00806 #define TDS_DEFAULT_VERSION 0x500
00807 #define TDS_DEF_PORT 4000
00808 #endif
00809
00810
00811 #define TDS_STR_VERSION "tds version"
00812 #define TDS_STR_BLKSZ "initial block size"
00813 #define TDS_STR_SWAPDT "swap broken dates"
00814 #define TDS_STR_DUMPFILE "dump file"
00815 #define TDS_STR_DEBUGLVL "debug level"
00816 #define TDS_STR_DEBUGFLAGS "debug flags"
00817 #define TDS_STR_TIMEOUT "timeout"
00818 #define TDS_STR_QUERY_TIMEOUT "query timeout"
00819 #define TDS_STR_CONNTIMEOUT "connect timeout"
00820 #define TDS_STR_HOSTNAME "hostname"
00821 #define TDS_STR_HOST "host"
00822 #define TDS_STR_PORT "port"
00823 #define TDS_STR_TEXTSZ "text size"
00824
00825 #define TDS_STR_EMUL_LE "emulate little endian"
00826 #define TDS_STR_CHARSET "charset"
00827 #define TDS_STR_CLCHARSET "client charset"
00828 #define TDS_STR_LANGUAGE "language"
00829 #define TDS_STR_APPENDMODE "dump file append"
00830 #define TDS_STR_DATEFMT "date format"
00831 #define TDS_STR_INSTANCE "instance"
00832 #define TDS_STR_ASA_DATABASE "asa database"
00833 #define TDS_STR_ENCRYPTION "encryption"
00834 #define TDS_STR_USENTLMV2 "use ntlmv2"
00835
00836 #define TDS_STR_ENCRYPTION_OFF "off"
00837 #define TDS_STR_ENCRYPTION_REQUEST "request"
00838 #define TDS_STR_ENCRYPTION_REQUIRE "require"
00839
00840 #define TDS_GSSAPI_DELEGATION "enable gssapi delegation"
00841
00842 #define TDS_STR_REALM "realm"
00843
00844
00845
00846 typedef union
00847 {
00848 void *p;
00849 int i;
00850 } tds_align_struct;
00851
00852 #define TDS_ALIGN_SIZE sizeof(tds_align_struct)
00853
00854 #define TDS_MAX_LOGIN_STR_SZ 128
00855 typedef struct tds_login
00856 {
00857 DSTR server_name;
00858 int port;
00859 TDS_USMALLINT tds_version;
00860 int block_size;
00861 DSTR language;
00862 DSTR server_charset;
00863 TDS_INT connect_timeout;
00864 DSTR client_host_name;
00865 DSTR app_name;
00866 DSTR user_name;
00867 DSTR password;
00868
00869 DSTR library;
00870 TDS_TINYINT encryption_level;
00871
00872 TDS_INT query_timeout;
00873 unsigned char capabilities[TDS_MAX_CAPABILITY];
00874 DSTR client_charset;
00875 DSTR database;
00876 unsigned int bulk_copy:1;
00877 unsigned int suppress_language:1;
00878 } TDSLOGIN;
00879
00880 typedef struct tds_connection
00881 {
00882
00883 DSTR server_name;
00884 int port;
00885 TDS_USMALLINT tds_version;
00886 int block_size;
00887 DSTR language;
00888 DSTR server_charset;
00889 TDS_INT connect_timeout;
00890 DSTR client_host_name;
00891 DSTR server_host_name;
00892 DSTR server_realm_name;
00893 DSTR app_name;
00894 DSTR user_name;
00895 DSTR password;
00896 DSTR library;
00897 TDS_TINYINT encryption_level;
00898
00899 TDS_INT query_timeout;
00900 unsigned char capabilities[TDS_MAX_CAPABILITY];
00901 unsigned char option_flag2;
00902 DSTR client_charset;
00903
00904 DSTR ip_addr;
00905 DSTR instance_name;
00906 DSTR database;
00907 DSTR dump_file;
00908 int debug_flags;
00909 int text_size;
00910 unsigned int broken_dates:1;
00911 unsigned int emul_little_endian:1;
00912 unsigned int bulk_copy:1;
00913 unsigned int suppress_language:1;
00914 unsigned int gssapi_use_delegation:1;
00915 unsigned int use_ntlmv2:1;
00916 } TDSCONNECTION;
00917
00918 typedef struct tds_locale
00919 {
00920 char *language;
00921 char *server_charset;
00922 char *date_fmt;
00923 } TDSLOCALE;
00924
00929 typedef struct tds_blob
00930 {
00931 TDS_CHAR *textvalue;
00932 TDS_CHAR textptr[16];
00933 TDS_CHAR timestamp[8];
00934 } TDSBLOB;
00935
00939 typedef struct tds_variant
00940 {
00941
00942 TDS_CHAR *data;
00943 TDS_INT size;
00944 TDS_INT data_len;
00945 TDS_UCHAR type;
00946 TDS_UCHAR collation[5];
00947 } TDSVARIANT;
00948
00952 typedef struct
00953 {
00954 TDS_USMALLINT locale_id;
00955 TDS_USMALLINT flags;
00956 TDS_UCHAR charset_id;
00957 } TDS8_COLLATION;
00958
00959
00960 #define TDS_SF_BIN (TDS_USMALLINT) 0x100
00961 #define TDS_SF_WIDTH_INSENSITIVE (TDS_USMALLINT) 0x080
00962 #define TDS_SF_KATATYPE_INSENSITIVE (TDS_USMALLINT) 0x040
00963 #define TDS_SF_ACCENT_SENSITIVE (TDS_USMALLINT) 0x020
00964 #define TDS_SF_CASE_INSENSITIVE (TDS_USMALLINT) 0x010
00965
00966
00967 #define TDS_UT_TIMESTAMP 80
00968
00969
00974 typedef struct tds_encoding
00975 {
00976 const char *name;
00977 unsigned char min_bytes_per_char;
00978 unsigned char max_bytes_per_char;
00979 unsigned char canonic;
00980 } TDS_ENCODING;
00981
00982 typedef struct tds_bcpcoldata
00983 {
00984 TDS_UCHAR *data;
00985 TDS_INT datalen;
00986 TDS_INT is_null;
00987 } BCPCOLDATA;
00988
00989
00990 enum
00991 { TDS_SYSNAME_SIZE = 512 };
00992
00996 typedef struct tds_column
00997 {
00998 TDS_SMALLINT column_type;
01003 TDS_INT column_usertype;
01004 TDS_INT column_flags;
01005
01006 TDS_INT column_size;
01008 TDS_TINYINT column_varint_size;
01010 TDS_TINYINT column_prec;
01011 TDS_TINYINT column_scale;
01013 TDS_SMALLINT column_namelen;
01014 TDS_SMALLINT table_namelen;
01015 struct
01016 {
01017 TDS_SMALLINT column_type;
01018 TDS_INT column_size;
01019 } on_server;
01020
01021 TDSICONV *char_conv;
01023 TDS_CHAR table_name[TDS_SYSNAME_SIZE];
01024 TDS_CHAR column_name[TDS_SYSNAME_SIZE];
01025 char * table_column_name;
01026
01027 unsigned char *column_data;
01028 void (*column_data_free)(struct tds_column *column);
01029 unsigned int column_nullable:1;
01030 unsigned int column_writeable:1;
01031 unsigned int column_identity:1;
01032 unsigned int column_key:1;
01033 unsigned int column_hidden:1;
01034 unsigned int column_output:1;
01035 unsigned int column_timestamp:1;
01036 TDS_UCHAR column_collation[5];
01037
01038
01039 TDS_TINYINT column_operator;
01040 TDS_SMALLINT column_operand;
01041
01042
01044 TDS_INT column_cur_size;
01045
01046
01047
01048 TDS_SMALLINT column_bindtype;
01049 TDS_SMALLINT column_bindfmt;
01050 TDS_UINT column_bindlen;
01051 TDS_SMALLINT *column_nullbind;
01052 TDS_CHAR *column_varaddr;
01053 TDS_INT *column_lenbind;
01054 TDS_INT column_textpos;
01055 TDS_INT column_text_sqlgetdatapos;
01056 TDS_CHAR column_text_sqlputdatainfo;
01057
01058 BCPCOLDATA *bcp_column_data;
01067 TDS_INT bcp_prefix_len;
01068 TDS_INT bcp_term_len;
01069 TDS_CHAR *bcp_terminator;
01070 } TDSCOLUMN;
01071
01072
01074 typedef struct tds_result_info
01075 {
01076
01077 TDS_SMALLINT num_cols;
01078 TDSCOLUMN **columns;
01079 TDS_INT row_size;
01080 TDS_INT ref_count;
01081 unsigned char *current_row;
01082 void (*row_free)(struct tds_result_info* result, unsigned char *row);
01083
01084 TDS_SMALLINT rows_exist;
01085
01086 TDS_INT row_count;
01087
01088 TDS_TINYINT more_results;
01089 TDS_SMALLINT computeid;
01090 TDS_SMALLINT *bycolumns;
01091 TDS_SMALLINT by_cols;
01092 } TDSRESULTINFO;
01093
01095 typedef enum _TDS_STATE
01096 {
01097 TDS_IDLE,
01098 TDS_QUERYING,
01099 TDS_PENDING,
01100 TDS_READING,
01101 TDS_DEAD
01102 } TDS_STATE;
01103
01104 #define TDS_DBG_LOGIN __FILE__, ((__LINE__ << 4) | 11)
01105 #define TDS_DBG_HEADER __FILE__, ((__LINE__ << 4) | 10)
01106 #define TDS_DBG_FUNC __FILE__, ((__LINE__ << 4) | 7)
01107 #define TDS_DBG_INFO2 __FILE__, ((__LINE__ << 4) | 6)
01108 #define TDS_DBG_INFO1 __FILE__, ((__LINE__ << 4) | 5)
01109 #define TDS_DBG_NETWORK __FILE__, ((__LINE__ << 4) | 4)
01110 #define TDS_DBG_WARN __FILE__, ((__LINE__ << 4) | 3)
01111 #define TDS_DBG_ERROR __FILE__, ((__LINE__ << 4) | 2)
01112 #define TDS_DBG_SEVERE __FILE__, ((__LINE__ << 4) | 1)
01113
01114 #define TDS_DBGFLAG_FUNC 0x80
01115 #define TDS_DBGFLAG_INFO2 0x40
01116 #define TDS_DBGFLAG_INFO1 0x20
01117 #define TDS_DBGFLAG_NETWORK 0x10
01118 #define TDS_DBGFLAG_WARN 0x08
01119 #define TDS_DBGFLAG_ERROR 0x04
01120 #define TDS_DBGFLAG_SEVERE 0x02
01121 #define TDS_DBGFLAG_ALL 0xfff
01122 #define TDS_DBGFLAG_LOGIN 0x0800
01123 #define TDS_DBGFLAG_HEADER 0x0400
01124 #define TDS_DBGFLAG_PID 0x1000
01125 #define TDS_DBGFLAG_TIME 0x2000
01126 #define TDS_DBGFLAG_SOURCE 0x4000
01127 #define TDS_DBGFLAG_THREAD 0x8000
01128
01129 #if 0
01130
01135 enum TDS_DBG_LOG_STATE
01136 {
01137 TDS_DBG_LOGIN = (1 << 0)
01139 , TDS_DBG_API = (1 << 1)
01140 , TDS_DBG_ASYNC = (1 << 2)
01141 , TDS_DBG_DIAG = (1 << 3)
01142 , TDS_DBG_error = (1 << 4)
01143
01144
01145 , TDS_DBG_PACKET = (1 << 5)
01146 , TDS_DBG_LIBTDS = (1 << 6)
01147 , TDS_DBG_CONFIG = (1 << 7)
01148 , TDS_DBG_DEFAULT = 0xFE
01149 };
01150 #endif
01151
01152 typedef struct tds_result_info TDSCOMPUTEINFO;
01153
01154 typedef TDSRESULTINFO TDSPARAMINFO;
01155
01156 typedef struct tds_message
01157 {
01158 TDS_CHAR *server;
01159 TDS_CHAR *message;
01160 TDS_CHAR *proc_name;
01161 TDS_CHAR *sql_state;
01162 TDS_UINT msgno;
01163 TDS_INT line_number;
01164
01165 TDS_SMALLINT state;
01166 TDS_TINYINT priv_msg_type;
01167 TDS_TINYINT severity;
01168
01169 int oserr;
01170 } TDSMESSAGE;
01171
01172 typedef struct tds_upd_col
01173 {
01174 struct tds_upd_col *next;
01175 TDS_INT colnamelength;
01176 char * columnname;
01177 } TDSUPDCOL;
01178
01179 typedef enum {
01180 TDS_CURSOR_STATE_UNACTIONED = 0
01181 , TDS_CURSOR_STATE_REQUESTED = 1
01182 , TDS_CURSOR_STATE_SENT = 2
01183 , TDS_CURSOR_STATE_ACTIONED = 3
01184 } TDS_CURSOR_STATE;
01185
01186 typedef struct tds_cursor_status
01187 {
01188 TDS_CURSOR_STATE declare;
01189 TDS_CURSOR_STATE cursor_row;
01190 TDS_CURSOR_STATE open;
01191 TDS_CURSOR_STATE fetch;
01192 TDS_CURSOR_STATE close;
01193 TDS_CURSOR_STATE dealloc;
01194 } TDS_CURSOR_STATUS;
01195
01196 typedef enum tds_cursor_operation
01197 {
01198 TDS_CURSOR_POSITION = 0,
01199 TDS_CURSOR_UPDATE = 1,
01200 TDS_CURSOR_DELETE = 2,
01201 TDS_CURSOR_INSERT = 4
01202 } TDS_CURSOR_OPERATION;
01203
01204 typedef enum tds_cursor_fetch
01205 {
01206 TDS_CURSOR_FETCH_NEXT = 1,
01207 TDS_CURSOR_FETCH_PREV,
01208 TDS_CURSOR_FETCH_FIRST,
01209 TDS_CURSOR_FETCH_LAST,
01210 TDS_CURSOR_FETCH_ABSOLUTE,
01211 TDS_CURSOR_FETCH_RELATIVE
01212 } TDS_CURSOR_FETCH;
01213
01217 typedef struct tds_cursor
01218 {
01219 struct tds_cursor *next;
01220 TDS_INT ref_count;
01221 TDS_TINYINT cursor_name_len;
01222 char *cursor_name;
01223 TDS_INT cursor_id;
01224 TDS_TINYINT options;
01225 TDS_TINYINT hasargs;
01226 TDS_USMALLINT query_len;
01227 char *query;
01228
01229
01230
01231 TDS_INT cursor_rows;
01232
01233 TDS_CURSOR_STATUS status;
01234 TDS_SMALLINT srv_status;
01235 TDSRESULTINFO *res_info;
01236 TDS_INT type, concurrency;
01237 } TDSCURSOR;
01238
01242 typedef struct tds_env
01243 {
01244 int block_size;
01245 char *language;
01246 char *charset;
01247 char *database;
01248 } TDSENV;
01249
01253 typedef struct tds_dynamic
01254 {
01255 struct tds_dynamic *next;
01261 char id[30];
01262
01264 TDS_INT num_id;
01265 TDSPARAMINFO *res_info;
01273 TDSPARAMINFO *params;
01279 int emulated;
01281 char *query;
01282 } TDSDYNAMIC;
01283
01284 typedef enum {
01285 TDS_MULTIPLE_QUERY,
01286 TDS_MULTIPLE_EXECUTE,
01287 TDS_MULTIPLE_RPC
01288 } TDS_MULTIPLE_TYPE;
01289
01290 typedef struct tds_multiple
01291 {
01292 TDS_MULTIPLE_TYPE type;
01293 unsigned int flags;
01294 } TDSMULTIPLE;
01295
01296
01297 typedef struct tds_context TDSCONTEXT;
01298 typedef int (*err_handler_t) (const TDSCONTEXT *, TDSSOCKET *, TDSMESSAGE *);
01299
01300 struct tds_context
01301 {
01302 TDSLOCALE *locale;
01303 void *parent;
01304
01305 int (*msg_handler) (const TDSCONTEXT *, TDSSOCKET *, TDSMESSAGE *);
01306 int (*err_handler) (const TDSCONTEXT *, TDSSOCKET *, TDSMESSAGE *);
01307 int (*int_handler) (void *);
01308 };
01309
01310 enum TDS_ICONV_ENTRY
01311 {
01312 client2ucs2
01313 , client2server_chardata
01314 , iso2server_metadata
01315 , initial_char_conv_count
01316 };
01317
01318 typedef struct tds_authentication
01319 {
01320 TDS_UCHAR *packet;
01321 int packet_len;
01322 int (*free)(TDSSOCKET * tds, struct tds_authentication * auth);
01323 int (*handle_next)(TDSSOCKET * tds, struct tds_authentication * auth, size_t len);
01324 } TDSAUTHENTICATION;
01325
01329 struct tds_socket
01330 {
01331 TDS_SYS_SOCKET s;
01333 TDS_USMALLINT tds_version;
01334 TDS_UINT product_version;
01335 char *product_name;
01336
01337 unsigned char capabilities[TDS_MAX_CAPABILITY];
01338 unsigned int broken_dates:1;
01339 unsigned int emul_little_endian:1;
01340 unsigned int use_iconv:1;
01341 unsigned int tds71rev1:1;
01342
01343 unsigned char *in_buf;
01344 unsigned char *out_buf;
01345 unsigned int in_buf_max;
01346 unsigned in_pos;
01347 unsigned out_pos;
01348 unsigned in_len;
01350 unsigned char in_flag;
01351 unsigned char out_flag;
01352 void *parent;
01353
01359 TDSRESULTINFO *current_results;
01360 TDSRESULTINFO *res_info;
01361 TDS_INT num_comp_info;
01362 TDSCOMPUTEINFO **comp_info;
01363 TDSPARAMINFO *param_info;
01364 TDSCURSOR *cur_cursor;
01365 TDSCURSOR *cursors;
01366 TDS_TINYINT has_status;
01367 TDS_INT ret_status;
01368 TDS_STATE state;
01369
01370 volatile
01371 unsigned char in_cancel;
01373 TDS_INT8 rows_affected;
01374 TDS_INT query_timeout;
01375 TDSENV env;
01376
01377 TDSDYNAMIC *cur_dyn;
01378 TDSDYNAMIC *dyns;
01380 const TDSCONTEXT *tds_ctx;
01381 int char_conv_count;
01382 TDSICONV **char_convs;
01383
01384 TDSCONNECTION *connection;
01386 int spid;
01387 TDS_UCHAR collation[5];
01388 TDS_UCHAR tds9_transaction[8];
01389 void (*env_chg_func) (TDSSOCKET * tds, int type, char *oldval, char *newval);
01390 int internal_sp_called;
01391
01392 void *tls_session;
01393 void *tls_credentials;
01394 TDSAUTHENTICATION *authentication;
01395 int option_value;
01396 };
01397
01398 int tds_init_write_buf(TDSSOCKET * tds);
01399 void tds_free_result_info(TDSRESULTINFO * info);
01400 void tds_free_socket(TDSSOCKET * tds);
01401 void tds_free_connection(TDSCONNECTION * connection);
01402 void tds_free_all_results(TDSSOCKET * tds);
01403 void tds_free_results(TDSRESULTINFO * res_info);
01404 void tds_free_param_results(TDSPARAMINFO * param_info);
01405 void tds_free_param_result(TDSPARAMINFO * param_info);
01406 void tds_free_msg(TDSMESSAGE * message);
01407 void tds_cursor_deallocated(TDSSOCKET *tds, TDSCURSOR *cursor);
01408 void tds_release_cursor(TDSSOCKET *tds, TDSCURSOR *cursor);
01409 void tds_free_bcp_column_data(BCPCOLDATA * coldata);
01410
01411 int tds_put_n(TDSSOCKET * tds, const void *buf, size_t n);
01412 int tds_put_string(TDSSOCKET * tds, const char *buf, int len);
01413 int tds_put_int(TDSSOCKET * tds, TDS_INT i);
01414 int tds_put_int8(TDSSOCKET * tds, TDS_INT8 i);
01415 int tds_put_smallint(TDSSOCKET * tds, TDS_SMALLINT si);
01417 #define tds_put_tinyint(tds, ti) tds_put_byte(tds,ti)
01418 int tds_put_byte(TDSSOCKET * tds, unsigned char c);
01419 TDSRESULTINFO *tds_alloc_results(int num_cols);
01420 TDSCOMPUTEINFO **tds_alloc_compute_results(TDSSOCKET * tds, int num_cols, int by_cols);
01421 TDSCONTEXT *tds_alloc_context(void * parent);
01422 void tds_free_context(TDSCONTEXT * locale);
01423 TDSSOCKET *tds_alloc_socket(TDSCONTEXT * context, int bufsize);
01424
01425
01426 int tds_default_port(int major, int minor);
01427 const TDS_COMPILETIME_SETTINGS *tds_get_compiletime_settings(void);
01428 typedef void (*TDSCONFPARSE) (const char *option, const char *value, void *param);
01429 int tds_read_conf_section(FILE * in, const char *section, TDSCONFPARSE tds_conf_parse, void *parse_param);
01430 int tds_read_conf_file(TDSCONNECTION * connection, const char *server);
01431 void tds_parse_conf_section(const char *option, const char *value, void *param);
01432 TDSCONNECTION *tds_read_config_info(TDSSOCKET * tds, TDSLOGIN * login, TDSLOCALE * locale);
01433 void tds_fix_connection(TDSCONNECTION * connection);
01434 TDS_USMALLINT tds_config_verstr(const char *tdsver, TDSCONNECTION * connection);
01435 int tds_lookup_host(const char *servername, char *ip);
01436 int tds_set_interfaces_file_loc(const char *interfloc);
01437 extern const char STD_DATETIME_FMT[];
01438 int tds_config_boolean(const char *value);
01439
01440 TDSLOCALE *tds_get_locale(void);
01441 int tds_alloc_row(TDSRESULTINFO * res_info);
01442 int tds_alloc_compute_row(TDSCOMPUTEINFO * res_info);
01443 BCPCOLDATA * tds_alloc_bcp_column_data(int column_size);
01444 unsigned char *tds7_crypt_pass(const unsigned char *clear_pass, size_t len, unsigned char *crypt_pass);
01445 TDSDYNAMIC *tds_lookup_dynamic(TDSSOCKET * tds, const char *id);
01446 const char *tds_prtype(int token);
01447 int tds_get_varint_size(TDSSOCKET * tds, int datatype);
01448 int tds_get_cardinal_type(int datatype, int usertype);
01449
01450
01451
01452
01453 void tds_iconv_open(TDSSOCKET * tds, const char *charset);
01454 void tds_iconv_close(TDSSOCKET * tds);
01455 void tds_srv_charset_changed(TDSSOCKET * tds, const char *charset);
01456 void tds7_srv_charset_changed(TDSSOCKET * tds, int sql_collate, int lcid);
01457 int tds_iconv_alloc(TDSSOCKET * tds);
01458 void tds_iconv_free(TDSSOCKET * tds);
01459 TDSICONV *tds_iconv_from_collate(TDSSOCKET * tds, TDS_UCHAR collate[5]);
01460
01461
01462 char *tds_timestamp_str(char *str, int maxlen);
01463 struct tm *tds_localtime_r(const time_t *timep, struct tm *result);
01464 struct hostent *tds_gethostbyname_r(const char *servername, struct hostent *result, char *buffer, int buflen, int *h_errnop);
01465 struct hostent *tds_gethostbyaddr_r(const char *addr, int len, int type, struct hostent *result, char *buffer, int buflen,
01466 int *h_errnop);
01467 struct servent *tds_getservbyname_r(const char *name, const char *proto, struct servent *result, char *buffer, int buflen);
01468 #ifdef INADDR_NONE
01469 const char *tds_inet_ntoa_r(struct in_addr iaddr, char *ip, size_t len);
01470 #endif
01471 char *tds_get_homedir(void);
01472
01473
01474 TDSPARAMINFO *tds_alloc_param_result(TDSPARAMINFO * old_param);
01475 void tds_free_input_params(TDSDYNAMIC * dyn);
01476 void tds_free_dynamic(TDSSOCKET * tds, TDSDYNAMIC * dyn);
01477 TDSSOCKET *tds_realloc_socket(TDSSOCKET * tds, size_t bufsize);
01478 char *tds_alloc_client_sqlstate(int msgno);
01479 char *tds_alloc_lookup_sqlstate(TDSSOCKET * tds, int msgno);
01480 TDSLOGIN *tds_alloc_login(void);
01481 TDSDYNAMIC *tds_alloc_dynamic(TDSSOCKET * tds, const char *id);
01482 void tds_free_login(TDSLOGIN * login);
01483 TDSCONNECTION *tds_alloc_connection(TDSLOCALE * locale);
01484 TDSLOCALE *tds_alloc_locale(void);
01485 void *tds_alloc_param_data(TDSCOLUMN * curparam);
01486 void tds_free_locale(TDSLOCALE * locale);
01487 TDSCURSOR * tds_alloc_cursor(TDSSOCKET * tds, const char *name, TDS_INT namelen, const char *query, TDS_INT querylen);
01488 void tds_free_row(TDSRESULTINFO * res_info, unsigned char *row);
01489
01490
01491 void tds_set_packet(TDSLOGIN * tds_login, int packet_size);
01492 void tds_set_port(TDSLOGIN * tds_login, int port);
01493 void tds_set_passwd(TDSLOGIN * tds_login, const char *password);
01494 void tds_set_bulk(TDSLOGIN * tds_login, TDS_TINYINT enabled);
01495 void tds_set_user(TDSLOGIN * tds_login, const char *username);
01496 void tds_set_app(TDSLOGIN * tds_login, const char *application);
01497 void tds_set_host(TDSLOGIN * tds_login, const char *hostname);
01498 void tds_set_library(TDSLOGIN * tds_login, const char *library);
01499 void tds_set_server(TDSLOGIN * tds_login, const char *server);
01500 void tds_set_client_charset(TDSLOGIN * tds_login, const char *charset);
01501 void tds_set_language(TDSLOGIN * tds_login, const char *language);
01502 void tds_set_database_name(TDSLOGIN * tds_login, const char *dbname);
01503 void tds_set_version(TDSLOGIN * tds_login, TDS_TINYINT major_ver, TDS_TINYINT minor_ver);
01504 void tds_set_capabilities(TDSLOGIN * tds_login, unsigned char *capabilities, int size);
01505 int tds_connect_and_login(TDSSOCKET * tds, TDSCONNECTION * connection);
01506
01507
01508 int tds_submit_query(TDSSOCKET * tds, const char *query);
01509 int tds_submit_query_params(TDSSOCKET * tds, const char *query, TDSPARAMINFO * params);
01510 int tds_submit_queryf(TDSSOCKET * tds, const char *queryf, ...);
01511 int tds_submit_prepare(TDSSOCKET * tds, const char *query, const char *id, TDSDYNAMIC ** dyn_out, TDSPARAMINFO * params);
01512 int tds_submit_execdirect(TDSSOCKET * tds, const char *query, TDSPARAMINFO * params);
01513 int tds8_submit_prepexec(TDSSOCKET * tds, const char *query, const char *id, TDSDYNAMIC ** dyn_out, TDSPARAMINFO * params);
01514 int tds_submit_execute(TDSSOCKET * tds, TDSDYNAMIC * dyn);
01515 int tds_send_cancel(TDSSOCKET * tds);
01516 const char *tds_next_placeholder(const char *start);
01517 int tds_count_placeholders(const char *query);
01518 int tds_needs_unprepare(TDSSOCKET * tds, TDSDYNAMIC * dyn);
01519 int tds_submit_unprepare(TDSSOCKET * tds, TDSDYNAMIC * dyn);
01520 int tds_submit_rpc(TDSSOCKET * tds, const char *rpc_name, TDSPARAMINFO * params);
01521 int tds_submit_optioncmd(TDSSOCKET * tds, TDS_OPTION_CMD command, TDS_OPTION option, TDS_OPTION_ARG *param, TDS_INT param_size);
01522 int tds_quote_id(TDSSOCKET * tds, char *buffer, const char *id, int idlen);
01523 int tds_quote_string(TDSSOCKET * tds, char *buffer, const char *str, int len);
01524 const char *tds_skip_quoted(const char *s);
01525
01526 int tds_cursor_declare(TDSSOCKET * tds, TDSCURSOR * cursor, TDSPARAMINFO *params, int *send);
01527 int tds_cursor_setrows(TDSSOCKET * tds, TDSCURSOR * cursor, int *send);
01528 int tds_cursor_open(TDSSOCKET * tds, TDSCURSOR * cursor, TDSPARAMINFO *params, int *send);
01529 int tds_cursor_fetch(TDSSOCKET * tds, TDSCURSOR * cursor, TDS_CURSOR_FETCH fetch_type, TDS_INT i_row);
01530 int tds_cursor_get_cursor_info(TDSSOCKET * tds, TDSCURSOR * cursor, TDS_UINT * row_number, TDS_UINT * row_count);
01531 int tds_cursor_close(TDSSOCKET * tds, TDSCURSOR * cursor);
01532 int tds_cursor_dealloc(TDSSOCKET * tds, TDSCURSOR * cursor);
01533 int tds_cursor_update(TDSSOCKET * tds, TDSCURSOR * cursor, TDS_CURSOR_OPERATION op, TDS_INT i_row, TDSPARAMINFO * params);
01534 int tds_cursor_setname(TDSSOCKET * tds, TDSCURSOR * cursor);
01535
01536 int tds_multiple_init(TDSSOCKET *tds, TDSMULTIPLE *multiple, TDS_MULTIPLE_TYPE type);
01537 int tds_multiple_done(TDSSOCKET *tds, TDSMULTIPLE *multiple);
01538 int tds_multiple_query(TDSSOCKET *tds, TDSMULTIPLE *multiple, const char *query, TDSPARAMINFO * params);
01539 int tds_multiple_execute(TDSSOCKET *tds, TDSMULTIPLE *multiple, TDSDYNAMIC * dyn);
01540
01541
01542 int tds_process_cancel(TDSSOCKET * tds);
01543 #ifdef WORDS_BIGENDIAN
01544 void tds_swap_datatype(int coltype, unsigned char *buf);
01545 #endif
01546 void tds_swap_numeric(TDS_NUMERIC *num);
01547 int tds_get_token_size(int marker);
01548 int tds_process_login_tokens(TDSSOCKET * tds);
01549 int tds_process_simple_query(TDSSOCKET * tds);
01550 int tds5_send_optioncmd(TDSSOCKET * tds, TDS_OPTION_CMD tds_command, TDS_OPTION tds_option, TDS_OPTION_ARG * tds_argument,
01551 TDS_INT * tds_argsize);
01552 int tds_process_tokens(TDSSOCKET * tds, TDS_INT * result_type, int *done_flags, unsigned flag);
01553
01554
01555 void tds_set_param_type(TDSSOCKET * tds, TDSCOLUMN * curcol, TDS_SERVER_TYPE type);
01556 void tds_set_column_type(TDSSOCKET * tds, TDSCOLUMN * curcol, int type);
01557 TDS_INT tds_data_get_info(TDSSOCKET *tds, TDSCOLUMN *col);
01558
01559
01560
01561 TDS_INT tds_datecrack(TDS_INT datetype, const void *di, TDSDATEREC * dr);
01562 int tds_get_conversion_type(int srctype, int colsize);
01563 extern const char tds_hex_digits[];
01564
01565
01566 int tds_flush_packet(TDSSOCKET * tds);
01567 int tds_put_buf(TDSSOCKET * tds, const unsigned char *buf, int dsize, int ssize);
01568
01569
01570 unsigned char tds_get_byte(TDSSOCKET * tds);
01571 void tds_unget_byte(TDSSOCKET * tds);
01572 unsigned char tds_peek(TDSSOCKET * tds);
01573 TDS_SMALLINT tds_get_smallint(TDSSOCKET * tds);
01574 TDS_INT tds_get_int(TDSSOCKET * tds);
01575 TDS_INT8 tds_get_int8(TDSSOCKET * tds);
01576 int tds_get_string(TDSSOCKET * tds, int string_len, char *dest, size_t dest_size);
01577 int tds_get_char_data(TDSSOCKET * tds, char *dest, size_t wire_size, TDSCOLUMN * curcol);
01578 void *tds_get_n(TDSSOCKET * tds, void *dest, int n);
01579 int tds_get_size_by_type(int servertype);
01580
01581
01582
01583 int tdserror (const TDSCONTEXT * tds_ctx, TDSSOCKET * tds, int msgno, int errnum);
01584 TDS_STATE tds_set_state(TDSSOCKET * tds, TDS_STATE state);
01585 void tds_set_parent(TDSSOCKET * tds, void *the_parent);
01586 int tds_swap_bytes(unsigned char *buf, int bytes);
01587 int tds_version(TDSSOCKET * tds_socket, char *pversion_string);
01588 unsigned int tds_gettime_ms(void);
01589 int tds_get_req_capability(TDSSOCKET * tds, int cap);
01590
01591
01592 void tdsdump_off(void);
01593 void tdsdump_on(void);
01594 int tdsdump_isopen(void);
01595 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
01596 #pragma GCC visibility pop
01597 #endif
01598 int tdsdump_open(const char *filename);
01599 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
01600 #pragma GCC visibility push(hidden)
01601 #endif
01602 void tdsdump_close(void);
01603 void tdsdump_dump_buf(const char* file, unsigned int level_line, const char *msg, const void *buf, size_t length);
01604 void tdsdump_col(const TDSCOLUMN *col);
01605 #undef tdsdump_log
01606 void tdsdump_log(const char* file, unsigned int level_line, const char *fmt, ...)
01607 #if defined(__GNUC__) && __GNUC__ >= 2
01608 __attribute__ ((__format__ (__printf__, 3, 4)))
01609 #endif
01610 ;
01611 #define tdsdump_log if (TDS_UNLIKELY(tds_write_dump)) tdsdump_log
01612
01613 extern int tds_write_dump;
01614 extern int tds_debug_flags;
01615 extern int tds_g_append_mode;
01616
01617
01618 int tds_lastpacket(TDSSOCKET * tds);
01619 TDSERRNO tds_open_socket(TDSSOCKET * tds, const char *ip_addr, unsigned int port, int timeout, int *p_oserr);
01620 int tds_close_socket(TDSSOCKET * tds);
01621 int tds_read_packet(TDSSOCKET * tds);
01622 int tds_write_packet(TDSSOCKET * tds, unsigned char final);
01623 int tds7_get_instance_ports(FILE *output, const char *ip_addr);
01624 int tds7_get_instance_port(const char *ip_addr, const char *instance);
01625 int tds_ssl_init(TDSSOCKET *tds);
01626 void tds_ssl_deinit(TDSSOCKET *tds);
01627 const char *tds_prwsaerror(int erc);
01628
01629
01630
01631
01632 int tds_vstrbuild(char *buffer, int buflen, int *resultlen, char *text, int textlen, const char *formats, int formatlen,
01633 va_list ap);
01634
01635
01636 char *tds_money_to_string(const TDS_MONEY * money, char *s);
01637 TDS_INT tds_numeric_to_string(const TDS_NUMERIC * numeric, char *s);
01638 TDS_INT tds_numeric_change_prec_scale(TDS_NUMERIC * numeric, unsigned char new_prec, unsigned char new_scale);
01639
01640
01641 void tds_getmac(TDS_SYS_SOCKET s, unsigned char mac[6]);
01642
01643 #ifndef HAVE_SSPI
01644 TDSAUTHENTICATION * tds_ntlm_get_auth(TDSSOCKET * tds);
01645 TDSAUTHENTICATION * tds_gss_get_auth(TDSSOCKET * tds);
01646 #else
01647 TDSAUTHENTICATION * tds_sspi_get_auth(TDSSOCKET * tds);
01648 #endif
01649
01650
01651
01653 enum tds_bcp_directions
01654 {
01655 TDS_BCP_IN = 1,
01656 TDS_BCP_OUT = 2,
01657 TDS_BCP_QUERYOUT = 3
01658 };
01659
01660 typedef struct tds_bcpinfo
01661 {
01662 const char *hint;
01663 void *parent;
01664 TDS_CHAR *tablename;
01665 TDS_CHAR *insert_stmt;
01666 TDS_INT direction;
01667 TDS_INT identity_insert_on;
01668 TDS_INT xfer_init;
01669 TDS_INT var_cols;
01670 TDS_INT bind_count;
01671 TDSRESULTINFO *bindinfo;
01672 } TDSBCPINFO;
01673
01674 int tds_bcp_init(TDSSOCKET *tds, TDSBCPINFO *bcpinfo);
01675 typedef int (*tds_bcp_get_col_data) (TDSBCPINFO *bulk, TDSCOLUMN *bcpcol, int offset);
01676 typedef void (*tds_bcp_null_error) (TDSBCPINFO *bulk, int index, int offset);
01677 int tds_bcp_send_record(TDSSOCKET *tds, TDSBCPINFO *bcpinfo, tds_bcp_get_col_data get_col_data, tds_bcp_null_error null_error, int offset);
01678 int tds_bcp_done(TDSSOCKET *tds, int *rows_copied);
01679 int tds_bcp_start(TDSSOCKET *tds, TDSBCPINFO *bcpinfo);
01680 int tds_bcp_start_copy_in(TDSSOCKET *tds, TDSBCPINFO *bcpinfo);
01681
01682 int tds_writetext_start(TDSSOCKET *tds, const char *objname, const char *textptr, const char *timestamp, int with_log, TDS_UINT size);
01683 int tds_writetext_continue(TDSSOCKET *tds, const TDS_UCHAR *text, TDS_UINT size);
01684 int tds_writetext_end(TDSSOCKET *tds);
01685
01686
01687 #define IS_TDS42(x) (x->tds_version==0x402)
01688 #define IS_TDS46(x) (x->tds_version==0x406)
01689 #define IS_TDS50(x) (x->tds_version==0x500)
01690 #define IS_TDS70(x) (x->tds_version==0x700)
01691 #define IS_TDS71(x) (x->tds_version==0x701)
01692 #define IS_TDS72(x) (x->tds_version==0x702)
01693
01694 #define IS_TDS7_PLUS(x) ((x)->tds_version>=0x700)
01695 #define IS_TDS71_PLUS(x) ((x)->tds_version>=0x701)
01696 #define IS_TDS72_PLUS(x) ((x)->tds_version>=0x702)
01697
01698 #define TDS_MAJOR(x) ((x)->tds_version >> 8)
01699 #define TDS_MINOR(x) ((x)->tds_version & 0xff)
01700
01701 #define IS_TDSDEAD(x) (((x) == NULL) || TDS_IS_SOCKET_INVALID((x)->s))
01702
01704 #define TDS_IS_SYBASE(x) (!(x->product_version & 0x80000000u))
01705
01706 #define TDS_IS_MSSQL(x) ((x->product_version & 0x80000000u)!=0)
01707
01711 #define TDS_MS_VER(maj,min,x) (0x80000000u|((maj)<<24)|((min)<<16)|(x))
01712
01713
01715 #define TDS_SYB_VER(maj,min,x) (((maj)<<24)|((min)<<16)|(x)<<8)
01716
01717 #ifdef __cplusplus
01718 #if 0
01719 {
01720 #endif
01721 }
01722 #endif
01723
01724 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
01725 #pragma GCC visibility pop
01726 #endif
01727
01728 #define TDS_PUT_INT(tds,v) tds_put_int((tds), ((TDS_INT)(v)))
01729 #define TDS_PUT_SMALLINT(tds,v) tds_put_smallint((tds), ((TDS_SMALLINT)(v)))
01730 #define TDS_PUT_BYTE(tds,v) tds_put_byte((tds), ((unsigned char)(v)))
01731
01732 #endif