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