00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _sql_h_
00022 #define _sql_h_
00023
00024 #include "tds.h"
00025 #include "tdsthread.h"
00026
00027 #if defined(UNIXODBC) || defined(TDS_NO_DM)
00028 #include <sql.h>
00029 #include <sqlext.h>
00030 #ifdef UNIXODBC
00031 #include <odbcinst.h>
00032 #endif
00033 #else
00034 #include <isql.h>
00035 #include <isqlext.h>
00036 #ifdef HAVE_IODBCINST_H
00037 #include <iodbcinst.h>
00038 #endif
00039 #endif
00040
00041 #ifndef HAVE_SQLLEN
00042 #ifndef SQLULEN
00043 #define SQLULEN SQLUINTEGER
00044 #endif
00045 #ifndef SQLLEN
00046 #define SQLLEN SQLINTEGER
00047 #endif
00048 #endif
00049
00050 #ifndef HAVE_SQLSETPOSIROW
00051 #define SQLSETPOSIROW SQLUSMALLINT
00052 #endif
00053
00054 #ifndef HAVE_SQLROWOFFSET
00055 #define SQLROWOFFSET SQLLEN
00056 #endif
00057
00058 #ifndef HAVE_SQLROWSETSIZE
00059 #define SQLROWSETSIZE SQLULEN
00060 #endif
00061
00062 #ifndef SQL_COPT_SS_BASE
00063 #define SQL_COPT_SS_BASE 1200
00064 #endif
00065
00066 #ifndef SQL_COPT_SS_MARS_ENABLED
00067 #define SQL_COPT_SS_MARS_ENABLED (SQL_COPT_SS_BASE+24)
00068 #endif
00069
00070 #ifndef SQL_MARS_ENABLED_NO
00071 #define SQL_MARS_ENABLED_NO 0
00072 #endif
00073
00074 #ifndef SQL_MARS_ENABLED_YES
00075 #define SQL_MARS_ENABLED_YES 1
00076 #endif
00077
00078 #ifndef SQL_SS_TIME2
00079 #define SQL_SS_TIME2 (-154)
00080 #endif
00081
00082 #ifndef SQL_TIMESTAMPOFFSET
00083 #define SQL_TIMESTAMPOFFSET (-155)
00084 #endif
00085
00086 #ifdef __cplusplus
00087 extern "C"
00088 {
00089 #if 0
00090 }
00091 #endif
00092 #endif
00093
00094
00095
00096 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
00097 #pragma GCC visibility push(hidden)
00098 #define ODBC_API SQL_API __attribute__((externally_visible))
00099 #else
00100 #define ODBC_API SQL_API
00101 #endif
00102
00103 #if (defined(_WIN32) || defined(__CYGWIN__)) && defined(__GNUC__)
00104 # define ODBC_PUBLIC __attribute__((dllexport))
00105 #else
00106 # define ODBC_PUBLIC
00107 #endif
00108
00109 #define ODBC_MAX(a,b) ( (a) > (b) ? (a) : (b) )
00110 #define ODBC_MIN(a,b) ( (a) < (b) ? (a) : (b) )
00111
00112 struct _sql_error
00113 {
00114 const char *msg;
00115 char state2[6];
00116 char state3[6];
00117 TDS_UINT native;
00118 char *server;
00119 int linenum;
00120 int msgstate;
00121 };
00122
00123 struct _sql_errors
00124 {
00125 struct _sql_error *errs;
00126 int num_errors;
00127 SQLRETURN lastrc;
00128 char ranked;
00129 };
00130
00131 typedef struct _sql_errors TDS_ERRS;
00132
00133 #if ENABLE_EXTRA_CHECKS
00134 void odbc_check_struct_extra(void *p);
00135 #else
00136 static inline void odbc_check_struct_extra(void *p) {}
00137 #endif
00138
00139 #define ODBC_RETURN(handle, rc) \
00140 do { odbc_check_struct_extra(handle); \
00141 return handle->errs.lastrc = (rc); } while(0)
00142 #define ODBC_RETURN_(handle) \
00143 do { odbc_check_struct_extra(handle); \
00144 return handle->errs.lastrc; } while(0)
00145
00146 #define ODBC_EXIT(handle, rc) \
00147 do { SQLRETURN _odbc_rc = handle->errs.lastrc = (rc); \
00148 odbc_check_struct_extra(handle); \
00149 TDS_MUTEX_UNLOCK(&handle->mtx); \
00150 return _odbc_rc; } while(0)
00151 #define ODBC_EXIT_(handle) \
00152 do { SQLRETURN _odbc_rc = handle->errs.lastrc; \
00153 odbc_check_struct_extra(handle); \
00154 TDS_MUTEX_UNLOCK(&handle->mtx); \
00155 return _odbc_rc; } while(0)
00156
00157
00159 void odbc_errs_reset(struct _sql_errors *errs);
00160
00162 void odbc_errs_add(struct _sql_errors *errs, const char *sqlstate, const char *msg);
00163
00165 void odbc_errs_add_rdbms(struct _sql_errors *errs, TDS_UINT native, const char *sqlstate, const char *msg, int linenum,
00166 int msgstate, const char *server);
00167
00168 struct _dheader
00169 {
00170 SQLSMALLINT sql_desc_alloc_type;
00171 SQLINTEGER sql_desc_bind_type;
00172 SQLULEN sql_desc_array_size;
00173
00174 SQLSMALLINT sql_desc_count;
00175 SQLUSMALLINT *sql_desc_array_status_ptr;
00176 SQLULEN *sql_desc_rows_processed_ptr;
00177 SQLLEN *sql_desc_bind_offset_ptr;
00178 };
00179
00180 struct _drecord
00181 {
00182 SQLUINTEGER sql_desc_auto_unique_value;
00183 DSTR sql_desc_base_column_name;
00184 DSTR sql_desc_base_table_name;
00185 SQLINTEGER sql_desc_case_sensitive;
00186 DSTR sql_desc_catalog_name;
00187 SQLSMALLINT sql_desc_concise_type;
00188 SQLPOINTER sql_desc_data_ptr;
00189 SQLSMALLINT sql_desc_datetime_interval_code;
00190 SQLINTEGER sql_desc_datetime_interval_precision;
00191 SQLLEN sql_desc_display_size;
00192 SQLSMALLINT sql_desc_fixed_prec_scale;
00193 SQLLEN *sql_desc_indicator_ptr;
00194 DSTR sql_desc_label;
00195 SQLULEN sql_desc_length;
00196
00197 const char *sql_desc_literal_prefix;
00198
00199 const char *sql_desc_literal_suffix;
00200 DSTR sql_desc_local_type_name;
00201 DSTR sql_desc_name;
00202 SQLSMALLINT sql_desc_nullable;
00203 SQLINTEGER sql_desc_num_prec_radix;
00204 SQLLEN sql_desc_octet_length;
00205 SQLLEN *sql_desc_octet_length_ptr;
00206 SQLSMALLINT sql_desc_parameter_type;
00207 SQLSMALLINT sql_desc_precision;
00208 SQLSMALLINT sql_desc_rowver;
00209 SQLSMALLINT sql_desc_scale;
00210 DSTR sql_desc_schema_name;
00211 SQLSMALLINT sql_desc_searchable;
00212 DSTR sql_desc_table_name;
00213 SQLSMALLINT sql_desc_type;
00214
00215 const char *sql_desc_type_name;
00216 SQLSMALLINT sql_desc_unnamed;
00217 SQLSMALLINT sql_desc_unsigned;
00218 SQLSMALLINT sql_desc_updatable;
00219 };
00220
00221 struct _hdesc
00222 {
00223 SQLSMALLINT htype;
00224 struct _sql_errors errs;
00225 TDS_MUTEX_DECLARE(mtx);
00226 int type;
00227 SQLHANDLE parent;
00228 struct _dheader header;
00229 struct _drecord *records;
00230 };
00231
00232 typedef struct _hdesc TDS_DESC;
00233
00234 #define DESC_IRD 1
00235 #define DESC_IPD 2
00236 #define DESC_ARD 3
00237 #define DESC_APD 4
00238
00239 struct _heattr
00240 {
00241 SQLUINTEGER connection_pooling;
00242 SQLUINTEGER cp_match;
00243 SQLINTEGER odbc_version;
00244 SQLINTEGER output_nts;
00245 };
00246
00247 struct _hchk
00248 {
00249 SQLSMALLINT htype;
00250 struct _sql_errors errs;
00251 TDS_MUTEX_DECLARE(mtx);
00252 };
00253
00254 struct _henv
00255 {
00256 SQLSMALLINT htype;
00257 struct _sql_errors errs;
00258 TDS_MUTEX_DECLARE(mtx);
00259 TDSCONTEXT *tds_ctx;
00260 struct _heattr attr;
00261 };
00262
00263 struct _hcattr
00264 {
00265 SQLUINTEGER access_mode;
00266 SQLUINTEGER async_enable;
00267 SQLUINTEGER auto_ipd;
00268 SQLUINTEGER autocommit;
00269 SQLUINTEGER connection_dead;
00270 SQLUINTEGER connection_timeout;
00271 DSTR current_catalog;
00272 SQLUINTEGER login_timeout;
00273 SQLUINTEGER metadata_id;
00274 SQLUINTEGER odbc_cursors;
00275 SQLUINTEGER packet_size;
00276 SQLHWND quite_mode;
00277 DSTR translate_lib;
00278 SQLUINTEGER translate_option;
00279 SQLUINTEGER txn_isolation;
00280 SQLUINTEGER mars_enabled;
00281 SQLUINTEGER cursor_type;
00282 #ifdef TDS_NO_DM
00283 SQLUINTEGER trace;
00284 DSTR tracefile;
00285 #endif
00286 };
00287
00288 #define TDS_MAX_APP_DESC 100
00289
00290 struct _hstmt;
00291 struct _hdbc
00292 {
00293 SQLSMALLINT htype;
00294 struct _sql_errors errs;
00295 TDS_MUTEX_DECLARE(mtx);
00296 struct _henv *env;
00297 TDSSOCKET *tds_socket;
00298 DSTR dsn;
00299 DSTR server;
00300 #ifdef ENABLE_ODBC_WIDE
00301 DSTR original_charset;
00302 TDSICONV *mb_conv;
00303 #endif
00304
00310 struct _hstmt *current_statement;
00312 struct _hstmt *stmt_list;
00313 struct _hcattr attr;
00315 TDS_DESC *uad[TDS_MAX_APP_DESC];
00317 unsigned int cursor_support;
00318 TDS_INT default_query_timeout;
00319 };
00320
00321 struct _hsattr
00322 {
00323
00324
00325
00326 SQLUINTEGER async_enable;
00327 SQLUINTEGER concurrency;
00328 SQLUINTEGER cursor_scrollable;
00329 SQLUINTEGER cursor_sensitivity;
00330 SQLUINTEGER cursor_type;
00331 SQLUINTEGER enable_auto_ipd;
00332 SQLPOINTER fetch_bookmark_ptr;
00333 SQLULEN keyset_size;
00334 SQLULEN max_length;
00335 SQLULEN max_rows;
00336 SQLUINTEGER metadata_id;
00337 SQLUINTEGER noscan;
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350 SQLUINTEGER query_timeout;
00351 SQLUINTEGER retrieve_data;
00352
00353
00354
00355
00356
00357
00358 SQLULEN row_number;
00359
00360
00361
00362
00363
00364
00365 SQLUINTEGER simulate_cursor;
00366 SQLUINTEGER use_bookmarks;
00367
00368
00369
00370 };
00371
00372 typedef enum
00373 {
00374 NOT_IN_ROW,
00375 IN_NORMAL_ROW,
00376 IN_COMPUTE_ROW,
00377 AFTER_COMPUTE_ROW,
00378 PRE_NORMAL_ROW
00379 } TDS_ODBC_ROW_STATUS;
00380
00381 typedef enum
00382 {
00383 ODBC_SPECIAL_NONE = 0,
00384 ODBC_SPECIAL_GETTYPEINFO = 1,
00385 ODBC_SPECIAL_COLUMNS = 2,
00386 ODBC_SPECIAL_PROCEDURECOLUMNS = 3,
00387 ODBC_SPECIAL_SPECIALCOLUMNS = 4
00388 } TDS_ODBC_SPECIAL_ROWS;
00389
00390 struct _hstmt
00391 {
00392 SQLSMALLINT htype;
00393 struct _sql_errors errs;
00394 TDS_MUTEX_DECLARE(mtx);
00395 struct _hdbc *dbc;
00397 char *query;
00398
00400 struct _hstmt *next;
00402 struct _hstmt *prev;
00403
00404
00405 char *prepared_query;
00406 unsigned prepared_query_is_func:1;
00407 unsigned prepared_query_is_rpc:1;
00408 unsigned need_reprepare:1;
00409 unsigned param_data_called:1;
00410
00411
00413 TDSPARAMINFO *params;
00415 int param_num;
00417 char *prepared_pos;
00418
00419 unsigned int curr_param_row, num_param_rows;
00420
00422 unsigned int param_count;
00423 int row;
00425 TDS_INT8 row_count;
00427 TDS_ODBC_ROW_STATUS row_status;
00428
00429 TDSDYNAMIC *dyn;
00430 TDS_DESC *ard, *ird, *apd, *ipd;
00431 TDS_DESC *orig_ard, *orig_apd;
00432 SQLULEN sql_rowset_size;
00433 struct _hsattr attr;
00434 DSTR cursor_name;
00435 TDS_ODBC_SPECIAL_ROWS special_row;
00436
00437 TDSCURSOR *cursor;
00438 };
00439
00440 typedef struct _henv TDS_ENV;
00441 typedef struct _hdbc TDS_DBC;
00442 typedef struct _hstmt TDS_STMT;
00443 typedef struct _hchk TDS_CHK;
00444
00445 #define IS_HENV(x) (((TDS_CHK *)x)->htype == SQL_HANDLE_ENV)
00446 #define IS_HDBC(x) (((TDS_CHK *)x)->htype == SQL_HANDLE_DBC)
00447 #define IS_HSTMT(x) (((TDS_CHK *)x)->htype == SQL_HANDLE_STMT)
00448 #define IS_HDESC(x) (((TDS_CHK *)x)->htype == SQL_HANDLE_DESC)
00449
00450
00451 #ifdef __MINGW32__
00452 #if SQL_INTERVAL_YEAR == (100 + SQL_CODE_SECOND)
00453
00454 #undef SQL_INTERVAL_YEAR
00455 #undef SQL_INTERVAL_MONTH
00456 #undef SQL_INTERVAL_DAY
00457 #undef SQL_INTERVAL_HOUR
00458 #undef SQL_INTERVAL_MINUTE
00459 #undef SQL_INTERVAL_SECOND
00460 #undef SQL_INTERVAL_YEAR_TO_MONTH
00461 #undef SQL_INTERVAL_DAY_TO_HOUR
00462 #undef SQL_INTERVAL_DAY_TO_MINUTE
00463 #undef SQL_INTERVAL_DAY_TO_SECOND
00464 #undef SQL_INTERVAL_HOUR_TO_MINUTE
00465 #undef SQL_INTERVAL_HOUR_TO_SECOND
00466 #undef SQL_INTERVAL_MINUTE_TO_SECOND
00467
00468 #define SQL_INTERVAL_YEAR (100 + SQL_CODE_YEAR)
00469 #define SQL_INTERVAL_MONTH (100 + SQL_CODE_MONTH)
00470 #define SQL_INTERVAL_DAY (100 + SQL_CODE_DAY)
00471 #define SQL_INTERVAL_HOUR (100 + SQL_CODE_HOUR)
00472 #define SQL_INTERVAL_MINUTE (100 + SQL_CODE_MINUTE)
00473 #define SQL_INTERVAL_SECOND (100 + SQL_CODE_SECOND)
00474 #define SQL_INTERVAL_YEAR_TO_MONTH (100 + SQL_CODE_YEAR_TO_MONTH)
00475 #define SQL_INTERVAL_DAY_TO_HOUR (100 + SQL_CODE_DAY_TO_HOUR)
00476 #define SQL_INTERVAL_DAY_TO_MINUTE (100 + SQL_CODE_DAY_TO_MINUTE)
00477 #define SQL_INTERVAL_DAY_TO_SECOND (100 + SQL_CODE_DAY_TO_SECOND)
00478 #define SQL_INTERVAL_HOUR_TO_MINUTE (100 + SQL_CODE_HOUR_TO_MINUTE)
00479 #define SQL_INTERVAL_HOUR_TO_SECOND (100 + SQL_CODE_HOUR_TO_SECOND)
00480 #define SQL_INTERVAL_MINUTE_TO_SECOND (100 + SQL_CODE_MINUTE_TO_SECOND)
00481
00482 #endif
00483 #endif
00484
00485 #ifdef _WIN32
00486 BOOL get_login_info(HWND hwndParent, TDSLOGIN * login);
00487 #endif
00488
00489 #define ODBC_PARAM_LIST \
00490 ODBC_PARAM(Servername) \
00491 ODBC_PARAM(Server) \
00492 ODBC_PARAM(DSN) \
00493 ODBC_PARAM(UID) \
00494 ODBC_PARAM(PWD) \
00495 ODBC_PARAM(Address) \
00496 ODBC_PARAM(Port) \
00497 ODBC_PARAM(TDS_Version) \
00498 ODBC_PARAM(Language) \
00499 ODBC_PARAM(Database) \
00500 ODBC_PARAM(TextSize) \
00501 ODBC_PARAM(PacketSize) \
00502 ODBC_PARAM(ClientCharset) \
00503 ODBC_PARAM(DumpFile) \
00504 ODBC_PARAM(DumpFileAppend) \
00505 ODBC_PARAM(DebugFlags) \
00506 ODBC_PARAM(Encryption) \
00507 ODBC_PARAM(Trusted_Connection) \
00508 ODBC_PARAM(APP) \
00509 ODBC_PARAM(WSID) \
00510 ODBC_PARAM(UseNTLMv2) \
00511 ODBC_PARAM(MARS_Connection) \
00512 ODBC_PARAM(REALM) \
00513 ODBC_PARAM(ServerSPN)
00514
00515 #define ODBC_PARAM(p) ODBC_PARAM_##p,
00516 enum {
00517 ODBC_PARAM_LIST
00518 ODBC_PARAM_SIZE
00519 };
00520 #undef ODBC_PARAM
00521
00522
00523
00524
00525
00526
00527 typedef struct {
00528 const char *p;
00529 size_t len;
00530 } TDS_PARSED_PARAM;
00531
00539 int odbc_parse_connect_string(TDS_ERRS *errs, const char *connect_string, const char *connect_string_end, TDSLOGIN * login, TDS_PARSED_PARAM *parsed_params);
00540 int odbc_get_dsn_info(TDS_ERRS *errs, const char *DSN, TDSLOGIN * login);
00541 #ifdef _WIN32
00542 int odbc_build_connect_string(TDS_ERRS *errs, TDS_PARSED_PARAM *params, char **out);
00543 #endif
00544
00545
00546
00547
00548 SQLLEN odbc_tds2sql(TDS_STMT * stmt, TDSCOLUMN *curcol, int srctype, TDS_CHAR * src, TDS_UINT srclen, int desttype, TDS_CHAR * dest, SQLULEN destlen, const struct _drecord *drec_ixd);
00549
00550
00551
00552
00553 TDS_DESC *desc_alloc(SQLHANDLE parent, int desc_type, int alloc_type);
00554 SQLRETURN desc_free(TDS_DESC * desc);
00555 SQLRETURN desc_alloc_records(TDS_DESC * desc, unsigned count);
00556 SQLRETURN desc_copy(TDS_DESC * dest, TDS_DESC * src);
00557 SQLRETURN desc_free_records(TDS_DESC * desc);
00558 TDS_DBC *desc_get_dbc(TDS_DESC *desc);
00559
00560
00561
00562
00563 SQLRETURN _SQLRowCount(SQLHSTMT hstmt, SQLLEN FAR * pcrow);
00564
00565
00566
00567
00568 #if ENABLE_EXTRA_CHECKS
00569
00570 #define CHECK_ENV_EXTRA(env) odbc_check_env_extra(env)
00571 #define CHECK_DBC_EXTRA(dbc) odbc_check_dbc_extra(dbc)
00572 #define CHECK_STMT_EXTRA(stmt) odbc_check_stmt_extra(stmt)
00573 #define CHECK_DESC_EXTRA(desc) odbc_check_desc_extra(desc)
00574
00575 void odbc_check_env_extra(TDS_ENV * env);
00576 void odbc_check_dbc_extra(TDS_DBC * dbc);
00577 void odbc_check_stmt_extra(TDS_STMT * stmt);
00578 void odbc_check_desc_extra(TDS_DESC * desc);
00579 #else
00580
00581 #define CHECK_ENV_EXTRA(env)
00582 #define CHECK_DBC_EXTRA(dbc)
00583 #define CHECK_STMT_EXTRA(stmt)
00584 #define CHECK_DESC_EXTRA(desc)
00585 #endif
00586
00587
00588
00589
00590
00591
00592 #undef _wide
00593 #undef _WIDE
00594 #ifdef ENABLE_ODBC_WIDE
00595 typedef union {
00596 char mb[1];
00597 SQLWCHAR wide[1];
00598 } ODBC_CHAR;
00599 # define _wide ,wide
00600 # define _wide0 ,0
00601 # define _WIDE ,int wide
00602 #else
00603 # define _wide
00604 # define _wide0
00605 # define _WIDE
00606 # define ODBC_CHAR SQLCHAR
00607 #endif
00608 int odbc_set_stmt_query(struct _hstmt *stmt, const ODBC_CHAR *sql, int sql_len _WIDE);
00609 int odbc_set_stmt_prepared_query(struct _hstmt *stmt, const ODBC_CHAR *sql, int sql_len _WIDE);
00610 void odbc_set_return_status(struct _hstmt *stmt, unsigned int n_row);
00611 void odbc_set_return_params(struct _hstmt *stmt, unsigned int n_row);
00612
00613 SQLSMALLINT odbc_server_to_sql_type(int col_type, int col_size);
00614 int odbc_sql_to_c_type_default(int sql_type);
00615 int odbc_sql_to_server_type(TDSSOCKET * tds, int sql_type);
00616 int odbc_c_to_server_type(int c_type);
00617
00618 void odbc_set_sql_type_info(TDSCOLUMN * col, struct _drecord *drec, SQLINTEGER odbc_ver);
00619 SQLINTEGER odbc_sql_to_displaysize(int sqltype, TDSCOLUMN *col);
00620 int odbc_get_string_size(int size, ODBC_CHAR * str _WIDE);
00621 void odbc_rdbms_version(TDSSOCKET * tds_socket, char *pversion_string);
00622 SQLINTEGER odbc_get_param_len(const struct _drecord *drec_axd, const struct _drecord *drec_ixd, const TDS_DESC* axd, unsigned int n_row);
00623
00624 #ifdef ENABLE_ODBC_WIDE
00625 DSTR* odbc_dstr_copy_flag(TDS_DBC *dbc, DSTR *s, int size, ODBC_CHAR * str, int flag);
00626 #define odbc_dstr_copy(dbc, s, len, out) \
00627 odbc_dstr_copy_flag(dbc, s, len, sizeof((out)->mb) ? (out) : (out), wide)
00628 #define odbc_dstr_copy_oct(dbc, s, len, out) \
00629 odbc_dstr_copy_flag(dbc, s, len, out, wide|0x20)
00630 #else
00631 DSTR* odbc_dstr_copy(TDS_DBC *dbc, DSTR *s, int size, ODBC_CHAR * str);
00632 #define odbc_dstr_copy_oct odbc_dstr_copy
00633 #endif
00634
00635
00636 SQLRETURN odbc_set_string_flag(TDS_DBC *dbc, SQLPOINTER buffer, SQLINTEGER cbBuffer, void FAR * pcbBuffer, const char *s, int len, int flag);
00637 #ifdef ENABLE_ODBC_WIDE
00638 #define odbc_set_string(dbc, buf, buf_len, out_len, s, s_len) \
00639 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))
00640 #define odbc_set_string_oct(dbc, buf, buf_len, out_len, s, s_len) \
00641 odbc_set_string_flag(dbc, buf, buf_len, out_len, s, s_len, (wide) | (sizeof(*(out_len)) == sizeof(SQLSMALLINT)?0x20:0x30))
00642 #else
00643 #define odbc_set_string(dbc, buf, buf_len, out_len, s, s_len) \
00644 odbc_set_string_flag(dbc, buf, buf_len, out_len, s, s_len, (sizeof(*(out_len)) == sizeof(SQLSMALLINT)?0:0x10))
00645 #define odbc_set_string_oct(dbc, buf, buf_len, out_len, s, s_len) \
00646 odbc_set_string_flag(dbc, buf, buf_len, out_len, s, s_len, (sizeof(*(out_len)) == sizeof(SQLSMALLINT)?0x20:0x30))
00647 #endif
00648
00649 SQLSMALLINT odbc_get_concise_sql_type(SQLSMALLINT type, SQLSMALLINT interval);
00650 SQLRETURN odbc_set_concise_sql_type(SQLSMALLINT concise_type, struct _drecord *drec, int check_only);
00651 SQLSMALLINT odbc_get_concise_c_type(SQLSMALLINT type, SQLSMALLINT interval);
00652 SQLRETURN odbc_set_concise_c_type(SQLSMALLINT concise_type, struct _drecord *drec, int check_only);
00653
00654 SQLLEN odbc_get_octet_len(int c_type, const struct _drecord *drec);
00655 void odbc_convert_err_set(struct _sql_errors *errs, TDS_INT err);
00656
00657
00658
00659
00660 SQLRETURN prepare_call(struct _hstmt *stmt);
00661 SQLRETURN native_sql(struct _hdbc *dbc, char *s);
00662 int parse_prepared_query(struct _hstmt *stmt, int compute_row);
00663 int start_parse_prepared_query(struct _hstmt *stmt, int compute_row);
00664 int continue_parse_prepared_query(struct _hstmt *stmt, SQLPOINTER DataPtr, SQLLEN StrLen_or_Ind);
00665 const char *parse_const_param(const char * s, TDS_SERVER_TYPE *type);
00666
00667
00668
00669
00670 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, unsigned int n_row);
00671
00672
00673
00674
00675 #if SIZEOF_SQLWCHAR != SIZEOF_WCHAR_T
00676 size_t sqlwcslen(const SQLWCHAR * s);
00677 const wchar_t *sqlwstr(const SQLWCHAR * s);
00678 #else
00679 #define sqlwcslen(s) wcslen(s)
00680 #define sqlwstr(s) ((const wchar_t*)(s))
00681 #endif
00682
00683 #if SIZEOF_SQLWCHAR == 2
00684 # if WORDS_BIGENDIAN
00685 # define ODBC_WIDE_NAME "UCS-2BE"
00686 # else
00687 # define ODBC_WIDE_NAME "UCS-2LE"
00688 # endif
00689 #elif SIZEOF_SQLWCHAR == 4
00690 # if WORDS_BIGENDIAN
00691 # define ODBC_WIDE_NAME "UCS-4BE"
00692 # else
00693 # define ODBC_WIDE_NAME "UCS-4LE"
00694 # endif
00695 #else
00696 #error SIZEOF_SQLWCHAR not supported !!
00697 #endif
00698
00699 #if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__MINGW32__)
00700 #pragma GCC visibility pop
00701 #endif
00702
00703 #ifdef __cplusplus
00704 #if 0
00705 {
00706 #endif
00707 }
00708 #endif
00709
00710 #endif