00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _tds_h_
00021 #define _tds_h_
00022
00023 static char rcsid_tds_h[]=
00024 "$Id: tds.h,v 1.104 2003/04/03 19:38:20 freddy77 Exp $";
00025 static void *no_unused_tds_h_warn[] = {
00026 rcsid_tds_h,
00027 no_unused_tds_h_warn};
00028
00029 #include <stdio.h>
00030 #include <stdarg.h>
00031 #include <time.h>
00032
00033 #include "tdsver.h"
00034 #include "tds_sysdep_public.h"
00035 #ifdef _FREETDS_LIBRARY_SOURCE
00036 #include "tds_sysdep_private.h"
00037 #endif
00038
00039 #ifdef __cplusplus
00040 extern "C" {
00041 #endif
00042
00048 typedef struct _tds_compiletime_settings
00049 {
00050 char *freetds_version;
00051 char *last_update;
00052 int msdblib;
00053 int sybase_compat;
00054 int threadsafe;
00055 int libiconv;
00056 char *tdsver;
00057 int iodbc;
00058 int unixodbc;
00059
00060 } TDS_COMPILETIME_SETTINGS;
00061
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 typedef char TDS_CHAR;
00089 typedef unsigned char TDS_UCHAR;
00090 typedef unsigned char TDS_TINYINT;
00091 typedef tds_sysdep_int16_type TDS_SMALLINT;
00092 typedef unsigned tds_sysdep_int16_type TDS_USMALLINT;
00093 typedef tds_sysdep_int32_type TDS_INT;
00094 typedef unsigned tds_sysdep_int32_type TDS_UINT;
00095 typedef tds_sysdep_real32_type TDS_REAL;
00096 typedef tds_sysdep_real64_type TDS_FLOAT;
00097 typedef tds_sysdep_int64_type TDS_INT8;
00098 typedef unsigned tds_sysdep_int64_type TDS_UINT8;
00099
00100 typedef struct tdsnumeric
00101 {
00102 unsigned char precision;
00103 unsigned char scale;
00104 unsigned char array[33];
00105 } TDS_NUMERIC;
00106
00107 typedef struct tdsoldmoney
00108 {
00109 TDS_INT mnyhigh;
00110 TDS_UINT mnylow;
00111 } TDS_OLD_MONEY;
00112
00113 typedef union tdsmoney
00114 { TDS_OLD_MONEY tdsoldmoney;
00115 TDS_INT8 mny;
00116 } TDS_MONEY;
00117
00118 typedef struct tdsmoney4
00119 {
00120 TDS_INT mny4;
00121 } TDS_MONEY4;
00122
00123 typedef struct tdsdatetime
00124 {
00125 TDS_INT dtdays;
00126 TDS_INT dttime;
00127 } TDS_DATETIME;
00128
00129 typedef struct tdsdatetime4
00130 {
00131 TDS_USMALLINT days;
00132 TDS_USMALLINT minutes;
00133 } TDS_DATETIME4;
00134
00135 typedef struct tdsvarbinary
00136 {
00137 TDS_INT len;
00138 TDS_CHAR array[256];
00139 } TDS_VARBINARY;
00140 typedef struct tdsvarchar
00141 {
00142 TDS_INT len;
00143 TDS_CHAR array[256];
00144 } TDS_VARCHAR;
00145
00146 typedef struct tdsunique
00147 {
00148 TDS_UINT Data1;
00149 TDS_USMALLINT Data2;
00150 TDS_USMALLINT Data3;
00151 TDS_UCHAR Data4[8];
00152 } TDS_UNIQUE;
00153
00155 typedef struct tdsdaterec
00156 {
00157 TDS_INT year;
00158 TDS_INT month;
00159 TDS_INT day;
00160 TDS_INT dayofyear;
00161 TDS_INT weekday;
00162 TDS_INT hour;
00163 TDS_INT minute;
00164 TDS_INT second;
00165 TDS_INT millisecond;
00166 TDS_INT tzone;
00167 } TDSDATEREC;
00168
00174 extern const int tds_numeric_bytes_per_prec[];
00175
00176 #define TDS_SUCCEED 1
00177 #define TDS_FAIL 0
00178 #define TDS_NO_MORE_RESULTS 2
00179 #define TDS_REG_ROW -1
00180 #define TDS_NO_MORE_ROWS -2
00181 #define TDS_COMP_ROW -3
00182
00183 #define TDS_NO_COUNT -1
00184
00185 #define TDS_ROW_RESULT 4040
00186 #define TDS_PARAM_RESULT 4042
00187 #define TDS_STATUS_RESULT 4043
00188 #define TDS_MSG_RESULT 4044
00189 #define TDS_COMPUTE_RESULT 4045
00190 #define TDS_CMD_DONE 4046
00191 #define TDS_CMD_SUCCEED 4047
00192 #define TDS_CMD_FAIL 4048
00193 #define TDS_ROWFMT_RESULT 4049
00194 #define TDS_COMPUTEFMT_RESULT 4050
00195 #define TDS_DESCRIBE_RESULT 4051
00196
00197 enum tds_end {
00198 TDS_DONE_FINAL = 0,
00199 TDS_DONE_MORE_RESULTS = 1,
00200 TDS_DONE_ERROR = 2,
00201 TDS_DONE_COUNT = 16,
00202 TDS_DONE_CANCELLED = 32
00203 };
00204
00205
00206
00207
00208
00209
00210
00211 #define TDS_ERROR 3
00212 #define TDS_DONT_RETURN 42
00213
00214 #define TDS5_PARAMFMT2_TOKEN 32
00215 #define TDS_LANGUAGE_TOKEN 33
00216 #define TDS_ORDERBY2_TOKEN 34
00217 #define TDS_ROWFMT2_TOKEN 97
00218 #define TDS_LOGOUT_TOKEN 113
00219 #define TDS_RETURNSTATUS_TOKEN 121
00220 #define TDS_PROCID_TOKEN 124
00221 #define TDS7_RESULT_TOKEN 129
00222 #define TDS7_COMPUTE_RESULT_TOKEN 136
00223 #define TDS_COLNAME_TOKEN 160
00224 #define TDS_COLFMT_TOKEN 161
00225 #define TDS_DYNAMIC2_TOKEN 163
00226 #define TDS_TABNAME_TOKEN 164
00227 #define TDS_COLINFO_TOKEN 165
00228 #define TDS_OPTIONCMD_TOKEN 166
00229 #define TDS_COMPUTE_NAMES_TOKEN 167
00230 #define TDS_COMPUTE_RESULT_TOKEN 168
00231 #define TDS_ORDERBY_TOKEN 169
00232 #define TDS_ERROR_TOKEN 170
00233 #define TDS_INFO_TOKEN 171
00234 #define TDS_PARAM_TOKEN 172
00235 #define TDS_LOGINACK_TOKEN 173
00236 #define TDS_CONTROL_TOKEN 174
00237 #define TDS_ROW_TOKEN 209
00238 #define TDS_CMP_ROW_TOKEN 211
00239 #define TDS5_PARAMS_TOKEN 215
00240 #define TDS_CAPABILITY_TOKEN 226
00241 #define TDS_ENVCHANGE_TOKEN 227
00242 #define TDS_EED_TOKEN 229
00243 #define TDS_DBRPC_TOKEN 230
00244 #define TDS5_DYNAMIC_TOKEN 231
00245 #define TDS5_PARAMFMT_TOKEN 236
00246 #define TDS_AUTH_TOKEN 237
00247 #define TDS_RESULT_TOKEN 238
00248 #define TDS_DONE_TOKEN 253
00249 #define TDS_DONEPROC_TOKEN 254
00250 #define TDS_DONEINPROC_TOKEN 255
00251
00252
00253 #define PROCESS_ROWS 0
00254 #define PROCESS_RESULTS 1
00255 #define CANCEL_PROCESS 2
00256 #define GOTO_1ST_ROW 3
00257 #define LOGIN 4
00258
00259
00260 #define TDS_ENV_DATABASE 1
00261 #define TDS_ENV_LANG 2
00262 #define TDS_ENV_CHARSET 3
00263 #define TDS_ENV_PACKSIZE 4
00264 #define TDS_ENV_LCID 5
00265 #define TDS_ENV_SQLCOLLATION 7
00266
00267
00268 #define TDS_NULLTERM -9
00269
00270
00271
00272
00273
00274
00275 #define SYBCHAR 47
00276 #define SYBVARCHAR 39
00277 #define SYBINTN 38
00278 #define SYBINT1 48
00279 #define SYBINT2 52
00280 #define SYBINT4 56
00281 #define SYBINT8 127
00282 #define SYBFLT8 62
00283 #define SYBDATETIME 61
00284 #define SYBBIT 50
00285 #define SYBTEXT 35
00286 #define SYBNTEXT 99
00287 #define SYBIMAGE 34
00288 #define SYBMONEY4 122
00289 #define SYBMONEY 60
00290 #define SYBDATETIME4 58
00291 #define SYBREAL 59
00292 #define SYBBINARY 45
00293 #define SYBVOID 31
00294 #define SYBVARBINARY 37
00295 #define SYBNVARCHAR 103
00296 #define SYBBITN 104
00297 #define SYBNUMERIC 108
00298 #define SYBDECIMAL 106
00299 #define SYBFLTN 109
00300 #define SYBMONEYN 110
00301 #define SYBDATETIMN 111
00302 #define XSYBCHAR 175
00303 #define XSYBVARCHAR 167
00304 #define XSYBNVARCHAR 231
00305 #define XSYBNCHAR 239
00306 #define XSYBVARBINARY 165
00307 #define XSYBBINARY 173
00308 #define SYBLONGBINARY 225
00309 #define SYBSINT1 64
00310 #define SYBUINT2 65
00311 #define SYBUINT4 66
00312 #define SYBUINT8 67
00313
00314 #define SYBUNIQUE 36
00315 #define SYBVARIANT 0x62
00316
00317 #define SYBAOPCNT 0x4b
00318 #define SYBAOPCNTU 0x4c
00319 #define SYBAOPSUM 0x4d
00320 #define SYBAOPSUMU 0x4e
00321 #define SYBAOPAVG 0x4f
00322 #define SYBAOPAVGU 0x50
00323 #define SYBAOPMIN 0x51
00324 #define SYBAOPMAX 0x52
00325
00329 typedef enum {
00330 TDS_OPT_SET = 1
00331 , TDS_OPT_DEFAULT = 2
00332 , TDS_OPT_LIST = 3
00333 , TDS_OPT_INFO = 4
00334 } TDS_OPTION_CMD;
00335
00336 typedef enum {
00337 TDS_OPT_DATEFIRST = 1
00338 , TDS_OPT_TEXTSIZE = 2
00339 , TDS_OPT_STAT_TIME = 3
00340 , TDS_OPT_STAT_IO = 4
00341 , TDS_OPT_ROWCOUNT = 5
00342 , TDS_OPT_NATLANG = 6
00343 , TDS_OPT_DATEFORMAT = 7
00344 , TDS_OPT_ISOLATION = 8
00345 , TDS_OPT_AUTHON = 9
00346 , TDS_OPT_CHARSET = 10
00347 , TDS_OPT_SHOWPLAN = 13
00348 , TDS_OPT_NOEXEC = 14
00349 , TDS_OPT_ARITHIGNOREON = 15
00350 , TDS_OPT_ARITHABORTON = 17
00351 , TDS_OPT_PARSEONLY = 18
00352 , TDS_OPT_GETDATA = 20
00353 , TDS_OPT_NOCOUNT = 21
00354 , TDS_OPT_FORCEPLAN = 23
00355 , TDS_OPT_FORMATONLY = 24
00356 , TDS_OPT_CHAINXACTS = 25
00357 , TDS_OPT_CURCLOSEONXACT = 26
00358 , TDS_OPT_FIPSFLAG = 27
00359 , TDS_OPT_RESTREES = 28
00360 , TDS_OPT_IDENTITYON = 29
00361 , TDS_OPT_CURREAD = 30
00362 , TDS_OPT_CURWRITE = 31
00363 , TDS_OPT_IDENTITYOFF = 32
00364 , TDS_OPT_AUTHOFF = 33
00365 , TDS_OPT_ANSINULL = 34
00366 , TDS_OPT_QUOTED_IDENT = 35
00367 , TDS_OPT_ARITHIGNOREOFF = 36
00368 , TDS_OPT_ARITHABORTOFF = 37
00369 , TDS_OPT_TRUNCABORT = 38
00370 } TDS_OPTION;
00371
00372 typedef union tds_option_arg
00373 {
00374 TDS_TINYINT ti;
00375 TDS_INT i;
00376 TDS_CHAR *c;
00377 } TDS_OPTION_ARG;
00378
00379 static const TDS_INT TDS_OPT_ARITHOVERFLOW = 0x01;
00380 static const TDS_INT TDS_OPT_NUMERICTRUNC = 0x02;
00381
00382 enum TDS_OPT_DATEFIRST_CHOICE {
00383 TDS_OPT_MONDAY= 1
00384 , TDS_OPT_TUESDAY= 2
00385 , TDS_OPT_WEDNESDAY= 3
00386 , TDS_OPT_THURSDAY= 4
00387 , TDS_OPT_FRIDAY= 5
00388 , TDS_OPT_SATURDAY= 6
00389 , TDS_OPT_SUNDAY= 7
00390 };
00391
00392 enum TDS_OPT_DATEFORMAT_CHOICE {
00393 TDS_OPT_FMTMDY = 1
00394 , TDS_OPT_FMTDMY = 2
00395 , TDS_OPT_FMTYMD = 3
00396 , TDS_OPT_FMTYDM = 4
00397 , TDS_OPT_FMTMYD = 5
00398 , TDS_OPT_FMTDYM = 6
00399 };
00400 enum TDS_OPT_ISOLATION_CHOICE {
00401 TDS_OPT_LEVEL1 = 1
00402 , TDS_OPT_LEVEL3 = 3
00403 };
00404
00405 #define TDS_ZERO_FREE(x) {free((x)); (x) = NULL;}
00406 #define TDS_VECTOR_SIZE(x) (sizeof(x)/sizeof(x[0]))
00407
00408 #define TDS_BYTE_SWAP16(value) \
00409 (((((unsigned short)value)<<8) & 0xFF00) | \
00410 ((((unsigned short)value)>>8) & 0x00FF))
00411
00412 #define TDS_BYTE_SWAP32(value) \
00413 (((((unsigned long)value)<<24) & 0xFF000000) | \
00414 ((((unsigned long)value)<< 8) & 0x00FF0000) | \
00415 ((((unsigned long)value)>> 8) & 0x0000FF00) | \
00416 ((((unsigned long)value)>>24) & 0x000000FF))
00417
00418 #define is_end_token(x) (x==TDS_DONE_TOKEN || \
00419 x==TDS_DONEPROC_TOKEN || \
00420 x==TDS_DONEINPROC_TOKEN)
00421
00422 #define is_hard_end_token(x) (x==TDS_DONE_TOKEN || \
00423 x==TDS_DONEPROC_TOKEN)
00424
00425 #define is_msg_token(x) (x==TDS_INFO_TOKEN || \
00426 x==TDS_ERROR_TOKEN || \
00427 x==TDS_EED_TOKEN)
00428
00429 #define is_result_token(x) (x==TDS_RESULT_TOKEN || \
00430 x==TDS_ROWFMT2_TOKEN || \
00431 x==TDS7_RESULT_TOKEN || \
00432 x==TDS_COLFMT_TOKEN || \
00433 x==TDS_COLNAME_TOKEN)
00434
00435
00436 #define is_fixed_type(x) (x==SYBINT1 || \
00437 x==SYBINT2 || \
00438 x==SYBINT4 || \
00439 x==SYBINT8 || \
00440 x==SYBREAL || \
00441 x==SYBFLT8 || \
00442 x==SYBDATETIME || \
00443 x==SYBDATETIME4 || \
00444 x==SYBBIT || \
00445 x==SYBMONEY || \
00446 x==SYBMONEY4 || \
00447 x==SYBUNIQUE)
00448 #define is_nullable_type(x) (x==SYBINTN || \
00449 x==SYBFLTN || \
00450 x==SYBDATETIMN || \
00451 x==SYBVARCHAR || \
00452 x==SYBVARBINARY || \
00453 x==SYBMONEYN || \
00454 x==SYBTEXT || \
00455 x==SYBNTEXT || \
00456 x==SYBBITN || \
00457 x==SYBIMAGE)
00458 #define is_blob_type(x) (x==SYBTEXT || x==SYBIMAGE || x==SYBNTEXT)
00459
00460 #define is_large_type(x) (x>128)
00461 #define is_numeric_type(x) (x==SYBNUMERIC || x==SYBDECIMAL)
00462 #define is_unicode_type(x) (x==XSYBNVARCHAR || x==XSYBNCHAR || x==SYBNTEXT)
00463 #define is_collate_type(x) (x==XSYBVARCHAR || x==XSYBCHAR || x==SYBTEXT || x==XSYBNVARCHAR || x==XSYBNCHAR || x==SYBNTEXT)
00464 #define is_ascii_type(x) ( x==XSYBCHAR || x==XSYBVARCHAR || x==SYBTEXT || x==SYBCHAR || x==SYBVARCHAR)
00465 #define is_char_type(x) (is_unicode_type(x) || is_ascii_type(x))
00466
00467 #define TDS_MAX_CAPABILITY 22
00468 #define MAXPRECISION 80
00469 #define TDS_MAX_CONN 4096
00470 #define TDS_MAX_DYNID_LEN 30
00471
00472
00473 #define TDS_DEF_SERVER "SYBASE"
00474 #define TDS_DEF_BLKSZ 512
00475 #define TDS_DEF_CHARSET "iso_1"
00476 #define TDS_DEF_LANG "us_english"
00477 #if TDS42
00478 #define TDS_DEF_MAJOR 4
00479 #define TDS_DEF_MINOR 2
00480 #define TDS_DEF_PORT 1433
00481 #elif TDS46
00482 #define TDS_DEF_MAJOR 4
00483 #define TDS_DEF_MINOR 6
00484 #define TDS_DEF_PORT 4000
00485 #elif TDS70
00486 #define TDS_DEF_MAJOR 7
00487 #define TDS_DEF_MINOR 0
00488 #define TDS_DEF_PORT 1433
00489 #elif TDS80
00490 #define TDS_DEF_MAJOR 8
00491 #define TDS_DEF_MINOR 0
00492 #define TDS_DEF_PORT 1433
00493 #else
00494 #define TDS_DEF_MAJOR 5
00495 #define TDS_DEF_MINOR 0
00496 #define TDS_DEF_PORT 4000
00497 #endif
00498
00499
00500 #define TDS_STR_VERSION "tds version"
00501 #define TDS_STR_BLKSZ "initial block size"
00502 #define TDS_STR_SWAPDT "swap broken dates"
00503 #define TDS_STR_SWAPMNY "swap broken money"
00504 #define TDS_STR_TRYSVR "try server login"
00505 #define TDS_STR_TRYDOM "try domain login"
00506 #define TDS_STR_DOMAIN "nt domain"
00507 #define TDS_STR_XDOMAUTH "cross domain login"
00508 #define TDS_STR_DUMPFILE "dump file"
00509 #define TDS_STR_DEBUGLVL "debug level"
00510 #define TDS_STR_TIMEOUT "timeout"
00511 #define TDS_STR_CONNTMOUT "connect timeout"
00512 #define TDS_STR_HOSTNAME "hostname"
00513 #define TDS_STR_HOST "host"
00514 #define TDS_STR_PORT "port"
00515 #define TDS_STR_TEXTSZ "text size"
00516
00517 #define TDS_STR_EMUL_LE "emulate little endian"
00518 #define TDS_STR_CHARSET "charset"
00519 #define TDS_STR_CLCHARSET "client charset"
00520 #define TDS_STR_LANGUAGE "language"
00521 #define TDS_STR_APPENDMODE "dump file append"
00522 #define TDS_STR_DATEFMT "date format"
00523
00524
00525 typedef union { void *p; int i; } tds_align_struct;
00526 #define TDS_ALIGN_SIZE sizeof(tds_align_struct)
00527
00528 #define TDS_MAX_LOGIN_STR_SZ 30
00529 typedef struct tds_login {
00530 char *server_name;
00531 int port;
00532 TDS_TINYINT major_version;
00533 TDS_TINYINT minor_version;
00534 int block_size;
00535 char *language;
00536 char *server_charset;
00537 TDS_INT connect_timeout;
00538 char *host_name;
00539 char *app_name;
00540 char *user_name;
00541 char *password;
00542
00543 char *library;
00544 TDS_TINYINT bulk_copy;
00545 TDS_TINYINT suppress_language;
00546 TDS_TINYINT encrypted;
00547
00548 TDS_INT query_timeout;
00549 TDS_INT longquery_timeout;
00550 void (*longquery_func)(long lHint);
00551 long longquery_param;
00552 unsigned char capabilities[TDS_MAX_CAPABILITY];
00553 char *client_charset;
00554 } TDSLOGIN;
00555
00556 typedef struct tds_connect_info {
00557
00558 char *server_name;
00559 int port;
00560 TDS_TINYINT major_version;
00561 TDS_TINYINT minor_version;
00562 int block_size;
00563 char *language;
00564 char *server_charset;
00565 TDS_INT connect_timeout;
00566 char *host_name;
00567 char *app_name;
00568 char *user_name;
00569 char *password;
00570 char *library;
00571 TDS_TINYINT bulk_copy;
00572 TDS_TINYINT suppress_language;
00573 TDS_TINYINT encrypted;
00574
00575 TDS_INT query_timeout;
00576 TDS_INT longquery_timeout;
00577 void (*longquery_func)(long lHint);
00578 long longquery_param;
00579 unsigned char capabilities[TDS_MAX_CAPABILITY];
00580 char *client_charset;
00581
00582 char *ip_addr;
00583 char *database;
00584 char *dump_file;
00585 char *default_domain;
00586 int timeout;
00587 int debug_level;
00588 int text_size;
00589 int broken_dates;
00590 int broken_money;
00591 int try_server_login;
00592 int try_domain_login;
00593 int xdomain_auth;
00594 int emul_little_endian;
00595 } TDSCONNECTINFO;
00596
00597 typedef struct tds_locale {
00598 char *language;
00599 char *char_set;
00600 char *date_fmt;
00601 } TDSLOCALE;
00602
00606 typedef struct tds_blob_info {
00607 TDS_CHAR *textvalue;
00608 TDS_CHAR textptr[16];
00609 TDS_CHAR timestamp[8];
00610 } TDSBLOBINFO;
00611
00614 typedef struct
00615 {
00616 TDS_USMALLINT locale_id;
00617 TDS_USMALLINT flags;
00618 TDS_UCHAR charset_id;
00619 } TDS8_COLLATION;
00620
00621
00622 #define TDS_SF_BIN (TDS_USMALLINT) 0x100
00623 #define TDS_SF_WIDTH_INSENSITIVE (TDS_USMALLINT) 0x080
00624 #define TDS_SF_KATATYPE_INSENSITIVE (TDS_USMALLINT) 0x040
00625 #define TDS_SF_ACCENT_SENSITIVE (TDS_USMALLINT) 0x020
00626 #define TDS_SF_CASE_INSENSITIVE (TDS_USMALLINT) 0x010
00627
00629 typedef struct tds_column_info {
00632 TDS_SMALLINT column_type;
00634 TDS_SMALLINT column_type_save;
00635 TDS_INT column_usertype;
00636 TDS_INT column_flags;
00638 TDS_INT column_size;
00640 TDS_TINYINT column_varint_size;
00642 TDS_TINYINT column_prec;
00644 TDS_TINYINT column_scale;
00646 TDS_TINYINT column_namelen;
00647 TDS_TINYINT table_namelen;
00649 TDS_CHAR table_name[256];
00650
00652 TDS_CHAR column_name[256];
00654 TDS_INT column_offset;
00655 unsigned int column_nullable:1;
00656 unsigned int column_writeable:1;
00657 unsigned int column_identity:1;
00658 unsigned int column_unicodedata:1;
00659 unsigned int column_output:1;
00660 TDS_UCHAR column_collation[5];
00661
00662
00663 TDS_TINYINT column_operator;
00664 TDS_SMALLINT column_operand;
00665
00666
00668 TDS_INT column_cur_size;
00669
00670
00671
00672 TDS_SMALLINT column_bindtype;
00673 TDS_SMALLINT column_bindfmt;
00674 TDS_UINT column_bindlen;
00675 TDS_CHAR *column_nullbind;
00676 TDS_CHAR *column_varaddr;
00677 TDS_CHAR *column_lenbind;
00678 TDS_INT column_textpos;
00679 TDS_INT column_text_sqlgetdatapos;
00680 } TDSCOLINFO;
00681
00683 typedef struct tds_result_info {
00684
00685 TDS_SMALLINT num_cols;
00686 TDSCOLINFO **columns;
00687 TDS_INT row_size;
00688 int null_info_size;
00689 unsigned char *current_row;
00690
00691 TDS_SMALLINT rows_exist;
00692 TDS_INT row_count;
00693 TDS_SMALLINT computeid;
00694 TDS_TINYINT more_results;
00695 TDS_TINYINT *bycolumns;
00696 TDS_SMALLINT by_cols;
00697 } TDSRESULTINFO;
00698
00699
00700 enum {
00701 TDS_QUERYING,
00702 TDS_PENDING,
00703 TDS_COMPLETED,
00704 TDS_CANCELED,
00705 TDS_DEAD
00706 };
00707
00708 #define TDS_DBG_FUNC 7
00709 #define TDS_DBG_INFO2 6
00710 #define TDS_DBG_INFO1 5
00711 #define TDS_DBG_NETWORK 4
00712 #define TDS_DBG_WARN 3
00713 #define TDS_DBG_ERROR 2
00714 #define TDS_DBG_SEVERE 1
00715
00716 typedef struct tds_result_info TDSCOMPUTEINFO;
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728 typedef TDSRESULTINFO TDSPARAMINFO;
00729
00730 typedef struct tds_msg_info {
00731 TDS_SMALLINT priv_msg_type;
00732 TDS_SMALLINT line_number;
00733 TDS_UINT msg_number;
00734 TDS_SMALLINT msg_state;
00735 TDS_SMALLINT msg_level;
00736 TDS_CHAR *server;
00737 TDS_CHAR *message;
00738 TDS_CHAR *proc_name;
00739 TDS_CHAR *sql_state;
00740 } TDSMSGINFO;
00741
00742
00743
00744
00745 typedef struct tds_env_info {
00746 int block_size;
00747 char *language;
00748 char *charset;
00749 char *database;
00750 } TDSENVINFO;
00751
00752 typedef struct tds_dynamic {
00753 char id[30];
00754 int dyn_state;
00756 TDS_INT num_id;
00757 TDSPARAMINFO *res_info;
00758 TDSPARAMINFO *params;
00759 } TDSDYNAMIC;
00760
00761
00762 typedef struct tds_context TDSCONTEXT;
00763 typedef struct tds_socket TDSSOCKET;
00764
00765 struct tds_context {
00766 TDSLOCALE *locale;
00767 void *parent;
00768
00769 int (*msg_handler)(TDSCONTEXT*, TDSSOCKET*, TDSMSGINFO*);
00770 int (*err_handler)(TDSCONTEXT*, TDSSOCKET*, TDSMSGINFO*);
00771 };
00772
00773 struct tds_socket {
00774
00775 int s;
00776 TDS_SMALLINT major_version;
00777 TDS_SMALLINT minor_version;
00779 TDS_UINT product_version;
00780 unsigned char capabilities[TDS_MAX_CAPABILITY];
00781 unsigned char broken_dates;
00782
00783 unsigned char *in_buf;
00784 unsigned char *out_buf;
00785 unsigned int in_buf_max;
00786 unsigned in_pos;
00787 unsigned out_pos;
00788 unsigned in_len;
00789 unsigned out_len;
00790 unsigned char out_flag;
00791 unsigned char last_packet;
00792 void *parent;
00793
00794 TDSRESULTINFO *curr_resinfo;
00795 TDSRESULTINFO *res_info;
00796 TDS_INT num_comp_info;
00797 TDSCOMPUTEINFO **comp_info;
00798 TDSPARAMINFO *param_info;
00799 TDS_TINYINT has_status;
00800 TDS_INT ret_status;
00801 TDS_TINYINT state;
00802 int rows_affected;
00803
00804 TDS_INT timeout;
00805 TDS_INT longquery_timeout;
00806 void (*longquery_func)(long lHint);
00807 long longquery_param;
00808 time_t queryStarttime;
00809 TDSENVINFO *env;
00810
00811 int num_dyns;
00812 TDSDYNAMIC *cur_dyn;
00813 TDSDYNAMIC **dyns;
00814 int emul_little_endian;
00815 char *date_fmt;
00816 TDSCONTEXT *tds_ctx;
00817 void *iconv_info;
00818
00820 TDSCONNECTINFO *connect_info;
00821 int spid;
00822 TDS_UCHAR collation[5];
00823 void (*env_chg_func)(TDSSOCKET *tds, int type, char *oldval, char *newval);
00824 };
00825
00826 void tds_set_longquery_handler(TDSLOGIN * tds_login, void (* longquery_func)(long), long longquery_param);
00827 void tds_set_timeouts(TDSLOGIN *tds_login, int connect_timeout, int query_timeout, int longquery_timeout);
00828 int tds_init_write_buf(TDSSOCKET *tds);
00829 void tds_free_result_info(TDSRESULTINFO *info);
00830 void tds_free_socket(TDSSOCKET *tds);
00831 void tds_free_connect(TDSCONNECTINFO *connect_info);
00832 void tds_free_all_results(TDSSOCKET *tds);
00833 void tds_free_results(TDSRESULTINFO *res_info);
00834 void tds_free_param_results(TDSPARAMINFO *param_info);
00835 void tds_free_msg(TDSMSGINFO *msg_info);
00836 int tds_put_n(TDSSOCKET *tds, const void *buf, int n);
00837 int tds_put_string(TDSSOCKET *tds, const char *buf,int len);
00838 int tds_put_int(TDSSOCKET *tds, TDS_INT i);
00839 int tds_put_int8(TDSSOCKET *tds, TDS_INT8 i);
00840 int tds_put_smallint(TDSSOCKET *tds, TDS_SMALLINT si);
00841 int tds_put_tinyint(TDSSOCKET *tds, TDS_TINYINT ti);
00842 int tds_put_byte(TDSSOCKET *tds, unsigned char c);
00843 TDSRESULTINFO *tds_alloc_results(int num_cols);
00844 TDSCOMPUTEINFO **tds_alloc_compute_results(TDS_INT *num_comp_results, TDSCOMPUTEINFO** ci, int num_cols, int by_cols);
00845 TDSCONTEXT *tds_alloc_context(void);
00846 void tds_free_context(TDSCONTEXT *locale);
00847 TDSSOCKET *tds_alloc_socket(TDSCONTEXT *context, int bufsize);
00848
00849
00850 const TDS_COMPILETIME_SETTINGS* tds_get_compiletime_settings(void);
00851 typedef void (*TDSCONFPARSE)(const char* option, const char* value, void *param);
00852 int tds_read_conf_section(FILE *in, const char *section, TDSCONFPARSE tds_conf_parse, void *parse_param);
00853 int tds_read_conf_file(TDSCONNECTINFO *connect_info,const char *server);
00854 TDSCONNECTINFO *tds_read_config_info(TDSSOCKET *tds, TDSLOGIN *login, TDSLOCALE *locale);
00855 void tds_fix_connect(TDSCONNECTINFO *connect_info);
00856 void tds_config_verstr(const char *tdsver, TDSCONNECTINFO *connect_info);
00857 void tds_lookup_host(const char *servername, const char *portname, char *ip, char *port);
00858 int tds_set_interfaces_file_loc(char *interfloc);
00859
00860 TDSLOCALE *tds_get_locale(void);
00861 unsigned char *tds_alloc_row(TDSRESULTINFO *res_info);
00862 unsigned char *tds_alloc_compute_row(TDSCOMPUTEINFO *res_info);
00863 char *tds_alloc_get_string(TDSSOCKET *tds, int len);
00864 TDSLOGIN *tds_alloc_login(void);
00865 TDSDYNAMIC *tds_alloc_dynamic(TDSSOCKET *tds, const char *id);
00866 void tds_free_login(TDSLOGIN *login);
00867 TDSCONNECTINFO *tds_alloc_connect(TDSLOCALE *locale);
00868 TDSLOCALE *tds_alloc_locale(void);
00869 void tds_free_locale(TDSLOCALE *locale);
00870 int tds_connect(TDSSOCKET *tds, TDSCONNECTINFO *connect_info);
00871 void tds_set_packet(TDSLOGIN *tds_login, int packet_size);
00872 void tds_set_port(TDSLOGIN *tds_login, int port);
00873 void tds_set_passwd(TDSLOGIN *tds_login, const char *password);
00874 void tds_set_bulk(TDSLOGIN *tds_login, TDS_TINYINT enabled);
00875 void tds_set_user(TDSLOGIN *tds_login, const char *username);
00876 void tds_set_app(TDSLOGIN *tds_login, const char *application);
00877 void tds_set_host(TDSLOGIN *tds_login, const char *hostname);
00878 void tds_set_library(TDSLOGIN *tds_login, const char *library);
00879 void tds_set_server(TDSLOGIN *tds_login, const char *server);
00880 void tds_set_client_charset(TDSLOGIN *tds_login, const char *charset);
00881 void tds_set_language(TDSLOGIN *tds_login, const char *language);
00882 void tds_set_version(TDSLOGIN *tds_login, short major_ver, short minor_ver);
00883 void tds_set_capabilities(TDSLOGIN *tds_login, unsigned char *capabilities, int size);
00884 int tds_submit_query(TDSSOCKET *tds, const char *query, TDSPARAMINFO *params);
00885 int tds_submit_queryf(TDSSOCKET *tds, const char *queryf, ...);
00886 int tds_process_result_tokens(TDSSOCKET *tds, TDS_INT *result_type);
00887 int tds_process_row_tokens(TDSSOCKET *tds, TDS_INT *rowtype, TDS_INT *computeid);
00888 int tds_process_default_tokens(TDSSOCKET *tds, int marker);
00889 int tds_process_trailing_tokens(TDSSOCKET * tds);
00890 TDS_INT tds_process_end(TDSSOCKET *tds, int marker, int *flags);
00891 int tds_client_msg(TDSCONTEXT *tds_ctx, TDSSOCKET *tds, int msgnum, int level, int state, int line, const char *message);
00892 void tds_set_null(unsigned char *current_row, int column);
00893 void tds_clr_null(unsigned char *current_row, int column);
00894 int tds_get_null(unsigned char *current_row, int column);
00895 unsigned char *tds7_crypt_pass(const unsigned char *clear_pass, int len, unsigned char *crypt_pass);
00896 TDSDYNAMIC *tds_lookup_dynamic(TDSSOCKET *tds, char *id);
00897 const char *tds_prtype(int token);
00898
00899
00900
00901
00902 void tds_iconv_open(TDSSOCKET *tds, char *charset);
00903 void tds_iconv_close(TDSSOCKET *tds);
00904 char *tds7_ascii2unicode(TDSSOCKET *tds, const char *in_string, char *out_string, int maxlen);
00905 int tds7_unicode2ascii(TDSSOCKET *tds, const char *in_string, int in_len, char *out_string, int out_len);
00906 void tds7_srv_charset_changed(TDSSOCKET * tds, int lcid);
00907
00908
00909 char *tds_timestamp_str(char *str, int maxlen);
00910 struct hostent *tds_gethostbyname_r(const char *servername, struct hostent *result, char *buffer, int buflen, int *h_errnop);
00911 struct hostent *tds_gethostbyaddr_r(const char *addr, int len, int type, struct hostent *result, char *buffer, int buflen, int *h_errnop);
00912 struct servent *tds_getservbyname_r(const char *name, const char *proto, struct servent *result, char *buffer, int buflen);
00913 char *tds_get_homedir(void);
00914
00915
00916 TDSPARAMINFO *tds_alloc_param_result(TDSPARAMINFO *old_param);
00917 void tds_free_input_params(TDSDYNAMIC *dyn);
00918 void tds_free_dynamic(TDSSOCKET *tds);
00919 TDSSOCKET *tds_realloc_socket(int bufsize);
00920 void tds_free_compute_result(TDSCOMPUTEINFO *comp_info);
00921 void tds_free_compute_results(TDSCOMPUTEINFO **comp_info, TDS_INT num_comp);
00922 unsigned char *tds_alloc_param_row(TDSPARAMINFO *info,TDSCOLINFO *curparam);
00923 char *tds_alloc_lookup_sqlstate(TDSSOCKET *tds, int msgnum);
00924
00925
00926 int tds7_send_auth(TDSSOCKET *tds, const unsigned char *challenge);
00927
00928
00929 int tds_submit_prepare(TDSSOCKET *tds, const char *query, const char *id, TDSDYNAMIC **dyn_out);
00930 int tds_submit_execute(TDSSOCKET *tds, TDSDYNAMIC *dyn);
00931 int tds_send_cancel(TDSSOCKET *tds);
00932 const char *tds_next_placeholders(const char *start);
00933 int tds_count_placeholders(const char *query);
00934 int tds_get_dynid(TDSSOCKET *tds, char **id);
00935 int tds_submit_unprepare(TDSSOCKET *tds, TDSDYNAMIC *dyn);
00936 int tds_submit_rpc(TDSSOCKET *tds, const char *rpc_name, TDSPARAMINFO *params);
00937 int tds_quote_id(TDSSOCKET * tds, char* buffer, const char *id);
00938 int tds_quote_string(TDSSOCKET * tds, char *buffer, const char *str, int len);
00939
00940
00941 int tds_process_cancel(TDSSOCKET *tds);
00942 void tds_swap_datatype(int coltype, unsigned char *buf);
00943 int tds_get_token_size(int marker);
00944 int tds_process_login_tokens(TDSSOCKET *tds);
00945 int tds_process_trailing_tokens(TDSSOCKET * tds);
00946 void tds_set_column_type(TDSCOLINFO *curcol, int type);
00947 void tds_add_row_column_size(TDSRESULTINFO * info, TDSCOLINFO * curcol);
00948 int tds_process_simple_query(TDSSOCKET * tds, TDS_INT * result_type);
00949 int tds5_send_optioncmd(TDSSOCKET * tds, TDS_OPTION_CMD tds_command, TDS_OPTION tds_option, TDS_OPTION_ARG *tds_argument, TDS_INT *tds_argsize);
00950
00951
00952 TDS_INT tds_datecrack(TDS_INT datetype, const void *di, TDSDATEREC *dr);
00953
00954
00955 int tds_put_bulk_data(TDSSOCKET *tds, const unsigned char *buf, TDS_INT bufsize);
00956 int tds_flush_packet(TDSSOCKET *tds);
00957 int tds_put_buf(TDSSOCKET *tds, const unsigned char *buf, int dsize, int ssize);
00958
00959
00960 unsigned char tds_get_byte(TDSSOCKET *tds);
00961 void tds_unget_byte(TDSSOCKET *tds);
00962 unsigned char tds_peek(TDSSOCKET *tds);
00963 TDS_SMALLINT tds_get_smallint(TDSSOCKET *tds);
00964 TDS_INT tds_get_int(TDSSOCKET *tds);
00965 int tds_get_string(TDSSOCKET *tds, int string_len, char *dest, int need);
00966 void *tds_get_n(TDSSOCKET *tds, void *dest, int n);
00967 int tds_get_size_by_type(int servertype);
00968 int tds_read_packet (TDSSOCKET *tds);
00969
00970
00971 void tds_set_parent(TDSSOCKET *tds, void *the_parent);
00972 void *tds_get_parent(TDSSOCKET *tds);
00973 void tds_ctx_set_parent(TDSCONTEXT *ctx, void *the_parent);
00974 void *tds_ctx_get_parent(TDSCONTEXT *ctx);
00975 int tds_swap_bytes(unsigned char *buf, int bytes);
00976 int tds_version(TDSSOCKET *tds_socket, char *pversion_string);
00977 void tdsdump_off(void);
00978 void tdsdump_on(void);
00979 int tdsdump_open(const char *filename);
00980 int tdsdump_append(void);
00981 void tdsdump_close(void);
00982 void tdsdump_dump_buf(const void *buf, int length);
00983 void tdsdump_log(int dbg_lvl, const char *fmt, ...);
00984 int tds_close_socket(TDSSOCKET *tds);
00985
00986
00987 int tds_vstrbuild(char *buffer, int buflen, int *resultlen, char *text, int textlen, const char *formats, int formatlen, va_list ap);
00988
00989
00990 char *tds_money_to_string(const TDS_MONEY *money, char *s);
00991 char *tds_numeric_to_string(const TDS_NUMERIC *numeric, char *s);
00992
00993
00994 void tds_getmac(int s, unsigned char mac[6]);
00995
00996 typedef struct tds_answer
00997 {
00998 unsigned char lm_resp[24];
00999 unsigned char nt_resp[24];
01000 } TDSANSWER;
01001 void tds_answer_challenge(const char *passwd, const unsigned char *challenge,TDSANSWER* answer);
01002
01003 #define IS_TDS42(x) (x->major_version==4 && x->minor_version==2)
01004 #define IS_TDS46(x) (x->major_version==4 && x->minor_version==6)
01005 #define IS_TDS50(x) (x->major_version==5 && x->minor_version==0)
01006 #define IS_TDS70(x) (x->major_version==7 && x->minor_version==0)
01007 #define IS_TDS80(x) (x->major_version==8 && x->minor_version==0)
01008
01009 #define IS_TDS7_PLUS(x) ( IS_TDS70(x) || IS_TDS80(x) )
01010
01011 #define IS_TDSDEAD(x) (((x) == NULL) || ((x)->s < 0))
01012
01014 #define TDS_IS_SYBASE(x) (!(x->product_version & 0x80000000u))
01015
01016 #define TDS_IS_MSSQL(x) ((x->product_version & 0x80000000u)!=0)
01017
01021 #define TDS_MS_VER(maj,min,x) (0x80000000u|((maj)<<24)|((min)<<16)|(x))
01022
01023
01025 #define TDS_SYB_VER(maj,min,x) (((maj)<<24)|((min)<<16)|(x)<<8)
01026
01027 #ifdef __cplusplus
01028 }
01029 #endif
01030
01031 #endif