tds.h
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:24k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: tds.h,v $
  4.  * PRODUCTION Revision 1000.1  2003/11/17 22:11:37  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
  10.  * Copyright (C) 1998-1999  Brian Bruns
  11.  *
  12.  * This library is free software; you can redistribute it and/or
  13.  * modify it under the terms of the GNU Library General Public
  14.  * License as published by the Free Software Foundation; either
  15.  * version 2 of the License, or (at your option) any later version.
  16.  *
  17.  * This library is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20.  * Library General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU Library General Public
  23.  * License along with this library; if not, write to the
  24.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  25.  * Boston, MA 02111-1307, USA.
  26.  */
  27. #ifndef _tds_h_
  28. #define _tds_h_
  29. static char rcsid_tds_h[]=
  30.  "$Id: tds.h,v 1000.1 2003/11/17 22:11:37 gouriano Exp $";
  31. static void *no_unused_tds_h_warn[]={rcsid_tds_h, no_unused_tds_h_warn};
  32. #include <tds_config.h>
  33. #ifndef WIN32
  34. #include <sys/types.h>
  35. #include <sys/socket.h>
  36. #include <netinet/in.h>
  37. #include <arpa/inet.h>
  38. #include <netdb.h>
  39. #include <sys/signal.h>
  40. #include <sys/wait.h>
  41. #endif 
  42. #ifdef WIN32
  43. #include <windows.h>
  44. #include <stdio.h>
  45. #endif
  46. #ifdef __INCvxWorksh
  47. #include <signal.h>
  48. #include <ioLib.h> /* for FIONBIO */
  49. #else
  50. #include <errno.h>
  51. #include <stdio.h>
  52. #include <ctype.h>
  53. #include <string.h>
  54. #include <stdlib.h>
  55. #include <time.h>
  56. #ifdef HAVE_MALLOC_H
  57. #include <malloc.h>
  58. #endif
  59. #include <sys/time.h>
  60. #endif
  61. #ifndef WIN32
  62. #include <unistd.h>
  63. #endif
  64. #include "tdsver.h"
  65. #ifdef __cplusplus
  66. extern "C" {
  67. #endif 
  68. /* 
  69. ** this is where platform specific changes need to be made.
  70. ** I've tried to change all references to data that goes to 
  71. ** or comes off the wire to use these typedefs.  I've probably 
  72. ** missed a bunch, but the idea is we can do an ifdef here 
  73. ** to set the appropriately sized native type.
  74. **
  75. ** If you have problems on 64-bit machines and the code is 
  76. ** using a native datatype, please change the code to use
  77. ** these. (In the TDS layer only, the API layers have their
  78. ** own typedefs which equate to these).
  79. */
  80. typedef char TDS_CHAR;      /*  8 bit char     */
  81. typedef unsigned char TDS_UCHAR;     /*  8 bit uchar    */
  82. typedef unsigned char TDS_TINYINT;   /*  8 bit int      */
  83. typedef short            TDS_SMALLINT;  /* 16 bit int      */
  84. typedef unsigned short   TDS_USMALLINT; /* 16 bit unsigned */
  85. typedef int                 TDS_INT;       /* 32 bit int      */
  86. typedef unsigned int        TDS_UINT;      /* 32 bit unsigned */
  87. typedef float                TDS_REAL;      /* 32 bit float    */
  88. typedef double               TDS_FLOAT;     /* 64 bit float    */
  89. typedef long long TDS_INT8;      /* 64 bit integer  */
  90. typedef unsigned long long TDS_UINT8;      /* 64 bit integer  */
  91. typedef struct tdsnumeric
  92. {
  93.         unsigned char         precision;
  94.         unsigned char         scale;
  95.         unsigned char         array[17];
  96. } TDS_NUMERIC;
  97. typedef struct tdsoldmoney
  98. {
  99. TDS_INT         mnyhigh;
  100. TDS_INT         mnylow;
  101. } TDS_OLD_MONEY;
  102. typedef union tdsmoney
  103. { TDS_OLD_MONEY tdsoldmoney;
  104.         TDS_INT8        mny;
  105. } TDS_MONEY;
  106. typedef struct tdsmoney4
  107. {
  108.         TDS_INT          mny4;
  109. } TDS_MONEY4;
  110. typedef struct tdsdatetime
  111. {
  112. TDS_INT dtdays;
  113. TDS_INT dttime;
  114. } TDS_DATETIME;
  115. typedef struct tdsdatetime4
  116. {
  117. TDS_USMALLINT days;
  118. TDS_USMALLINT minutes;
  119. } TDS_DATETIME4;
  120. typedef struct tdsvarbinary
  121. {
  122. TDS_INT len;
  123. TDS_CHAR array[256];
  124. } TDS_VARBINARY;
  125. typedef struct tdsvarchar
  126. {
  127. TDS_INT len;
  128. TDS_CHAR array[256];
  129. } TDS_VARCHAR;
  130. typedef struct tdsunique
  131. {
  132.     TDS_UINT      Data1;
  133.     TDS_USMALLINT Data2;
  134.     TDS_USMALLINT Data3;
  135.     TDS_UCHAR     Data4[8];
  136. } TDS_UNIQUE;
  137. typedef struct tdsdaterec
  138. {
  139. TDS_INT   year;
  140. TDS_INT   month;
  141. TDS_INT   day;
  142. TDS_INT   dayofyear;
  143. TDS_INT   weekday;
  144. TDS_INT   hour;
  145. TDS_INT   minute;
  146. TDS_INT   second;
  147. TDS_INT   millisecond;
  148. TDS_INT   tzone;
  149. } TDSDATEREC;
  150. #define TDS_NO_MORE_ROWS     -2
  151. #define TDS_SUCCEED          1
  152. #define TDS_FAIL             0
  153. #define TDS_NO_MORE_RESULTS  2
  154. /*
  155. ** TDS_ERROR indicates a successful processing, but an TDS_ERR_TOKEN or 
  156. ** TDS_EED_TOKEN error was encountered, whereas TDS_FAIL indicates an
  157. ** unrecoverable failure.
  158. */
  159. #define TDS_ERROR            3  
  160. #define TDS_DONT_RETURN      42
  161. #define TDS5_DYN_TOKEN      231  /* 0xE7    TDS 5.0 only              */
  162. #define TDS5_DYNRES_TOKEN   236  /* 0xEC    TDS 5.0 only              */
  163. #define TDS5_DYN3_TOKEN     215  /* 0xD7    TDS 5.0 only              */
  164. #define TDS_LANG_TOKEN       33  /* 0x21    TDS 5.0 only              */
  165. #define TDS_CLOSE_TOKEN     113  /* 0x71    TDS 5.0 only? ct_close()  */
  166. #define TDS_RET_STAT_TOKEN  121  /* 0x79                              */
  167. #define TDS_124_TOKEN       124  /* 0x7C    TDS 4.2 only - TDS_PROCID */
  168. #define TDS7_RESULT_TOKEN   129  /* 0x81    TDS 7.0 only              */
  169. #define TDS_COL_NAME_TOKEN  160  /* 0xA0    TDS 4.2 only              */
  170. #define TDS_COL_INFO_TOKEN  161  /* 0xA1    TDS 4.2 only - TDS_COLFMT */
  171. /*#define  TDS_TABNAME   164 */
  172. #ifdef NCBI_FTDS
  173. #define  TDS_COL_INFO_TOKEN2   165 /* 0xA5                            */
  174. #endif
  175. #define TDS_167_TOKEN       167  /* 0xA7                              */
  176. #define TDS_168_TOKEN       168  /* 0xA8                              */
  177. #define TDS_ORDER_BY_TOKEN  169  /* 0xA9    TDS_ORDER                 */
  178. #define TDS_ERR_TOKEN       170  /* 0xAA                              */
  179. #define TDS_MSG_TOKEN       171  /* 0xAB                              */
  180. #define TDS_PARAM_TOKEN     172  /* 0xAC    RETURNVALUE?              */
  181. #define TDS_LOGIN_ACK_TOKEN 173  /* 0xAD                              */
  182. #define TDS_174_TOKEN       174  /* 0xAE    TDS_CONTROL               */
  183. #define TDS_ROW_TOKEN       209  /* 0xD1                              */
  184. #define TDS_CMP_ROW_TOKEN   211  /* 0xD3                              */
  185. #define TDS_CAP_TOKEN       226  /* 0xE2                              */
  186. #define TDS_ENV_CHG_TOKEN   227  /* 0xE3                              */
  187. #define TDS_EED_TOKEN       229  /* 0xE5                              */
  188. #define TDS_AUTH_TOKEN      237  /* 0xED                              */
  189. #define TDS_RESULT_TOKEN    238  /* 0xEE                              */
  190. #define TDS_DONE_TOKEN      253  /* 0xFD    TDS_DONE                  */
  191. #define TDS_DONEPROC_TOKEN  254  /* 0xFE    TDS_DONEPROC              */
  192. #define TDS_DONEINPROC_TOKEN 255  /* 0xFF    TDS_DONEINPROC            */
  193. /* states for tds_process_messages() */
  194. #define PROCESS_ROWS    0
  195. #define PROCESS_RESULTS 1
  196. #define CANCEL_PROCESS  2
  197. #define GOTO_1ST_ROW    3
  198. #define LOGIN           4
  199. /* environment type field */
  200. #define TDS_ENV_DATABASE  1
  201. #define TDS_ENV_CHARSET   3
  202. #define TDS_ENV_BLOCKSIZE 4
  203. /* 
  204. <rant> Sybase does an awful job of this stuff, non null ints of size 1 2 
  205. and 4 have there own codes but nullable ints are lumped into INTN
  206. sheesh! </rant>
  207. */
  208. #define SYBCHAR      47   /* 0x2F */
  209. #define SYBVARCHAR   39   /* 0x27 */
  210. #define SYBINTN      38   /* 0x26 */
  211. #define SYBINT1      48   /* 0x30 */
  212. #define SYBINT2      52   /* 0x34 */
  213. #define SYBINT4      56   /* 0x38 */
  214. #define SYBINT8     127   /* 0x7F */
  215. #define SYBFLT8      62   /* 0x3E */
  216. #define SYBDATETIME  61   /* 0x3D */
  217. #define SYBBIT       50   /* 0x32 */
  218. #define SYBTEXT      35   /* 0x23 */
  219. #define SYBNTEXT     99   /* 0x63 */
  220. #define SYBIMAGE     34   /* 0x22 */
  221. #define SYBMONEY4    122  /* 0x7A */
  222. #define SYBMONEY     60   /* 0x3C */
  223. #define SYBDATETIME4 58   /* 0x3A */
  224. #define SYBREAL      59   /* 0x3B */
  225. #define SYBBINARY    45   /* 0x2D */
  226. #define SYBVOID      31   /* 0x1F */
  227. #define SYBVARBINARY 37   /* 0x25 */
  228. #define SYBNVARCHAR  103  /* 0x67 */
  229. #define SYBBITN      104  /* 0x68 */
  230. #define SYBNUMERIC   108  /* 0x6C */
  231. #define SYBDECIMAL   106  /* 0x6A */
  232. #define SYBFLTN      109  /* 0x6D */
  233. #define SYBMONEYN    110  /* 0x6E */
  234. #define SYBDATETIMN  111  /* 0x6F */
  235. #define XSYBCHAR     175  /* 0xAF */
  236. #define XSYBVARCHAR  167  /* 0xA7 */
  237. #define XSYBNVARCHAR 231  /* 0xE7 */
  238. #define XSYBNCHAR    239  /* 0xEF */
  239. #define XSYBVARBINARY 165  /* 0xA5 */
  240. #define XSYBBINARY    173  /* 0xAD */
  241. #define SYBUNIQUE    36    /* 0x24 */
  242. #define SYBVARIANT   0x62
  243. #define TDS_ZERO_FREE(x) {free((x)); (x) = NULL;}
  244. #define TDS_BYTE_SWAP16(value)                 
  245.          (((((unsigned short)value)<<8) & 0xFF00)   | 
  246.           ((((unsigned short)value)>>8) & 0x00FF))
  247. #define TDS_BYTE_SWAP32(value)                     
  248.          (((((unsigned long)value)<<24) & 0xFF000000)  | 
  249.           ((((unsigned long)value)<< 8) & 0x00FF0000)  | 
  250.           ((((unsigned long)value)>> 8) & 0x0000FF00)  | 
  251.           ((((unsigned long)value)>>24) & 0x000000FF))
  252. #define is_end_token(x) (x==TDS_DONE_TOKEN    || 
  253. x==TDS_DONEPROC_TOKEN    || 
  254. x==TDS_DONEINPROC_TOKEN)
  255. #define is_hard_end_token(x) (x==TDS_DONE_TOKEN    || 
  256. x==TDS_DONEPROC_TOKEN)
  257. #define is_msg_token(x) (x==TDS_MSG_TOKEN    || 
  258. x==TDS_ERR_TOKEN    || 
  259. x==TDS_EED_TOKEN)
  260. #define is_result_token(x) (x==TDS_RESULT_TOKEN    || 
  261. x==TDS7_RESULT_TOKEN    || 
  262. x==TDS_COL_INFO_TOKEN    || 
  263. x==TDS_COL_NAME_TOKEN)
  264. /* FIX ME -- not a complete list */
  265. #define is_fixed_type(x) (x==SYBINT1    || 
  266. x==SYBINT2      || 
  267. x==SYBINT4      || 
  268. x==SYBINT8      || 
  269. x==SYBREAL  || 
  270. x==SYBFLT8      || 
  271. x==SYBDATETIME  || 
  272. x==SYBDATETIME4 || 
  273. x==SYBBIT       || 
  274. x==SYBMONEY     || 
  275. x==SYBMONEY4    || 
  276. x==SYBUNIQUE)
  277. #define is_nullable_type(x) (x==SYBINTN || 
  278. x==SYBFLTN      || 
  279. x==SYBDATETIMN  || 
  280. x==SYBVARCHAR   || 
  281. x==SYBVARBINARY || 
  282. x==SYBMONEYN || 
  283. x==SYBTEXT || 
  284. x==SYBNTEXT || 
  285. x==SYBBITN      || 
  286. x==SYBIMAGE)
  287. #define is_blob_type(x) (x==SYBTEXT || x==SYBIMAGE || x==SYBNTEXT)
  288. /* large type means it has a two byte size field */
  289. #define is_large_type(x) (x>128)
  290. #define is_numeric_type(x) (x==SYBNUMERIC || x==SYBDECIMAL)
  291. #define is_unicode(x) (x==XSYBNVARCHAR || x==XSYBNCHAR || x==SYBNTEXT)
  292. #define is_collate_type(x) (x==XSYBVARCHAR || x==XSYBCHAR || x==SYBTEXT || x == XSYBNVARCHAR || x==SYBNTEXT)
  293. #define TDS_MAX_CAPABILITY 18
  294. #define MAXPRECISION  50
  295. #define TDS_MAX_CONN 4096
  296. #define TDS_MAX_DYNID_LEN 30
  297. /* defaults to use if no others are found */
  298. #define TDS_DEF_SERVER "SYBASE"
  299. #define TDS_DEF_BLKSZ 512
  300. #define TDS_DEF_CHARSET "iso_1"
  301. #define TDS_DEF_LANG "us_english"
  302. #if TDS42
  303. #define TDS_DEF_MAJOR 4
  304. #define TDS_DEF_MINOR 2
  305. #define TDS_DEF_PORT 1433
  306. #elif TDS46
  307. #define TDS_DEF_MAJOR 4
  308. #define TDS_DEF_MINOR 6
  309. #define TDS_DEF_PORT 4000
  310. #elif TDS70
  311. #define TDS_DEF_MAJOR 7
  312. #define TDS_DEF_MINOR 0
  313. #define TDS_DEF_PORT 1433
  314. #elif TDS80
  315. #define TDS_DEF_MAJOR 8
  316. #define TDS_DEF_MINOR 0
  317. #define TDS_DEF_PORT 1433
  318. #else
  319. #define TDS_DEF_MAJOR 5
  320. #define TDS_DEF_MINOR 0
  321. #define TDS_DEF_PORT 4000
  322. #endif
  323. /* normalized strings from freetds.conf file */
  324. #define TDS_STR_VERSION  "tds version"
  325. #define TDS_STR_BLKSZ    "initial block size"
  326. #define TDS_STR_SWAPDT   "swap broken dates"
  327. #define TDS_STR_SWAPMNY  "tds version"
  328. #define TDS_STR_TRYSVR   "try server login"
  329. #define TDS_STR_TRYDOM   "try domain login"
  330. #define TDS_STR_DOMAIN   "nt domain"
  331. #define TDS_STR_XDOMAUTH "cross domain auth"
  332. #define TDS_STR_DUMPFILE "dump file"
  333. #define TDS_STR_DEBUGLVL "debug level"
  334. #define TDS_STR_TIMEOUT  "timeout"
  335. #define TDS_STR_CONNTMOUT "connect timeout"
  336. #define TDS_STR_HOSTNAME "hostname"
  337. #define TDS_STR_HOST     "host"
  338. #define TDS_STR_PORT     "port"
  339. #define TDS_STR_TEXTSZ   "text size"
  340. /* for big endian hosts */
  341. #define TDS_STR_EMUL_LE "emulate little endian"
  342. #define TDS_STR_CHARSET "charset"
  343. #define TDS_STR_CLCHARSET "client charset"
  344. #define TDS_STR_LANGUAGE "language"
  345. #define TDS_STR_APPENDMODE "dump file append"
  346. #define TDS_STR_DATEFMT "date format"
  347. #define TDS_MAX_LOGIN_STR_SZ 30
  348. #define TDS_MAX_LIBRARY_STR_SZ 11
  349. typedef struct tds_login {
  350. TDS_CHAR  host_name[TDS_MAX_LOGIN_STR_SZ+1];
  351. TDS_CHAR  user_name[TDS_MAX_LOGIN_STR_SZ+1];
  352. /* FIXME temporary fix, 40 pwd max len */
  353. TDS_CHAR  password[40+1];
  354. TDS_TINYINT bulk_copy; 
  355. TDS_CHAR  app_name[TDS_MAX_LOGIN_STR_SZ+1];
  356. TDS_CHAR  server_name[TDS_MAX_LOGIN_STR_SZ+1];
  357. TDS_TINYINT  major_version; /* TDS version */
  358. TDS_TINYINT  minor_version; /* TDS version */
  359. /* Ct-Library, DB-Library,  TDS-Library or ODBC */
  360. TDS_CHAR  library[TDS_MAX_LIBRARY_STR_SZ+1];
  361. TDS_CHAR language[TDS_MAX_LOGIN_STR_SZ+1]; /* ie us-english */
  362. TDS_TINYINT encrypted; 
  363. TDS_CHAR char_set[TDS_MAX_LOGIN_STR_SZ+1]; /*  ie iso_1 */
  364. TDS_SMALLINT block_size; 
  365. TDS_TINYINT suppress_language;
  366.      TDS_INT connect_timeout;
  367.      TDS_INT query_timeout;
  368.      TDS_INT longquery_timeout;
  369.      void (*longquery_func)(long lHint);
  370.      long longquery_param;
  371. unsigned char capabilities[TDS_MAX_CAPABILITY];
  372. int port;
  373. } TDSLOGIN;
  374. #ifdef NCBI_FTDS
  375. #define NCBI_NUM_SERVERS 8
  376. #endif
  377. typedef struct tds_config_info {
  378.         char *server_name;
  379.         char *host;
  380. #ifdef NCBI_FTDS
  381.         char *ip_addr[NCBI_NUM_SERVERS];
  382.         int port[NCBI_NUM_SERVERS];
  383. #else
  384.         char *ip_addr;
  385.         int port;
  386. #endif
  387.         TDS_SMALLINT minor_version;
  388.         TDS_SMALLINT major_version;
  389.         int block_size;
  390.         char *language;
  391.         char *char_set;
  392.         char *database;
  393.         char *dump_file;
  394.         int broken_dates;
  395.         int broken_money;
  396.         int timeout;
  397.         int connect_timeout;
  398.         char *host_name;
  399.         char *default_domain;
  400.         int try_server_login;
  401.         int try_domain_login;
  402.         int xdomain_auth;
  403.         int debug_level;
  404.         int emul_little_endian;
  405.         int text_size;
  406.         char *app_name;
  407.         char *user_name;
  408.         char *password;
  409.         char *library;
  410.         int bulk_copy;
  411.    int suppress_language;
  412.    int encrypted;
  413.         char *client_charset;
  414. } TDSCONFIGINFO;
  415. typedef struct tds_loc_info {
  416.         char *language;
  417.         char *char_set;
  418.         char *date_fmt;
  419. } TDSLOCINFO;
  420. /* structure for storing data about regular and compute rows */ 
  421. typedef struct tds_column_info {
  422. TDS_SMALLINT column_type;
  423. TDS_SMALLINT column_type_save;
  424. TDS_SMALLINT column_usertype;
  425. TDS_SMALLINT column_flags;
  426. TDS_INT column_size;
  427. TDS_INT column_offset;
  428. TDS_TINYINT column_namelen;
  429. TDS_TINYINT column_varint_size;
  430. #ifdef NCBI_FTDS
  431.     TDS_CHAR column_name[140]; 
  432.     TDS_CHAR full_column_name[140];
  433. #else
  434.    TDS_CHAR column_name[256];
  435. #endif
  436. TDS_SMALLINT column_bindtype;
  437. TDS_SMALLINT column_bindfmt;
  438. TDS_UINT column_bindlen;
  439. TDS_CHAR *column_nullbind;
  440. TDS_CHAR *varaddr;
  441. TDS_CHAR *column_lenbind;
  442. TDS_SMALLINT column_prec;
  443. TDS_SMALLINT column_scale;
  444. TDS_INT column_textsize;
  445. TDS_INT column_textpos;
  446. TDS_INT column_text_sqlgetdatapos;
  447. TDS_CHAR column_textptr[16];
  448. TDS_CHAR column_timestamp[8];
  449. TDS_CHAR *column_textvalue;
  450. TDS_TINYINT column_nullable;
  451. TDS_TINYINT column_writeable;
  452. TDS_TINYINT column_identity;
  453. TDS_TINYINT column_unicodedata;
  454.     TDS_CHAR    collation[5];
  455. TDS_INT cur_row_size; /* size of this column in the current row */
  456. } TDSCOLINFO;
  457. typedef struct tds_result_info {
  458. TDS_SMALLINT  rows_exist;
  459. TDS_INT       row_count;
  460. TDS_INT       row_size;
  461. TDS_SMALLINT  num_cols;
  462. TDS_TINYINT   more_results;
  463. TDSCOLINFO    **columns;
  464. int           null_info_size;
  465. unsigned char *current_row;
  466. } TDSRESULTINFO;
  467. /* values for tds->state */
  468. enum {
  469. TDS_QUERYING,
  470. TDS_PENDING,
  471. TDS_COMPLETED,
  472. TDS_CANCELED,
  473. TDS_DEAD
  474. };
  475. #define TDS_DBG_FUNC    7  
  476. #define TDS_DBG_INFO2   6
  477. #define TDS_DBG_INFO1   5
  478. #define TDS_DBG_NETWORK 4
  479. #define TDS_DBG_WARN    3
  480. #define TDS_DBG_ERROR   2
  481. #define TDS_DBG_SEVERE  1
  482. typedef struct tds_compute_info {
  483.         TDS_SMALLINT num_cols;
  484. TDS_INT row_size;
  485.         TDSCOLINFO **columns;
  486. int           null_info_size;
  487. unsigned char *current_row;
  488. } TDSCOMPUTEINFO;
  489. typedef struct tds_param_info {
  490.         TDS_SMALLINT num_cols;
  491. TDS_INT row_size;
  492.         TDSCOLINFO **columns;
  493. int           null_info_size;
  494. unsigned char *current_row;
  495. } TDSPARAMINFO;
  496. typedef struct tds_input_param {
  497. TDS_SMALLINT column_type;
  498. TDS_CHAR *varaddr;
  499. TDS_UINT column_bindlen;
  500. TDS_CHAR is_null;
  501. } TDSINPUTPARAM;
  502. typedef struct tds_msg_info {
  503.       TDS_SMALLINT priv_msg_type;
  504.       TDS_SMALLINT line_number;
  505.       TDS_UINT msg_number;
  506.       TDS_SMALLINT msg_state;
  507.       TDS_SMALLINT msg_level;
  508.       TDS_CHAR *server;
  509.       TDS_CHAR *message;
  510.       TDS_CHAR *proc_name;
  511.       TDS_CHAR *sql_state;
  512. } TDSMSGINFO;
  513. #ifdef NCBI_FTDS
  514. typedef struct tds_blob_info {
  515.         TDS_CHAR *textvalue;
  516.         TDS_CHAR textptr[16];
  517.         TDS_CHAR timestamp[8];
  518. } TDSBLOBINFO;
  519. #endif
  520. /*
  521. ** This is the current environment as reported by the server
  522. */
  523. typedef struct tds_env_info {
  524. int block_size;
  525. char *language;
  526. char *charset;
  527. char *database;
  528. } TDSENVINFO;
  529. typedef struct tds_dynamic {
  530. char id[30];
  531. int dyn_state;
  532. TDSRESULTINFO *res_info;
  533. int num_params;
  534. TDSINPUTPARAM **params;
  535. } TDSDYNAMIC;
  536. /* forward declaration */
  537. typedef struct tds_context TDSCONTEXT;
  538. typedef struct tds_socket  TDSSOCKET;
  539. struct tds_context {
  540. TDSLOCINFO *locale;
  541. void *parent;
  542. /* handler */
  543. int (*msg_handler)(TDSCONTEXT*, TDSSOCKET*, TDSMSGINFO*);
  544. int (*err_handler)(TDSCONTEXT*, TDSSOCKET*, TDSMSGINFO*);
  545. };
  546. struct tds_socket {
  547. /* fixed and connect time */
  548.         int s;
  549. TDS_SMALLINT major_version;
  550. TDS_SMALLINT minor_version;
  551. unsigned char capabilities[TDS_MAX_CAPABILITY];
  552. unsigned char broken_dates;
  553. /* in/out buffers */
  554. unsigned char *in_buf;
  555. unsigned char *out_buf;
  556. unsigned int in_buf_max;
  557. unsigned in_pos;
  558. unsigned out_pos;
  559. unsigned in_len;
  560. unsigned out_len;
  561. unsigned char out_flag;
  562. unsigned char last_packet;
  563. void *parent;
  564. /* info about current query */
  565. TDSRESULTINFO *res_info;
  566.         TDSCOMPUTEINFO *comp_info;
  567.         TDSPARAMINFO *param_info;
  568. TDS_TINYINT   has_status;
  569. TDS_INT       ret_status;
  570. TDSMSGINFO *msg_info;
  571. TDS_TINYINT   state;
  572. int rows_affected;
  573. /* timeout stuff from Jeff */
  574. TDS_INT timeout;
  575. TDS_INT longquery_timeout;
  576. void (*longquery_func)(long lHint);
  577. long longquery_param;
  578. time_t queryStarttime;
  579. TDSENVINFO *env;
  580. /* dynamic placeholder stuff */
  581. int num_dyns;
  582. int cur_dyn_elem;
  583. TDSDYNAMIC **dyns;
  584. int emul_little_endian;
  585. char *date_fmt;
  586. TDSCONTEXT *tds_ctx;
  587. void *iconv_info;
  588. #ifdef NCBI_FTDS
  589.     /* bcp stuff */
  590.     int                packet_count; 
  591.     int                f_batch; 
  592.     int                rows_in_batch;
  593. #endif   
  594. /** config for login stuff. After login this field is NULL */
  595. TDSCONFIGINFO *config;
  596. };
  597. void tds_set_longquery_handler(TDSLOGIN * tds_login, void (* longquery_func)(long), long longquery_param);
  598. void tds_set_timeouts(TDSLOGIN *tds_login, int connect, int query, int longquery);
  599. int tds_write_packet(TDSSOCKET *tds,unsigned char final);
  600. int tds_init_write_buf(TDSSOCKET *tds);
  601. void tds_free_result_info(TDSRESULTINFO *info);
  602. void tds_free_socket(TDSSOCKET *tds);
  603. void tds_free_config(TDSCONFIGINFO *config);
  604. void tds_free_all_results(TDSSOCKET *tds);
  605. void tds_free_results(TDSRESULTINFO *res_info);
  606. void tds_free_param_results(TDSPARAMINFO *param_info);
  607. void tds_free_column(TDSCOLINFO *column);
  608. void tds_free_msg(TDSMSGINFO *msg_info);
  609. int tds_put_n(TDSSOCKET *tds, const unsigned char *buf, int n);
  610. int tds_put_string(TDSSOCKET *tds, const char *buf, int n);
  611. int tds_put_int(TDSSOCKET *tds, TDS_INT i);
  612. int tds_put_smallint(TDSSOCKET *tds, TDS_SMALLINT si);
  613. int tds_put_tinyint(TDSSOCKET *tds, TDS_TINYINT ti);
  614. int tds_put_byte(TDSSOCKET *tds, unsigned char c);
  615. unsigned char tds_get_byte(TDSSOCKET *tds);
  616. void tds_unget_byte(TDSSOCKET *tds);
  617. TDS_INT tds_get_int(TDSSOCKET *tds);
  618. TDS_SMALLINT tds_get_smallint(TDSSOCKET *tds);
  619. char *tds_get_n(TDSSOCKET *tds, void *dest, int n);
  620. char *tds_get_string(TDSSOCKET *tds, void *dest, int n);
  621. char *tds_get_ntstring(TDSSOCKET *tds, char *dest, int n);
  622. TDSRESULTINFO *tds_alloc_results(int num_cols);
  623. TDSCOMPUTEINFO *tds_alloc_compute_results(int num_cols);
  624. TDSCONTEXT *tds_alloc_context();
  625. void tds_free_context(TDSCONTEXT *locale);
  626. TDSSOCKET *tds_alloc_socket(TDSCONTEXT *context, int bufsize);
  627. TDSCONFIGINFO *tds_get_config(TDSSOCKET *tds, TDSLOGIN *login, TDSLOCINFO *locale);
  628. TDSLOCINFO *tds_get_locale();
  629. void *tds_alloc_row(TDSRESULTINFO *res_info);
  630. char *tds_msg_get_proc_name(TDSSOCKET *tds);
  631. TDSLOGIN *tds_alloc_login();
  632. TDSDYNAMIC *tds_alloc_dynamic(TDSSOCKET *tds, char *id);
  633. void tds_free_login(TDSLOGIN *login);
  634. TDSCONFIGINFO *tds_alloc_config(TDSLOCINFO *locale);
  635. TDSLOCINFO *tds_alloc_locale();
  636. void tds_free_locale(TDSLOCINFO *locale);
  637. TDSSOCKET *tds_connect(TDSLOGIN *login, TDSCONTEXT *context, void *parent);
  638. TDSINPUTPARAM *tds_add_input_param(TDSDYNAMIC *dyn);
  639. void tds_set_packet(TDSLOGIN *tds_login, short packet_size);
  640. void tds_set_port(TDSLOGIN *tds_login, int port);
  641. void tds_set_passwd(TDSLOGIN *tds_login, char *password);
  642. void tds_set_bulk(TDSLOGIN *tds_login, TDS_TINYINT enabled);
  643. void tds_set_user(TDSLOGIN *tds_login, char *username);
  644. void tds_set_app(TDSLOGIN *tds_login, char *application);
  645. void tds_set_host(TDSLOGIN *tds_login, char *hostname);
  646. void tds_set_library(TDSLOGIN *tds_login, char *library);
  647. void tds_set_server(TDSLOGIN *tds_login, char *server);
  648. void tds_set_charset(TDSLOGIN *tds_login, char *charset);
  649. void tds_set_language(TDSLOGIN *tds_login, char *language);
  650. void tds_set_version(TDSLOGIN *tds_login, short major_ver, short minor_ver);
  651. void tds_set_capabilities(TDSLOGIN *tds_login, unsigned char *capabilities, int size);
  652. int tds_submit_query(TDSSOCKET *tds, char *query);
  653. int tds_process_result_tokens(TDSSOCKET *tds);
  654. int tds_process_row_tokens(TDSSOCKET *tds);
  655. int tds_process_env_chg(TDSSOCKET *tds);
  656. int tds_process_default_tokens(TDSSOCKET *tds, int marker);
  657. TDS_INT tds_process_end(TDSSOCKET *tds, int marker, int *more, int *canceled);
  658. int tds_client_msg(TDSCONTEXT *tds_ctx, TDSSOCKET *tds, int msgnum, int level, int state, int line, char *message);
  659. int tds_reset_msg_info(TDSMSGINFO *msg_info);
  660. void  tds_set_parent(TDSSOCKET* tds, void* the_parent);
  661. void* tds_get_parent(TDSSOCKET* tds);
  662. void tds_set_null(unsigned char *current_row, int column);
  663. void tds_clr_null(unsigned char *current_row, int column);
  664. int tds_get_null(unsigned char *current_row, int column);
  665. int tds7_send_login(TDSSOCKET *tds, TDSCONFIGINFO *config);
  666. unsigned char *tds7_crypt_pass(const unsigned char *clear_pass, int len, unsigned char *crypt_pass);
  667. int tds_lookup_dynamic(TDSSOCKET *tds, char *id);
  668. /* iconv.c */
  669. void tds_iconv_open(TDSSOCKET *tds, char *charset);
  670. void tds_iconv_close(TDSSOCKET *tds);
  671. unsigned char *tds7_ascii2unicode(TDSSOCKET *tds, const char *in_string, char *out_string, int maxlen);
  672. char *tds7_unicode2ascii(TDSSOCKET *tds, const char *in_string, char *out_string, int len);
  673.  
  674. /* threadsafe.c */
  675. char *tds_timestamp_str(char *str, int maxlen);
  676. struct hostent *tds_gethostbyname_r(const char *servername, struct hostent *result, char *buffer, int buflen, int *h_errnop);
  677. struct hostent *tds_gethostbyaddr_r(const char *addr, int len, int type, struct hostent *result, char *buffer, int buflen, int *h_errnop);
  678. struct servent *tds_getservbyname_r(const char *name, char *proto, struct servent *result, char *buffer, int buflen);
  679. char *tds_strtok_r(char *s, const char *delim, char **ptrptr);
  680. typedef struct tds_answer
  681. {
  682. unsigned char lm_resp[24];
  683. unsigned char nt_resp[24];
  684. } TDSANSWER;
  685. void tds_answer_challenge(char *passwd, char *challenge,TDSANSWER* answer);
  686. #define IS_TDS42(x) (x->major_version==4 && x->minor_version==2)
  687. #define IS_TDS46(x) (x->major_version==4 && x->minor_version==6)
  688. #define IS_TDS50(x) (x->major_version==5 && x->minor_version==0)
  689. #define IS_TDS70(x) (x->major_version==7 && x->minor_version==0)
  690. #define IS_TDS80(x) (x->major_version==8 && x->minor_version==0)
  691. #define IS_TDS7_PLUS(x) ( IS_TDS70(x) || IS_TDS80(x) )
  692. #ifdef __cplusplus
  693. }
  694. #endif 
  695. #endif /* _tds_h_ */