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 #ifdef HAVE_STDDEF_H
00031 #include <stddef.h>
00032 #endif
00033
00034 #if HAVE_NETINET_IN_H
00035 #include <netinet/in.h>
00036 #endif
00037 #if HAVE_ARPA_INET_H
00038 #include <arpa/inet.h>
00039 #endif
00040
00041
00042 typedef struct tdsiconvinfo TDSICONV;
00043 typedef struct tds_socket TDSSOCKET;
00044 typedef struct tds_column TDSCOLUMN;
00045
00046 #include "tdsver.h"
00047 #include "tds_sysdep_public.h"
00048 #include "tds_sysdep_private.h"
00049 #include "tdsthread.h"
00050
00051 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
00052 #pragma GCC visibility push(hidden)
00053 #endif
00054
00055 #ifdef __cplusplus
00056 extern "C"
00057 {
00058 #if 0
00059 }
00060 #endif
00061 #endif
00062
00068 typedef struct tds_compiletime_settings
00069 {
00070 const char *freetds_version;
00071 const char *sysconfdir;
00072 const char *last_update;
00073 int msdblib;
00074 int sybase_compat;
00075 int threadsafe;
00076 int libiconv;
00077 const char *tdsver;
00078 int iodbc;
00079 int unixodbc;
00080
00081 } TDS_COMPILETIME_SETTINGS;
00082
00083 typedef struct tds_dstr {
00084 char *dstr_s;
00085 size_t dstr_size;
00086 } DSTR;
00087
00103
00104
00105
00106
00107
00108
00109
00110
00111 typedef char TDS_CHAR;
00112 typedef unsigned char TDS_UCHAR;
00113 typedef unsigned char TDS_TINYINT;
00114 typedef tds_sysdep_int16_type TDS_SMALLINT;
00115 typedef unsigned tds_sysdep_int16_type TDS_USMALLINT;
00116 typedef tds_sysdep_int32_type TDS_INT;
00117 typedef unsigned tds_sysdep_int32_type TDS_UINT;
00118 typedef tds_sysdep_real32_type TDS_REAL;
00119 typedef tds_sysdep_real64_type TDS_FLOAT;
00120 typedef tds_sysdep_int64_type TDS_INT8;
00121 typedef unsigned tds_sysdep_int64_type TDS_UINT8;
00122 typedef tds_sysdep_intptr_type TDS_INTPTR;
00123
00124 #include "tdsproto.h"
00125
00126
00127
00128
00129 typedef struct
00130 {
00131 TDS_UINT8 time;
00132 TDS_INT date;
00133 TDS_SMALLINT offset;
00134 unsigned time_prec:4;
00135 unsigned has_time:1;
00136 unsigned has_date:1;
00137 unsigned has_offset:1;
00138 } TDS_DATETIMEALL;
00139
00141 typedef struct tdsdaterec
00142 {
00143 TDS_INT year;
00144 TDS_INT quarter;
00145 TDS_INT month;
00146 TDS_INT day;
00147 TDS_INT dayofyear;
00148 TDS_INT week;
00149 TDS_INT weekday;
00150 TDS_INT hour;
00151 TDS_INT minute;
00152 TDS_INT second;
00153 TDS_INT decimicrosecond;
00154 TDS_INT tzone;
00155 } TDSDATEREC;
00156
00162 extern const int tds_numeric_bytes_per_prec[];
00163
00164 typedef int TDSRET;
00165 #define TDS_NO_MORE_RESULTS ((TDSRET)1)
00166 #define TDS_SUCCESS ((TDSRET)0)
00167 #define TDS_FAIL ((TDSRET)-1)
00168 #define TDS_CANCELLED ((TDSRET)-2)
00169 #define TDS_FAILED(rc) ((rc)<0)
00170 #define TDS_SUCCEED(rc) ((rc)>=0)
00171
00172 #define TDS_INT_CONTINUE 1
00173 #define TDS_INT_CANCEL 2
00174 #define TDS_INT_TIMEOUT 3
00175
00176
00177 #define TDS_NO_COUNT -1
00178
00179 #define TDS_ROW_RESULT 4040
00180 #define TDS_PARAM_RESULT 4042
00181 #define TDS_STATUS_RESULT 4043
00182 #define TDS_MSG_RESULT 4044
00183 #define TDS_COMPUTE_RESULT 4045
00184 #define TDS_CMD_DONE 4046
00185 #define TDS_CMD_SUCCEED 4047
00186 #define TDS_CMD_FAIL 4048
00187 #define TDS_ROWFMT_RESULT 4049
00188 #define TDS_COMPUTEFMT_RESULT 4050
00189 #define TDS_DESCRIBE_RESULT 4051
00190 #define TDS_DONE_RESULT 4052
00191 #define TDS_DONEPROC_RESULT 4053
00192 #define TDS_DONEINPROC_RESULT 4054
00193 #define TDS_OTHERS_RESULT 4055
00194
00195 enum tds_token_results
00196 {
00197 TDS_TOKEN_RES_OTHERS,
00198 TDS_TOKEN_RES_ROWFMT,
00199 TDS_TOKEN_RES_COMPUTEFMT,
00200 TDS_TOKEN_RES_PARAMFMT,
00201 TDS_TOKEN_RES_DONE,
00202 TDS_TOKEN_RES_ROW,
00203 TDS_TOKEN_RES_COMPUTE,
00204 TDS_TOKEN_RES_PROC,
00205 TDS_TOKEN_RES_MSG
00206 };
00207
00208 #define TDS_TOKEN_FLAG(flag) TDS_RETURN_##flag = (1 << (TDS_TOKEN_RES_##flag*2)), TDS_STOPAT_##flag = (2 << (TDS_TOKEN_RES_##flag*2))
00209
00210 enum tds_token_flags
00211 {
00212 TDS_HANDLE_ALL = 0,
00213 TDS_TOKEN_FLAG(OTHERS),
00214 TDS_TOKEN_FLAG(ROWFMT),
00215 TDS_TOKEN_FLAG(COMPUTEFMT),
00216 TDS_TOKEN_FLAG(PARAMFMT),
00217 TDS_TOKEN_FLAG(DONE),
00218 TDS_TOKEN_FLAG(ROW),
00219 TDS_TOKEN_FLAG(COMPUTE),
00220 TDS_TOKEN_FLAG(PROC),
00221 TDS_TOKEN_FLAG(MSG),
00222 TDS_TOKEN_RESULTS = TDS_RETURN_ROWFMT|TDS_RETURN_COMPUTEFMT|TDS_RETURN_DONE|TDS_STOPAT_ROW|TDS_STOPAT_COMPUTE|TDS_RETURN_PROC,
00223 TDS_TOKEN_TRAILING = TDS_STOPAT_ROWFMT|TDS_STOPAT_COMPUTEFMT|TDS_STOPAT_ROW|TDS_STOPAT_COMPUTE|TDS_STOPAT_MSG|TDS_STOPAT_OTHERS
00224 };
00225
00229 enum tds_end
00230 {
00231 TDS_DONE_FINAL = 0x00
00232 , TDS_DONE_MORE_RESULTS = 0x01
00233 , TDS_DONE_ERROR = 0x02
00234 , TDS_DONE_INXACT = 0x04
00235 , TDS_DONE_PROC = 0x08
00236 , TDS_DONE_COUNT = 0x10
00237 , TDS_DONE_CANCELLED = 0x20
00238 , TDS_DONE_EVENT = 0x40
00239 , TDS_DONE_SRVERROR = 0x100
00241
00242 , TDS_DONE_NO_TRAN = 0
00243 , TDS_DONE_TRAN_SUCCEED = 1
00244 , TDS_DONE_TRAN_PROGRESS= 2
00245 , TDS_DONE_STMT_ABORT = 3
00246 , TDS_DONE_TRAN_ABORT = 4
00247 };
00248
00249
00250
00251
00252
00253
00254
00255
00256 typedef enum { TDSEOK = TDS_SUCCESS,
00257 TDSEVERDOWN = 100,
00258 TDSEICONVIU = 2400,
00259 TDSEICONVAVAIL = 2401,
00260 TDSEICONVO = 2402,
00261 TDSEICONVI = 2403,
00262 TDSEICONV2BIG = 2404,
00263 TDSEPORTINSTANCE = 2500,
00264 TDSESYNC = 20001,
00265 TDSEFCON = 20002,
00266 TDSETIME = 20003,
00267 TDSEREAD = 20004,
00268 TDSEWRIT = 20006,
00269 TDSESOCK = 20008,
00270 TDSECONN = 20009,
00271 TDSEMEM = 20010,
00272 TDSEINTF = 20012,
00273 TDSEUHST = 20013,
00274 TDSEPWD = 20014,
00275 TDSESEOF = 20017,
00276 TDSERPND = 20019,
00277 TDSEBTOK = 20020,
00278 TDSEOOB = 20022,
00279 TDSECLOS = 20056,
00280 TDSEUSCT = 20058,
00281 TDSEUTDS = 20146,
00282 TDSEEUNR = 20185,
00283 TDSECAP = 20203,
00284 TDSENEG = 20210,
00285 TDSEUMSG = 20212,
00286 TDSECAPTYP = 20213,
00287 TDSEBPROBADTYP = 20250,
00288 TDSECLOSEIN = 20292
00289 } TDSERRNO;
00290
00291
00292 enum {
00293 TDS_CUR_ISTAT_UNUSED = 0x00,
00294 TDS_CUR_ISTAT_DECLARED = 0x01,
00295 TDS_CUR_ISTAT_OPEN = 0x02,
00296 TDS_CUR_ISTAT_CLOSED = 0x04,
00297 TDS_CUR_ISTAT_RDONLY = 0x08,
00298 TDS_CUR_ISTAT_UPDATABLE = 0x10,
00299 TDS_CUR_ISTAT_ROWCNT = 0x20,
00300 TDS_CUR_ISTAT_DEALLOC = 0x40
00301 };
00302
00303
00304 #define TDS_NULLTERM -9
00305
00306
00307 typedef union tds_option_arg
00308 {
00309 TDS_TINYINT ti;
00310 TDS_INT i;
00311 TDS_CHAR *c;
00312 } TDS_OPTION_ARG;
00313
00314
00315 typedef enum tds_encryption_level {
00316 TDS_ENCRYPTION_OFF, TDS_ENCRYPTION_REQUEST, TDS_ENCRYPTION_REQUIRE
00317 } TDS_ENCRYPTION_LEVEL;
00318
00319 #define TDS_ZERO_FREE(x) do {free((x)); (x) = NULL;} while(0)
00320 #define TDS_VECTOR_SIZE(x) (sizeof(x)/sizeof(x[0]))
00321 #ifdef offsetof
00322 #define TDS_OFFSET(str, field) offsetof(str, field)
00323 #else
00324 #define TDS_OFFSET(str, field) (((char*)&((str*)0)->field)-((char*)0))
00325 #endif
00326
00327 #if defined(__GNUC__) && __GNUC__ >= 3
00328 # define TDS_LIKELY(x) __builtin_expect(!!(x), 1)
00329 # define TDS_UNLIKELY(x) __builtin_expect(!!(x), 0)
00330 #else
00331 # define TDS_LIKELY(x) (x)
00332 # define TDS_UNLIKELY(x) (x)
00333 #endif
00334
00335
00336
00337
00338
00339
00340 #define TDS_BYTE_SWAP16(value) \
00341 (((((unsigned short)value)<<8) & 0xFF00) | \
00342 ((((unsigned short)value)>>8) & 0x00FF))
00343
00344 #define TDS_BYTE_SWAP32(value) \
00345 (((((unsigned long)value)<<24) & 0xFF000000) | \
00346 ((((unsigned long)value)<< 8) & 0x00FF0000) | \
00347 ((((unsigned long)value)>> 8) & 0x0000FF00) | \
00348 ((((unsigned long)value)>>24) & 0x000000FF))
00349
00350 #define is_end_token(x) (x==TDS_DONE_TOKEN || \
00351 x==TDS_DONEPROC_TOKEN || \
00352 x==TDS_DONEINPROC_TOKEN)
00353
00354 #define is_hard_end_token(x) (x==TDS_DONE_TOKEN || \
00355 x==TDS_DONEPROC_TOKEN)
00356
00357 #define is_msg_token(x) (x==TDS_INFO_TOKEN || \
00358 x==TDS_ERROR_TOKEN || \
00359 x==TDS_EED_TOKEN)
00360
00361 #define is_result_token(x) (x==TDS_RESULT_TOKEN || \
00362 x==TDS_ROWFMT2_TOKEN || \
00363 x==TDS7_RESULT_TOKEN || \
00364 x==TDS_COLFMT_TOKEN || \
00365 x==TDS_COLNAME_TOKEN || \
00366 x==TDS_RETURNSTATUS_TOKEN)
00367
00368
00369 #define is_fixed_type(x) (x==SYBINT1 || \
00370 x==SYBINT2 || \
00371 x==SYBINT4 || \
00372 x==SYBINT8 || \
00373 x==SYBREAL || \
00374 x==SYBFLT8 || \
00375 x==SYBDATETIME || \
00376 x==SYBDATETIME4 || \
00377 x==SYBBIT || \
00378 x==SYBMONEY || \
00379 x==SYBMONEY4 || \
00380 x==SYBVOID || \
00381 x==SYBUNIQUE || \
00382 x==SYBMSDATE)
00383 #define is_nullable_type(x) ( \
00384 x==SYBBITN || \
00385 x==SYBINTN || \
00386 x==SYBFLTN || \
00387 x==SYBMONEYN || \
00388 x==SYBDATETIMN || \
00389 x==SYBVARCHAR || \
00390 x==SYBBINARY || \
00391 x==SYBVARBINARY || \
00392 x==SYBTEXT || \
00393 x==SYBNTEXT || \
00394 x==SYBIMAGE)
00395
00396 #define is_variable_type(x) ( \
00397 (x)==SYBTEXT || \
00398 (x)==SYBIMAGE || \
00399 (x)==SYBNTEXT || \
00400 (x)==SYBCHAR || \
00401 (x)==SYBVARCHAR || \
00402 (x)==SYBBINARY || \
00403 (x)==SYBVARBINARY || \
00404 (x)==SYBLONGBINARY || \
00405 (x)==XSYBCHAR || \
00406 (x)==XSYBVARCHAR || \
00407 (x)==XSYBNVARCHAR || \
00408 (x)==XSYBNCHAR)
00409
00410 #define is_blob_type(x) (x==SYBTEXT || x==SYBIMAGE || x==SYBNTEXT)
00411 #define is_blob_col(x) ((x)->column_varint_size > 2)
00412
00413
00414 #define is_numeric_type(x) (x==SYBNUMERIC || x==SYBDECIMAL)
00415 #define is_unicode_type(x) (x==XSYBNVARCHAR || x==XSYBNCHAR || x==SYBNTEXT || x==SYBMSXML)
00416 #define is_collate_type(x) (x==XSYBVARCHAR || x==XSYBCHAR || x==SYBTEXT || x==XSYBNVARCHAR || x==XSYBNCHAR || x==SYBNTEXT)
00417 #define is_ascii_type(x) ( x==XSYBCHAR || x==XSYBVARCHAR || x==SYBTEXT || x==SYBCHAR || x==SYBVARCHAR)
00418 #define is_char_type(x) (is_unicode_type(x) || is_ascii_type(x))
00419 #define is_similar_type(x, y) ((is_char_type(x) && is_char_type(y)) || ((is_unicode_type(x) && is_unicode_type(y))))
00420
00421
00422 #define TDS_MAX_CAPABILITY 22
00423 #define MAXPRECISION 77
00424 #define TDS_MAX_CONN 4096
00425 #define TDS_MAX_DYNID_LEN 30
00426
00427
00428 #define TDS_DEF_SERVER "SYBASE"
00429 #define TDS_DEF_BLKSZ 512
00430 #define TDS_DEF_CHARSET "iso_1"
00431 #define TDS_DEF_LANG "us_english"
00432 #if TDS42
00433 #define TDS_DEFAULT_VERSION 0x402
00434 #define TDS_DEF_PORT 1433
00435 #elif TDS46
00436 #define TDS_DEFAULT_VERSION 0x406
00437 #define TDS_DEF_PORT 4000
00438 #elif TDS70
00439 #define TDS_DEFAULT_VERSION 0x700
00440 #define TDS_DEF_PORT 1433
00441 #elif TDS71
00442 #define TDS_DEFAULT_VERSION 0x701
00443 #define TDS_DEF_PORT 1433
00444 #elif TDS72
00445 #define TDS_DEFAULT_VERSION 0x702
00446 #define TDS_DEF_PORT 1433
00447 #elif TDS73
00448 #define TDS_DEFAULT_VERSION 0x703
00449 #define TDS_DEF_PORT 1433
00450 #else
00451 #define TDS_DEFAULT_VERSION 0x500
00452 #define TDS_DEF_PORT 4000
00453 #endif
00454
00455
00456 #define TDS_STR_VERSION "tds version"
00457 #define TDS_STR_BLKSZ "initial block size"
00458 #define TDS_STR_SWAPDT "swap broken dates"
00459 #define TDS_STR_DUMPFILE "dump file"
00460 #define TDS_STR_DEBUGLVL "debug level"
00461 #define TDS_STR_DEBUGFLAGS "debug flags"
00462 #define TDS_STR_TIMEOUT "timeout"
00463 #define TDS_STR_QUERY_TIMEOUT "query timeout"
00464 #define TDS_STR_CONNTIMEOUT "connect timeout"
00465 #define TDS_STR_HOSTNAME "hostname"
00466 #define TDS_STR_HOST "host"
00467 #define TDS_STR_PORT "port"
00468 #define TDS_STR_TEXTSZ "text size"
00469
00470 #define TDS_STR_EMUL_LE "emulate little endian"
00471 #define TDS_STR_CHARSET "charset"
00472 #define TDS_STR_CLCHARSET "client charset"
00473 #define TDS_STR_LANGUAGE "language"
00474 #define TDS_STR_APPENDMODE "dump file append"
00475 #define TDS_STR_DATEFMT "date format"
00476 #define TDS_STR_INSTANCE "instance"
00477 #define TDS_STR_ASA_DATABASE "asa database"
00478 #define TDS_STR_ENCRYPTION "encryption"
00479 #define TDS_STR_USENTLMV2 "use ntlmv2"
00480
00481 #define TDS_STR_ENCRYPTION_OFF "off"
00482 #define TDS_STR_ENCRYPTION_REQUEST "request"
00483 #define TDS_STR_ENCRYPTION_REQUIRE "require"
00484
00485 #define TDS_GSSAPI_DELEGATION "enable gssapi delegation"
00486
00487 #define TDS_STR_REALM "realm"
00488
00489 #define TDS_STR_SPN "spn"
00490
00491
00492
00493 typedef union
00494 {
00495 void *p;
00496 int i;
00497 } tds_align_struct;
00498
00499 #define TDS_ALIGN_SIZE sizeof(tds_align_struct)
00500
00501 #define TDS_MAX_LOGIN_STR_SZ 30
00502 typedef struct tds_login
00503 {
00504 DSTR server_name;
00505 int port;
00506 TDS_USMALLINT tds_version;
00507 int block_size;
00508 DSTR language;
00509 DSTR server_charset;
00510 TDS_INT connect_timeout;
00511 DSTR client_host_name;
00512 DSTR server_host_name;
00513 DSTR server_realm_name;
00514 DSTR server_spn;
00515 DSTR app_name;
00516 DSTR user_name;
00517 DSTR password;
00519 DSTR library;
00520 TDS_TINYINT encryption_level;
00521
00522 TDS_INT query_timeout;
00523 unsigned char capabilities[TDS_MAX_CAPABILITY];
00524 DSTR client_charset;
00525 DSTR database;
00526
00527 DSTR ip_addr;
00528 DSTR instance_name;
00529 DSTR dump_file;
00530 int debug_flags;
00531 int text_size;
00532
00533 unsigned char option_flag2;
00534
00535 unsigned int bulk_copy:1;
00536 unsigned int suppress_language:1;
00537 unsigned int broken_dates:1;
00538 unsigned int emul_little_endian:1;
00539 unsigned int gssapi_use_delegation:1;
00540 unsigned int use_ntlmv2:1;
00541 unsigned int mars:1;
00542 } TDSLOGIN;
00543
00544 typedef struct tds_locale
00545 {
00546 char *language;
00547 char *server_charset;
00548 char *date_fmt;
00549 } TDSLOCALE;
00550
00555 typedef struct tds_blob
00556 {
00557 TDS_CHAR *textvalue;
00558 TDS_CHAR textptr[16];
00559 TDS_CHAR timestamp[8];
00560 } TDSBLOB;
00561
00565 typedef struct tds_variant
00566 {
00567
00568 TDS_CHAR *data;
00569 TDS_INT size;
00570 TDS_INT data_len;
00571 TDS_UCHAR type;
00572 TDS_UCHAR collation[5];
00573 } TDSVARIANT;
00574
00579 typedef struct tds_encoding
00580 {
00581 const char *name;
00582 unsigned char min_bytes_per_char;
00583 unsigned char max_bytes_per_char;
00584 unsigned char canonic;
00585 } TDS_ENCODING;
00586
00587 typedef struct tds_bcpcoldata
00588 {
00589 TDS_UCHAR *data;
00590 TDS_INT datalen;
00591 TDS_INT is_null;
00592 } BCPCOLDATA;
00593
00594
00595 enum
00596 { TDS_SYSNAME_SIZE = 512 };
00597
00598 typedef struct tds_column_funcs
00599 {
00600 TDSRET (*get_info)(TDSSOCKET *tds, TDSCOLUMN *col);
00601 TDSRET (*get_data)(TDSSOCKET *tds, TDSCOLUMN *col);
00602 TDS_INT (*row_len)(TDSCOLUMN *col);
00603 TDSRET (*put_info)(TDSSOCKET *tds, TDSCOLUMN *col);
00604 TDSRET (*put_data)(TDSSOCKET *tds, TDSCOLUMN *col);
00605
00606 } TDSCOLUMNFUNCS;
00607
00611 struct tds_column
00612 {
00613 const TDSCOLUMNFUNCS *funcs;
00614 TDS_INT column_usertype;
00615 TDS_INT column_flags;
00616
00617 TDS_INT column_size;
00619 TDS_TINYINT column_type;
00624 TDS_TINYINT column_varint_size;
00626 TDS_TINYINT column_prec;
00627 TDS_TINYINT column_scale;
00629 TDS_SMALLINT column_namelen;
00630 TDS_SMALLINT table_namelen;
00631 struct
00632 {
00633 TDS_TINYINT column_type;
00634 TDS_INT column_size;
00635 } on_server;
00636
00637 TDSICONV *char_conv;
00639 TDS_CHAR table_name[TDS_SYSNAME_SIZE];
00640 TDS_CHAR column_name[TDS_SYSNAME_SIZE];
00641 char * table_column_name;
00642
00643 unsigned char *column_data;
00644 void (*column_data_free)(struct tds_column *column);
00645 unsigned int column_nullable:1;
00646 unsigned int column_writeable:1;
00647 unsigned int column_identity:1;
00648 unsigned int column_key:1;
00649 unsigned int column_hidden:1;
00650 unsigned int column_output:1;
00651 unsigned int column_timestamp:1;
00652 TDS_UCHAR column_collation[5];
00653
00654
00655 TDS_TINYINT column_operator;
00656 TDS_SMALLINT column_operand;
00657
00658
00660 TDS_INT column_cur_size;
00661
00662
00663
00664 TDS_SMALLINT column_bindtype;
00665 TDS_SMALLINT column_bindfmt;
00666 TDS_UINT column_bindlen;
00667 TDS_SMALLINT *column_nullbind;
00668 TDS_CHAR *column_varaddr;
00669 TDS_INT *column_lenbind;
00670 TDS_INT column_textpos;
00671 TDS_INT column_text_sqlgetdatapos;
00672 TDS_CHAR column_text_sqlputdatainfo;
00673
00674 BCPCOLDATA *bcp_column_data;
00683 TDS_INT bcp_prefix_len;
00684 TDS_INT bcp_term_len;
00685 TDS_CHAR *bcp_terminator;
00686 };
00687
00688
00690 typedef struct tds_result_info
00691 {
00692
00693 TDS_SMALLINT num_cols;
00694 TDSCOLUMN **columns;
00695 TDS_INT row_size;
00696 TDS_INT ref_count;
00697 unsigned char *current_row;
00698 void (*row_free)(struct tds_result_info* result, unsigned char *row);
00699
00700 TDS_SMALLINT rows_exist;
00701
00702 TDS_INT row_count;
00703
00704 TDS_TINYINT more_results;
00705 TDS_SMALLINT computeid;
00706 TDS_SMALLINT *bycolumns;
00707 TDS_SMALLINT by_cols;
00708 } TDSRESULTINFO;
00709
00711 typedef enum tds_states
00712 {
00713 TDS_IDLE,
00714 TDS_QUERYING,
00715 TDS_PENDING,
00716 TDS_READING,
00717 TDS_DEAD
00718 } TDS_STATE;
00719
00720 #define TDS_DBG_LOGIN __FILE__, ((__LINE__ << 4) | 11)
00721 #define TDS_DBG_HEADER __FILE__, ((__LINE__ << 4) | 10)
00722 #define TDS_DBG_FUNC __FILE__, ((__LINE__ << 4) | 7)
00723 #define TDS_DBG_INFO2 __FILE__, ((__LINE__ << 4) | 6)
00724 #define TDS_DBG_INFO1 __FILE__, ((__LINE__ << 4) | 5)
00725 #define TDS_DBG_NETWORK __FILE__, ((__LINE__ << 4) | 4)
00726 #define TDS_DBG_WARN __FILE__, ((__LINE__ << 4) | 3)
00727 #define TDS_DBG_ERROR __FILE__, ((__LINE__ << 4) | 2)
00728 #define TDS_DBG_SEVERE __FILE__, ((__LINE__ << 4) | 1)
00729
00730 #define TDS_DBGFLAG_FUNC 0x80
00731 #define TDS_DBGFLAG_INFO2 0x40
00732 #define TDS_DBGFLAG_INFO1 0x20
00733 #define TDS_DBGFLAG_NETWORK 0x10
00734 #define TDS_DBGFLAG_WARN 0x08
00735 #define TDS_DBGFLAG_ERROR 0x04
00736 #define TDS_DBGFLAG_SEVERE 0x02
00737 #define TDS_DBGFLAG_ALL 0xfff
00738 #define TDS_DBGFLAG_LOGIN 0x0800
00739 #define TDS_DBGFLAG_HEADER 0x0400
00740 #define TDS_DBGFLAG_PID 0x1000
00741 #define TDS_DBGFLAG_TIME 0x2000
00742 #define TDS_DBGFLAG_SOURCE 0x4000
00743 #define TDS_DBGFLAG_THREAD 0x8000
00744
00745 #if 0
00746
00751 enum TDS_DBG_LOG_STATE
00752 {
00753 TDS_DBG_LOGIN = (1 << 0)
00755 , TDS_DBG_API = (1 << 1)
00756 , TDS_DBG_ASYNC = (1 << 2)
00757 , TDS_DBG_DIAG = (1 << 3)
00758 , TDS_DBG_error = (1 << 4)
00759
00760
00761 , TDS_DBG_PACKET = (1 << 5)
00762 , TDS_DBG_LIBTDS = (1 << 6)
00763 , TDS_DBG_CONFIG = (1 << 7)
00764 , TDS_DBG_DEFAULT = 0xFE
00765 };
00766 #endif
00767
00768 typedef struct tds_result_info TDSCOMPUTEINFO;
00769
00770 typedef TDSRESULTINFO TDSPARAMINFO;
00771
00772 typedef struct tds_message
00773 {
00774 TDS_CHAR *server;
00775 TDS_CHAR *message;
00776 TDS_CHAR *proc_name;
00777 TDS_CHAR *sql_state;
00778 TDS_UINT msgno;
00779 TDS_INT line_number;
00780
00781 TDS_SMALLINT state;
00782 TDS_TINYINT priv_msg_type;
00783 TDS_TINYINT severity;
00784
00785 int oserr;
00786 } TDSMESSAGE;
00787
00788 typedef struct tds_upd_col
00789 {
00790 struct tds_upd_col *next;
00791 TDS_INT colnamelength;
00792 char * columnname;
00793 } TDSUPDCOL;
00794
00795 typedef enum {
00796 TDS_CURSOR_STATE_UNACTIONED = 0
00797 , TDS_CURSOR_STATE_REQUESTED = 1
00798 , TDS_CURSOR_STATE_SENT = 2
00799 , TDS_CURSOR_STATE_ACTIONED = 3
00800 } TDS_CURSOR_STATE;
00801
00802 typedef struct tds_cursor_status
00803 {
00804 TDS_CURSOR_STATE declare;
00805 TDS_CURSOR_STATE cursor_row;
00806 TDS_CURSOR_STATE open;
00807 TDS_CURSOR_STATE fetch;
00808 TDS_CURSOR_STATE close;
00809 TDS_CURSOR_STATE dealloc;
00810 } TDS_CURSOR_STATUS;
00811
00812 typedef enum tds_cursor_operation
00813 {
00814 TDS_CURSOR_POSITION = 0,
00815 TDS_CURSOR_UPDATE = 1,
00816 TDS_CURSOR_DELETE = 2,
00817 TDS_CURSOR_INSERT = 4
00818 } TDS_CURSOR_OPERATION;
00819
00820 typedef enum tds_cursor_fetch
00821 {
00822 TDS_CURSOR_FETCH_NEXT = 1,
00823 TDS_CURSOR_FETCH_PREV,
00824 TDS_CURSOR_FETCH_FIRST,
00825 TDS_CURSOR_FETCH_LAST,
00826 TDS_CURSOR_FETCH_ABSOLUTE,
00827 TDS_CURSOR_FETCH_RELATIVE
00828 } TDS_CURSOR_FETCH;
00829
00833 typedef struct tds_cursor
00834 {
00835 struct tds_cursor *next;
00836 TDS_INT ref_count;
00837 char *cursor_name;
00838 TDS_INT cursor_id;
00839 TDS_TINYINT options;
00840 char *query;
00841
00842
00843
00844 TDS_INT cursor_rows;
00845
00846 TDS_CURSOR_STATUS status;
00847 TDS_SMALLINT srv_status;
00848 TDSRESULTINFO *res_info;
00849 TDS_INT type, concurrency;
00850 } TDSCURSOR;
00851
00855 typedef struct tds_env
00856 {
00857 int block_size;
00858 char *language;
00859 char *charset;
00860 char *database;
00861 } TDSENV;
00862
00866 typedef struct tds_dynamic
00867 {
00868 struct tds_dynamic *next;
00874 char id[30];
00875
00877 TDS_INT num_id;
00878 TDSPARAMINFO *res_info;
00886 TDSPARAMINFO *params;
00892 int emulated;
00894 char *query;
00895 } TDSDYNAMIC;
00896
00897 typedef enum {
00898 TDS_MULTIPLE_QUERY,
00899 TDS_MULTIPLE_EXECUTE,
00900 TDS_MULTIPLE_RPC
00901 } TDS_MULTIPLE_TYPE;
00902
00903 typedef struct tds_multiple
00904 {
00905 TDS_MULTIPLE_TYPE type;
00906 unsigned int flags;
00907 } TDSMULTIPLE;
00908
00909
00910 typedef struct tds_context TDSCONTEXT;
00911 typedef int (*err_handler_t) (const TDSCONTEXT *, TDSSOCKET *, TDSMESSAGE *);
00912
00913 struct tds_context
00914 {
00915 TDSLOCALE *locale;
00916 void *parent;
00917
00918 int (*msg_handler) (const TDSCONTEXT *, TDSSOCKET *, TDSMESSAGE *);
00919 int (*err_handler) (const TDSCONTEXT *, TDSSOCKET *, TDSMESSAGE *);
00920 int (*int_handler) (void *);
00921 };
00922
00923 enum TDS_ICONV_ENTRY
00924 {
00925 client2ucs2
00926 , client2server_chardata
00927 , iso2server_metadata
00928 , initial_char_conv_count
00929 };
00930
00931 typedef struct tds_authentication
00932 {
00933 TDS_UCHAR *packet;
00934 int packet_len;
00935 TDSRET (*free)(TDSSOCKET * tds, struct tds_authentication * auth);
00936 TDSRET (*handle_next)(TDSSOCKET * tds, struct tds_authentication * auth, size_t len);
00937 } TDSAUTHENTICATION;
00938
00939
00940 typedef struct tds_connection
00941 {
00942 TDS_SYS_SOCKET s;
00943 TDS_SYS_SOCKET s_signal, s_signaled;
00944 void *parent;
00945 const TDSCONTEXT *tds_ctx;
00946
00947 TDS_UINT product_version;
00948 char *product_name;
00949
00950 unsigned char capabilities[TDS_MAX_CAPABILITY];
00951 unsigned int broken_dates:1;
00952 unsigned int emul_little_endian:1;
00953 unsigned int use_iconv:1;
00954 unsigned int tds71rev1:1;
00955
00956 void *tls_session;
00957 #if defined(HAVE_GNUTLS)
00958 void *tls_credentials;
00959 #elif defined(HAVE_OPENSSL)
00960 void *tls_ctx;
00961 #else
00962 void *tls_dummy;
00963 #endif
00964 TDSAUTHENTICATION *authentication;
00965 } TDSCONNECTION;
00966
00970 struct tds_socket
00971 {
00972 TDSCONNECTION conn;
00973
00974 TDS_USMALLINT tds_version;
00975
00976 unsigned char *in_buf;
00977 unsigned char *out_buf;
00978 unsigned int in_buf_max;
00979 unsigned in_pos;
00980 unsigned out_pos;
00981 unsigned in_len;
00983 unsigned char in_flag;
00984 unsigned char out_flag;
00991 TDSRESULTINFO *current_results;
00992 TDSRESULTINFO *res_info;
00993 TDS_INT num_comp_info;
00994 TDSCOMPUTEINFO **comp_info;
00995 TDSPARAMINFO *param_info;
00996 TDSCURSOR *cur_cursor;
00997 TDSCURSOR *cursors;
00998 TDS_TINYINT has_status;
00999 TDS_INT ret_status;
01000 TDS_STATE state;
01001
01002 volatile
01003 unsigned char in_cancel;
01005 TDS_INT8 rows_affected;
01006 TDS_INT query_timeout;
01007 TDSENV env;
01008
01009 TDSDYNAMIC *cur_dyn;
01010 TDSDYNAMIC *dyns;
01012 int char_conv_count;
01013 TDSICONV **char_convs;
01014
01015 TDSLOGIN *login;
01017 int spid;
01018 TDS_UCHAR collation[5];
01019 TDS_UCHAR tds72_transaction[8];
01020 void (*env_chg_func) (TDSSOCKET * tds, int type, char *oldval, char *newval);
01021 int internal_sp_called;
01022
01023 int option_value;
01024 TDS_MUTEX_DECLARE(wire_mtx);
01025 };
01026
01027 #define tds_conn(tds) (&(tds)->conn)
01028 #define tds_get_ctx(tds) (tds_conn(tds)->tds_ctx)
01029 #define tds_set_ctx(tds, val) do { (tds_conn(tds)->tds_ctx) = (val); } while(0)
01030 #define tds_get_parent(tds) (tds_conn(tds)->parent)
01031 #define tds_set_parent(tds, val) do { (tds_conn(tds)->parent) = (val); } while(0)
01032 #define tds_get_s(tds) (tds_conn(tds)->s)
01033 #define tds_set_s(tds, val) do { (tds_conn(tds)->s) = (val); } while(0)
01034
01035 int tds_init_write_buf(TDSSOCKET * tds);
01036 void tds_free_result_info(TDSRESULTINFO * info);
01037 void tds_free_socket(TDSSOCKET * tds);
01038 void tds_free_all_results(TDSSOCKET * tds);
01039 void tds_free_results(TDSRESULTINFO * res_info);
01040 void tds_free_param_results(TDSPARAMINFO * param_info);
01041 void tds_free_param_result(TDSPARAMINFO * param_info);
01042 void tds_free_msg(TDSMESSAGE * message);
01043 void tds_cursor_deallocated(TDSSOCKET *tds, TDSCURSOR *cursor);
01044 void tds_release_cursor(TDSSOCKET *tds, TDSCURSOR *cursor);
01045 void tds_free_bcp_column_data(BCPCOLDATA * coldata);
01046
01047 int tds_put_n(TDSSOCKET * tds, const void *buf, size_t n);
01048 int tds_put_string(TDSSOCKET * tds, const char *buf, int len);
01049 int tds_put_int(TDSSOCKET * tds, TDS_INT i);
01050 int tds_put_int8(TDSSOCKET * tds, TDS_INT8 i);
01051 int tds_put_smallint(TDSSOCKET * tds, TDS_SMALLINT si);
01053 #define tds_put_tinyint(tds, ti) tds_put_byte(tds,ti)
01054 int tds_put_byte(TDSSOCKET * tds, unsigned char c);
01055 TDSRESULTINFO *tds_alloc_results(int num_cols);
01056 TDSCOMPUTEINFO **tds_alloc_compute_results(TDSSOCKET * tds, int num_cols, int by_cols);
01057 TDSCONTEXT *tds_alloc_context(void * parent);
01058 void tds_free_context(TDSCONTEXT * locale);
01059 TDSSOCKET *tds_alloc_socket(TDSCONTEXT * context, int bufsize);
01060
01061
01062 const TDS_COMPILETIME_SETTINGS *tds_get_compiletime_settings(void);
01063 typedef void (*TDSCONFPARSE) (const char *option, const char *value, void *param);
01064 int tds_read_conf_section(FILE * in, const char *section, TDSCONFPARSE tds_conf_parse, void *parse_param);
01065 int tds_read_conf_file(TDSLOGIN * login, const char *server);
01066 void tds_parse_conf_section(const char *option, const char *value, void *param);
01067 TDSLOGIN *tds_read_config_info(TDSSOCKET * tds, TDSLOGIN * login, TDSLOCALE * locale);
01068 void tds_fix_login(TDSLOGIN* login);
01069 TDS_USMALLINT * tds_config_verstr(const char *tdsver, TDSLOGIN* login);
01070 TDSRET tds_lookup_host(const char *servername, char *ip);
01071 TDSRET tds_set_interfaces_file_loc(const char *interfloc);
01072 extern const char STD_DATETIME_FMT[];
01073 int tds_config_boolean(const char *value);
01074
01075 TDSLOCALE *tds_get_locale(void);
01076 TDSRET tds_alloc_row(TDSRESULTINFO * res_info);
01077 TDSRET tds_alloc_compute_row(TDSCOMPUTEINFO * res_info);
01078 BCPCOLDATA * tds_alloc_bcp_column_data(int column_size);
01079 unsigned char *tds7_crypt_pass(const unsigned char *clear_pass, size_t len, unsigned char *crypt_pass);
01080 TDSDYNAMIC *tds_lookup_dynamic(TDSSOCKET * tds, const char *id);
01081 const char *tds_prtype(int token);
01082 int tds_get_varint_size(TDSSOCKET * tds, int datatype);
01083 int tds_get_cardinal_type(int datatype, int usertype);
01084
01085
01086
01087
01088 void tds_iconv_open(TDSSOCKET * tds, const char *charset);
01089 void tds_iconv_close(TDSSOCKET * tds);
01090 void tds_srv_charset_changed(TDSSOCKET * tds, const char *charset);
01091 void tds7_srv_charset_changed(TDSSOCKET * tds, int sql_collate, int lcid);
01092 int tds_iconv_alloc(TDSSOCKET * tds);
01093 void tds_iconv_free(TDSSOCKET * tds);
01094 TDSICONV *tds_iconv_from_collate(TDSSOCKET * tds, TDS_UCHAR collate[5]);
01095
01096
01097 char *tds_timestamp_str(char *str, int maxlen);
01098 struct tm *tds_localtime_r(const time_t *timep, struct tm *result);
01099 struct hostent *tds_gethostbyname_r(const char *servername, struct hostent *result, char *buffer, int buflen, int *h_errnop);
01100 struct hostent *tds_gethostbyaddr_r(const char *addr, int len, int type, struct hostent *result, char *buffer, int buflen,
01101 int *h_errnop);
01102 struct servent *tds_getservbyname_r(const char *name, const char *proto, struct servent *result, char *buffer, int buflen);
01103 #ifdef INADDR_NONE
01104 const char *tds_inet_ntoa_r(struct in_addr iaddr, char *ip, size_t len);
01105 #endif
01106 char *tds_get_homedir(void);
01107
01108
01109 TDSPARAMINFO *tds_alloc_param_result(TDSPARAMINFO * old_param);
01110 void tds_free_input_params(TDSDYNAMIC * dyn);
01111 void tds_free_dynamic(TDSSOCKET * tds, TDSDYNAMIC * dyn);
01112 TDSSOCKET *tds_realloc_socket(TDSSOCKET * tds, size_t bufsize);
01113 char *tds_alloc_client_sqlstate(int msgno);
01114 char *tds_alloc_lookup_sqlstate(TDSSOCKET * tds, int msgno);
01115 TDSLOGIN *tds_alloc_login(int use_environment);
01116 TDSDYNAMIC *tds_alloc_dynamic(TDSSOCKET * tds, const char *id);
01117 void tds_free_login(TDSLOGIN * login);
01118 TDSLOGIN *tds_init_login(TDSLOGIN * login, TDSLOCALE * locale);
01119 TDSLOCALE *tds_alloc_locale(void);
01120 void *tds_alloc_param_data(TDSCOLUMN * curparam);
01121 void tds_free_locale(TDSLOCALE * locale);
01122 TDSCURSOR * tds_alloc_cursor(TDSSOCKET * tds, const char *name, TDS_INT namelen, const char *query, TDS_INT querylen);
01123 void tds_free_row(TDSRESULTINFO * res_info, unsigned char *row);
01124
01125
01126 void tds_set_packet(TDSLOGIN * tds_login, int packet_size);
01127 void tds_set_port(TDSLOGIN * tds_login, int port);
01128 void tds_set_passwd(TDSLOGIN * tds_login, const char *password);
01129 void tds_set_bulk(TDSLOGIN * tds_login, TDS_TINYINT enabled);
01130 void tds_set_user(TDSLOGIN * tds_login, const char *username);
01131 void tds_set_app(TDSLOGIN * tds_login, const char *application);
01132 void tds_set_host(TDSLOGIN * tds_login, const char *hostname);
01133 void tds_set_library(TDSLOGIN * tds_login, const char *library);
01134 void tds_set_server(TDSLOGIN * tds_login, const char *server);
01135 void tds_set_client_charset(TDSLOGIN * tds_login, const char *charset);
01136 void tds_set_language(TDSLOGIN * tds_login, const char *language);
01137 void tds_set_database_name(TDSLOGIN * tds_login, const char *dbname);
01138 void tds_set_version(TDSLOGIN * tds_login, TDS_TINYINT major_ver, TDS_TINYINT minor_ver);
01139 void tds_set_capabilities(TDSLOGIN * tds_login, unsigned char *capabilities, int size);
01140 int tds_connect_and_login(TDSSOCKET * tds, TDSLOGIN * login);
01141
01142
01143 TDSRET tds_submit_query(TDSSOCKET * tds, const char *query);
01144 TDSRET tds_submit_query_params(TDSSOCKET * tds, const char *query, TDSPARAMINFO * params);
01145 TDSRET tds_submit_queryf(TDSSOCKET * tds, const char *queryf, ...);
01146 TDSRET tds_submit_prepare(TDSSOCKET * tds, const char *query, const char *id, TDSDYNAMIC ** dyn_out, TDSPARAMINFO * params);
01147 TDSRET tds_submit_execdirect(TDSSOCKET * tds, const char *query, TDSPARAMINFO * params);
01148 TDSRET tds71_submit_prepexec(TDSSOCKET * tds, const char *query, const char *id, TDSDYNAMIC ** dyn_out, TDSPARAMINFO * params);
01149 TDSRET tds_submit_execute(TDSSOCKET * tds, TDSDYNAMIC * dyn);
01150 TDSRET tds_send_cancel(TDSSOCKET * tds);
01151 const char *tds_next_placeholder(const char *start);
01152 int tds_count_placeholders(const char *query);
01153 int tds_needs_unprepare(TDSSOCKET * tds, TDSDYNAMIC * dyn);
01154 TDSRET tds_submit_unprepare(TDSSOCKET * tds, TDSDYNAMIC * dyn);
01155 TDSRET tds_submit_rpc(TDSSOCKET * tds, const char *rpc_name, TDSPARAMINFO * params);
01156 TDSRET tds_submit_optioncmd(TDSSOCKET * tds, TDS_OPTION_CMD command, TDS_OPTION option, TDS_OPTION_ARG *param, TDS_INT param_size);
01157 TDSRET tds_submit_begin_tran(TDSSOCKET *tds);
01158 TDSRET tds_submit_rollback(TDSSOCKET *tds, int cont);
01159 TDSRET tds_submit_commit(TDSSOCKET *tds, int cont);
01160 int tds_quote_id(TDSSOCKET * tds, char *buffer, const char *id, int idlen);
01161 int tds_quote_string(TDSSOCKET * tds, char *buffer, const char *str, int len);
01162 const char *tds_skip_quoted(const char *s);
01163 size_t tds_fix_column_size(TDSSOCKET * tds, TDSCOLUMN * curcol);
01164 const char *tds_convert_string(TDSSOCKET * tds, const TDSICONV * char_conv, const char *s, int len, size_t *out_len);
01165 void tds_convert_string_free(const char *original, const char *converted);
01166 #if !ENABLE_EXTRA_CHECKS
01167 #define tds_convert_string_free(original, converted) \
01168 do { if (original != converted) free((char*) converted); } while(0)
01169 #endif
01170
01171 TDSRET tds_cursor_declare(TDSSOCKET * tds, TDSCURSOR * cursor, TDSPARAMINFO *params, int *send);
01172 TDSRET tds_cursor_setrows(TDSSOCKET * tds, TDSCURSOR * cursor, int *send);
01173 TDSRET tds_cursor_open(TDSSOCKET * tds, TDSCURSOR * cursor, TDSPARAMINFO *params, int *send);
01174 TDSRET tds_cursor_fetch(TDSSOCKET * tds, TDSCURSOR * cursor, TDS_CURSOR_FETCH fetch_type, TDS_INT i_row);
01175 TDSRET tds_cursor_get_cursor_info(TDSSOCKET * tds, TDSCURSOR * cursor, TDS_UINT * row_number, TDS_UINT * row_count);
01176 TDSRET tds_cursor_close(TDSSOCKET * tds, TDSCURSOR * cursor);
01177 TDSRET tds_cursor_dealloc(TDSSOCKET * tds, TDSCURSOR * cursor);
01178 TDSRET tds_cursor_update(TDSSOCKET * tds, TDSCURSOR * cursor, TDS_CURSOR_OPERATION op, TDS_INT i_row, TDSPARAMINFO * params);
01179 TDSRET tds_cursor_setname(TDSSOCKET * tds, TDSCURSOR * cursor);
01180
01181 TDSRET tds_multiple_init(TDSSOCKET *tds, TDSMULTIPLE *multiple, TDS_MULTIPLE_TYPE type);
01182 TDSRET tds_multiple_done(TDSSOCKET *tds, TDSMULTIPLE *multiple);
01183 TDSRET tds_multiple_query(TDSSOCKET *tds, TDSMULTIPLE *multiple, const char *query, TDSPARAMINFO * params);
01184 TDSRET tds_multiple_execute(TDSSOCKET *tds, TDSMULTIPLE *multiple, TDSDYNAMIC * dyn);
01185
01186
01187 TDSRET tds_process_cancel(TDSSOCKET * tds);
01188 #ifdef WORDS_BIGENDIAN
01189 void tds_swap_datatype(int coltype, unsigned char *buf);
01190 #endif
01191 void tds_swap_numeric(TDS_NUMERIC *num);
01192 int tds_get_token_size(int marker);
01193 TDSRET tds_process_login_tokens(TDSSOCKET * tds);
01194 TDSRET tds_process_simple_query(TDSSOCKET * tds);
01195 int tds5_send_optioncmd(TDSSOCKET * tds, TDS_OPTION_CMD tds_command, TDS_OPTION tds_option, TDS_OPTION_ARG * tds_argument,
01196 TDS_INT * tds_argsize);
01197 TDSRET tds_process_tokens(TDSSOCKET * tds, TDS_INT * result_type, int *done_flags, unsigned flag);
01198
01199
01200 void tds_set_param_type(TDSSOCKET * tds, TDSCOLUMN * curcol, TDS_SERVER_TYPE type);
01201 void tds_set_column_type(TDSSOCKET * tds, TDSCOLUMN * curcol, int type);
01202
01203
01204
01205 TDSRET tds_datecrack(TDS_INT datetype, const void *di, TDSDATEREC * dr);
01206 int tds_get_conversion_type(int srctype, int colsize);
01207 extern const char tds_hex_digits[];
01208
01209
01210 TDSRET tds_flush_packet(TDSSOCKET * tds);
01211 int tds_put_buf(TDSSOCKET * tds, const unsigned char *buf, int dsize, int ssize);
01212
01213
01214 unsigned char tds_get_byte(TDSSOCKET * tds);
01215 void tds_unget_byte(TDSSOCKET * tds);
01216 unsigned char tds_peek(TDSSOCKET * tds);
01217 TDS_SMALLINT tds_get_smallint(TDSSOCKET * tds);
01218 TDS_INT tds_get_int(TDSSOCKET * tds);
01219 TDS_INT8 tds_get_int8(TDSSOCKET * tds);
01220 int tds_get_string(TDSSOCKET * tds, int string_len, char *dest, size_t dest_size);
01221 TDSRET tds_get_char_data(TDSSOCKET * tds, char *dest, size_t wire_size, TDSCOLUMN * curcol);
01222 void *tds_get_n(TDSSOCKET * tds, void *dest, int n);
01223 int tds_get_size_by_type(int servertype);
01224
01225
01226
01227 int tdserror (const TDSCONTEXT * tds_ctx, TDSSOCKET * tds, int msgno, int errnum);
01228 TDS_STATE tds_set_state(TDSSOCKET * tds, TDS_STATE state);
01229 int tds_swap_bytes(unsigned char *buf, int bytes);
01230 #ifdef ENABLE_DEVELOPING
01231 unsigned int tds_gettime_ms(void);
01232 #endif
01233
01234
01235 void tdsdump_off(void);
01236 void tdsdump_on(void);
01237 int tdsdump_isopen(void);
01238 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
01239 #pragma GCC visibility pop
01240 #endif
01241 int tdsdump_open(const char *filename);
01242 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
01243 #pragma GCC visibility push(hidden)
01244 #endif
01245 void tdsdump_close(void);
01246 void tdsdump_dump_buf(const char* file, unsigned int level_line, const char *msg, const void *buf, size_t length);
01247 void tdsdump_col(const TDSCOLUMN *col);
01248 #undef tdsdump_log
01249 void tdsdump_log(const char* file, unsigned int level_line, const char *fmt, ...)
01250 #if defined(__GNUC__) && __GNUC__ >= 2
01251 __attribute__ ((__format__ (__printf__, 3, 4)))
01252 #endif
01253 ;
01254 #define tdsdump_log if (TDS_UNLIKELY(tds_write_dump)) tdsdump_log
01255
01256 extern int tds_write_dump;
01257 extern int tds_debug_flags;
01258 extern int tds_g_append_mode;
01259
01260
01261 TDSERRNO tds_open_socket(TDSSOCKET * tds, const char *ip_addr, unsigned int port, int timeout, int *p_oserr);
01262 int tds_close_socket(TDSSOCKET * tds);
01263 int tds_read_packet(TDSSOCKET * tds);
01264 TDSRET tds_write_packet(TDSSOCKET * tds, unsigned char final);
01265 int tds7_get_instance_ports(FILE *output, const char *ip_addr);
01266 int tds7_get_instance_port(const char *ip_addr, const char *instance);
01267 TDSRET tds_ssl_init(TDSSOCKET *tds);
01268 void tds_ssl_deinit(TDSSOCKET *tds);
01269 const char *tds_prwsaerror(int erc);
01270 int tds_put_cancel(TDSSOCKET * tds);
01271
01272
01273
01274
01275 TDSRET tds_vstrbuild(char *buffer, int buflen, int *resultlen, const char *text, int textlen, const char *formats, int formatlen,
01276 va_list ap);
01277
01278
01279 char *tds_money_to_string(const TDS_MONEY * money, char *s);
01280 TDS_INT tds_numeric_to_string(const TDS_NUMERIC * numeric, char *s);
01281 TDS_INT tds_numeric_change_prec_scale(TDS_NUMERIC * numeric, unsigned char new_prec, unsigned char new_scale);
01282
01283
01284 void tds_getmac(TDS_SYS_SOCKET s, unsigned char mac[6]);
01285
01286 #ifndef HAVE_SSPI
01287 TDSAUTHENTICATION * tds_ntlm_get_auth(TDSSOCKET * tds);
01288 TDSAUTHENTICATION * tds_gss_get_auth(TDSSOCKET * tds);
01289 #else
01290 TDSAUTHENTICATION * tds_sspi_get_auth(TDSSOCKET * tds);
01291 #endif
01292
01293
01294
01296 enum tds_bcp_directions
01297 {
01298 TDS_BCP_IN = 1,
01299 TDS_BCP_OUT = 2,
01300 TDS_BCP_QUERYOUT = 3
01301 };
01302
01303 typedef struct tds_bcpinfo
01304 {
01305 const char *hint;
01306 void *parent;
01307 TDS_CHAR *tablename;
01308 TDS_CHAR *insert_stmt;
01309 TDS_INT direction;
01310 TDS_INT identity_insert_on;
01311 TDS_INT xfer_init;
01312 TDS_INT var_cols;
01313 TDS_INT bind_count;
01314 TDSRESULTINFO *bindinfo;
01315 } TDSBCPINFO;
01316
01317 TDSRET tds_bcp_init(TDSSOCKET *tds, TDSBCPINFO *bcpinfo);
01318 typedef TDSRET (*tds_bcp_get_col_data) (TDSBCPINFO *bulk, TDSCOLUMN *bcpcol, int offset);
01319 typedef void (*tds_bcp_null_error) (TDSBCPINFO *bulk, int index, int offset);
01320 TDSRET tds_bcp_send_record(TDSSOCKET *tds, TDSBCPINFO *bcpinfo, tds_bcp_get_col_data get_col_data, tds_bcp_null_error null_error, int offset);
01321 TDSRET tds_bcp_done(TDSSOCKET *tds, int *rows_copied);
01322 TDSRET tds_bcp_start(TDSSOCKET *tds, TDSBCPINFO *bcpinfo);
01323 TDSRET tds_bcp_start_copy_in(TDSSOCKET *tds, TDSBCPINFO *bcpinfo);
01324
01325 TDSRET tds_writetext_start(TDSSOCKET *tds, const char *objname, const char *textptr, const char *timestamp, int with_log, TDS_UINT size);
01326 TDSRET tds_writetext_continue(TDSSOCKET *tds, const TDS_UCHAR *text, TDS_UINT size);
01327 TDSRET tds_writetext_end(TDSSOCKET *tds);
01328
01329
01330 #define IS_TDS42(x) (x->tds_version==0x402)
01331 #define IS_TDS46(x) (x->tds_version==0x406)
01332 #define IS_TDS50(x) (x->tds_version==0x500)
01333 #define IS_TDS70(x) (x->tds_version==0x700)
01334 #define IS_TDS71(x) (x->tds_version==0x701)
01335 #define IS_TDS72(x) (x->tds_version==0x702)
01336 #define IS_TDS73(x) (x->tds_version==0x703)
01337
01338 #define IS_TDS7_PLUS(x) ((x)->tds_version>=0x700)
01339 #define IS_TDS71_PLUS(x) ((x)->tds_version>=0x701)
01340 #define IS_TDS72_PLUS(x) ((x)->tds_version>=0x702)
01341 #define IS_TDS73_PLUS(x) ((x)->tds_version>=0x703)
01342
01343 #define TDS_MAJOR(x) ((x)->tds_version >> 8)
01344 #define TDS_MINOR(x) ((x)->tds_version & 0xff)
01345
01346 #define IS_TDSDEAD(x) (((x) == NULL) || TDS_IS_SOCKET_INVALID(tds_conn(x)->s))
01347
01349 #define TDS_IS_SYBASE(x) (!(tds_conn(x)->product_version & 0x80000000u))
01350
01351 #define TDS_IS_MSSQL(x) ((tds_conn(x)->product_version & 0x80000000u)!=0)
01352
01356 #define TDS_MS_VER(maj,min,x) (0x80000000u|((maj)<<24)|((min)<<16)|(x))
01357
01358
01360 #define TDS_SYB_VER(maj,min,x) (((maj)<<24)|((min)<<16)|(x)<<8)
01361
01362 #ifdef __cplusplus
01363 #if 0
01364 {
01365 #endif
01366 }
01367 #endif
01368
01369 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
01370 #pragma GCC visibility pop
01371 #endif
01372
01373 #define TDS_PUT_INT(tds,v) tds_put_int((tds), ((TDS_INT)(v)))
01374 #define TDS_PUT_SMALLINT(tds,v) tds_put_smallint((tds), ((TDS_SMALLINT)(v)))
01375 #define TDS_PUT_BYTE(tds,v) tds_put_byte((tds), ((unsigned char)(v)))
01376
01377 #endif