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