Main Page   Modules   Compound List   File List   Compound Members   File Members   Related Pages  

tds.h

Go to the documentation of this file.
00001 /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
00002  * Copyright (C) 1998-1999  Brian Bruns
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Library General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Library General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Library General Public
00015  * License along with this library; if not, write to the
00016  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017  * Boston, MA 02111-1307, USA.
00018  */
00019 
00020 #ifndef _tds_h_
00021 #define _tds_h_
00022 
00023 static char rcsid_tds_h[] = "$Id: tds.h,v 1.165 2003/12/18 16:38:52 jklowden Exp $";
00024 static void *no_unused_tds_h_warn[] = { rcsid_tds_h, no_unused_tds_h_warn };
00025 
00026 #include <stdio.h>
00027 #include <stdarg.h>
00028 #include <time.h>
00029 
00030 /* forward declaration */
00031 typedef struct tdsiconvinfo TDSICONVINFO;
00032 typedef struct tds_socket TDSSOCKET;
00033 
00034 #include "tdsver.h"
00035 #include "tds_sysdep_public.h"
00036 #ifdef _FREETDS_LIBRARY_SOURCE
00037 #include "tds_sysdep_private.h"
00038 #endif /* _FREETDS_LIBRARY_SOURCE */
00039 
00040 #ifdef __cplusplus
00041 extern "C"
00042 {
00043 #if 0
00044 }
00045 #endif
00046 #endif
00047 
00053 typedef struct _tds_compiletime_settings
00054 {
00055         const char *freetds_version;    /* release version of FreeTDS */
00056         const char *last_update;        /* latest software_version date among the modules */
00057         int msdblib;            /* for MS style dblib */
00058         int sybase_compat;      /* enable increased Open Client binary compatibility */
00059         int threadsafe;         /* compile for thread safety default=no */
00060         int libiconv;           /* search for libiconv in DIR/include and DIR/lib */
00061         const char *tdsver;     /* TDS protocol version (4.2/4.6/5.0/7.0/8.0) 5.0 */
00062         int iodbc;              /* build odbc driver against iODBC in DIR */
00063         int unixodbc;           /* build odbc driver against unixODBC in DIR */
00064 
00065 } TDS_COMPILETIME_SETTINGS;
00066 
00067 struct DSTR_CHAR;
00068 typedef struct DSTR_CHAR *DSTR;
00069 
00085 /* 
00086  * All references to data that touch the wire should use the following typedefs.  
00087  *
00088  * If you have problems on 64-bit machines and the code is 
00089  * using a native datatype, please change it to use
00090  * these. (In the TDS layer only, the API layers have their
00091  * own typedefs which equate to these).
00092  */
00093 typedef char TDS_CHAR;                                  /*  8-bit char     */
00094 typedef unsigned char TDS_UCHAR;                        /*  8-bit uchar    */
00095 typedef unsigned char TDS_TINYINT;                      /*  8-bit unsigned */
00096 typedef tds_sysdep_int16_type TDS_SMALLINT;             /* 16-bit int      */
00097 typedef unsigned tds_sysdep_int16_type TDS_USMALLINT;   /* 16-bit unsigned */
00098 typedef tds_sysdep_int32_type TDS_INT;                  /* 32-bit int      */
00099 typedef unsigned tds_sysdep_int32_type TDS_UINT;        /* 32-bit unsigned */
00100 typedef tds_sysdep_real32_type TDS_REAL;                /* 32-bit real     */
00101 typedef tds_sysdep_real64_type TDS_FLOAT;               /* 64-bit real     */
00102 typedef tds_sysdep_int64_type TDS_INT8;                 /* 64-bit integer  */
00103 typedef unsigned tds_sysdep_int64_type TDS_UINT8;       /* 64-bit unsigned */
00104 
00105 typedef struct tdsnumeric
00106 {
00107         unsigned char precision;
00108         unsigned char scale;
00109         unsigned char array[33];
00110 } TDS_NUMERIC;
00111 
00112 typedef struct tdsoldmoney
00113 {
00114         TDS_INT mnyhigh;
00115         TDS_UINT mnylow;
00116 } TDS_OLD_MONEY;
00117 
00118 typedef union tdsmoney
00119 {
00120         TDS_OLD_MONEY tdsoldmoney;
00121         TDS_INT8 mny;
00122 } TDS_MONEY;
00123 
00124 typedef struct tdsmoney4
00125 {
00126         TDS_INT mny4;
00127 } TDS_MONEY4;
00128 
00129 typedef struct tdsdatetime
00130 {
00131         TDS_INT dtdays;
00132         TDS_INT dttime;
00133 } TDS_DATETIME;
00134 
00135 typedef struct tdsdatetime4
00136 {
00137         TDS_USMALLINT days;
00138         TDS_USMALLINT minutes;
00139 } TDS_DATETIME4;
00140 
00141 typedef struct tdsvarbinary
00142 {
00143         TDS_INT len;
00144         TDS_CHAR array[256];
00145 } TDS_VARBINARY;
00146 typedef struct tdsvarchar
00147 {
00148         TDS_INT len;
00149         TDS_CHAR array[256];
00150 } TDS_VARCHAR;
00151 
00152 typedef struct tdsunique
00153 {
00154         TDS_UINT Data1;
00155         TDS_USMALLINT Data2;
00156         TDS_USMALLINT Data3;
00157         TDS_UCHAR Data4[8];
00158 } TDS_UNIQUE;
00159 
00161 typedef struct tdsdaterec
00162 {
00163         TDS_INT year;          
00164         TDS_INT month;         
00165         TDS_INT day;           
00166         TDS_INT dayofyear;     
00167         TDS_INT weekday;       
00168         TDS_INT hour;          
00169         TDS_INT minute;        
00170         TDS_INT second;        
00171         TDS_INT millisecond;   
00172         TDS_INT tzone;
00173 } TDSDATEREC;
00174 
00180 extern const int tds_numeric_bytes_per_prec[];
00181 
00182 #define TDS_SUCCEED          1
00183 #define TDS_FAIL             0
00184 #define TDS_NO_MORE_RESULTS  2
00185 
00186 #define TDS_REG_ROW          -1
00187 #define TDS_NO_MORE_ROWS     -2
00188 #define TDS_COMP_ROW         -3
00189 #define TDS_END_ROW          -4
00190 
00191 #define TDS_INT_EXIT 0
00192 #define TDS_INT_CONTINUE 1
00193 #define TDS_INT_CANCEL 2
00194 #define TDS_INT_TIMEOUT 3
00195 
00196 
00197 #define TDS_NO_COUNT         -1
00198 
00199 #define TDS_ROW_RESULT        4040
00200 #define TDS_PARAM_RESULT      4042
00201 #define TDS_STATUS_RESULT     4043
00202 #define TDS_MSG_RESULT        4044
00203 #define TDS_COMPUTE_RESULT    4045
00204 #define TDS_CMD_DONE          4046
00205 #define TDS_CMD_SUCCEED       4047
00206 #define TDS_CMD_FAIL          4048
00207 #define TDS_ROWFMT_RESULT     4049
00208 #define TDS_COMPUTEFMT_RESULT 4050
00209 #define TDS_DESCRIBE_RESULT   4051
00210 #define TDS_DONE_RESULT       4052
00211 #define TDS_DONEPROC_RESULT   4053
00212 #define TDS_DONEINPROC_RESULT 4054
00213 
00214 enum tds_end
00215 {
00216         TDS_DONE_FINAL = 0x00   /* final result set, command completed successfully. */
00217                 , TDS_DONE_MORE_RESULTS = 0x01  /* more results follow */
00218                 , TDS_DONE_ERROR = 0x02 /* error occurred */
00219                 , TDS_DONE_INXACT = 0x04        /* transaction in progress */
00220                 , TDS_DONE_PROC = 0x08  /* results are from a stored procedure */
00221                 , TDS_DONE_COUNT = 0x10 /* count field in packet is valid */
00222                 , TDS_DONE_CANCELLED = 0x20     /* acknowledging an attention command (usually a cancel) */
00223                 , TDS_DONE_EVENT = 0x40 /* part of an event notification. */
00224                 /* after the above flags, a TDS_DONE packet has a field describing the state of the transaction */
00225                 , TDS_DONE_NO_TRAN = 0  /* No transaction in effect */
00226                 , TDS_DONE_TRAN_SUCCEED = 1     /* Transaction completed successfully */
00227                 , TDS_DONE_TRAN_PROGRESS = 2    /* Transaction in progress */
00228                 , TDS_DONE_STMT_ABORT = 3       /* A statement aborted */
00229                 , TDS_DONE_TRAN_ABORT = 4       /* Transaction aborted */
00230 };
00231 
00232 /*
00233  * TDS_ERROR indicates a successful processing, but that a TDS_ERROR_TOKEN or TDS_EED_TOKEN error was encountered.  
00234  * TDS_FAIL indicates an unrecoverable failure.
00235  */
00236 #define TDS_ERROR            3
00237 #define TDS_DONT_RETURN      42
00238 
00239 #define TDS5_PARAMFMT2_TOKEN       32   /* 0x20 */
00240 #define TDS_LANGUAGE_TOKEN         33   /* 0x21    TDS 5.0 only              */
00241 #define TDS_ORDERBY2_TOKEN         34   /* 0x22 */
00242 #define TDS_ROWFMT2_TOKEN          97   /* 0x61    TDS 5.0 only              */
00243 #define TDS_LOGOUT_TOKEN          113   /* 0x71    TDS 5.0 only? ct_close()  */
00244 #define TDS_RETURNSTATUS_TOKEN    121   /* 0x79                              */
00245 #define TDS_PROCID_TOKEN          124   /* 0x7C    TDS 4.2 only - TDS_PROCID */
00246 #define TDS7_RESULT_TOKEN         129   /* 0x81    TDS 7.0 only              */
00247 #define TDS7_COMPUTE_RESULT_TOKEN 136   /* 0x88    TDS 7.0 only              */
00248 #define TDS_COLNAME_TOKEN         160   /* 0xA0    TDS 4.2 only              */
00249 #define TDS_COLFMT_TOKEN          161   /* 0xA1    TDS 4.2 only - TDS_COLFMT */
00250 #define TDS_DYNAMIC2_TOKEN        163   /* 0xA3 */
00251 #define TDS_TABNAME_TOKEN         164   /* 0xA4 */
00252 #define TDS_COLINFO_TOKEN         165   /* 0xA5 */
00253 #define TDS_OPTIONCMD_TOKEN       166   /* 0xA6 */
00254 #define TDS_COMPUTE_NAMES_TOKEN   167   /* 0xA7 */
00255 #define TDS_COMPUTE_RESULT_TOKEN  168   /* 0xA8 */
00256 #define TDS_ORDERBY_TOKEN         169   /* 0xA9    TDS_ORDER                 */
00257 #define TDS_ERROR_TOKEN           170   /* 0xAA                              */
00258 #define TDS_INFO_TOKEN            171   /* 0xAB                              */
00259 #define TDS_PARAM_TOKEN           172   /* 0xAC    RETURNVALUE?              */
00260 #define TDS_LOGINACK_TOKEN        173   /* 0xAD                              */
00261 #define TDS_CONTROL_TOKEN         174   /* 0xAE    TDS_CONTROL               */
00262 #define TDS_ROW_TOKEN             209   /* 0xD1                              */
00263 #define TDS_CMP_ROW_TOKEN         211   /* 0xD3                              */
00264 #define TDS5_PARAMS_TOKEN         215   /* 0xD7    TDS 5.0 only              */
00265 #define TDS_CAPABILITY_TOKEN      226   /* 0xE2                              */
00266 #define TDS_ENVCHANGE_TOKEN       227   /* 0xE3                              */
00267 #define TDS_EED_TOKEN             229   /* 0xE5                              */
00268 #define TDS_DBRPC_TOKEN           230   /* 0xE6                              */
00269 #define TDS5_DYNAMIC_TOKEN        231   /* 0xE7    TDS 5.0 only              */
00270 #define TDS5_PARAMFMT_TOKEN       236   /* 0xEC    TDS 5.0 only              */
00271 #define TDS_AUTH_TOKEN            237   /* 0xED                              */
00272 #define TDS_RESULT_TOKEN          238   /* 0xEE                              */
00273 #define TDS_DONE_TOKEN            253   /* 0xFD    TDS_DONE                  */
00274 #define TDS_DONEPROC_TOKEN        254   /* 0xFE    TDS_DONEPROC              */
00275 #define TDS_DONEINPROC_TOKEN      255   /* 0xFF    TDS_DONEINPROC            */
00276 
00277 /* CURSOR support: TDS 5.0 only*/
00278 #define TDS_CURCLOSE_TOKEN        128  /* 0x80    TDS 5.0 only              */
00279 #define TDS_CURFETCH_TOKEN        130  /* 0x82    TDS 5.0 only              */
00280 #define TDS_CURINFO_TOKEN         131  /* 0x83    TDS 5.0 only              */
00281 #define TDS_CUROPEN_TOKEN         132  /* 0x84    TDS 5.0 only              */
00282 #define TDS_CURDECLARE_TOKEN      134  /* 0x86    TDS 5.0 only              */
00283 
00284 /* 
00285  * Cursor Declare, SetRows, Open and Close all return 0x83 token. 
00286  * But only SetRows includes the rowcount (4 byte) in the stream. 
00287  * So for Setrows we read the rowcount from the stream and not for others. 
00288  * These values are useful to determine when to read the rowcount from the packet
00289  */
00290 #define IS_DECLARE  100
00291 #define IS_CURROW   200
00292 #define IS_OPEN     300
00293 #define IS_CLOSE    400
00294 
00295 /* states for tds_process_messages() */
00296 #define PROCESS_ROWS    0
00297 #define PROCESS_RESULTS 1
00298 #define CANCEL_PROCESS  2
00299 #define GOTO_1ST_ROW    3
00300 #define LOGIN           4
00301 
00302 /* environment type field */
00303 #define TDS_ENV_DATABASE        1
00304 #define TDS_ENV_LANG            2
00305 #define TDS_ENV_CHARSET         3
00306 #define TDS_ENV_PACKSIZE        4
00307 #define TDS_ENV_LCID            5
00308 #define TDS_ENV_SQLCOLLATION    7
00309 
00310 /* string types */
00311 #define TDS_NULLTERM -9
00312 
00313 /* Microsoft internal stored procedure id's */
00314 
00315 #define TDS_SP_CURSOR           1
00316 #define TDS_SP_CURSOROPEN       2
00317 #define TDS_SP_CURSORPREPARE    3
00318 #define TDS_SP_CURSOREXECUTE    4
00319 #define TDS_SP_CURSORPREPEXEC   5
00320 #define TDS_SP_CURSORUNPREPARE  6
00321 #define TDS_SP_CURSORFETCH      7
00322 #define TDS_SP_CURSOROPTION     8
00323 #define TDS_SP_CURSORCLOSE      9
00324 #define TDS_SP_EXECUTESQL      10
00325 #define TDS_SP_PREPARE         11
00326 #define TDS_SP_EXECUTE         12
00327 #define TDS_SP_PREPEXEC        13
00328 #define TDS_SP_PREPEXECRPC     14
00329 #define TDS_SP_UNPREPARE       15
00330 /* 
00331 <rant> Sybase does an awful job of this stuff, non null ints of size 1 2 
00332 and 4 have there own codes but nullable ints are lumped into INTN
00333 sheesh! </rant>
00334 */
00335 typedef enum
00336 {
00337         SYBCHAR = 47,           /* 0x2F */
00338 #define SYBCHAR SYBCHAR
00339         SYBVARCHAR = 39,        /* 0x27 */
00340 #define SYBVARCHAR      SYBVARCHAR
00341         SYBINTN = 38,           /* 0x26 */
00342 #define SYBINTN SYBINTN
00343         SYBINT1 = 48,           /* 0x30 */
00344 #define SYBINT1 SYBINT1
00345         SYBINT2 = 52,           /* 0x34 */
00346 #define SYBINT2 SYBINT2
00347         SYBINT4 = 56,           /* 0x38 */
00348 #define SYBINT4 SYBINT4
00349         SYBINT8 = 127,          /* 0x7F */
00350 #define SYBINT8 SYBINT8
00351         SYBFLT8 = 62,           /* 0x3E */
00352 #define SYBFLT8 SYBFLT8
00353         SYBDATETIME = 61,       /* 0x3D */
00354 #define SYBDATETIME     SYBDATETIME
00355         SYBBIT = 50,            /* 0x32 */
00356 #define SYBBIT  SYBBIT
00357         SYBTEXT = 35,           /* 0x23 */
00358 #define SYBTEXT SYBTEXT
00359         SYBNTEXT = 99,          /* 0x63 */
00360 #define SYBNTEXT        SYBNTEXT
00361         SYBIMAGE = 34,          /* 0x22 */
00362 #define SYBIMAGE        SYBIMAGE
00363         SYBMONEY4 = 122,        /* 0x7A */
00364 #define SYBMONEY4       SYBMONEY4
00365         SYBMONEY = 60,          /* 0x3C */
00366 #define SYBMONEY        SYBMONEY
00367         SYBDATETIME4 = 58,      /* 0x3A */
00368 #define SYBDATETIME4    SYBDATETIME4
00369         SYBREAL = 59,           /* 0x3B */
00370 #define SYBREAL SYBREAL
00371         SYBBINARY = 45,         /* 0x2D */
00372 #define SYBBINARY       SYBBINARY
00373         SYBVOID = 31,           /* 0x1F */
00374 #define SYBVOID SYBVOID
00375         SYBVARBINARY = 37,      /* 0x25 */
00376 #define SYBVARBINARY    SYBVARBINARY
00377         SYBNVARCHAR = 103,      /* 0x67 */
00378 #define SYBNVARCHAR     SYBNVARCHAR
00379         SYBBITN = 104,          /* 0x68 */
00380 #define SYBBITN SYBBITN
00381         SYBNUMERIC = 108,       /* 0x6C */
00382 #define SYBNUMERIC      SYBNUMERIC
00383         SYBDECIMAL = 106,       /* 0x6A */
00384 #define SYBDECIMAL      SYBDECIMAL
00385         SYBFLTN = 109,          /* 0x6D */
00386 #define SYBFLTN SYBFLTN
00387         SYBMONEYN = 110,        /* 0x6E */
00388 #define SYBMONEYN       SYBMONEYN
00389         SYBDATETIMN = 111,      /* 0x6F */
00390 #define SYBDATETIMN     SYBDATETIMN
00391         XSYBCHAR = 175,         /* 0xAF */
00392 #define XSYBCHAR        XSYBCHAR
00393         XSYBVARCHAR = 167,      /* 0xA7 */
00394 #define XSYBVARCHAR     XSYBVARCHAR
00395         XSYBNVARCHAR = 231,     /* 0xE7 */
00396 #define XSYBNVARCHAR    XSYBNVARCHAR
00397         XSYBNCHAR = 239,        /* 0xEF */
00398 #define XSYBNCHAR       XSYBNCHAR
00399         XSYBVARBINARY = 165,    /* 0xA5 */
00400 #define XSYBVARBINARY   XSYBVARBINARY
00401         XSYBBINARY = 173,       /* 0xAD */
00402 #define XSYBBINARY      XSYBBINARY
00403         SYBLONGBINARY = 225,    /* 0xE1 */
00404 #define SYBLONGBINARY   SYBLONGBINARY
00405         SYBSINT1 = 64,          /* 0x40 */
00406 #define SYBSINT1        SYBSINT1
00407         SYBUINT2 = 65,          /* 0x41 */
00408 #define SYBUINT2        SYBUINT2
00409         SYBUINT4 = 66,          /* 0x42 */
00410 #define SYBUINT4        SYBUINT4
00411         SYBUINT8 = 67,          /* 0x43 */
00412 #define SYBUINT8        SYBUINT8
00413 
00414         SYBUNIQUE = 36,         /* 0x24 */
00415 #define SYBUNIQUE       SYBUNIQUE
00416         SYBVARIANT = 98         /* 0x62 */
00417 #define SYBVARIANT      SYBVARIANT
00418 } TDS_SERVER_TYPE;
00419 
00420 
00421 typedef enum
00422 {
00423         USER_UNICHAR_TYPE = 34,         /* 0x22 */
00424         USER_UNIVARCHAR_TYPE = 35       /* 0x23 */
00425 } TDS_USER_TYPE;
00426 
00427 #define SYBAOPCNT  0x4b
00428 #define SYBAOPCNTU 0x4c
00429 #define SYBAOPSUM  0x4d
00430 #define SYBAOPSUMU 0x4e
00431 #define SYBAOPAVG  0x4f
00432 #define SYBAOPAVGU 0x50
00433 #define SYBAOPMIN  0x51
00434 #define SYBAOPMAX  0x52
00435 
00436 /* mssql2k compute operator */
00437 #define SYBAOPCNT_BIG           0x09
00438 #define SYBAOPSTDEV             0x30
00439 #define SYBAOPSTDEVP            0x31
00440 #define SYBAOPVAR               0x32
00441 #define SYBAOPVARP              0x33
00442 #define SYBAOPCHECKSUM_AGG      0x72
00443 
00444 
00448 typedef enum
00449 {
00450           TDS_OPT_SET = 1       /* Set an option. */
00451         , TDS_OPT_DEFAULT = 2   /* Set option to its default value. */
00452         , TDS_OPT_LIST = 3      /* Request current setting of a specific option. */
00453         , TDS_OPT_INFO = 4      /* Report current setting of a specific option. */
00454 } TDS_OPTION_CMD;
00455 
00456 typedef enum
00457 {
00458           TDS_OPT_DATEFIRST = 1         /* 0x01 */
00459         , TDS_OPT_TEXTSIZE = 2          /* 0x02 */
00460         , TDS_OPT_STAT_TIME = 3         /* 0x03 */
00461         , TDS_OPT_STAT_IO = 4           /* 0x04 */
00462         , TDS_OPT_ROWCOUNT = 5          /* 0x05 */
00463         , TDS_OPT_NATLANG = 6           /* 0x06 */
00464         , TDS_OPT_DATEFORMAT = 7        /* 0x07 */
00465         , TDS_OPT_ISOLATION = 8         /* 0x08 */
00466         , TDS_OPT_AUTHON = 9            /* 0x09 */
00467         , TDS_OPT_CHARSET = 10          /* 0x0a */
00468         , TDS_OPT_SHOWPLAN = 13         /* 0x0d */
00469         , TDS_OPT_NOEXEC = 14           /* 0x0e */
00470         , TDS_OPT_ARITHIGNOREON = 15    /* 0x0f */
00471         , TDS_OPT_ARITHABORTON = 17     /* 0x11 */
00472         , TDS_OPT_PARSEONLY = 18        /* 0x12 */
00473         , TDS_OPT_GETDATA = 20          /* 0x14 */
00474         , TDS_OPT_NOCOUNT = 21          /* 0x15 */
00475         , TDS_OPT_FORCEPLAN = 23        /* 0x17 */
00476         , TDS_OPT_FORMATONLY = 24       /* 0x18 */
00477         , TDS_OPT_CHAINXACTS = 25       /* 0x19 */
00478         , TDS_OPT_CURCLOSEONXACT = 26   /* 0x1a */
00479         , TDS_OPT_FIPSFLAG = 27         /* 0x1b */
00480         , TDS_OPT_RESTREES = 28         /* 0x1c */
00481         , TDS_OPT_IDENTITYON = 29       /* 0x1d */
00482         , TDS_OPT_CURREAD = 30          /* 0x1e */
00483         , TDS_OPT_CURWRITE = 31         /* 0x1f */
00484         , TDS_OPT_IDENTITYOFF = 32      /* 0x20 */
00485         , TDS_OPT_AUTHOFF = 33          /* 0x21 */
00486         , TDS_OPT_ANSINULL = 34         /* 0x22 */
00487         , TDS_OPT_QUOTED_IDENT = 35     /* 0x23 */
00488         , TDS_OPT_ARITHIGNOREOFF = 36   /* 0x24 */
00489         , TDS_OPT_ARITHABORTOFF = 37    /* 0x25 */
00490         , TDS_OPT_TRUNCABORT = 38       /* 0x26 */
00491 } TDS_OPTION;
00492 
00493 typedef union tds_option_arg
00494 {
00495         TDS_TINYINT ti;
00496         TDS_INT i;
00497         TDS_CHAR *c;
00498 } TDS_OPTION_ARG;
00499 
00500 enum {
00501         TDS_OPT_ARITHOVERFLOW = 0x01,
00502         TDS_OPT_NUMERICTRUNC = 0x02
00503 };
00504 
00505 enum TDS_OPT_DATEFIRST_CHOICE
00506 {
00507         TDS_OPT_MONDAY = 1, TDS_OPT_TUESDAY = 2, TDS_OPT_WEDNESDAY = 3, TDS_OPT_THURSDAY = 4, TDS_OPT_FRIDAY = 5, TDS_OPT_SATURDAY =
00508                 6, TDS_OPT_SUNDAY = 7
00509 };
00510 
00511 enum TDS_OPT_DATEFORMAT_CHOICE
00512 {
00513         TDS_OPT_FMTMDY = 1, TDS_OPT_FMTDMY = 2, TDS_OPT_FMTYMD = 3, TDS_OPT_FMTYDM = 4, TDS_OPT_FMTMYD = 5, TDS_OPT_FMTDYM = 6
00514 };
00515 enum TDS_OPT_ISOLATION_CHOICE
00516 {
00517         TDS_OPT_LEVEL1 = 1, TDS_OPT_LEVEL3 = 3
00518 };
00519 
00520 #define TDS_ZERO_FREE(x) {free((x)); (x) = NULL;}
00521 #define TDS_VECTOR_SIZE(x) (sizeof(x)/sizeof(x[0]))
00522 
00523 #define TDS_BYTE_SWAP16(value)                 \
00524          (((((unsigned short)value)<<8) & 0xFF00)   | \
00525           ((((unsigned short)value)>>8) & 0x00FF))
00526 
00527 #define TDS_BYTE_SWAP32(value)                     \
00528          (((((unsigned long)value)<<24) & 0xFF000000)  | \
00529           ((((unsigned long)value)<< 8) & 0x00FF0000)  | \
00530           ((((unsigned long)value)>> 8) & 0x0000FF00)  | \
00531           ((((unsigned long)value)>>24) & 0x000000FF))
00532 
00533 #define is_end_token(x) (x==TDS_DONE_TOKEN    || \
00534                         x==TDS_DONEPROC_TOKEN    || \
00535                         x==TDS_DONEINPROC_TOKEN)
00536 
00537 #define is_hard_end_token(x) (x==TDS_DONE_TOKEN    || \
00538                         x==TDS_DONEPROC_TOKEN)
00539 
00540 #define is_msg_token(x) (x==TDS_INFO_TOKEN    || \
00541                         x==TDS_ERROR_TOKEN    || \
00542                         x==TDS_EED_TOKEN)
00543 
00544 #define is_result_token(x) (x==TDS_RESULT_TOKEN    || \
00545                         x==TDS_ROWFMT2_TOKEN || \
00546                         x==TDS7_RESULT_TOKEN    || \
00547                         x==TDS_COLFMT_TOKEN    || \
00548                         x==TDS_COLNAME_TOKEN)
00549 
00550 /* FIX ME -- not a complete list */
00551 #define is_fixed_type(x) (x==SYBINT1    || \
00552                         x==SYBINT2      || \
00553                         x==SYBINT4      || \
00554                         x==SYBINT8      || \
00555                         x==SYBREAL       || \
00556                         x==SYBFLT8      || \
00557                         x==SYBDATETIME  || \
00558                         x==SYBDATETIME4 || \
00559                         x==SYBBIT       || \
00560                         x==SYBMONEY     || \
00561                         x==SYBMONEY4    || \
00562                         x==SYBUNIQUE)
00563 #define is_nullable_type(x) ( \
00564                         x==SYBBITN      || \
00565                      x==SYBINTN      || \
00566                      x==SYBFLTN      || \
00567                      x==SYBMONEYN    || \
00568                      x==SYBDATETIMN  || \
00569                      x==SYBCHAR      || \
00570                      x==SYBVARCHAR   || \
00571                      x==SYBBINARY    || \
00572                      x==SYBVARBINARY || \
00573                      x==SYBTEXT      || \
00574                      x==SYBNTEXT     || \
00575                      x==SYBIMAGE)
00576 
00577 #define is_blob_type(x) (x==SYBTEXT || x==SYBIMAGE || x==SYBNTEXT)
00578 /* large type means it has a two byte size field */
00579 /* define is_large_type(x) (x>128) */
00580 #define is_numeric_type(x) (x==SYBNUMERIC || x==SYBDECIMAL)
00581 #define is_unicode_type(x) (x==XSYBNVARCHAR || x==XSYBNCHAR || x==SYBNTEXT)
00582 #define is_collate_type(x) (x==XSYBVARCHAR || x==XSYBCHAR || x==SYBTEXT || x==XSYBNVARCHAR || x==XSYBNCHAR || x==SYBNTEXT)
00583 #define is_ascii_type(x) ( x==XSYBCHAR || x==XSYBVARCHAR || x==SYBTEXT || x==SYBCHAR || x==SYBVARCHAR)
00584 #define is_binary_type(x) (x==SYBLONGBINARY)
00585 #define is_char_type(x) (is_unicode_type(x) || is_ascii_type(x))
00586 #define is_similar_type(x, y) ((is_char_type(x) && is_char_type(y)) || ((is_unicode_type(x) && is_unicode_type(y))))
00587 
00588 
00589 #define TDS_MAX_CAPABILITY      22
00590 #define MAXPRECISION            80
00591 #define TDS_MAX_CONN            4096
00592 #define TDS_MAX_DYNID_LEN       30
00593 
00594 /* defaults to use if no others are found */
00595 #define TDS_DEF_SERVER          "SYBASE"
00596 #define TDS_DEF_BLKSZ           512
00597 #define TDS_DEF_CHARSET         "iso_1"
00598 #define TDS_DEF_LANG            "us_english"
00599 #if TDS42
00600 #define TDS_DEF_MAJOR           4
00601 #define TDS_DEF_MINOR           2
00602 #define TDS_DEF_PORT            1433
00603 #elif TDS46
00604 #define TDS_DEF_MAJOR           4
00605 #define TDS_DEF_MINOR           6
00606 #define TDS_DEF_PORT            4000
00607 #elif TDS70
00608 #define TDS_DEF_MAJOR           7
00609 #define TDS_DEF_MINOR           0
00610 #define TDS_DEF_PORT            1433
00611 #elif TDS80
00612 #define TDS_DEF_MAJOR           8
00613 #define TDS_DEF_MINOR           0
00614 #define TDS_DEF_PORT            1433
00615 #else
00616 #define TDS_DEF_MAJOR           5
00617 #define TDS_DEF_MINOR           0
00618 #define TDS_DEF_PORT            4000
00619 #endif
00620 
00621 /* normalized strings from freetds.conf file */
00622 #define TDS_STR_VERSION  "tds version"
00623 #define TDS_STR_BLKSZ    "initial block size"
00624 #define TDS_STR_SWAPDT   "swap broken dates"
00625 #define TDS_STR_SWAPMNY  "swap broken money"
00626 #define TDS_STR_TRYSVR   "try server login"
00627 #define TDS_STR_TRYDOM   "try domain login"
00628 #define TDS_STR_DOMAIN   "nt domain"
00629 #define TDS_STR_XDOMAUTH "cross domain login"
00630 #define TDS_STR_DUMPFILE "dump file"
00631 #define TDS_STR_DEBUGLVL "debug level"
00632 #define TDS_STR_TIMEOUT  "timeout"
00633 #define TDS_STR_CONNTMOUT "connect timeout"
00634 #define TDS_STR_HOSTNAME "hostname"
00635 #define TDS_STR_HOST     "host"
00636 #define TDS_STR_PORT     "port"
00637 #define TDS_STR_TEXTSZ   "text size"
00638 /* for big endian hosts */
00639 #define TDS_STR_EMUL_LE "emulate little endian"
00640 #define TDS_STR_CHARSET "charset"
00641 #define TDS_STR_CLCHARSET       "client charset"
00642 #define TDS_STR_LANGUAGE        "language"
00643 #define TDS_STR_APPENDMODE      "dump file append"
00644 #define TDS_STR_DATEFMT "date format"
00645 
00646 /* TODO do a better check for alignment than this */
00647 typedef union
00648 {
00649         void *p;
00650         int i;
00651 } tds_align_struct;
00652 
00653 #define TDS_ALIGN_SIZE sizeof(tds_align_struct)
00654 
00655 #define TDS_MAX_LOGIN_STR_SZ 30
00656 typedef struct tds_login
00657 {
00658         DSTR server_name;
00659         int port;
00660         TDS_TINYINT major_version;      /* TDS version */
00661         TDS_TINYINT minor_version;      /* TDS version */
00662         int block_size;
00663         DSTR language;          /* ie us-english */
00664         DSTR server_charset;    /*  ie iso_1 */
00665         TDS_INT connect_timeout;
00666         DSTR host_name;
00667         DSTR app_name;
00668         DSTR user_name;
00669         DSTR password;
00670         
00671         DSTR library;   /* Ct-Library, DB-Library,  TDS-Library or ODBC */
00672         TDS_TINYINT bulk_copy;
00673         TDS_TINYINT suppress_language;
00674         TDS_TINYINT encrypted;
00675 
00676         TDS_INT query_timeout;
00677         TDS_INT longquery_timeout;
00678         void (*longquery_func) (void *param);
00679         void *longquery_param;
00680         unsigned char capabilities[TDS_MAX_CAPABILITY];
00681         DSTR client_charset;
00682 } TDSLOGIN;
00683 
00684 typedef struct tds_connect_info
00685 {
00686         /* first part of structure is the same of login one */
00687         DSTR server_name; 
00688         int port;          
00689         TDS_TINYINT major_version;
00690         TDS_TINYINT minor_version;
00691         int block_size;
00692         DSTR language;
00693         DSTR server_charset;    
00694         TDS_INT connect_timeout;
00695         DSTR host_name;     
00696         DSTR app_name;
00697         DSTR user_name;     
00698         DSTR password;      
00699         DSTR library;
00700         TDS_TINYINT bulk_copy;
00701         TDS_TINYINT suppress_language;
00702         TDS_TINYINT encrypted;
00703 
00704         TDS_INT query_timeout;
00705         TDS_INT longquery_timeout;
00706         void (*longquery_func) (void *param);
00707         void *longquery_param;
00708         unsigned char capabilities[TDS_MAX_CAPABILITY];
00709         DSTR client_charset;
00710 
00711         DSTR ip_addr;     
00712         DSTR database;
00713         DSTR dump_file;
00714         DSTR default_domain;
00715         int timeout;
00716         int debug_level;
00717         int text_size;
00718         int broken_dates;
00719         int broken_money;
00720         int try_server_login;
00721         int try_domain_login;
00722         int xdomain_auth;
00723         int emul_little_endian;
00724 } TDSCONNECTINFO;
00725 
00726 typedef struct tds_locale
00727 {
00728         char *language;
00729         char *char_set;
00730         char *date_fmt;
00731 } TDSLOCALE;
00732 
00737 typedef struct tds_blob_info
00738 {
00739         TDS_CHAR *textvalue;
00740         TDS_CHAR textptr[16];
00741         TDS_CHAR timestamp[8];
00742 } TDSBLOBINFO;
00743 
00747 typedef struct
00748 {
00749         TDS_USMALLINT locale_id;        /* master..syslanguages.lcid */
00750         TDS_USMALLINT flags;
00751         TDS_UCHAR charset_id;           /* or zero */
00752 } TDS8_COLLATION;
00753 
00754 /* SF stands for "sort flag" */
00755 #define TDS_SF_BIN                   (TDS_USMALLINT) 0x100
00756 #define TDS_SF_WIDTH_INSENSITIVE     (TDS_USMALLINT) 0x080
00757 #define TDS_SF_KATATYPE_INSENSITIVE  (TDS_USMALLINT) 0x040
00758 #define TDS_SF_ACCENT_SENSITIVE      (TDS_USMALLINT) 0x020
00759 #define TDS_SF_CASE_INSENSITIVE      (TDS_USMALLINT) 0x010
00760 
00761 
00766 typedef struct _tds_encoding
00767 {
00768         const char *name;
00769         unsigned char min_bytes_per_char;
00770         unsigned char max_bytes_per_char;
00771 } TDS_ENCODING;
00772 
00773 
00774 enum
00775 { TDS_SYSNAME_SIZE = 512 };
00776 
00780 typedef struct tds_column_info
00781 {
00782         TDS_SMALLINT column_type;       
00787         TDS_INT column_usertype;
00788         TDS_INT column_flags;
00789 
00790         TDS_INT column_size;            
00792         TDS_TINYINT column_varint_size; 
00794         TDS_TINYINT column_prec;        
00795         TDS_TINYINT column_scale;       
00797         TDS_TINYINT column_namelen;     
00798         TDS_TINYINT table_namelen;
00799         struct
00800         {
00801                 TDS_SMALLINT column_type;       
00802                 TDS_INT column_size;
00803         } on_server;
00804 
00805         const TDSICONVINFO *iconv_info; 
00807         TDS_CHAR table_name[TDS_SYSNAME_SIZE];
00808         TDS_CHAR column_name[TDS_SYSNAME_SIZE];
00809 
00810         TDS_INT column_offset;          
00811         unsigned int column_nullable:1;
00812         unsigned int column_writeable:1;
00813         unsigned int column_identity:1;
00814         unsigned int column_key:1;
00815         unsigned int column_hidden:1;
00816         unsigned int column_output:1;
00817         TDS_UCHAR column_collation[5];
00818 
00819         /* additional fields flags for compute results */
00820         TDS_TINYINT column_operator;
00821         TDS_SMALLINT column_operand;
00822 
00823         /* FIXME this is data related, not column */
00825         TDS_INT column_cur_size;
00826 
00827         /* related to binding or info stored by client libraries */
00828         /* FIXME find a best place to store these data, some are unused */
00829         TDS_SMALLINT column_bindtype;
00830         TDS_SMALLINT column_bindfmt;
00831         TDS_UINT column_bindlen;
00832         TDS_CHAR *column_nullbind;
00833         TDS_CHAR *column_varaddr;
00834         TDS_CHAR *column_lenbind;
00835         TDS_INT column_textpos;
00836         TDS_INT column_text_sqlgetdatapos;
00837 } TDSCOLINFO;
00838 
00839 typedef struct
00840 {
00841         int tab_colnum;
00842         char db_name[256];      /* column name */
00843         TDS_SMALLINT db_minlen;
00844         TDS_SMALLINT db_maxlen;
00845         TDS_SMALLINT db_colcnt; /* I don't know what this does */
00846         TDS_TINYINT db_type;
00847         struct
00848         {
00849                 TDS_SMALLINT column_type;       
00850                 TDS_INT column_size;
00851         } on_server;
00852         const TDSICONVINFO *iconv_info; 
00853         TDS_SMALLINT db_usertype;
00854         TDS_TINYINT db_varint_size;
00855         TDS_INT db_length;      /* size of field according to database */
00856         TDS_TINYINT db_nullable;
00857         TDS_TINYINT db_status;
00858         TDS_SMALLINT db_offset;
00859         TDS_TINYINT db_default;
00860         TDS_TINYINT db_prec;
00861         TDS_TINYINT db_scale;
00862         TDS_SMALLINT db_flags;
00863         TDS_INT db_size;
00864         char db_collate[5];
00865         long data_size;
00866         TDS_TINYINT *data;
00867         int txptr_offset;
00868 } BCP_COLINFO;
00869 
00870 
00872 typedef struct tds_result_info
00873 {
00874         /* TODO those fields can became a struct */
00875         TDS_SMALLINT num_cols;
00876         TDSCOLINFO **columns;
00877         TDS_INT row_size;
00878         int null_info_size;
00879         unsigned char *current_row;
00880 
00881         TDS_SMALLINT rows_exist;
00882         TDS_INT row_count;
00883         TDS_SMALLINT computeid;
00884         TDS_TINYINT more_results;
00885         TDS_TINYINT *bycolumns;
00886         TDS_SMALLINT by_cols;
00887 } TDSRESULTINFO;
00888 
00889 /* values for tds->state */
00890 enum
00891 {
00892         TDS_QUERYING,
00893         TDS_PENDING,
00894         TDS_IDLE,
00895         TDS_CANCELED,
00896         TDS_DEAD
00897 };
00898 
00899 #define TDS_DBG_FUNC    7
00900 #define TDS_DBG_INFO2   6
00901 #define TDS_DBG_INFO1   5
00902 #define TDS_DBG_NETWORK 4
00903 #define TDS_DBG_WARN    3
00904 #define TDS_DBG_ERROR   2
00905 #define TDS_DBG_SEVERE  1
00906 
00912 enum TDS_DBG_LOG_STATE
00913 {
00914           TDS_DBG_LOGIN = 1             /* for diagnosing login problems;                                       
00915                                            otherwise the username/password information is suppressed. */
00916         , TDS_DBG_API =    (1 << 1)     /* Log calls to client libraries */
00917         , TDS_DBG_ASYNC =  (1 << 2)     /* Log asynchronous function starts or completes. */
00918         , TDS_DBG_DIAG =   (1 << 3)     /* Log client- and server-generated messages */
00919         , TDS_DBG_error =  (1 << 4)
00920         /* TODO:  ^^^^^ make upper case when old #defines (above) are removed */
00921         /* Log FreeTDS runtime/logic error occurs. */
00922         , TDS_DBG_PACKET = (1 << 5)     /* Log hex dump of packets to/from the server. */
00923         , TDS_DBG_LIBTDS = (1 << 6)     /* Log calls to (and in) libtds */
00924         , TDS_DBG_CONFIG = (1 << 7)     /* replaces TDSDUMPCONFIG */
00925         , TDS_DBG_DEFAULT = 0xFE        /* all above except login packets */
00926 };
00927 
00928 typedef struct tds_result_info TDSCOMPUTEINFO;
00929 
00930 typedef TDSRESULTINFO TDSPARAMINFO;
00931 
00932 typedef struct tds_msg_info
00933 {
00934         TDS_SMALLINT priv_msg_type;
00935         TDS_SMALLINT line_number;
00936         TDS_UINT msg_number;
00937         TDS_SMALLINT msg_state;
00938         TDS_SMALLINT msg_level;
00939         TDS_CHAR *server;
00940         TDS_CHAR *message;
00941         TDS_CHAR *proc_name;
00942         TDS_CHAR *sql_state;
00943 } TDSMSGINFO;
00944 
00945 typedef struct tds_upd_col
00946 {
00947         struct tds_upd_col *next;       
00948         TDS_INT colnamelength;
00949         char * columnname;
00950 } TDSUPDCOL;
00951 
00952 typedef enum {
00953           TDS_CURSOR_STATE_UNACTIONED = 0
00954         , TDS_CURSOR_STATE_REQUESTED = 1        /* called by ct_cursor */ 
00955         , TDS_CURSOR_STATE_SENT = 2             /* sent to server and ack */
00956 } TDS_CURSOR_STATE;
00957 
00958 typedef struct _tds_cursor_status
00959 {
00960         TDS_CURSOR_STATE declare;
00961         TDS_CURSOR_STATE cursor_row;
00962         TDS_CURSOR_STATE open;
00963         TDS_CURSOR_STATE fetch;
00964         TDS_CURSOR_STATE close; 
00965         TDS_CURSOR_STATE dealloc;
00966 } TDS_CURSOR_STATUS;
00967 
00968 typedef struct _tds_cursor 
00969 {
00970         TDS_INT length;                 /* total length of the remaining datastream */
00971         TDS_TINYINT cursor_name_len;    /* length of cursor name > 0 and <= 30  */
00972         char *cursor_name;              /* name of the cursor */
00973         TDS_INT cursor_id;              /* cursor id returned by the server after cursor declare */
00974         TDS_TINYINT options;            /* read only|updatable */
00975         TDS_TINYINT hasargs;            /* cursor parameters exists ? */
00976         TDS_USMALLINT query_len;        /* SQL query length */
00977         char *query;                    /* SQL query */
00978         /* TODO for updatable columns */
00979         TDS_TINYINT number_upd_cols;    /* number of updatable columns */
00980         TDS_INT cursor_rows;            /* number of cursor rows to fetch */
00981         /*TODO when cursor has parameters*/
00982         /*TDS_PARAM *param_list;         cursor parameter */
00983         TDSUPDCOL *cur_col_list;        /* updatable column list */
00984         TDS_CURSOR_STATUS status;
00985 } TDS_CURSOR;
00986 
00987 /*
00988  * Current environment as reported by the server
00989  */
00990 typedef struct tds_env_info
00991 {
00992         int block_size;
00993         char *language;
00994         char *charset;
00995         char *database;
00996 } TDSENVINFO;
00997 
00998 typedef struct tds_dynamic
00999 {
01000         char id[30];
01001         int dyn_state;
01003         TDS_INT num_id;
01004         TDSPARAMINFO *res_info;
01005         TDSPARAMINFO *params;
01006         int emulated;
01008         char *query;
01009 } TDSDYNAMIC;
01010 
01011 /* forward declaration */
01012 typedef struct tds_context TDSCONTEXT;
01013 
01014 struct tds_context
01015 {
01016         TDSLOCALE *locale;
01017         void *parent;
01018         /* handler */
01019         int (*msg_handler) (TDSCONTEXT *, TDSSOCKET *, TDSMSGINFO *);
01020         int (*err_handler) (TDSCONTEXT *, TDSSOCKET *, TDSMSGINFO *);
01021 };
01022 
01023 enum TDS_ICONV_INFO_ENTRY
01024 { 
01025           client2ucs2
01026         , client2server_chardata
01027         , iso2server_metadata
01028         , initial_iconv_info_count      /* keep last */
01029 };
01030 
01031 struct tds_socket
01032 {
01033         /* fixed and connect time */
01034         TDS_SYS_SOCKET s;
01035         TDS_SMALLINT major_version;
01036         TDS_SMALLINT minor_version;
01038         TDS_UINT product_version;
01039         char *product_name;
01040         unsigned char capabilities[TDS_MAX_CAPABILITY];
01041         unsigned char broken_dates;
01042         unsigned char option_flag2;
01043         /* in/out buffers */
01044         unsigned char *in_buf;
01045         unsigned char *out_buf;
01046         unsigned int in_buf_max;
01047         unsigned in_pos;
01048         unsigned out_pos;
01049         unsigned in_len;
01050         unsigned out_len;
01051         unsigned char out_flag;
01052         unsigned char last_packet;
01053         void *parent;
01054         /* info about current query. 
01055          * Contain information in process, even normal results and compute.
01056          * This pointer shouldn't be freed.
01057          */
01058         TDSRESULTINFO *curr_resinfo;
01059         TDSRESULTINFO *res_info;
01060         TDS_INT num_comp_info;
01061         TDSCOMPUTEINFO **comp_info;
01062         TDSPARAMINFO *param_info;
01063         TDS_CURSOR *cursor;
01064         TDS_TINYINT has_status;
01065         TDS_INT ret_status;
01066         TDS_TINYINT state;
01067         int rows_affected;
01068         /* timeout stuff from Jeff */
01069         TDS_INT timeout;
01070         TDS_INT longquery_timeout;
01071         void (*longquery_func) (void *param);
01072         void *longquery_param;
01073         time_t queryStarttime;
01074         TDSENVINFO *env;
01075         /* dynamic placeholder stuff */
01076         int num_dyns;
01077         TDSDYNAMIC *cur_dyn;
01078         TDSDYNAMIC **dyns;
01079         int emul_little_endian;
01080         char *date_fmt;
01081         TDSCONTEXT *tds_ctx;
01082         int iconv_info_count;
01083         TDSICONVINFO **iconv_info;
01084 
01086         TDSCONNECTINFO *connect_info;
01087         int spid;
01088         TDS_UCHAR collation[5];
01089         void (*env_chg_func) (TDSSOCKET * tds, int type, char *oldval, char *newval);
01090         int (*chkintr) (TDSSOCKET * tds);
01091         int (*hndlintr) (TDSSOCKET * tds);
01092     int internal_sp_called;
01093 };
01094 
01095 void tds_set_longquery_handler(TDSLOGIN * tds_login, void (*longquery_func) (void *param), void *longquery_param);
01096 void tds_set_timeouts(TDSLOGIN * tds_login, int connect_timeout, int query_timeout, int longquery_timeout);
01097 int tds_init_write_buf(TDSSOCKET * tds);
01098 void tds_free_result_info(TDSRESULTINFO * info);
01099 void tds_free_socket(TDSSOCKET * tds);
01100 void tds_free_connect(TDSCONNECTINFO * connect_info);
01101 void tds_free_all_results(TDSSOCKET * tds);
01102 void tds_free_results(TDSRESULTINFO * res_info);
01103 void tds_free_param_results(TDSPARAMINFO * param_info);
01104 void tds_free_msg(TDSMSGINFO * msg_info);
01105 void tds_free_cursor(TDS_CURSOR *cursor);
01106 int tds_put_n(TDSSOCKET * tds, const void *buf, int n);
01107 int tds_put_string(TDSSOCKET * tds, const char *buf, int len);
01108 int tds_put_int(TDSSOCKET * tds, TDS_INT i);
01109 int tds_put_int8(TDSSOCKET * tds, TDS_INT8 i);
01110 int tds_put_smallint(TDSSOCKET * tds, TDS_SMALLINT si);
01111 int tds_put_tinyint(TDSSOCKET * tds, TDS_TINYINT ti);
01112 int tds_put_byte(TDSSOCKET * tds, unsigned char c);
01113 TDSRESULTINFO *tds_alloc_results(int num_cols);
01114 TDSCOMPUTEINFO **tds_alloc_compute_results(TDS_INT * num_comp_results, TDSCOMPUTEINFO ** ci, int num_cols, int by_cols);
01115 TDSCONTEXT *tds_alloc_context(void);
01116 void tds_free_context(TDSCONTEXT * locale);
01117 TDSSOCKET *tds_alloc_socket(TDSCONTEXT * context, int bufsize);
01118 
01119 /* config.c */
01120 const TDS_COMPILETIME_SETTINGS *tds_get_compiletime_settings(void);
01121 typedef void (*TDSCONFPARSE) (const char *option, const char *value, void *param);
01122 int tds_read_conf_section(FILE * in, const char *section, TDSCONFPARSE tds_conf_parse, void *parse_param);
01123 int tds_read_conf_file(TDSCONNECTINFO * connect_info, const char *server);
01124 TDSCONNECTINFO *tds_read_config_info(TDSSOCKET * tds, TDSLOGIN * login, TDSLOCALE * locale);
01125 void tds_fix_connect(TDSCONNECTINFO * connect_info);
01126 void tds_config_verstr(const char *tdsver, TDSCONNECTINFO * connect_info);
01127 void tds_lookup_host(const char *servername, char *ip);
01128 int tds_set_interfaces_file_loc(const char *interfloc);
01129 
01130 TDSLOCALE *tds_get_locale(void);
01131 unsigned char *tds_alloc_row(TDSRESULTINFO * res_info);
01132 unsigned char *tds_alloc_compute_row(TDSCOMPUTEINFO * res_info);
01133 int tds_alloc_get_string(TDSSOCKET * tds, char **string, int len);
01134 void tds_set_null(unsigned char *current_row, int column);
01135 void tds_clr_null(unsigned char *current_row, int column);
01136 int tds_get_null(unsigned char *current_row, int column);
01137 unsigned char *tds7_crypt_pass(const unsigned char *clear_pass, int len, unsigned char *crypt_pass);
01138 TDSDYNAMIC *tds_lookup_dynamic(TDSSOCKET * tds, char *id);
01139 const char *tds_prtype(int token);
01140 
01141 
01142 
01143 /* iconv.c */
01144 void tds_iconv_open(TDSSOCKET * tds, const char *charset);
01145 void tds_iconv_close(TDSSOCKET * tds);
01146 void tds_srv_charset_changed(TDSSOCKET * tds, const char *charset);
01147 void tds7_srv_charset_changed(TDSSOCKET * tds, int lcid);
01148 int tds_iconv_alloc(TDSSOCKET * tds);
01149 void tds_iconv_free(TDSSOCKET * tds);
01150 TDSICONVINFO *tds_iconv_from_lcid(TDSSOCKET * tds, int lcid);
01151 
01152 /* threadsafe.c */
01153 char *tds_timestamp_str(char *str, int maxlen);
01154 struct hostent *tds_gethostbyname_r(const char *servername, struct hostent *result, char *buffer, int buflen, int *h_errnop);
01155 struct hostent *tds_gethostbyaddr_r(const char *addr, int len, int type, struct hostent *result, char *buffer, int buflen,
01156                                     int *h_errnop);
01157 struct servent *tds_getservbyname_r(const char *name, const char *proto, struct servent *result, char *buffer, int buflen);
01158 char *tds_get_homedir(void);
01159 
01160 /* mem.c */
01161 TDSPARAMINFO *tds_alloc_param_result(TDSPARAMINFO * old_param);
01162 void tds_free_input_params(TDSDYNAMIC * dyn);
01163 void tds_free_all_dynamic(TDSSOCKET * tds);
01164 void tds_free_dynamic(TDSSOCKET * tds, TDSDYNAMIC * dyn);
01165 TDSSOCKET *tds_realloc_socket(TDSSOCKET * tds, int bufsize);
01166 void tds_free_compute_result(TDSCOMPUTEINFO * comp_info);
01167 void tds_free_compute_results(TDSCOMPUTEINFO ** comp_info, TDS_INT num_comp);
01168 unsigned char *tds_alloc_param_row(TDSPARAMINFO * info, TDSCOLINFO * curparam);
01169 char *tds_alloc_client_sqlstate(int msgnum);
01170 char *tds_alloc_lookup_sqlstate(TDSSOCKET * tds, int msgnum);
01171 TDSLOGIN *tds_alloc_login(void);
01172 TDSDYNAMIC *tds_alloc_dynamic(TDSSOCKET * tds, const char *id);
01173 void tds_free_login(TDSLOGIN * login);
01174 TDSCONNECTINFO *tds_alloc_connect(TDSLOCALE * locale);
01175 TDSLOCALE *tds_alloc_locale(void);
01176 void tds_free_locale(TDSLOCALE * locale);
01177 TDS_CURSOR * tds_alloc_cursor(char *name, TDS_INT namelen, char *query, TDS_INT querylen);
01178 
01179 /* login.c */
01180 int tds7_send_auth(TDSSOCKET * tds, const unsigned char *challenge);
01181 void tds_set_packet(TDSLOGIN * tds_login, int packet_size);
01182 void tds_set_port(TDSLOGIN * tds_login, int port);
01183 void tds_set_passwd(TDSLOGIN * tds_login, const char *password);
01184 void tds_set_bulk(TDSLOGIN * tds_login, TDS_TINYINT enabled);
01185 void tds_set_user(TDSLOGIN * tds_login, const char *username);
01186 void tds_set_app(TDSLOGIN * tds_login, const char *application);
01187 void tds_set_host(TDSLOGIN * tds_login, const char *hostname);
01188 void tds_set_library(TDSLOGIN * tds_login, const char *library);
01189 void tds_set_server(TDSLOGIN * tds_login, const char *server);
01190 void tds_set_client_charset(TDSLOGIN * tds_login, const char *charset);
01191 void tds_set_language(TDSLOGIN * tds_login, const char *language);
01192 void tds_set_version(TDSLOGIN * tds_login, short major_ver, short minor_ver);
01193 void tds_set_capabilities(TDSLOGIN * tds_login, unsigned char *capabilities, int size);
01194 int tds_connect(TDSSOCKET * tds, TDSCONNECTINFO * connect_info);
01195 
01196 /* query.c */
01197 int tds_submit_query(TDSSOCKET * tds, const char *query);
01198 int tds_submit_query_params(TDSSOCKET * tds, const char *query, TDSPARAMINFO * params);
01199 int tds_submit_queryf(TDSSOCKET * tds, const char *queryf, ...);
01200 int tds_submit_prepare(TDSSOCKET * tds, const char *query, const char *id, TDSDYNAMIC ** dyn_out, TDSPARAMINFO * params);
01201 int tds_submit_execdirect(TDSSOCKET * tds, const char *query, TDSPARAMINFO * params);
01202 int tds_submit_execute(TDSSOCKET * tds, TDSDYNAMIC * dyn);
01203 int tds_send_cancel(TDSSOCKET * tds);
01204 const char *tds_next_placeholders(const char *start);
01205 int tds_count_placeholders(const char *query);
01206 int tds_get_dynid(TDSSOCKET * tds, char **id);
01207 int tds_submit_unprepare(TDSSOCKET * tds, TDSDYNAMIC * dyn);
01208 int tds_submit_rpc(TDSSOCKET * tds, const char *rpc_name, TDSPARAMINFO * params);
01209 int tds_quote_id(TDSSOCKET * tds, char *buffer, const char *id, int idlen);
01210 int tds_quote_string(TDSSOCKET * tds, char *buffer, const char *str, int len);
01211 const char *tds_skip_quoted(const char *s);
01212 int tds_cursor_declare(TDSSOCKET * tds, int *send);
01213 int tds_cursor_setrows(TDSSOCKET * tds, int *send);
01214 int tds_cursor_open(TDSSOCKET * tds, int *send);
01215 int tds_cursor_fetch(TDSSOCKET * tds);
01216 int tds_cursor_close(TDSSOCKET * tds);
01217 int tds_cursor_dealloc(TDSSOCKET * tds);
01218 
01219 /* token.c */
01220 int tds_process_cancel(TDSSOCKET * tds);
01221 void tds_swap_datatype(int coltype, unsigned char *buf);
01222 int tds_get_token_size(int marker);
01223 int tds_process_login_tokens(TDSSOCKET * tds);
01224 void tds_add_row_column_size(TDSRESULTINFO * info, TDSCOLINFO * curcol);
01225 int tds_process_simple_query(TDSSOCKET * tds);
01226 int tds5_send_optioncmd(TDSSOCKET * tds, TDS_OPTION_CMD tds_command, TDS_OPTION tds_option, TDS_OPTION_ARG * tds_argument,
01227                         TDS_INT * tds_argsize);
01228 int tds_process_result_tokens(TDSSOCKET * tds, TDS_INT * result_type, int *done_flags);
01229 int tds_process_row_tokens(TDSSOCKET * tds, TDS_INT * rowtype, TDS_INT * computeid);
01230 int tds_process_row_tokens_ct(TDSSOCKET * tds, TDS_INT * rowtype, TDS_INT *computeid);
01231 int tds_process_trailing_tokens(TDSSOCKET * tds);
01232 int tds_client_msg(TDSCONTEXT * tds_ctx, TDSSOCKET * tds, int msgnum, int level, int state, int line, const char *message);
01233 int tds_do_until_done(TDSSOCKET * tds);
01234 
01235 /* data.c */
01236 void tds_set_param_type(TDSSOCKET * tds, TDSCOLINFO * curcol, TDS_SERVER_TYPE type);
01237 void tds_set_column_type(TDSCOLINFO * curcol, int type);
01238 
01239 
01240 /* tds_convert.c */
01241 TDS_INT tds_datecrack(TDS_INT datetype, const void *di, TDSDATEREC * dr);
01242 int tds_get_conversion_type(int srctype, int colsize);
01243 extern const char tds_hex_digits[];
01244 
01245 /* write.c */
01246 int tds_put_bulk_data(TDSSOCKET * tds, const unsigned char *buf, TDS_INT bufsize);
01247 int tds_flush_packet(TDSSOCKET * tds);
01248 int tds_put_buf(TDSSOCKET * tds, const unsigned char *buf, int dsize, int ssize);
01249 int tds7_put_bcpcol(TDSSOCKET * tds, const BCP_COLINFO * bcpcol);
01250 
01251 /* read.c */
01252 unsigned char tds_get_byte(TDSSOCKET * tds);
01253 void tds_unget_byte(TDSSOCKET * tds);
01254 unsigned char tds_peek(TDSSOCKET * tds);
01255 TDS_SMALLINT tds_get_smallint(TDSSOCKET * tds);
01256 TDS_INT tds_get_int(TDSSOCKET * tds);
01257 int tds_get_string(TDSSOCKET * tds, int string_len, char *dest, size_t dest_size);
01258 int tds_get_char_data(TDSSOCKET * tds, char *dest, size_t wire_size, TDSCOLINFO * curcol);
01259 void *tds_get_n(TDSSOCKET * tds, void *dest, int n);
01260 int tds_get_size_by_type(int servertype);
01261 int tds_read_packet(TDSSOCKET * tds);
01262 
01263 /* util.c */
01264 void tds_set_parent(TDSSOCKET * tds, void *the_parent);
01265 void *tds_get_parent(TDSSOCKET * tds);
01266 void tds_ctx_set_parent(TDSCONTEXT * ctx, void *the_parent);
01267 void *tds_ctx_get_parent(TDSCONTEXT * ctx);
01268 int tds_swap_bytes(unsigned char *buf, int bytes);
01269 int tds_version(TDSSOCKET * tds_socket, char *pversion_string);
01270 void tdsdump_off(void);
01271 void tdsdump_on(void);
01272 int tdsdump_open(const char *filename);
01273 int tdsdump_append(void);
01274 void tdsdump_close(void);
01275 void tdsdump_dump_buf(const void *buf, int length);
01276 void tdsdump_log(int dbg_lvl, const char *fmt, ...);
01277 int tds_close_socket(TDSSOCKET * tds);
01278 
01279 /* vstrbuild.c */
01280 int tds_vstrbuild(char *buffer, int buflen, int *resultlen, char *text, int textlen, const char *formats, int formatlen,
01281                   va_list ap);
01282 
01283 /* numeric.c */
01284 char *tds_money_to_string(const TDS_MONEY * money, char *s);
01285 char *tds_numeric_to_string(const TDS_NUMERIC * numeric, char *s);
01286 
01287 /* getmac.c */
01288 void tds_getmac(int s, unsigned char mac[6]);
01289 
01290 typedef struct tds_answer
01291 {
01292         unsigned char lm_resp[24];
01293         unsigned char nt_resp[24];
01294 } TDSANSWER;
01295 void tds_answer_challenge(const char *passwd, const unsigned char *challenge, TDSANSWER * answer);
01296 
01297 #define IS_TDS42(x) (x->major_version==4 && x->minor_version==2)
01298 #define IS_TDS46(x) (x->major_version==4 && x->minor_version==6)
01299 #define IS_TDS50(x) (x->major_version==5 && x->minor_version==0)
01300 #define IS_TDS70(x) (x->major_version==7 && x->minor_version==0)
01301 #define IS_TDS80(x) (x->major_version==8 && x->minor_version==0)
01302 
01303 #define IS_TDS7_PLUS(x) ( IS_TDS70(x) || IS_TDS80(x) )
01304 
01305 #define IS_TDSDEAD(x) (((x) == NULL) || TDS_IS_SOCKET_INVALID((x)->s))
01306 
01308 #define TDS_IS_SYBASE(x) (!(x->product_version & 0x80000000u))
01309 
01310 #define TDS_IS_MSSQL(x) ((x->product_version & 0x80000000u)!=0)
01311 
01315 #define TDS_MS_VER(maj,min,x) (0x80000000u|((maj)<<24)|((min)<<16)|(x))
01316 
01317 /* TODO test if not similar to ms one*/
01319 #define TDS_SYB_VER(maj,min,x) (((maj)<<24)|((min)<<16)|(x)<<8)
01320 
01321 #ifdef __cplusplus
01322 #if 0
01323 {
01324 #endif
01325 }
01326 #endif
01327 
01328 #endif /* _tds_h_ */

Generated on Sat Dec 27 16:42:19 2003 for FreeTDS API by doxygen1.3