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