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

Generated on Sat Apr 5 23:17:39 2003 for FreeTDS API by doxygen1.2.18