53 #ifdef ENABLE_ODBC_WIDE
54 static DSTR *odbc_iso2utf(
DSTR *res,
const char *s,
size_t len);
64 #ifdef ENABLE_ODBC_WIDE
67 sql_len = strlen((
const char*)
sql);
69 else if (sql_len <= 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;
81 stmt->curr_param_row = 0;
82 stmt->num_param_rows = 1;
83 stmt->need_reprepare = 0;
96 #ifdef ENABLE_ODBC_WIDE
99 return strlen((
const char*)
str);
102 return (
unsigned int)
size;
108 #ifdef ENABLE_ODBC_WIDE
110 odbc_iso2utf(
DSTR *res,
const char *s,
size_t len)
112 size_t i, o_len =
len + 1;
117 if ((s[
i] & 0x80) != 0)
125 unsigned char u = (
unsigned char) *s++;
126 if ((u & 0x80) != 0) {
127 *p++ = 0xc0 | (0x1f & (u >> 6));
128 *p++ = 0x80 | (0x3f & u);
140 size_t i, o_len =
len + 1;
143 #if SIZEOF_SQLWCHAR > 2
144 # define MASK(n) ((0xffffffffu << (n)) & 0xffffffffu)
146 # define MASK(n) ((0xffffu << (n)) & 0xffffu)
150 for (
i = 0;
i <
len; ++
i) {
151 if ((s[
i] &
MASK(7)) == 0)
154 if ((s[
i] &
MASK(11)) == 0)
157 #if SIZEOF_SQLWCHAR > 2
158 if ((s[
i] &
MASK(16)) == 0)
161 if ((s[
i] &
MASK(21)) == 0)
164 if ((s[
i] &
MASK(26)) == 0)
176 if ((u &
MASK(7)) == 0) {
180 if ((u &
MASK(11)) == 0) {
181 *p++ = 0xc0 | (0x1f & (u >> 6));
183 #if SIZEOF_SQLWCHAR > 2
184 if ((u &
MASK(16)) == 0) {
185 *p++ = 0xe0 | (0x0f & (u >> 12));
187 if ((u &
MASK(21)) == 0) {
188 if ((u &
MASK(26)) == 0) {
189 *p++ = 0xfc | (0x01 & (u >> 30));
190 *p++ = 0x80 | (0x3f & (u >> 24));
192 *p++ = 0xf8 | (0x03 & (u >> 24));
194 *p++ = 0x80 | (0x3f & (u >> 18));
196 *p++ = 0xf0 | (0x07 & (u >> 18));
198 *p++ = 0x80 | (0x3f & (u >> 12));
200 *p++ = 0x80 | (0x3f & (u >> 6));
202 *p++ = 0xe0 | (0x0f & (u >> 12));
203 *p++ = 0x80 | (0x3f & (u >> 6));
206 *p++ = 0x80 | (0x3f & u);
223 return odbc_iso2utf(res, s,
len);
250 #ifdef ENABLE_ODBC_WIDE
259 return odbc_wide2utf(s,
str->wide,
len);
261 return odbc_mb2utf(
dbc, s,
str->mb,
len);
288 #if !defined(NDEBUG) && defined(ENABLE_ODBC_WIDE)
289 ptrdiff_t initial_size;
298 #ifdef ENABLE_ODBC_WIDE
299 if ((flag & 1) != 0) {
301 const unsigned char *p = (
const unsigned char*) s;
307 initial_size = cbBuffer;
314 if (!(p[0] & 0x80)) {
316 }
else if ((p[0] & 0xe0) == 0xc0) {
318 }
else if ((p[0] & 0xf0) == 0xe0) {
320 }
else if ((p[0] & 0xf8) == 0xf0) {
322 }
else if ((p[0] & 0xfc) == 0xf8) {
332 u = (u << 6) | (*p++ & 0x3f);
346 if (dest && cbBuffer) {
353 }
else if (!
dbc || !
dbc->mb_conv) {
355 const unsigned char *p = (
const unsigned char*) s;
356 unsigned char *dest = (
unsigned char*)
buffer;
359 initial_size = cbBuffer;
366 if (!(p[0] & 0x80)) {
368 }
else if ((p[0] & 0xe0) == 0xc0) {
370 }
else if ((p[0] & 0xf0) == 0xe0) {
372 }
else if ((p[0] & 0xf8) == 0xf0) {
374 }
else if ((p[0] & 0xfc) == 0xf8) {
384 u = (u << 6) | (*p++ & 0x3f);
389 *dest++ = u > 0x100 ?
'?' : u;
396 || (dest-(
unsigned char*)
buffer <= out_len && cbBuffer <= 1));
398 if (dest && cbBuffer) {
406 if (
len >= cbBuffer) {
429 if (cbBuffer &&
tds_iconv(
dbc->tds_socket, char_conv,
to_client, &ib, &il, &ob, &ol) == (
size_t)-1 && errno != E2BIG)
431 out_len = cbBuffer - (
int) ol;
434 ol =
sizeof(discard);
437 if (
tds_iconv(
dbc->tds_socket, char_conv,
to_client, &ib, &il, &ob, &ol) == (size_t)-1 && errno != E2BIG)
439 ol =
sizeof(discard) - ol;
441 if (out_len < cbBuffer) {
442 size_t max_copy = cbBuffer - out_len;
445 memcpy(((
char *)
buffer) + out_len, discard, max_copy);
451 if (
buffer && cbBuffer > 0)
452 ((
char *)
buffer)[cbBuffer-1 < out_len ? cbBuffer-1:out_len] = 0;
456 if (
len >= cbBuffer) {
500 data_ptr += len_offset;
502 len_offset =
sizeof(
SQLLEN) * n_row;
505 #define LEN(ptr) *((SQLLEN*)(((char*)(ptr)) + len_offset))
525 int i_begin =
stmt->prepared_query_is_func ? 1 : 0;
527 int nparam = i_begin;
534 for (
i = 0;
i <
info->num_cols; ++
i) {
536 const struct _drecord *drec_apd, *drec_ipd;
551 drec_apd = &axd->
records[nparam];
552 drec_ipd = &
stmt->ipd->records[nparam];
562 data_ptr += len_offset;
564 len_offset =
sizeof(
SQLLEN) * n_row;
567 #define LEN(ptr) *((SQLLEN*)(((char*)(ptr)) + len_offset))
624 #if (ODBCVER >= 0x0300)
856 sprintf(pversion_string,
"%.02d.%.02d.%.04d", (
int) ((
version & 0x7F000000) >> 24),
857 (
int) ((
version & 0x00FF0000) >> 16), (
int) (
version & 0x0000FFFF));
875 len_offset =
sizeof(
SQLLEN) * n_row;
877 #define LEN(ptr) *((SQLLEN*)(((char*)(ptr)) + len_offset))
909 # define TYPE_NORMAL_SQL_GUID TYPE_NORMAL(SQL_GUID)
911 # define TYPE_NORMAL_SQL_GUID
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) \
920 TYPE_NORMAL_SQL_GUID \
922 TYPE_NORMAL(SQL_BINARY) \
923 TYPE_NORMAL(SQL_VARBINARY) \
924 TYPE_NORMAL(SQL_LONGVARBINARY) \
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) \
933 TYPE_NORMAL(SQL_DECIMAL) \
934 TYPE_NORMAL(SQL_NUMERIC) \
936 TYPE_NORMAL(SQL_FLOAT) \
937 TYPE_NORMAL(SQL_REAL) \
938 TYPE_NORMAL(SQL_DOUBLE)\
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) \
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)
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) \
966 #undef TYPE_VERBOSE_START
967 #undef TYPE_VERBOSE_DATE
968 #undef TYPE_VERBOSE_END
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)
1010 #undef TYPE_VERBOSE_START
1011 #undef TYPE_VERBOSE_DATE
1012 #undef TYPE_VERBOSE_END
1016 # define TYPE_NORMAL_SQL_C_GUID TYPE_NORMAL(SQL_C_GUID)
1018 # define TYPE_NORMAL_SQL_C_GUID
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) \
1034 TYPE_NORMAL_SQL_C_GUID \
1035 TYPE_NORMAL(SQL_C_DEFAULT) \
1037 TYPE_NORMAL(SQL_C_BINARY) \
1039 TYPE_NORMAL(SQL_C_CHAR) \
1040 TYPE_NORMAL(SQL_C_WCHAR) \
1042 TYPE_NORMAL(SQL_C_NUMERIC) \
1044 TYPE_NORMAL(SQL_C_FLOAT) \
1045 TYPE_NORMAL(SQL_C_DOUBLE)\
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) \
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)
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) \
1087 #undef TYPE_VERBOSE_START
1089 #undef TYPE_VERBOSE_DATE
1090 #undef TYPE_VERBOSE_END
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)
1134 #undef TYPE_VERBOSE_START
1136 #undef TYPE_VERBOSE_DATE
1137 #undef TYPE_VERBOSE_END
#define TDS_CONVERT_SYNTAX
#define TDS_CONVERT_OVERFLOW
#define TDS_CONVERT_NOMEM
#define TDS_CONVERT_NOAVAIL
static CS_CONNECTION * conn
@ TDS_REQ_DATA_BIGDATETIME
std::ofstream out("events_result.xml")
main entry point for tests
DSTR * tds_dstr_setlen(DSTR *s, size_t length)
limit length of string, MUST be <= current length
DSTR * tds_dstr_copyn(DSTR *s, const char *src, size_t length) TDS_WUR
Set string to a given buffer of characters.
DSTR * tds_dstr_alloc(DSTR *s, size_t length) TDS_WUR
allocate space for length char
static char * tds_dstr_buf(DSTR *s)
Returns a buffer to edit the string.
unsigned int
A callback function used to compare two keys in a database.
SQLRETURN odbc_set_concise_sql_type(SQLSMALLINT concise_type, struct _drecord *drec, int check_only)
Set concise type and all cascading field.
SQLRETURN odbc_set_concise_c_type(SQLSMALLINT concise_type, struct _drecord *drec, int check_only)
Set concise type and all cascading field.
int odbc_set_stmt_query(TDS_STMT *stmt, const ODBC_CHAR *sql, ssize_t sql_len _WIDE)
DSTR * odbc_dstr_copy(TDS_DBC *dbc, DSTR *s, int size, const ODBC_CHAR *str)
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.
void odbc_set_return_params(struct _hstmt *stmt, unsigned int n_row)
int odbc_sql_to_c_type_default(int sql_type)
SQLSMALLINT odbc_get_concise_sql_type(SQLSMALLINT type, SQLSMALLINT interval)
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.
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.
void odbc_set_return_status(struct _hstmt *stmt, unsigned int n_row)
void odbc_convert_err_set(struct _sql_errors *errs, TDS_INT err)
TDS_SERVER_TYPE odbc_sql_to_server_type(TDSCONNECTION *conn, int sql_type, int sql_unsigned)
SQLLEN odbc_get_octet_len(int c_type, const struct _drecord *drec)
void odbc_rdbms_version(TDSSOCKET *tds, char *pversion_string)
Returns the version of the RDBMS in the ODBC format.
size_t odbc_get_string_size(ssize_t size, const ODBC_CHAR *str _WIDE)
SQLSMALLINT odbc_get_concise_c_type(SQLSMALLINT type, SQLSMALLINT interval)
#define TDS_ENCODING_MEMCPY
if(yy_accept[yy_current_state])
const struct ncbi::grid::netcache::search::fields::SIZE size
void odbc_errs_add(struct _sql_errors *errs, const char *sqlstate, const char *msg)
add an error to list
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 SQL_SS_TIMESTAMPOFFSET
static pcre_uint8 * buffer
#define tds_free_param_results
#define tds_get_size_by_type
#define tds_get_conversion_type
#define SQL_TYPE_TIMESTAMP
#define SQL_SUCCESS_WITH_INFO
#define SQL_C_INTERVAL_MONTH
#define SQL_C_INTERVAL_SECOND
#define SQL_C_INTERVAL_HOUR
#define SQL_C_INTERVAL_DAY
#define SQL_C_TYPE_TIMESTAMP
#define SQL_C_INTERVAL_MINUTE
#define SQL_LONGVARBINARY
#define SQL_C_INTERVAL_HOUR_TO_SECOND
#define SQL_C_INTERVAL_YEAR_TO_MONTH
#define SQL_C_INTERVAL_HOUR_TO_MINUTE
#define SQL_C_INTERVAL_YEAR
#define SQL_C_INTERVAL_DAY_TO_MINUTE
#define SQL_BIND_BY_COLUMN
#define SQL_C_INTERVAL_DAY_TO_SECOND
#define SQL_C_INTERVAL_MINUTE_TO_SECOND
#define SQL_C_INTERVAL_DAY_TO_HOUR
struct tagSQL_NUMERIC_STRUCT SQL_NUMERIC_STRUCT
struct tagDATE_STRUCT DATE_STRUCT
struct tagTIMESTAMP_STRUCT TIMESTAMP_STRUCT
struct tagTIME_STRUCT TIME_STRUCT
signed short int SQLSMALLINT
static const char * str(char *buf, int n)
SQLINTEGER * sql_desc_octet_length_ptr
SQLINTEGER * sql_desc_indicator_ptr
SQLINTEGER sql_desc_octet_length
SQLUINTEGER sql_desc_length
SQLSMALLINT sql_desc_scale
SQLPOINTER sql_desc_data_ptr
SQLSMALLINT sql_desc_precision
SQLSMALLINT sql_desc_datetime_interval_code
SQLSMALLINT sql_desc_type
SQLSMALLINT sql_desc_concise_type
struct _drecord * records
Metadata about columns in regular and compute rows.
TDS_INT column_size
maximun size of data.
unsigned char * column_data
TDS_SERVER_TYPE column_type
This type can be different from wire type because conversion (e.g.
struct tds_column::@124 on_server
TDS_INT column_cur_size
size written in variable (ie: char, text, binary).
TDS_INT column_text_sqlgetdatapos
TDS_UINT product_version
version of product (Sybase/MS and full version)
Structure to hold a string.
unsigned char min_bytes_per_char
Hold information for any results.
Information for a server connection.
TDS_INT ret_status
return status from store procedure
TDSRESULTINFO * current_results
Current query information.
TDS_TINYINT has_status
true is ret_status is valid
struct tdsiconvdir to from
TDS_ERRNO_MESSAGE_FLAGS suppress
#define SYBMSDATETIMEOFFSET
#define tds_capability_has_req(conn, cap)
tds_sysdep_int32_type TDS_INT
tds_sysdep_intptr_type TDS_INTPTR
tds_sysdep_uint32_type TDS_UINT