24 #define TDS_DONT_DEFINE_DEFAULT_FUNCTIONS
25 #include <freetds/tds.h>
26 #include <freetds/thread.h>
27 #include <freetds/data.h>
29 #if defined(UNIXODBC) || defined(_WIN32) || defined(TDS_NO_DM)
32 #if defined(UNIXODBC) || defined(_WIN32)
38 #ifdef HAVE_IODBCINST_H
39 #include <iodbcinst.h>
49 #define SQLULEN SQLUINTEGER
52 #define SQLLEN SQLINTEGER
56 #ifndef HAVE_SQLSETPOSIROW
57 #define SQLSETPOSIROW SQLUSMALLINT
60 #ifndef HAVE_SQLROWOFFSET
61 #define SQLROWOFFSET SQLLEN
64 #ifndef HAVE_SQLROWSETSIZE
65 #define SQLROWSETSIZE SQLULEN
76 #include <freetds/pushvis.h>
78 #define ODBC_API SQL_API __attribute__((visibility("default")))
79 #elif defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
80 #define ODBC_API SQL_API __attribute__((externally_visible))
82 #define ODBC_API SQL_API
85 #if (defined(_WIN32) || defined(__CYGWIN__)) && defined(__GNUC__)
86 # define ODBC_PUBLIC __attribute__((dllexport))
91 #define ODBC_MAX(a,b) ( (a) > (b) ? (a) : (b) )
92 #define ODBC_MIN(a,b) ( (a) < (b) ? (a) : (b) )
116 #if ENABLE_EXTRA_CHECKS
122 #define ODBC_RETURN(handle, rc) \
123 do { odbc_check_struct_extra(handle); \
124 return handle->errs.lastrc = (rc); } while(0)
125 #define ODBC_RETURN_(handle) \
126 do { odbc_check_struct_extra(handle); \
127 return handle->errs.lastrc; } while(0)
129 #define ODBC_EXIT(handle, rc) \
130 do { SQLRETURN _odbc_rc = handle->errs.lastrc = (rc); \
131 odbc_check_struct_extra(handle); \
132 tds_mutex_unlock(&handle->mtx); \
133 return _odbc_rc; } while(0)
134 #define ODBC_EXIT_(handle) \
135 do { SQLRETURN _odbc_rc = handle->errs.lastrc; \
136 odbc_check_struct_extra(handle); \
137 tds_mutex_unlock(&handle->mtx); \
138 return _odbc_rc; } while(0)
149 int msgstate,
const char *server,
int row);
208 #ifdef TDS_HAVE_MUTEX
236 #ifdef TDS_HAVE_MUTEX
245 #ifdef TDS_HAVE_MUTEX
278 #define TDS_MAX_APP_DESC 100
285 #ifdef TDS_HAVE_MUTEX
292 #ifdef ENABLE_ODBC_WIDE
293 DSTR original_charset;
393 #ifdef TDS_HAVE_MUTEX
454 #define IS_HENV(x) (((TDS_CHK *)x)->htype == SQL_HANDLE_ENV)
455 #define IS_HDBC(x) (((TDS_CHK *)x)->htype == SQL_HANDLE_DBC)
456 #define IS_HSTMT(x) (((TDS_CHK *)x)->htype == SQL_HANDLE_STMT)
457 #define IS_HDESC(x) (((TDS_CHK *)x)->htype == SQL_HANDLE_DESC)
461 #if SQL_INTERVAL_YEAR == (100 + SQL_CODE_SECOND)
463 #undef SQL_INTERVAL_YEAR
464 #undef SQL_INTERVAL_MONTH
465 #undef SQL_INTERVAL_DAY
466 #undef SQL_INTERVAL_HOUR
467 #undef SQL_INTERVAL_MINUTE
468 #undef SQL_INTERVAL_SECOND
469 #undef SQL_INTERVAL_YEAR_TO_MONTH
470 #undef SQL_INTERVAL_DAY_TO_HOUR
471 #undef SQL_INTERVAL_DAY_TO_MINUTE
472 #undef SQL_INTERVAL_DAY_TO_SECOND
473 #undef SQL_INTERVAL_HOUR_TO_MINUTE
474 #undef SQL_INTERVAL_HOUR_TO_SECOND
475 #undef SQL_INTERVAL_MINUTE_TO_SECOND
477 #define SQL_INTERVAL_YEAR (100 + SQL_CODE_YEAR)
478 #define SQL_INTERVAL_MONTH (100 + SQL_CODE_MONTH)
479 #define SQL_INTERVAL_DAY (100 + SQL_CODE_DAY)
480 #define SQL_INTERVAL_HOUR (100 + SQL_CODE_HOUR)
481 #define SQL_INTERVAL_MINUTE (100 + SQL_CODE_MINUTE)
482 #define SQL_INTERVAL_SECOND (100 + SQL_CODE_SECOND)
483 #define SQL_INTERVAL_YEAR_TO_MONTH (100 + SQL_CODE_YEAR_TO_MONTH)
484 #define SQL_INTERVAL_DAY_TO_HOUR (100 + SQL_CODE_DAY_TO_HOUR)
485 #define SQL_INTERVAL_DAY_TO_MINUTE (100 + SQL_CODE_DAY_TO_MINUTE)
486 #define SQL_INTERVAL_DAY_TO_SECOND (100 + SQL_CODE_DAY_TO_SECOND)
487 #define SQL_INTERVAL_HOUR_TO_MINUTE (100 + SQL_CODE_HOUR_TO_MINUTE)
488 #define SQL_INTERVAL_HOUR_TO_SECOND (100 + SQL_CODE_HOUR_TO_SECOND)
489 #define SQL_INTERVAL_MINUTE_TO_SECOND (100 + SQL_CODE_MINUTE_TO_SECOND)
498 #define ODBC_PARAM_LIST \
499 ODBC_PARAM(Servername) \
504 ODBC_PARAM(Address) \
506 ODBC_PARAM(TDS_Version) \
507 ODBC_PARAM(Language) \
508 ODBC_PARAM(Database) \
509 ODBC_PARAM(TextSize) \
510 ODBC_PARAM(PacketSize) \
511 ODBC_PARAM(ClientCharset) \
512 ODBC_PARAM(DumpFile) \
513 ODBC_PARAM(DumpFileAppend) \
514 ODBC_PARAM(DebugFlags) \
515 ODBC_PARAM(Encryption) \
516 ODBC_PARAM(Trusted_Connection) \
519 ODBC_PARAM(UseNTLMv2) \
520 ODBC_PARAM(MARS_Connection) \
522 ODBC_PARAM(ServerSPN) \
523 ODBC_PARAM(AttachDbFilename) \
524 ODBC_PARAM(ApplicationIntent)
526 #define ODBC_PARAM(p) ODBC_PARAM_##p,
579 #if ENABLE_EXTRA_CHECKS
581 #define CHECK_ENV_EXTRA(env) odbc_check_env_extra(env)
582 #define CHECK_DBC_EXTRA(dbc) odbc_check_dbc_extra(dbc)
583 #define CHECK_STMT_EXTRA(stmt) odbc_check_stmt_extra(stmt)
584 #define CHECK_DESC_EXTRA(desc) odbc_check_desc_extra(desc)
589 void odbc_check_desc_extra(
TDS_DESC * desc);
592 #define CHECK_ENV_EXTRA(env)
593 #define CHECK_DBC_EXTRA(dbc)
594 #define CHECK_STMT_EXTRA(stmt)
595 #define CHECK_DESC_EXTRA(desc)
605 #ifdef ENABLE_ODBC_WIDE
612 # define _WIDE ,int wide
617 # define ODBC_CHAR SQLCHAR
636 #ifdef ENABLE_ODBC_WIDE
638 #define odbc_dstr_copy(dbc, s, len, out) \
639 odbc_dstr_copy_flag(dbc, s, len, sizeof((out)->mb) ? (out) : (out), wide)
640 #define odbc_dstr_copy_oct(dbc, s, len, out) \
641 odbc_dstr_copy_flag(dbc, s, len, out, wide|0x20)
644 #define odbc_dstr_copy_oct odbc_dstr_copy
651 #ifdef ENABLE_ODBC_WIDE
652 #define odbc_set_string(dbc, buf, buf_len, out_len, s, s_len) \
653 odbc_set_string_flag(dbc, sizeof((buf)->mb) ? (buf) : (buf), buf_len, out_len, s, s_len, (wide) | (sizeof(*(out_len)) == sizeof(SQLSMALLINT)?0:0x10))
654 #define odbc_set_string_oct(dbc, buf, buf_len, out_len, s, s_len) \
655 odbc_set_string_flag(dbc, buf, buf_len, out_len, s, s_len, (wide) | (sizeof(*(out_len)) == sizeof(SQLSMALLINT)?0x20:0x30))
657 #define odbc_set_string(dbc, buf, buf_len, out_len, s, s_len) \
658 odbc_set_string_flag(dbc, buf, buf_len, out_len, s, s_len, (sizeof(*(out_len)) == sizeof(SQLSMALLINT)?0:0x10))
659 #define odbc_set_string_oct(dbc, buf, buf_len, out_len, s, s_len) \
660 odbc_set_string_flag(dbc, buf, buf_len, out_len, s, s_len, (sizeof(*(out_len)) == sizeof(SQLSMALLINT)?0x20:0x30))
687 int compute_row,
const TDS_DESC* axd,
706 #if SIZEOF_SQLWCHAR != SIZEOF_WCHAR_T
709 typedef struct sqlwstr_buf {
710 struct sqlwstr_buf *
next;
713 const wchar_t *sqlwstr(
const SQLWCHAR * s, SQLWSTRBUF **bufs);
714 void sqlwstr_free(SQLWSTRBUF *bufs);
715 #define SQLWSTR_BUFS(n) SQLWSTRBUF *bufs = NULL
716 #define SQLWSTR(s) sqlwstr(s, &bufs)
717 #define SQLWSTR_FREE() sqlwstr_free(bufs)
719 #define sqlwcslen(s) wcslen(s)
721 #define SQLWSTR_BUFS(n) do {} while(0)
722 #define SQLWSTR(s) ((const wchar_t*)(s))
723 #define SQLWSTR_FREE() do {} while(0)
726 #if SIZEOF_SQLWCHAR == 2
728 # define ODBC_WIDE_NAME "UCS-2BE"
729 # define ODBC_WIDE_NAME_UTF "UTF-16BE"
731 # define ODBC_WIDE_NAME "UCS-2LE"
732 # define ODBC_WIDE_NAME_UTF "UTF-16LE"
735 #elif SIZEOF_SQLWCHAR == 4
737 # define ODBC_WIDE_NAME "UCS-4BE"
739 # define ODBC_WIDE_NAME "UCS-4LE"
741 static inline const char *
744 return ODBC_WIDE_NAME;
747 #error SIZEOF_SQLWCHAR not supported !!
750 #include <freetds/popvis.h>
std::ofstream out("events_result.xml")
main entry point for tests
static CS_CONNECTION * conn
static DLIST_TYPE *DLIST_NAME() next(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
void odbc_bcp_sendrow(TDS_DBC *dbc)
Write data in host variables to the table.
int odbc_bcp_batch(TDS_DBC *dbc)
Commit a set of rows to the table.
TDS_INT convert_datetime2server(int bindtype, const void *src, TDS_DATETIMEALL *dta)
SQLRETURN desc_alloc_records(TDS_DESC *desc, unsigned count)
void odbc_bcp_free_storage(TDS_DBC *dbc)
TDS_DBC * desc_get_dbc(TDS_DESC *desc)
void odbc_errs_add(struct _sql_errors *errs, const char *sqlstate, const char *msg)
add an error to list
void odbc_set_sql_type_info(TDSCOLUMN *col, struct _drecord *drec, SQLINTEGER odbc_ver)
const char * parse_const_param(const char *s, TDS_SERVER_TYPE *type)
SQLINTEGER odbc_get_param_len(const struct _drecord *drec_axd, const struct _drecord *drec_ixd, const TDS_DESC *axd, SQLUSMALLINT n_row)
SQLRETURN desc_free(TDS_DESC *desc)
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)
void odbc_errs_reset(struct _sql_errors *errs)
reset errors
DSTR * odbc_dstr_copy(TDS_DBC *dbc, DSTR *s, int size, const SQLCHAR *str)
int parse_prepared_query(struct _hstmt *stmt, int compute_row)
void odbc_errs_add_rdbms(struct _sql_errors *errs, TDS_UINT native, const char *sqlstate, const char *msg, int linenum, int msgstate, const char *server, int row)
Add an error to list.
int odbc_get_dsn_info(TDS_ERRS *errs, const char *DSN, TDSLOGIN *login)
Read connection information from given DSN.
int odbc_parse_connect_string(TDS_ERRS *errs, const char *connect_string, const char *connect_string_end, TDSLOGIN *login, TDS_PARSED_PARAM *parsed_params)
Parses a connection string for SQLDriverConnect().
SQLRETURN _SQLRowCount(SQLHSTMT hstmt, SQLINTEGER FAR *pcrow)
int odbc_bcp_done(TDS_DBC *dbc)
Conclude the transfer of data from program variables.
SQLRETURN odbc_sql2tds(TDS_STMT *stmt, const struct _drecord *drec_ixd, const struct _drecord *drec_axd, TDSCOLUMN *curcol, int compute_row, const TDS_DESC *axd, SQLUSMALLINT n_row)
@ ODBC_SPECIAL_GETTYPEINFO
@ ODBC_SPECIAL_SPECIALCOLUMNS
@ ODBC_SPECIAL_PROCEDURECOLUMNS
int start_parse_prepared_query(struct _hstmt *stmt, int compute_row)
static void odbc_check_struct_extra(void *p)
SQLRETURN desc_free_records(TDS_DESC *desc)
SQLRETURN prepare_call(struct _hstmt *stmt)
void odbc_bcp_colptr(TDS_DBC *dbc, const void *colptr, int table_column)
Override bcp_bind() by pointing to a different host variable.
void odbc_bcp_control(TDS_DBC *dbc, int field, void *value)
Set BCP options for data transfer.
SQLRETURN native_sql(struct _hdbc *dbc, DSTR *s)
const char * odbc_skip_rpc_name(const char *s)
void odbc_bcp_bind(TDS_DBC *dbc, const void *varaddr, int prefixlen, int varlen, const void *terminator, int termlen, int vartype, int table_column)
Bind a program host variable to a database column.
TDS_DESC * desc_alloc(SQLHANDLE parent, int desc_type, int alloc_type)
int odbc_set_stmt_query(struct _hstmt *stmt, const SQLCHAR *sql, ssize_t sql_len)
SQLRETURN desc_copy(TDS_DESC *dest, TDS_DESC *src)
size_t odbc_get_string_size(ssize_t size, const SQLCHAR *str)
void odbc_bcp_init(TDS_DBC *dbc, const SQLCHAR *tblname, const SQLCHAR *hfile, const SQLCHAR *errfile, int direction)
int continue_parse_prepared_query(struct _hstmt *stmt, SQLPOINTER DataPtr, SQLINTEGER StrLen_or_Ind)
tds_sysdep_int32_type TDS_INT
tds_sysdep_int64_type TDS_INT8
tds_sysdep_uint32_type TDS_UINT
static const char * str(char *buf, int n)
BOOL get_login_info(HWND hwndParent, TDSLOGIN *login)
Use a dialog window to prompt for user_name and password.
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.
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)
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)
SQLINTEGER odbc_get_octet_len(int c_type, const struct _drecord *drec)
void odbc_rdbms_version(TDSSOCKET *tds_socket, char *pversion_string)
Returns the version of the RDBMS in the ODBC format.
SQLSMALLINT odbc_get_concise_c_type(SQLSMALLINT type, SQLSMALLINT interval)
const struct ncbi::grid::netcache::search::fields::SIZE size
const GenericPointer< typename T::ValueType > T2 value
static pcre_uint8 * buffer
unsigned long SQLUINTEGER
unsigned short SQLUSMALLINT
signed short int SQLSMALLINT
#define row(bind, expected)
this structure is not directed connected to a TDS protocol but keeps any DATE/TIME information.
SQLINTEGER * sql_desc_octet_length_ptr
DSTR sql_desc_base_column_name
SQLINTEGER sql_desc_num_prec_radix
SQLUINTEGER sql_desc_auto_unique_value
SQLSMALLINT sql_desc_unnamed
DSTR sql_desc_local_type_name
SQLSMALLINT sql_desc_nullable
SQLSMALLINT sql_desc_updatable
const char * sql_desc_literal_suffix
const char * sql_desc_type_name
DSTR sql_desc_catalog_name
SQLINTEGER * sql_desc_indicator_ptr
SQLINTEGER sql_desc_display_size
SQLSMALLINT sql_desc_rowver
SQLSMALLINT sql_desc_parameter_type
DSTR sql_desc_schema_name
SQLSMALLINT sql_desc_fixed_prec_scale
SQLSMALLINT sql_desc_searchable
SQLINTEGER sql_desc_case_sensitive
SQLINTEGER sql_desc_octet_length
SQLSMALLINT sql_desc_unsigned
SQLUINTEGER sql_desc_length
SQLSMALLINT sql_desc_scale
SQLPOINTER sql_desc_data_ptr
SQLINTEGER sql_desc_datetime_interval_precision
const char * sql_desc_literal_prefix
DSTR sql_desc_base_table_name
SQLSMALLINT sql_desc_precision
SQLSMALLINT sql_desc_datetime_interval_code
SQLSMALLINT sql_desc_type
SQLSMALLINT sql_desc_concise_type
SQLUINTEGER connection_timeout
SQLUINTEGER connection_dead
SQLUINTEGER translate_option
SQLUINTEGER login_timeout
SQLUINTEGER txn_isolation
struct _hstmt * stmt_list
list of all statements allocated from this connection
TDS_INT default_query_timeout
struct _hstmt * current_statement
Statement executing.
TDS_DESC * uad[100]
descriptors associated to connection
unsigned int cursor_support
<>0 if server handle cursors
struct _drecord * records
SQLUINTEGER connection_pooling
SQLUINTEGER cursor_scrollable
SQLUINTEGER enable_auto_ipd
SQLPOINTER fetch_bookmark_ptr
SQLUINTEGER cursor_sensitivity
SQLUINTEGER simulate_cursor
SQLUINTEGER use_bookmarks
SQLUINTEGER retrieve_data
SQLUINTEGER query_timeout
unsigned int num_param_rows
struct _hstmt * prev
previous in list
unsigned prepared_query_is_func
unsigned int param_count
number of parameter in current query
unsigned is_prepared_query
TDS_ODBC_ROW_STATUS row_status
status of row, it can happen that this flag mark that we are still parsing row, this it's normal
TDSPARAMINFO * params
parameters saved
TDSSOCKET * tds
socket (only if active)
SQLUINTEGER sql_rowset_size
TDS_ODBC_SPECIAL_ROWS special_row
TDS_INT8 row_count
row count to return
struct _hstmt * next
next in list
char * prepared_pos
position in prepared query to check parameters, used only in RPC
unsigned int curr_param_row
int param_num
last valid parameter in params, it's a ODBC index (from 1 relative to descriptor)
DSTR query
query to execute
unsigned prepared_query_is_rpc
unsigned need_reprepare
Prepared statement needs to be prepared again.
unsigned param_data_called
Metadata about columns in regular and compute rows.
Holds informations about a cursor.
Structure to hold a string.
Holds information for a dynamic (also called prepared) query.
Hold information for any results.
Information for a server connection.