NCBI C++ ToolKit
odbc_util.c
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
2  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Brian Bruns
3  * Copyright (C) 2005-2010 Frediano Ziglio
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20 
21 #include <config.h>
22 
23 #if HAVE_STDLIB_H
24 #include <stdlib.h>
25 #endif /* HAVE_STDLIB_H */
26 
27 #include <stddef.h>
28 
29 #if HAVE_STRING_H
30 #include <string.h>
31 #endif /* HAVE_STRING_H */
32 
33 #include <assert.h>
34 
35 #include <freetds/odbc.h>
36 #include <freetds/iconv.h>
37 #include <freetds/string.h>
38 #include <freetds/convert.h>
39 #include <freetds/enum_cap.h>
40 #include <odbcss.h>
41 
42 /**
43  * \ingroup odbc_api
44  * \defgroup odbc_util ODBC utility
45  * Functions called within \c ODBC driver.
46  */
47 
48 /**
49  * \addtogroup odbc_util
50  * @{
51  */
52 
53 #ifdef ENABLE_ODBC_WIDE
54 static DSTR *odbc_iso2utf(DSTR *res, const char *s, size_t len);
55 static DSTR *odbc_mb2utf(TDS_DBC *dbc, DSTR *res, const char *s, size_t len);
56 static DSTR *odbc_wide2utf(DSTR *res, const SQLWCHAR *s, size_t len);
57 #endif
58 
59 int
61  _WIDE)
62 {
63  if (sql_len == SQL_NTS)
64 #ifdef ENABLE_ODBC_WIDE
65  sql_len = wide ? sqlwcslen(sql->wide) : strlen(sql->mb);
66 #else
67  sql_len = strlen((const char*) sql);
68 #endif
69  else if (sql_len <= 0)
70  return SQL_ERROR;
71 
72  /* TODO already NULL ?? */
74  stmt->params = NULL;
75  stmt->param_num = 0;
76  stmt->param_count = 0;
77  stmt->is_prepared_query = 0;
78  stmt->prepared_query_is_func = 0;
79  stmt->prepared_query_is_rpc = 0;
80  stmt->prepared_pos = NULL;
81  stmt->curr_param_row = 0;
82  stmt->num_param_rows = 1;
83  stmt->need_reprepare = 0;
84 
85  if (!odbc_dstr_copy(stmt->dbc, &stmt->query, sql_len, sql))
86  return SQL_ERROR;
87 
88  return SQL_SUCCESS;
89 }
90 
91 size_t
93 {
94  if (str) {
95  if (size == SQL_NTS)
96 #ifdef ENABLE_ODBC_WIDE
97  return wide ? sqlwcslen(str->wide) : strlen(str->mb);
98 #else
99  return strlen((const char*) str);
100 #endif
101  if (size >= 0)
102  return (unsigned int) size;
103  }
104  /* SQL_NULL_DATA or any other strange value */
105  return 0;
106 }
107 
108 #ifdef ENABLE_ODBC_WIDE
109 static DSTR*
110 odbc_iso2utf(DSTR *res, const char *s, size_t len)
111 {
112  size_t i, o_len = len + 1;
113  char *out, *p;
114 
115  assert(s);
116  for (i = 0; i < len; ++i)
117  if ((s[i] & 0x80) != 0)
118  ++o_len;
119 
120  if (!tds_dstr_alloc(res, o_len))
121  return NULL;
122  out = tds_dstr_buf(res);
123 
124  for (p = out; len > 0; --len) {
125  unsigned char u = (unsigned char) *s++;
126  if ((u & 0x80) != 0) {
127  *p++ = 0xc0 | (0x1f & (u >> 6));
128  *p++ = 0x80 | (0x3f & u);
129  } else {
130  *p++ = u;
131  }
132  }
133  assert(p + 1 <= out + o_len);
134  return tds_dstr_setlen(res, p - out);
135 }
136 
137 static DSTR*
138 odbc_wide2utf(DSTR *res, const SQLWCHAR *s, size_t len)
139 {
140  size_t i, o_len = len + 1;
141  char *out, *p;
142 
143 #if SIZEOF_SQLWCHAR > 2
144 # define MASK(n) ((0xffffffffu << (n)) & 0xffffffffu)
145 #else
146 # define MASK(n) ((0xffffu << (n)) & 0xffffu)
147 #endif
148 
149  assert(s || len == 0);
150  for (i = 0; i < len; ++i) {
151  if ((s[i] & MASK(7)) == 0)
152  continue;
153  ++o_len;
154  if ((s[i] & MASK(11)) == 0)
155  continue;
156  ++o_len;
157 #if SIZEOF_SQLWCHAR > 2
158  if ((s[i] & MASK(16)) == 0)
159  continue;
160  ++o_len;
161  if ((s[i] & MASK(21)) == 0)
162  continue;
163  ++o_len;
164  if ((s[i] & MASK(26)) == 0)
165  continue;
166  ++o_len;
167 #endif
168  }
169 
170  if (!tds_dstr_alloc(res, o_len))
171  return NULL;
172  out = tds_dstr_buf(res);
173 
174  for (p = out; len > 0; --len) {
175  SQLWCHAR u = *s++;
176  if ((u & MASK(7)) == 0) {
177  *p++ = (char) u;
178  continue;
179  }
180  if ((u & MASK(11)) == 0) {
181  *p++ = 0xc0 | (0x1f & (u >> 6));
182  } else {
183 #if SIZEOF_SQLWCHAR > 2
184  if ((u & MASK(16)) == 0) {
185  *p++ = 0xe0 | (0x0f & (u >> 12));
186  } else {
187  if ((u & MASK(21)) == 0) {
188  if ((u & MASK(26)) == 0) {
189  *p++ = 0xfc | (0x01 & (u >> 30));
190  *p++ = 0x80 | (0x3f & (u >> 24));
191  } else {
192  *p++ = 0xf8 | (0x03 & (u >> 24));
193  }
194  *p++ = 0x80 | (0x3f & (u >> 18));
195  } else {
196  *p++ = 0xf0 | (0x07 & (u >> 18));
197  }
198  *p++ = 0x80 | (0x3f & (u >> 12));
199  }
200  *p++ = 0x80 | (0x3f & (u >> 6));
201 #else
202  *p++ = 0xe0 | (0x0f & (u >> 12));
203  *p++ = 0x80 | (0x3f & (u >> 6));
204 #endif
205  }
206  *p++ = 0x80 | (0x3f & u);
207  }
208  assert(p + 1 <= out + o_len);
209  return tds_dstr_setlen(res, p - out);
210 }
211 
212 static DSTR*
213 odbc_mb2utf(TDS_DBC *dbc, DSTR *res, const char *s, size_t len)
214 {
215  char *buf;
216 
217  const char *ib;
218  char *ob;
219  size_t il, ol;
220  TDSICONV *char_conv = dbc->mb_conv;
221 
222  if (!char_conv)
223  return odbc_iso2utf(res, s, len);
224 
225  if (char_conv->flags == TDS_ENCODING_MEMCPY)
226  return tds_dstr_copyn(res, s, len);
227 
228  il = len;
229 
230  /* allocate needed buffer (+1 is to exclude 0 case) */
231  ol = il * char_conv->to.charset.max_bytes_per_char / char_conv->from.charset.min_bytes_per_char + 1;
232  assert(ol > 0);
233  if (!tds_dstr_alloc(res, ol))
234  return NULL;
235  buf = tds_dstr_buf(res);
236 
237  ib = s;
238  ob = buf;
239  --ol; /* leave space for terminator */
240 
241  /* char_conv is only mostly const */
242  memset((TDS_ERRNO_MESSAGE_FLAGS*) &char_conv->suppress, 0, sizeof(char_conv->suppress));
243  if (tds_iconv(dbc->tds_socket, char_conv, to_server, &ib, &il, &ob, &ol) == (size_t)-1)
244  return NULL;
245 
246  return tds_dstr_setlen(res, ob - buf);
247 }
248 #endif
249 
250 #ifdef ENABLE_ODBC_WIDE
251 DSTR*
252 odbc_dstr_copy_flag(TDS_DBC *dbc, DSTR *s, int size, const ODBC_CHAR * str, int flag)
253 {
254  int wide = flag&1;
255  size_t len;
256 
257  len = odbc_get_string_size((flag&0x21) == 0x21 && size >= 0 ? size/SIZEOF_SQLWCHAR : size, str, wide);
258  if (wide)
259  return odbc_wide2utf(s, str->wide, len);
260 
261  return odbc_mb2utf(dbc, s, str->mb, len);
262 }
263 #else
264 DSTR*
266 {
267  return tds_dstr_copyn(s, (const char *) str, odbc_get_string_size(size, str));
268 }
269 #endif
270 
271 /**
272  * Copy a string to client setting size according to ODBC convenction
273  * @param dbc database connection. Can be NULL
274  * @param buffer client buffer
275  * @param cbBuffer client buffer size (in bytes)
276  * @param pcbBuffer pointer to SQLSMALLINT to hold string size
277  * @param s string to copy
278  * @param len len of string to copy. <0 null terminated
279  * @param flag set of flag 0x10 SQLINTEGER
280  */
281 SQLRETURN
283  void FAR * pcbBuffer, const char *s, ssize_t len,
284  int flag)
285 {
287  int out_len = 0;
288 #if !defined(NDEBUG) && defined(ENABLE_ODBC_WIDE)
289  ptrdiff_t initial_size;
290 #endif
291 
292  if (len < 0)
293  len = strlen(s);
294 
295  if (cbBuffer < 0)
296  cbBuffer = 0;
297 
298 #ifdef ENABLE_ODBC_WIDE
299  if ((flag & 1) != 0) {
300  /* wide characters */
301  const unsigned char *p = (const unsigned char*) s;
302  SQLWCHAR *dest = (SQLWCHAR*) buffer;
303 
304  if (flag&0x20)
305  cbBuffer /= SIZEOF_SQLWCHAR;
306 #ifndef NDEBUG
307  initial_size = cbBuffer;
308 #endif
309  while (len) {
310  unsigned char mask;
311  unsigned u;
312  int l;
313 
314  if (!(p[0] & 0x80)) {
315  mask = 0x7f; l = 1;
316  } else if ((p[0] & 0xe0) == 0xc0) {
317  mask = 0x1f; l = 2;
318  } else if ((p[0] & 0xf0) == 0xe0) {
319  mask = 0x0f; l = 3;
320  } else if ((p[0] & 0xf8) == 0xf0) {
321  mask = 0x07; l = 4;
322  } else if ((p[0] & 0xfc) == 0xf8) {
323  mask = 0x03; l = 5;
324  } else {
325  mask = 0x7f; l = 1;
326  }
327  if (len < l)
328  break;
329  len -= l;
330  u = *p++ & mask;
331  while(--l)
332  u = (u << 6) | (*p++ & 0x3f);
333  ++out_len;
334  if (!dest)
335  continue;
336  if (cbBuffer > 1) {
337  *dest++ = (SQLWCHAR) u;
338  --cbBuffer;
339  continue;
340  }
342  }
343  /* terminate buffer */
344  assert(dest == NULL || dest-(SQLWCHAR*) buffer == out_len
345  || (dest-(SQLWCHAR*) buffer <= out_len && cbBuffer <= 1));
346  if (dest && cbBuffer) {
347  *dest++ = 0;
348  assert(dest-(SQLWCHAR*) buffer <= initial_size);
349  }
350  assert(dest == NULL || dest-(SQLWCHAR*) buffer <= initial_size);
351  if (flag&0x20)
352  out_len *= SIZEOF_SQLWCHAR;
353  } else if (!dbc || !dbc->mb_conv) {
354  /* to ISO-8859-1 */
355  const unsigned char *p = (const unsigned char*) s;
356  unsigned char *dest = (unsigned char*) buffer;
357 
358 #ifndef NDEBUG
359  initial_size = cbBuffer;
360 #endif
361  while (len) {
362  unsigned char mask;
363  unsigned u;
364  int l;
365 
366  if (!(p[0] & 0x80)) {
367  mask = 0x7f; l = 1;
368  } else if ((p[0] & 0xe0) == 0xc0) {
369  mask = 0x1f; l = 2;
370  } else if ((p[0] & 0xf0) == 0xe0) {
371  mask = 0x0f; l = 3;
372  } else if ((p[0] & 0xf8) == 0xf0) {
373  mask = 0x07; l = 4;
374  } else if ((p[0] & 0xfc) == 0xf8) {
375  mask = 0x03; l = 5;
376  } else {
377  mask = 0x7f; l = 1;
378  }
379  if (len < l)
380  break;
381  len -= l;
382  u = *p++ & mask;
383  while(--l)
384  u = (u << 6) | (*p++ & 0x3f);
385  ++out_len;
386  if (!dest)
387  continue;
388  if (cbBuffer > 1) {
389  *dest++ = u > 0x100 ? '?' : u;
390  --cbBuffer;
391  continue;
392  }
394  }
395  assert(dest == NULL || dest-(unsigned char*) buffer == out_len
396  || (dest-(unsigned char*) buffer <= out_len && cbBuffer <= 1));
397  /* terminate buffer */
398  if (dest && cbBuffer) {
399  *dest++ = 0;
400  assert(dest-(unsigned char*) buffer <= initial_size);
401  }
402  assert(dest == NULL || dest-(unsigned char*) buffer <= initial_size);
403  } else if (dbc->mb_conv->flags == TDS_ENCODING_MEMCPY) {
404  /* to UTF-8 */
405  out_len = len;
406  if (len >= cbBuffer) {
407  len = cbBuffer - 1;
409  }
410  if (buffer && len >= 0) {
411  /* buffer can overlap, use memmove, thanks to Valgrind */
412  memmove((char *) buffer, s, len);
413  ((char *) buffer)[len] = 0;
414  }
415  } else {
416  const char *ib;
417  char *ob;
418  size_t il, ol;
419  TDSICONV *char_conv = dbc->mb_conv;
420 
421  il = len;
422  ib = s;
423  ol = cbBuffer;
424  ob = (char *) buffer;
425 
426  /* char_conv is only mostly const */
427  memset((TDS_ERRNO_MESSAGE_FLAGS*) &char_conv->suppress, 0, sizeof(char_conv->suppress));
428  char_conv->suppress.e2big = 1;
429  if (cbBuffer && tds_iconv(dbc->tds_socket, char_conv, to_client, &ib, &il, &ob, &ol) == (size_t)-1 && errno != E2BIG)
430  result = SQL_ERROR;
431  out_len = cbBuffer - (int) ol;
432  while (result != SQL_ERROR && il) {
433  char discard[128];
434  ol = sizeof(discard);
435  ob = discard;
436  char_conv->suppress.e2big = 1;
437  if (tds_iconv(dbc->tds_socket, char_conv, to_client, &ib, &il, &ob, &ol) == (size_t)-1 && errno != E2BIG)
438  result = SQL_ERROR;
439  ol = sizeof(discard) - ol;
440  /* if there are still left space copy the partial conversion */
441  if (out_len < cbBuffer) {
442  size_t max_copy = cbBuffer - out_len;
443  if (max_copy > ol)
444  max_copy = ol;
445  memcpy(((char *) buffer) + out_len, discard, max_copy);
446  }
447  out_len += ol;
448  }
449  if (out_len >= cbBuffer && result != SQL_ERROR)
451  if (buffer && cbBuffer > 0)
452  ((char *) buffer)[cbBuffer-1 < out_len ? cbBuffer-1:out_len] = 0;
453  }
454 #else
455  out_len = len;
456  if (len >= cbBuffer) {
457  len = cbBuffer - 1;
459  }
460  if (buffer && len >= 0) {
461  /* buffer can overlap, use memmove, thanks to Valgrind */
462  memmove((char *) buffer, s, len);
463  ((char *) buffer)[len] = 0;
464  }
465 #endif
466 
467  /* set output length */
468  if (pcbBuffer) {
469  if (flag & 0x10)
470  *((SQLINTEGER *) pcbBuffer) = out_len;
471  else
472  *((SQLSMALLINT *) pcbBuffer) = out_len;
473  }
474  return result;
475 }
476 
477 
478 void
479 odbc_set_return_status(struct _hstmt *stmt, unsigned int n_row)
480 {
481  TDSSOCKET *tds = stmt->tds;
482 
483  /* TODO handle different type results (functions) on mssql2k */
484  if (stmt->prepared_query_is_func && tds->has_status) {
485  struct _drecord *drec;
486  SQLLEN len;
487  const TDS_DESC* axd = stmt->apd;
488  TDS_INTPTR len_offset;
489  char *data_ptr;
490 
491  if (axd->header.sql_desc_count < 1)
492  return;
493  drec = &axd->records[0];
494  data_ptr = (char*) drec->sql_desc_data_ptr;
495 
497  len_offset = axd->header.sql_desc_bind_type * n_row;
499  len_offset += *axd->header.sql_desc_bind_offset_ptr;
500  data_ptr += len_offset;
501  } else {
502  len_offset = sizeof(SQLLEN) * n_row;
503  data_ptr += sizeof(SQLINTEGER) * n_row;
504  }
505 #define LEN(ptr) *((SQLLEN*)(((char*)(ptr)) + len_offset))
506 
508  drec->sql_desc_concise_type, (TDS_CHAR *) data_ptr, drec->sql_desc_octet_length, NULL);
509  if (len == SQL_NULL_DATA)
510  return /* SQL_ERROR */ ;
511  if (drec->sql_desc_indicator_ptr)
512  LEN(drec->sql_desc_indicator_ptr) = 0;
513  if (drec->sql_desc_octet_length_ptr)
515  }
516 #undef LEN
517 }
518 
519 void
520 odbc_set_return_params(struct _hstmt *stmt, unsigned int n_row)
521 {
522  TDSSOCKET *tds = stmt->tds;
524 
525  int i_begin = stmt->prepared_query_is_func ? 1 : 0;
526  int i;
527  int nparam = i_begin;
528 
529  /* I don't understand why but this happen -- freddy77 */
530  /* TODO check why, put an assert ? */
531  if (!info)
532  return;
533 
534  for (i = 0; i < info->num_cols; ++i) {
535  const TDS_DESC* axd = stmt->apd;
536  const struct _drecord *drec_apd, *drec_ipd;
537  TDSCOLUMN *colinfo = info->columns[i];
538  TDS_CHAR *src;
539  int srclen;
540  SQLLEN len;
541  int c_type;
542  char *data_ptr;
543  TDS_INTPTR len_offset;
544 
545  /* find next output parameter */
546  for (;;) {
547  drec_apd = NULL;
548  /* TODO best way to stop */
549  if (nparam >= axd->header.sql_desc_count || nparam >= stmt->ipd->header.sql_desc_count)
550  return;
551  drec_apd = &axd->records[nparam];
552  drec_ipd = &stmt->ipd->records[nparam];
553  if (stmt->ipd->records[nparam++].sql_desc_parameter_type != SQL_PARAM_INPUT)
554  break;
555  }
556 
557  data_ptr = (char*) drec_apd->sql_desc_data_ptr;
559  len_offset = axd->header.sql_desc_bind_type * n_row;
561  len_offset += *axd->header.sql_desc_bind_offset_ptr;
562  data_ptr += len_offset;
563  } else {
564  len_offset = sizeof(SQLLEN) * n_row;
565  data_ptr += odbc_get_octet_len(drec_apd->sql_desc_concise_type, drec_apd) * n_row;
566  }
567 #define LEN(ptr) *((SQLLEN*)(((char*)(ptr)) + len_offset))
568 
569  /* null parameter ? */
570  if (colinfo->column_cur_size < 0) {
571  /* FIXME error if NULL */
572  if (drec_apd->sql_desc_indicator_ptr)
574  continue;
575  }
576 
577  src = (TDS_CHAR *) colinfo->column_data;
578  colinfo->column_text_sqlgetdatapos = 0;
579  srclen = colinfo->column_cur_size;
580  c_type = drec_apd->sql_desc_concise_type;
581  if (c_type == SQL_C_DEFAULT)
583  /*
584  * TODO why IPD ?? perhaps SQLBindParameter it's not correct ??
585  * Or tests are wrong ??
586  */
587  len = odbc_tds2sql(stmt, colinfo, tds_get_conversion_type(colinfo->on_server.column_type, colinfo->on_server.column_size), src, srclen,
588  c_type, (TDS_CHAR*) data_ptr, drec_apd->sql_desc_octet_length, drec_ipd);
589  if (len == SQL_NULL_DATA)
590  return /* SQL_ERROR */ ;
591  if (drec_apd->sql_desc_indicator_ptr)
592  LEN(drec_apd->sql_desc_indicator_ptr) = 0;
593  if (drec_apd->sql_desc_octet_length_ptr)
594  LEN(drec_apd->sql_desc_octet_length_ptr) = len;
595 #undef LEN
596  }
597 }
598 
599 /**
600  * Pass this an SQL_C_* type and get a SYB* type which most closely corresponds
601  * to the SQL_C_* type.
602  * This function can return XSYBNVARCHAR or SYBUINTx even if server do not support it
603  */
606 {
607  switch (c_type) {
608  /* FIXME this should be dependent on size of data !!! */
609  case SQL_C_BINARY:
610  return SYBBINARY;
611 #ifdef SQL_C_WCHAR
612  case SQL_C_WCHAR:
613  return XSYBNVARCHAR;
614 #endif
615  /* TODO what happen if varchar is more than 255 characters long */
616  case SQL_C_CHAR:
617  return SYBVARCHAR;
618  case SQL_C_FLOAT:
619  return SYBREAL;
620  case SQL_C_DOUBLE:
621  return SYBFLT8;
622  case SQL_C_BIT:
623  return SYBBIT;
624 #if (ODBCVER >= 0x0300)
625  case SQL_C_UBIGINT:
626  return SYBUINT8;
627  case SQL_C_SBIGINT:
628  return SYBINT8;
629 #ifdef SQL_C_GUID
630  case SQL_C_GUID:
631  return SYBUNIQUE;
632 #endif
633 #endif
634  case SQL_C_ULONG:
635  return SYBUINT4;
636  case SQL_C_LONG:
637  case SQL_C_SLONG:
638  return SYBINT4;
639  case SQL_C_USHORT:
640  return SYBUINT2;
641  case SQL_C_SHORT:
642  case SQL_C_SSHORT:
643  return SYBINT2;
644  case SQL_C_STINYINT:
645  case SQL_C_TINYINT:
646  case SQL_C_UTINYINT:
647  return SYBINT1;
648  /* ODBC date formats are completely differect from SQL one */
649  case SQL_C_DATE:
650  case SQL_C_TIME:
651  case SQL_C_TIMESTAMP:
652  case SQL_C_TYPE_DATE:
653  case SQL_C_TYPE_TIME:
655  return SYBMSDATETIME2;
656  /* ODBC numeric/decimal formats are completely differect from tds one */
657  case SQL_C_NUMERIC:
658  return SYBNUMERIC;
659  /* not supported */
660  case SQL_C_INTERVAL_YEAR:
662  case SQL_C_INTERVAL_DAY:
663  case SQL_C_INTERVAL_HOUR:
673  break;
674  }
675  return TDS_INVALID_TYPE;
676 }
677 
678 int
680 {
681 
682  switch (sql_type) {
683 
684  case SQL_CHAR:
685  case SQL_VARCHAR:
686  case SQL_LONGVARCHAR:
687  /* these types map to SQL_C_CHAR for compatibility with old applications */
688 #ifdef SQL_C_WCHAR
689  case SQL_WCHAR:
690  case SQL_WVARCHAR:
691  case SQL_WLONGVARCHAR:
692 #endif
693  return SQL_C_CHAR;
694  /* for compatibility numeric are converted to CHAR, not to structure */
695  case SQL_DECIMAL:
696  case SQL_NUMERIC:
697  return SQL_C_CHAR;
698 #ifdef SQL_GUID
699  case SQL_GUID:
700  /* TODO return SQL_C_CHAR for Sybase ?? */
701  return SQL_C_GUID;
702 #endif
703  case SQL_BIT:
704  return SQL_C_BIT;
705  case SQL_TINYINT:
706  return SQL_C_UTINYINT;
707  case SQL_SMALLINT:
708  return SQL_C_SSHORT;
709  case SQL_INTEGER:
710  return SQL_C_SLONG;
711  case SQL_BIGINT:
712  return SQL_C_SBIGINT;
713  case SQL_REAL:
714  return SQL_C_FLOAT;
715  case SQL_FLOAT:
716  case SQL_DOUBLE:
717  return SQL_C_DOUBLE;
718  case SQL_DATE:
719  case SQL_TYPE_DATE:
720  return SQL_C_TYPE_DATE;
721  case SQL_TIME:
722  case SQL_TYPE_TIME:
723  return SQL_C_TYPE_TIME;
724  case SQL_TIMESTAMP:
725  case SQL_TYPE_TIMESTAMP:
726  return SQL_C_TYPE_TIMESTAMP;
727  case SQL_BINARY:
728  case SQL_VARBINARY:
729  case SQL_LONGVARBINARY:
730  return SQL_C_BINARY;
731  /* TODO interval types */
732  default:
733  return 0;
734  }
735 }
736 
738 odbc_sql_to_server_type(TDSCONNECTION * conn, int sql_type, int sql_unsigned)
739 {
740 
741  switch (sql_type) {
742  case SQL_WCHAR:
743  if (IS_TDS7_PLUS(conn))
744  return XSYBNCHAR;
745  case SQL_CHAR:
746  return SYBCHAR;
747  case SQL_WVARCHAR:
748  if (IS_TDS7_PLUS(conn))
749  return XSYBNVARCHAR;
750  case SQL_VARCHAR:
751  return SYBVARCHAR;
752  case SQL_SS_VARIANT:
753  if (IS_TDS71_PLUS(conn))
754  return SYBVARIANT;
755  if (IS_TDS7_PLUS(conn))
756  return XSYBNVARCHAR;
757  return SYBVARCHAR;
758  case SQL_SS_XML:
759  if (IS_TDS72_PLUS(conn))
760  return SYBMSXML;
761  case SQL_WLONGVARCHAR:
762  if (IS_TDS7_PLUS(conn))
763  return SYBNTEXT;
764  /* fall thought */
765  case SQL_LONGVARCHAR:
766  return SYBTEXT;
767  case SQL_DECIMAL:
768  return SYBDECIMAL;
769  case SQL_NUMERIC:
770  return SYBNUMERIC;
771 #ifdef SQL_GUID
772  case SQL_GUID:
773  if (IS_TDS7_PLUS(conn))
774  return SYBUNIQUE;
775  return TDS_INVALID_TYPE;
776 #endif
777  case SQL_BIT:
778  if (IS_TDS7_PLUS(conn))
779  return SYBBITN;
780  return SYBBIT;
781  case SQL_TINYINT:
782  return SYBINT1;
783  case SQL_SMALLINT:
784  if (sql_unsigned && tds_capability_has_req(conn, TDS_REQ_DATA_UINT2))
785  return SYBUINT2;
786  return SYBINT2;
787  case SQL_INTEGER:
788  if (sql_unsigned && tds_capability_has_req(conn, TDS_REQ_DATA_UINT4))
789  return SYBUINT4;
790  return SYBINT4;
791  case SQL_BIGINT:
792  if (sql_unsigned && tds_capability_has_req(conn, TDS_REQ_DATA_UINT8))
793  return SYBUINT8;
794  return SYBINT8;
795  case SQL_REAL:
796  return SYBREAL;
797  case SQL_FLOAT:
798  case SQL_DOUBLE:
799  return SYBFLT8;
800  /* ODBC version 2 */
801  case SQL_DATE:
802  case SQL_TIME:
803  case SQL_TIMESTAMP:
804  /* ODBC version 3 */
805  case SQL_TYPE_DATE:
807  return SYB5BIGDATETIME;
809  return SYBDATE;
810  if (IS_TDS73_PLUS(conn))
811  return SYBMSDATE;
812  goto type_timestamp;
813  case SQL_TYPE_TIME:
815  return SYB5BIGTIME;
817  return SYBTIME;
818  if (IS_TDS73_PLUS(conn))
819  return SYBMSTIME;
820  type_timestamp:
821  case SQL_TYPE_TIMESTAMP:
822  if (IS_TDS73_PLUS(conn))
823  return SYBMSDATETIME2;
825  return SYB5BIGDATETIME;
826  return SYBDATETIME;
827  case SQL_SS_TIME2:
828  if (IS_TDS73_PLUS(conn))
829  return SYBMSTIME;
831  return SYB5BIGDATETIME;
832  return SYBDATETIME;
834  if (IS_TDS73_PLUS(conn))
835  return SYBMSDATETIMEOFFSET;
837  return SYB5BIGDATETIME;
838  return SYBDATETIME;
839  case SQL_BINARY:
840  return SYBBINARY;
841  case SQL_VARBINARY:
842  return SYBVARBINARY;
843  case SQL_LONGVARBINARY:
844  return SYBIMAGE;
845  /* TODO interval types */
846  default:
847  return TDS_INVALID_TYPE;
848  }
849 }
850 
851 /** Returns the version of the RDBMS in the ODBC format */
852 void
853 odbc_rdbms_version(TDSSOCKET * tds, char *pversion_string)
854 {
856  sprintf(pversion_string, "%.02d.%.02d.%.04d", (int) ((version & 0x7F000000) >> 24),
857  (int) ((version & 0x00FF0000) >> 16), (int) (version & 0x0000FFFF));
858 }
859 
860 /** Return length of parameter from parameter information */
861 SQLLEN
862 odbc_get_param_len(const struct _drecord *drec_axd,
863  const struct _drecord *drec_ixd, const TDS_DESC* axd,
864  SQLSETPOSIROW n_row)
865 {
866  SQLLEN len;
867  int size;
868  TDS_INTPTR len_offset;
869 
871  len_offset = axd->header.sql_desc_bind_type * n_row;
873  len_offset += *axd->header.sql_desc_bind_offset_ptr;
874  } else {
875  len_offset = sizeof(SQLLEN) * n_row;
876  }
877 #define LEN(ptr) *((SQLLEN*)(((char*)(ptr)) + len_offset))
878 
879  if (drec_axd->sql_desc_indicator_ptr && LEN(drec_axd->sql_desc_indicator_ptr) == SQL_NULL_DATA)
880  len = SQL_NULL_DATA;
881  else if (drec_axd->sql_desc_octet_length_ptr)
882  len = LEN(drec_axd->sql_desc_octet_length_ptr);
883  else {
884  len = 0;
885  /* TODO add XML if defined */
886  /* FIXME, other types available */
887  if (drec_axd->sql_desc_concise_type == SQL_C_CHAR || drec_axd->sql_desc_concise_type == SQL_C_WCHAR
888  || drec_axd->sql_desc_concise_type == SQL_C_BINARY) {
889  len = SQL_NTS;
890  } else {
891  int type = drec_axd->sql_desc_concise_type;
892  TDS_SERVER_TYPE server_type;
893 
894  if (type == SQL_C_DEFAULT)
896  server_type = odbc_c_to_server_type(type);
897 
898  /* FIXME check what happen to DATE/TIME types */
899  size = tds_get_size_by_type(server_type);
900  if (size > 0)
901  len = size;
902  }
903  }
904  return len;
905 #undef LEN
906 }
907 
908 #ifdef SQL_GUID
909 # define TYPE_NORMAL_SQL_GUID TYPE_NORMAL(SQL_GUID)
910 #else
911 # define TYPE_NORMAL_SQL_GUID
912 #endif
913 #define SQL_TYPES \
914  TYPE_NORMAL(SQL_BIT) \
915  TYPE_NORMAL(SQL_SMALLINT) \
916  TYPE_NORMAL(SQL_TINYINT) \
917  TYPE_NORMAL(SQL_INTEGER) \
918  TYPE_NORMAL(SQL_BIGINT) \
919 \
920  TYPE_NORMAL_SQL_GUID \
921 \
922  TYPE_NORMAL(SQL_BINARY) \
923  TYPE_NORMAL(SQL_VARBINARY) \
924  TYPE_NORMAL(SQL_LONGVARBINARY) \
925 \
926  TYPE_NORMAL(SQL_CHAR) \
927  TYPE_NORMAL(SQL_VARCHAR) \
928  TYPE_NORMAL(SQL_LONGVARCHAR) \
929  TYPE_NORMAL(SQL_WCHAR) \
930  TYPE_NORMAL(SQL_WVARCHAR) \
931  TYPE_NORMAL(SQL_WLONGVARCHAR) \
932 \
933  TYPE_NORMAL(SQL_DECIMAL) \
934  TYPE_NORMAL(SQL_NUMERIC) \
935 \
936  TYPE_NORMAL(SQL_FLOAT) \
937  TYPE_NORMAL(SQL_REAL) \
938  TYPE_NORMAL(SQL_DOUBLE)\
939 \
940  TYPE_NORMAL(SQL_SS_TIMESTAMPOFFSET) \
941  TYPE_NORMAL(SQL_SS_TIME2) \
942  TYPE_NORMAL(SQL_SS_XML) \
943  TYPE_NORMAL(SQL_SS_VARIANT) \
944  TYPE_NORMAL(SQL_TYPE_DATE) \
945 \
946  TYPE_VERBOSE_START(SQL_DATETIME) \
947  TYPE_VERBOSE_DATE(SQL_DATETIME, SQL_CODE_TIMESTAMP, SQL_TYPE_TIMESTAMP, SQL_TIMESTAMP) \
948  TYPE_VERBOSE_END(SQL_DATETIME)
949 
952 {
953 #define TYPE_NORMAL(t) case t: return type;
954 #define TYPE_VERBOSE_START(t) \
955  case t: switch (interval) {
956 #define TYPE_VERBOSE_DATE(t, interval, concise, old) \
957  case interval: return concise;
958 #define TYPE_VERBOSE_END(t) \
959  }
960 
961  switch (type) {
962  SQL_TYPES;
963  }
964  return 0;
965 #undef TYPE_NORMAL
966 #undef TYPE_VERBOSE_START
967 #undef TYPE_VERBOSE_DATE
968 #undef TYPE_VERBOSE_END
969 }
970 
971 /**
972  * Set concise type and all cascading field.
973  * @param concise_type concise type to set
974  * @param drec record to set. NULL to test error without setting
975  * @param check_only it <>0 (true) check only, do not set type
976  */
977 SQLRETURN
978 odbc_set_concise_sql_type(SQLSMALLINT concise_type, struct _drecord * drec, int check_only)
979 {
980  SQLSMALLINT type = concise_type, interval_code = 0;
981 
982 #define TYPE_NORMAL(t) case t: break;
983 #define TYPE_VERBOSE_START(t)
984 #define TYPE_VERBOSE_DATE(t, interval, concise, old) \
985  case old: concise_type = concise; \
986  case concise: type = t; interval_code = interval; break;
987 #define TYPE_VERBOSE_END(t)
988 
989  switch (type) {
990  SQL_TYPES;
991  default:
992  return SQL_ERROR;
993  }
994  if (!check_only) {
995  drec->sql_desc_concise_type = concise_type;
996  drec->sql_desc_type = type;
997  drec->sql_desc_datetime_interval_code = interval_code;
998 
999  switch (drec->sql_desc_type) {
1000  case SQL_NUMERIC:
1001  case SQL_DECIMAL:
1002  drec->sql_desc_precision = 38;
1003  drec->sql_desc_scale = 0;
1004  break;
1005  /* TODO finish */
1006  }
1007  }
1008  return SQL_SUCCESS;
1009 #undef TYPE_NORMAL
1010 #undef TYPE_VERBOSE_START
1011 #undef TYPE_VERBOSE_DATE
1012 #undef TYPE_VERBOSE_END
1013 }
1014 
1015 #ifdef SQL_C_GUID
1016 # define TYPE_NORMAL_SQL_C_GUID TYPE_NORMAL(SQL_C_GUID)
1017 #else
1018 # define TYPE_NORMAL_SQL_C_GUID
1019 #endif
1020 #define C_TYPES \
1021  TYPE_NORMAL(SQL_C_BIT) \
1022  TYPE_NORMAL(SQL_C_SHORT) \
1023  TYPE_NORMAL(SQL_C_TINYINT) \
1024  TYPE_NORMAL(SQL_C_UTINYINT) \
1025  TYPE_NORMAL(SQL_C_STINYINT) \
1026  TYPE_NORMAL(SQL_C_LONG) \
1027  TYPE_NORMAL(SQL_C_SBIGINT) \
1028  TYPE_NORMAL(SQL_C_UBIGINT) \
1029  TYPE_NORMAL(SQL_C_SSHORT) \
1030  TYPE_NORMAL(SQL_C_SLONG) \
1031  TYPE_NORMAL(SQL_C_USHORT) \
1032  TYPE_NORMAL(SQL_C_ULONG) \
1033 \
1034  TYPE_NORMAL_SQL_C_GUID \
1035  TYPE_NORMAL(SQL_C_DEFAULT) \
1036 \
1037  TYPE_NORMAL(SQL_C_BINARY) \
1038 \
1039  TYPE_NORMAL(SQL_C_CHAR) \
1040  TYPE_NORMAL(SQL_C_WCHAR) \
1041 \
1042  TYPE_NORMAL(SQL_C_NUMERIC) \
1043 \
1044  TYPE_NORMAL(SQL_C_FLOAT) \
1045  TYPE_NORMAL(SQL_C_DOUBLE)\
1046 \
1047  TYPE_VERBOSE_START(SQL_DATETIME) \
1048  TYPE_VERBOSE_DATE(SQL_DATETIME, SQL_CODE_DATE, SQL_C_TYPE_DATE, SQL_C_DATE) \
1049  TYPE_VERBOSE_DATE(SQL_DATETIME, SQL_CODE_TIME, SQL_C_TYPE_TIME, SQL_C_TIME) \
1050  TYPE_VERBOSE_DATE(SQL_DATETIME, SQL_CODE_TIMESTAMP, SQL_C_TYPE_TIMESTAMP, SQL_C_TIMESTAMP) \
1051  TYPE_VERBOSE_END(SQL_DATETIME) \
1052 \
1053  TYPE_VERBOSE_START(SQL_INTERVAL) \
1054  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_DAY, SQL_C_INTERVAL_DAY) \
1055  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_DAY_TO_HOUR, SQL_C_INTERVAL_DAY_TO_HOUR) \
1056  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_DAY_TO_MINUTE, SQL_C_INTERVAL_DAY_TO_MINUTE) \
1057  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_DAY_TO_SECOND, SQL_C_INTERVAL_DAY_TO_SECOND) \
1058  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_HOUR, SQL_C_INTERVAL_HOUR) \
1059  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_HOUR_TO_MINUTE, SQL_C_INTERVAL_HOUR_TO_MINUTE) \
1060  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_HOUR_TO_SECOND, SQL_C_INTERVAL_HOUR_TO_SECOND) \
1061  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_MINUTE, SQL_C_INTERVAL_MINUTE) \
1062  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_MINUTE_TO_SECOND, SQL_C_INTERVAL_MINUTE_TO_SECOND) \
1063  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_MONTH, SQL_C_INTERVAL_MONTH) \
1064  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_SECOND, SQL_C_INTERVAL_SECOND) \
1065  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_YEAR, SQL_C_INTERVAL_YEAR) \
1066  TYPE_VERBOSE(SQL_INTERVAL, SQL_CODE_YEAR_TO_MONTH, SQL_C_INTERVAL_YEAR_TO_MONTH) \
1067  TYPE_VERBOSE_END(SQL_INTERVAL)
1068 
1071 {
1072 #define TYPE_NORMAL(t) case t: return type;
1073 #define TYPE_VERBOSE_START(t) \
1074  case t: switch (interval) {
1075 #define TYPE_VERBOSE(t, interval, concise) \
1076  case interval: return concise;
1077 #define TYPE_VERBOSE_DATE(t, interval, concise, old) \
1078  case interval: return concise;
1079 #define TYPE_VERBOSE_END(t) \
1080  }
1081 
1082  switch (type) {
1083  C_TYPES;
1084  }
1085  return 0;
1086 #undef TYPE_NORMAL
1087 #undef TYPE_VERBOSE_START
1088 #undef TYPE_VERBOSE
1089 #undef TYPE_VERBOSE_DATE
1090 #undef TYPE_VERBOSE_END
1091 }
1092 
1093 /**
1094  * Set concise type and all cascading field.
1095  * @param concise_type concise type to set
1096  * @param drec record to set. NULL to test error without setting
1097  * @param check_only it <>0 (true) check only, do not set type
1098  */
1099 SQLRETURN
1100 odbc_set_concise_c_type(SQLSMALLINT concise_type, struct _drecord * drec, int check_only)
1101 {
1102  SQLSMALLINT type = concise_type, interval_code = 0;
1103 
1104 #define TYPE_NORMAL(t) case t: break;
1105 #define TYPE_VERBOSE_START(t)
1106 #define TYPE_VERBOSE(t, interval, concise) \
1107  case concise: type = t; interval_code = interval; break;
1108 #define TYPE_VERBOSE_DATE(t, interval, concise, old) \
1109  case concise: type = t; interval_code = interval; break; \
1110  case old: concise_type = concise; type = t; interval_code = interval; break;
1111 #define TYPE_VERBOSE_END(t)
1112 
1113  switch (type) {
1114  C_TYPES;
1115  default:
1116  return SQL_ERROR;
1117  }
1118  if (!check_only) {
1119  drec->sql_desc_concise_type = concise_type;
1120  drec->sql_desc_type = type;
1121  drec->sql_desc_datetime_interval_code = interval_code;
1122 
1123  switch (drec->sql_desc_type) {
1124  case SQL_C_NUMERIC:
1125  drec->sql_desc_length = 38;
1126  drec->sql_desc_precision = 38;
1127  drec->sql_desc_scale = 0;
1128  break;
1129  /* TODO finish */
1130  }
1131  }
1132  return SQL_SUCCESS;
1133 #undef TYPE_NORMAL
1134 #undef TYPE_VERBOSE_START
1135 #undef TYPE_VERBOSE
1136 #undef TYPE_VERBOSE_DATE
1137 #undef TYPE_VERBOSE_END
1138 }
1139 
1140 SQLLEN
1141 odbc_get_octet_len(int c_type, const struct _drecord *drec)
1142 {
1143  SQLLEN len;
1144 
1145  /* this shit is mine -- freddy77 */
1146  switch (c_type) {
1147  case SQL_C_CHAR:
1148  case SQL_C_WCHAR:
1149  case SQL_C_BINARY:
1150  len = drec->sql_desc_octet_length;
1151  break;
1152  case SQL_C_DATE:
1153  case SQL_C_TYPE_DATE:
1154  len = sizeof(DATE_STRUCT);
1155  break;
1156  case SQL_C_TIME:
1157  case SQL_C_TYPE_TIME:
1158  len = sizeof(TIME_STRUCT);
1159  break;
1160  case SQL_C_TIMESTAMP:
1161  case SQL_C_TYPE_TIMESTAMP:
1162  len = sizeof(TIMESTAMP_STRUCT);
1163  break;
1164  case SQL_C_NUMERIC:
1165  len = sizeof(SQL_NUMERIC_STRUCT);
1166  break;
1167  default:
1169  break;
1170  }
1171  return len;
1172 }
1173 
1174 void
1176 {
1177  /*
1178  * TODO we really need a column offset in the _sql_error structure so that caller can
1179  * invoke SQLGetDiagField to learn which column is failing
1180  */
1181  switch (err) {
1182  case TDS_CONVERT_NOAVAIL:
1183  odbc_errs_add(errs, "HY003", NULL);
1184  break;
1185  case TDS_CONVERT_SYNTAX:
1186  odbc_errs_add(errs, "22018", NULL);
1187  break;
1188  case TDS_CONVERT_OVERFLOW:
1189  odbc_errs_add(errs, "22003", NULL);
1190  break;
1191  case TDS_CONVERT_FAIL:
1192  odbc_errs_add(errs, "07006", NULL);
1193  break;
1194  case TDS_CONVERT_NOMEM:
1195  odbc_errs_add(errs, "HY001", NULL);
1196  break;
1197  }
1198 }
1199 
1200 /** @} */
ncbi::TMaskedQueryRegions mask
static TDSSOCKET * tds
Definition: collations.c:37
#define TDS_CONVERT_SYNTAX
Definition: convert.h:78
#define TDS_CONVERT_OVERFLOW
Definition: convert.h:80
#define TDS_CONVERT_NOMEM
Definition: convert.h:79
#define TDS_CONVERT_NOAVAIL
Definition: convert.h:77
#define TDS_CONVERT_FAIL
Definition: convert.h:76
static CS_CONNECTION * conn
Definition: ct_dynamic.c:25
@ TDS_REQ_DATA_UINT4
Definition: enum_cap.h:61
@ TDS_REQ_DATA_BIGTIME
Definition: enum_cap.h:89
@ TDS_REQ_DATA_UINT8
Definition: enum_cap.h:62
@ TDS_REQ_DATA_DATE
Definition: enum_cap.h:70
@ TDS_REQ_DATA_UINT2
Definition: enum_cap.h:60
@ TDS_REQ_DATA_BIGDATETIME
Definition: enum_cap.h:88
@ TDS_REQ_DATA_TIME
Definition: enum_cap.h:71
std::ofstream out("events_result.xml")
main entry point for tests
static int type
Definition: getdata.c:31
#define NULL
Definition: ncbistd.hpp:225
#define FAR
Definition: ncbistd.hpp:278
DSTR * tds_dstr_setlen(DSTR *s, size_t length)
limit length of string, MUST be <= current length
Definition: tdsstring.c:146
DSTR * tds_dstr_copyn(DSTR *s, const char *src, size_t length) TDS_WUR
Set string to a given buffer of characters.
Definition: tdsstring.c:78
DSTR * tds_dstr_alloc(DSTR *s, size_t length) TDS_WUR
allocate space for length char
Definition: tdsstring.c:166
static char * tds_dstr_buf(DSTR *s)
Returns a buffer to edit the string.
Definition: string.h:59
unsigned int
A callback function used to compare two keys in a database.
Definition: types.hpp:1210
SQLRETURN odbc_set_concise_sql_type(SQLSMALLINT concise_type, struct _drecord *drec, int check_only)
Set concise type and all cascading field.
Definition: odbc_util.c:978
SQLRETURN odbc_set_concise_c_type(SQLSMALLINT concise_type, struct _drecord *drec, int check_only)
Set concise type and all cascading field.
Definition: odbc_util.c:1100
int odbc_set_stmt_query(TDS_STMT *stmt, const ODBC_CHAR *sql, ssize_t sql_len _WIDE)
Definition: odbc_util.c:60
DSTR * odbc_dstr_copy(TDS_DBC *dbc, DSTR *s, int size, const ODBC_CHAR *str)
Definition: odbc_util.c:265
TDS_SERVER_TYPE odbc_c_to_server_type(int c_type)
Pass this an SQL_C_* type and get a SYB* type which most closely corresponds to the SQL_C_* type.
Definition: odbc_util.c:605
void odbc_set_return_params(struct _hstmt *stmt, unsigned int n_row)
Definition: odbc_util.c:520
int odbc_sql_to_c_type_default(int sql_type)
Definition: odbc_util.c:679
SQLSMALLINT odbc_get_concise_sql_type(SQLSMALLINT type, SQLSMALLINT interval)
Definition: odbc_util.c:951
SQLLEN odbc_get_param_len(const struct _drecord *drec_axd, const struct _drecord *drec_ixd, const TDS_DESC *axd, SQLSETPOSIROW n_row)
Return length of parameter from parameter information.
Definition: odbc_util.c:862
#define SQL_TYPES
Definition: odbc_util.c:913
SQLRETURN odbc_set_string_flag(TDS_DBC *dbc, SQLPOINTER buffer, SQLINTEGER cbBuffer, void FAR *pcbBuffer, const char *s, ssize_t len, int flag)
Copy a string to client setting size according to ODBC convenction.
Definition: odbc_util.c:282
void odbc_set_return_status(struct _hstmt *stmt, unsigned int n_row)
Definition: odbc_util.c:479
#define C_TYPES
Definition: odbc_util.c:1020
void odbc_convert_err_set(struct _sql_errors *errs, TDS_INT err)
Definition: odbc_util.c:1175
TDS_SERVER_TYPE odbc_sql_to_server_type(TDSCONNECTION *conn, int sql_type, int sql_unsigned)
Definition: odbc_util.c:738
SQLLEN odbc_get_octet_len(int c_type, const struct _drecord *drec)
Definition: odbc_util.c:1141
void odbc_rdbms_version(TDSSOCKET *tds, char *pversion_string)
Returns the version of the RDBMS in the ODBC format.
Definition: odbc_util.c:853
size_t odbc_get_string_size(ssize_t size, const ODBC_CHAR *str _WIDE)
Definition: odbc_util.c:92
SQLSMALLINT odbc_get_concise_c_type(SQLSMALLINT type, SQLSMALLINT interval)
Definition: odbc_util.c:1070
@ to_client
Definition: iconv.h:70
@ to_server
Definition: iconv.h:70
#define TDS_ENCODING_MEMCPY
Definition: iconv.h:95
char * buf
int i
if(yy_accept[yy_current_state])
int len
static MDB_envinfo info
Definition: mdb_load.c:37
static int version
Definition: mdb_load.c:29
const struct ncbi::grid::netcache::search::fields::SIZE size
#define SIZEOF_SQLWCHAR
Definition: ncbiconf_msvc.h:48
int ssize_t
Definition: ncbiconf_msvc.h:92
#define ODBC_CHAR
Definition: odbc.h:617
void odbc_errs_add(struct _sql_errors *errs, const char *sqlstate, const char *msg)
add an error to list
Definition: error.c:382
#define sqlwcslen(s)
Definition: odbc.h:719
#define SQLLEN
Definition: odbc.h:52
SQLINTEGER odbc_tds2sql(TDS_STMT *stmt, TDSCOLUMN *curcol, int srctype, TDS_CHAR *src, TDS_UINT srclen, int desttype, TDS_CHAR *dest, SQLUINTEGER destlen, const struct _drecord *drec_ixd)
#define _WIDE
Definition: odbc.h:616
#define SQLSETPOSIROW
Definition: odbc.h:57
#define LEN(ptr)
#define SQL_SS_TIME2
Definition: odbcss.h:81
#define SQL_SS_TIMESTAMPOFFSET
Definition: odbcss.h:85
#define SQL_SS_VARIANT
Definition: odbcss.h:65
#define SQL_SS_XML
Definition: odbcss.h:73
#define memmove(a, b, c)
static pcre_uint8 * buffer
Definition: pcretest.c:1051
TDS_SERVER_TYPE
Definition: proto.h:161
@ SYBVARIANT
Definition: proto.h:200
@ SYBUINT8
Definition: proto.h:215
@ SYBUNIQUE
Definition: proto.h:199
@ XSYBNVARCHAR
Definition: proto.h:195
@ SYBUINT2
Definition: proto.h:213
@ SYBUINT4
Definition: proto.h:214
@ XSYBNCHAR
Definition: proto.h:196
@ SYB5BIGTIME
Definition: proto.h:231
@ SYBMSXML
Definition: proto.h:202
@ SYB5BIGDATETIME
Definition: proto.h:230
static char sql[1024]
Definition: putdata.c:19
static HSTMT stmt
Definition: rebindpar.c:12
#define tds_free_param_results
#define tds_iconv
#define tds_get_size_by_type
#define tds_get_conversion_type
#define MASK(n)
#define SQL_REAL
Definition: sql.h:173
#define SQL_FLOAT
Definition: sql.h:172
#define SQL_CHAR
Definition: sql.h:167
#define SQL_SUCCESS
Definition: sql.h:31
#define SQL_TYPE_TIMESTAMP
Definition: sql.h:184
#define SQL_SMALLINT
Definition: sql.h:171
#define SQL_NUMERIC
Definition: sql.h:168
#define SQL_TYPE_DATE
Definition: sql.h:182
#define SQL_DECIMAL
Definition: sql.h:169
#define SQL_INTEGER
Definition: sql.h:170
#define SQL_TYPE_TIME
Definition: sql.h:183
#define SQL_SUCCESS_WITH_INFO
Definition: sql.h:32
#define SQL_NTS
Definition: sql.h:49
#define SQL_NULL_DATA
Definition: sql.h:29
#define SQL_DOUBLE
Definition: sql.h:174
#define SQL_VARCHAR
Definition: sql.h:178
#define SQL_ERROR
Definition: sql.h:36
#define SQL_C_INTERVAL_MONTH
Definition: sqlext.h:533
#define SQL_C_INTERVAL_SECOND
Definition: sqlext.h:537
#define SQL_C_INTERVAL_HOUR
Definition: sqlext.h:535
#define SQL_PARAM_INPUT
Definition: sqlext.h:1852
#define SQL_C_INTERVAL_DAY
Definition: sqlext.h:534
#define SQL_C_DOUBLE
Definition: sqlext.h:515
#define SQL_C_TYPE_TIMESTAMP
Definition: sqlext.h:531
#define SQL_C_INTERVAL_MINUTE
Definition: sqlext.h:536
#define SQL_LONGVARBINARY
Definition: sqlext.h:435
#define SQL_LONGVARCHAR
Definition: sqlext.h:432
#define SQL_C_TYPE_DATE
Definition: sqlext.h:529
#define SQL_C_ULONG
Definition: sqlext.h:556
#define SQL_C_TINYINT
Definition: sqlext.h:552
#define SQL_C_SLONG
Definition: sqlext.h:553
#define SQL_C_INTERVAL_HOUR_TO_SECOND
Definition: sqlext.h:543
#define SQL_C_GUID
Definition: sqlext.h:567
#define SQL_C_TYPE_TIME
Definition: sqlext.h:530
#define SQL_C_BINARY
Definition: sqlext.h:546
#define SQL_C_DEFAULT
Definition: sqlext.h:519
#define SQL_C_SHORT
Definition: sqlext.h:513
#define SQL_C_LONG
Definition: sqlext.h:512
#define SQL_C_STINYINT
Definition: sqlext.h:555
#define SQL_C_TIME
Definition: sqlext.h:526
#define SQL_C_FLOAT
Definition: sqlext.h:514
#define SQL_TINYINT
Definition: sqlext.h:437
#define SQL_BINARY
Definition: sqlext.h:433
#define SQL_C_SSHORT
Definition: sqlext.h:554
#define SQL_VARBINARY
Definition: sqlext.h:434
#define SQL_C_BIT
Definition: sqlext.h:547
#define SQL_DATE
Definition: sqlext.h:426
#define SQL_C_UBIGINT
Definition: sqlext.h:550
#define SQL_C_INTERVAL_YEAR_TO_MONTH
Definition: sqlext.h:538
#define SQL_C_UTINYINT
Definition: sqlext.h:558
#define SQL_C_INTERVAL_HOUR_TO_MINUTE
Definition: sqlext.h:542
#define SQL_BIT
Definition: sqlext.h:438
#define SQL_C_INTERVAL_YEAR
Definition: sqlext.h:532
#define SQL_C_DATE
Definition: sqlext.h:525
#define SQL_C_INTERVAL_DAY_TO_MINUTE
Definition: sqlext.h:540
#define SQL_C_USHORT
Definition: sqlext.h:557
#define SQL_C_SBIGINT
Definition: sqlext.h:549
#define SQL_C_TIMESTAMP
Definition: sqlext.h:527
#define SQL_BIND_BY_COLUMN
Definition: sqlext.h:338
#define SQL_C_INTERVAL_DAY_TO_SECOND
Definition: sqlext.h:541
#define SQL_GUID
Definition: sqlext.h:440
#define SQL_TIME
Definition: sqlext.h:430
#define SQL_C_NUMERIC
Definition: sqlext.h:517
#define SQL_C_INTERVAL_MINUTE_TO_SECOND
Definition: sqlext.h:544
#define SQL_BIGINT
Definition: sqlext.h:436
#define SQL_C_CHAR
Definition: sqlext.h:511
#define SQL_C_INTERVAL_DAY_TO_HOUR
Definition: sqlext.h:539
#define SQL_TIMESTAMP
Definition: sqlext.h:431
struct tagSQL_NUMERIC_STRUCT SQL_NUMERIC_STRUCT
struct tagDATE_STRUCT DATE_STRUCT
void * SQLPOINTER
Definition: sqltypes.h:195
WCHAR SQLWCHAR
Definition: sqltypes.h:458
long SQLINTEGER
Definition: sqltypes.h:176
struct tagTIMESTAMP_STRUCT TIMESTAMP_STRUCT
struct tagTIME_STRUCT TIME_STRUCT
signed short int SQLSMALLINT
Definition: sqltypes.h:201
SQLSMALLINT SQLRETURN
Definition: sqltypes.h:210
#define SQL_WCHAR
Definition: sqlucode.h:14
#define SQL_WVARCHAR
Definition: sqlucode.h:15
#define SQL_C_WCHAR
Definition: sqlucode.h:17
#define SQL_WLONGVARCHAR
Definition: sqlucode.h:16
#define assert(x)
Definition: srv_diag.hpp:58
static const char * str(char *buf, int n)
Definition: stats.c:84
SQLSMALLINT sql_desc_count
Definition: odbc.h:157
SQLINTEGER * sql_desc_bind_offset_ptr
Definition: odbc.h:160
SQLINTEGER sql_desc_bind_type
Definition: odbc.h:154
Definition: odbc.h:164
SQLINTEGER * sql_desc_octet_length_ptr
Definition: odbc.h:188
SQLINTEGER * sql_desc_indicator_ptr
Definition: odbc.h:176
SQLINTEGER sql_desc_octet_length
Definition: odbc.h:187
SQLUINTEGER sql_desc_length
Definition: odbc.h:178
SQLSMALLINT sql_desc_scale
Definition: odbc.h:192
SQLPOINTER sql_desc_data_ptr
Definition: odbc.h:171
SQLSMALLINT sql_desc_precision
Definition: odbc.h:190
SQLSMALLINT sql_desc_datetime_interval_code
Definition: odbc.h:172
SQLSMALLINT sql_desc_type
Definition: odbc.h:196
SQLSMALLINT sql_desc_concise_type
Definition: odbc.h:170
Definition: odbc.h:282
Definition: odbc.h:205
struct _drecord * records
Definition: odbc.h:214
struct _dheader header
Definition: odbc.h:213
Definition: odbc.h:390
Metadata about columns in regular and compute rows.
Definition: tds.h:761
TDS_INT column_size
maximun size of data.
Definition: tds.h:766
unsigned char * column_data
Definition: tds.h:793
TDS_SERVER_TYPE column_type
This type can be different from wire type because conversion (e.g.
Definition: tds.h:768
struct tds_column::@124 on_server
TDS_INT column_cur_size
size written in variable (ie: char, text, binary).
Definition: tds.h:811
TDS_INT column_text_sqlgetdatapos
Definition: tds.h:822
TDS_UINT product_version
version of product (Sybase/MS and full version)
Definition: tds.h:1139
Structure to hold a string.
Definition: tds.h:116
unsigned char min_bytes_per_char
Definition: tds.h:686
unsigned int e2big
Definition: iconv.h:79
Hold information for any results.
Definition: tds.h:842
Information for a server connection.
Definition: tds.h:1211
TDS_INT ret_status
return status from store procedure
Definition: tds.h:1272
TDSRESULTINFO * current_results
Current query information.
Definition: tds.h:1263
TDS_TINYINT has_status
true is ret_status is valid
Definition: tds.h:1270
TDSCONNECTION conn[1]
Definition: tds.h:1215
TDS_ENCODING charset
Definition: iconv.h:86
unsigned int flags
Definition: iconv.h:96
struct tdsiconvdir to from
Definition: iconv.h:93
TDS_ERRNO_MESSAGE_FLAGS suppress
Definition: iconv.h:106
Definition: type.c:6
#define SYBMSDATE
Definition: sybdb.h:222
#define SYBINT4
Definition: sybdb.h:170
#define SYBNUMERIC
Definition: sybdb.h:202
#define SYBVARCHAR
Definition: sybdb.h:162
#define SYBTEXT
Definition: sybdb.h:182
#define SYBDATE
Definition: sybdb.h:214
#define SYBINT8
Definition: sybdb.h:172
#define SYBMSDATETIME2
Definition: sybdb.h:226
#define SYBNTEXT
Definition: sybdb.h:184
#define SYBIMAGE
Definition: sybdb.h:186
#define SYBMSDATETIMEOFFSET
Definition: sybdb.h:228
#define SYBINT1
Definition: sybdb.h:166
#define SYBDECIMAL
Definition: sybdb.h:204
#define SYBCHAR
Definition: sybdb.h:160
#define SYBREAL
Definition: sybdb.h:194
#define SYBBITN
Definition: sybdb.h:180
#define SYBBINARY
Definition: sybdb.h:196
#define SYBTIME
Definition: sybdb.h:216
#define SYBMSTIME
Definition: sybdb.h:224
#define SYBDATETIME
Definition: sybdb.h:176
#define SYBVARBINARY
Definition: sybdb.h:200
#define SYBFLT8
Definition: sybdb.h:174
#define SYBINT2
Definition: sybdb.h:168
#define SYBBIT
Definition: sybdb.h:178
#define IS_TDS71_PLUS(x)
Definition: tds.h:1709
#define tds_capability_has_req(conn, cap)
Definition: tds.h:1696
tds_sysdep_int32_type TDS_INT
Definition: tds.h:149
#define TDS_INVALID_TYPE
Definition: tds.h:160
#define IS_TDS50(x)
Definition: tds.h:1701
tds_sysdep_intptr_type TDS_INTPTR
Definition: tds.h:155
#define IS_TDS72_PLUS(x)
Definition: tds.h:1710
#define IS_TDS7_PLUS(x)
Definition: tds.h:1708
char TDS_CHAR
Definition: tds.h:144
tds_sysdep_uint32_type TDS_UINT
Definition: tds.h:150
#define IS_TDS73_PLUS(x)
Definition: tds.h:1711
else result
Definition: token2.c:20
static HDBC dbc
Definition: transaction2.c:39
Modified on Tue Dec 05 02:17:48 2023 by modify_doxy.py rev. 669887