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
00026 #ifdef UNIXODBC
00027 #include <sql.h>
00028 #include <sqlext.h>
00029 #include <odbcinst.h>
00030 #elif defined(TDS_NO_DM)
00031 #include <sql.h>
00032 #include <sqlext.h>
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 #ifdef __cplusplus
00051 extern "C"
00052 {
00053 #if 0
00054 }
00055 #endif
00056 #endif
00057
00058
00059
00060 #if defined(__GNUC__) && __GNUC__ >= 4
00061 #pragma GCC visibility push(hidden)
00062 #endif
00063
00064 struct _sql_error
00065 {
00066 const char *msg;
00067 char state2[6];
00068 char state3[6];
00069 TDS_UINT native;
00070 char *server;
00071 int linenum;
00072 int msgstate;
00073 };
00074
00075 struct _sql_errors
00076 {
00077 SQLRETURN lastrc;
00078 int num_errors;
00079 struct _sql_error *errs;
00080 char ranked;
00081 };
00082
00083 #if ENABLE_EXTRA_CHECKS
00084 void odbc_check_struct_extra(void *p);
00085
00086 #define ODBC_RETURN(handle, rc) \
00087 do { odbc_check_struct_extra(handle); return (handle->errs.lastrc = (rc)); } while(0)
00088 #define ODBC_RETURN_(handle) \
00089 do { odbc_check_struct_extra(handle); return handle->errs.lastrc; } while(0)
00090 #else
00091 #define ODBC_RETURN(handle, rc) \
00092 do { return (handle->errs.lastrc = (rc)); } while(0)
00093 #define ODBC_RETURN_(handle) \
00094 do { return handle->errs.lastrc; } while(0)
00095 #endif
00096
00098 void odbc_errs_reset(struct _sql_errors *errs);
00099
00101 void odbc_errs_add(struct _sql_errors *errs, const char *sqlstate, const char *msg);
00102
00104 void odbc_errs_add_rdbms(struct _sql_errors *errs, TDS_UINT native, const char *sqlstate, const char *msg, int linenum,
00105 int msgstate, const char *server);
00106
00107 struct _dheader
00108 {
00109 SQLSMALLINT sql_desc_alloc_type;
00110 SQLINTEGER sql_desc_bind_type;
00111 SQLULEN sql_desc_array_size;
00112
00113 SQLSMALLINT sql_desc_count;
00114 SQLUSMALLINT *sql_desc_array_status_ptr;
00115 SQLULEN *sql_desc_rows_processed_ptr;
00116 SQLLEN *sql_desc_bind_offset_ptr;
00117 };
00118
00119 struct _drecord
00120 {
00121 SQLUINTEGER sql_desc_auto_unique_value;
00122 DSTR sql_desc_base_column_name;
00123 DSTR sql_desc_base_table_name;
00124 SQLINTEGER sql_desc_case_sensitive;
00125 DSTR sql_desc_catalog_name;
00126 SQLSMALLINT sql_desc_concise_type;
00127 SQLPOINTER sql_desc_data_ptr;
00128 SQLSMALLINT sql_desc_datetime_interval_code;
00129 SQLINTEGER sql_desc_datetime_interval_precision;
00130 SQLLEN sql_desc_display_size;
00131 SQLSMALLINT sql_desc_fixed_prec_scale;
00132 SQLLEN *sql_desc_indicator_ptr;
00133 DSTR sql_desc_label;
00134 SQLULEN sql_desc_length;
00135
00136 const char *sql_desc_literal_prefix;
00137
00138 const char *sql_desc_literal_suffix;
00139 DSTR sql_desc_local_type_name;
00140 DSTR sql_desc_name;
00141 SQLSMALLINT sql_desc_nullable;
00142 SQLINTEGER sql_desc_num_prec_radix;
00143 SQLLEN sql_desc_octet_length;
00144 SQLLEN *sql_desc_octet_length_ptr;
00145 SQLSMALLINT sql_desc_parameter_type;
00146 SQLSMALLINT sql_desc_precision;
00147 SQLSMALLINT sql_desc_rowver;
00148 SQLSMALLINT sql_desc_scale;
00149 DSTR sql_desc_schema_name;
00150 SQLSMALLINT sql_desc_searchable;
00151 DSTR sql_desc_table_name;
00152 SQLSMALLINT sql_desc_type;
00153
00154 const char *sql_desc_type_name;
00155 SQLSMALLINT sql_desc_unnamed;
00156 SQLSMALLINT sql_desc_unsigned;
00157 SQLSMALLINT sql_desc_updatable;
00158 };
00159
00160 struct _hdesc
00161 {
00162 SQLSMALLINT htype;
00163 int type;
00164 SQLHANDLE parent;
00165 struct _dheader header;
00166 struct _drecord *records;
00167 struct _sql_errors errs;
00168 };
00169
00170 typedef struct _hdesc TDS_DESC;
00171
00172 #define DESC_IRD 1
00173 #define DESC_IPD 2
00174 #define DESC_ARD 3
00175 #define DESC_APD 4
00176
00177 struct _heattr
00178 {
00179 SQLUINTEGER connection_pooling;
00180 SQLUINTEGER cp_match;
00181 SQLINTEGER odbc_version;
00182 SQLINTEGER output_nts;
00183 };
00184
00185 struct _hchk
00186 {
00187 SQLSMALLINT htype;
00188 };
00189
00190 struct _henv
00191 {
00192 SQLSMALLINT htype;
00193 TDSCONTEXT *tds_ctx;
00194 struct _sql_errors errs;
00195 struct _heattr attr;
00196 };
00197
00198 struct _hcattr
00199 {
00200 SQLUINTEGER access_mode;
00201 SQLUINTEGER async_enable;
00202 SQLUINTEGER auto_ipd;
00203 SQLUINTEGER autocommit;
00204 SQLUINTEGER connection_dead;
00205 SQLUINTEGER connection_timeout;
00206 DSTR current_catalog;
00207 SQLUINTEGER login_timeout;
00208 SQLUINTEGER metadata_id;
00209 SQLUINTEGER odbc_cursors;
00210 SQLUINTEGER packet_size;
00211 SQLHWND quite_mode;
00212 DSTR translate_lib;
00213 SQLUINTEGER translate_option;
00214 SQLUINTEGER txn_isolation;
00215 #ifdef TDS_NO_DM
00216 SQLUINTEGER trace;
00217 DSTR tracefile;
00218 #endif
00219 };
00220
00221 #define TDS_MAX_APP_DESC 100
00222
00223 struct _hstmt;
00224 struct _hdbc
00225 {
00226 SQLSMALLINT htype;
00227 struct _henv *env;
00228 TDSSOCKET *tds_socket;
00229 DSTR dsn;
00230 DSTR server;
00236 struct _hstmt *current_statement;
00238 struct _hstmt *stmt_list;
00239 struct _sql_errors errs;
00240 struct _hcattr attr;
00242 TDS_DESC *uad[TDS_MAX_APP_DESC];
00243 };
00244
00245 struct _hsattr
00246 {
00247
00248
00249
00250 SQLUINTEGER async_enable;
00251 SQLUINTEGER concurrency;
00252 SQLUINTEGER cursor_scrollable;
00253 SQLUINTEGER cursor_sensitivity;
00254 SQLUINTEGER cursor_type;
00255 SQLUINTEGER enable_auto_ipd;
00256 SQLPOINTER fetch_bookmark_ptr;
00257 SQLULEN keyset_size;
00258 SQLULEN max_length;
00259 SQLULEN max_rows;
00260 SQLUINTEGER metadata_id;
00261 SQLUINTEGER noscan;
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 SQLUINTEGER query_timeout;
00275 SQLUINTEGER retrieve_data;
00276
00277
00278
00279
00280
00281
00282 SQLULEN row_number;
00283
00284
00285
00286
00287
00288
00289 SQLUINTEGER simulate_cursor;
00290 SQLUINTEGER use_bookmarks;
00291
00292
00293
00294 };
00295
00296 typedef enum
00297 {
00298 NOT_IN_ROW,
00299 IN_NORMAL_ROW,
00300 IN_COMPUTE_ROW,
00301 AFTER_COMPUTE_ROW,
00302 PRE_NORMAL_ROW
00303 } TDS_ODBC_ROW_STATUS;
00304
00305 struct _hstmt
00306 {
00307 SQLSMALLINT htype;
00308 struct _hdbc *dbc;
00310 char *query;
00311
00313 struct _hstmt *next;
00315 struct _hstmt *prev;
00316
00317
00318 char *prepared_query;
00319 unsigned prepared_query_is_func:1;
00320 unsigned prepared_query_is_rpc:1;
00321 unsigned need_reprepare:1;
00322 unsigned param_data_called:1;
00323
00324
00326 TDSPARAMINFO *params;
00328 int param_num;
00330 char *prepared_pos;
00331
00332 unsigned int curr_param_row, num_param_rows;
00333
00335 unsigned int param_count;
00336 int row;
00338 int row_count;
00339 int next_row_count;
00341 TDS_ODBC_ROW_STATUS row_status;
00342
00343 TDSDYNAMIC *dyn;
00344 struct _sql_errors errs;
00345 TDS_DESC *ard, *ird, *apd, *ipd;
00346 TDS_DESC *orig_ard, *orig_apd;
00347 SQLULEN sql_rowset_size;
00348 struct _hsattr attr;
00349 DSTR cursor_name;
00350 int special_row;
00351 };
00352
00353 typedef struct _henv TDS_ENV;
00354 typedef struct _hdbc TDS_DBC;
00355 typedef struct _hstmt TDS_STMT;
00356 typedef struct _hchk TDS_CHK;
00357
00358 #define IS_HENV(x) (((TDS_CHK *)x)->htype == SQL_HANDLE_ENV)
00359 #define IS_HDBC(x) (((TDS_CHK *)x)->htype == SQL_HANDLE_DBC)
00360 #define IS_HSTMT(x) (((TDS_CHK *)x)->htype == SQL_HANDLE_STMT)
00361 #define IS_HDESC(x) (((TDS_CHK *)x)->htype == SQL_HANDLE_DESC)
00362
00363
00364 #ifdef __MINGW32__
00365 #if SQL_INTERVAL_YEAR == (100 + SQL_CODE_SECOND)
00366
00367 #undef SQL_INTERVAL_YEAR
00368 #undef SQL_INTERVAL_MONTH
00369 #undef SQL_INTERVAL_DAY
00370 #undef SQL_INTERVAL_HOUR
00371 #undef SQL_INTERVAL_MINUTE
00372 #undef SQL_INTERVAL_SECOND
00373 #undef SQL_INTERVAL_YEAR_TO_MONTH
00374 #undef SQL_INTERVAL_DAY_TO_HOUR
00375 #undef SQL_INTERVAL_DAY_TO_MINUTE
00376 #undef SQL_INTERVAL_DAY_TO_SECOND
00377 #undef SQL_INTERVAL_HOUR_TO_MINUTE
00378 #undef SQL_INTERVAL_HOUR_TO_SECOND
00379 #undef SQL_INTERVAL_MINUTE_TO_SECOND
00380
00381 #define SQL_INTERVAL_YEAR (100 + SQL_CODE_YEAR)
00382 #define SQL_INTERVAL_MONTH (100 + SQL_CODE_MONTH)
00383 #define SQL_INTERVAL_DAY (100 + SQL_CODE_DAY)
00384 #define SQL_INTERVAL_HOUR (100 + SQL_CODE_HOUR)
00385 #define SQL_INTERVAL_MINUTE (100 + SQL_CODE_MINUTE)
00386 #define SQL_INTERVAL_SECOND (100 + SQL_CODE_SECOND)
00387 #define SQL_INTERVAL_YEAR_TO_MONTH (100 + SQL_CODE_YEAR_TO_MONTH)
00388 #define SQL_INTERVAL_DAY_TO_HOUR (100 + SQL_CODE_DAY_TO_HOUR)
00389 #define SQL_INTERVAL_DAY_TO_MINUTE (100 + SQL_CODE_DAY_TO_MINUTE)
00390 #define SQL_INTERVAL_DAY_TO_SECOND (100 + SQL_CODE_DAY_TO_SECOND)
00391 #define SQL_INTERVAL_HOUR_TO_MINUTE (100 + SQL_CODE_HOUR_TO_MINUTE)
00392 #define SQL_INTERVAL_HOUR_TO_SECOND (100 + SQL_CODE_HOUR_TO_SECOND)
00393 #define SQL_INTERVAL_MINUTE_TO_SECOND (100 + SQL_CODE_MINUTE_TO_SECOND)
00394
00395 #endif
00396 #endif
00397
00398 #ifdef WIN32
00399 BOOL get_login_info(HWND hwndParent, TDSCONNECTION * connection);
00400 #endif
00401
00402
00403
00404
00412 int odbc_parse_connect_string(const char *connect_string, const char *connect_string_end, TDSCONNECTION * connection);
00413 int odbc_get_dsn_info(const char *DSN, TDSCONNECTION * connection);
00414
00415
00416
00417
00418 TDS_INT convert_tds2sql(TDSCONTEXT * context, int srctype, TDS_CHAR * src, TDS_UINT srclen, int desttype, TDS_CHAR * dest, SQLULEN destlen, const struct _drecord *drec_ixd);
00419
00420
00421
00422
00423 TDS_DESC *desc_alloc(SQLHANDLE parent, int desc_type, int alloc_type);
00424 SQLRETURN desc_free(TDS_DESC * desc);
00425 SQLRETURN desc_alloc_records(TDS_DESC * desc, unsigned count);
00426 SQLRETURN desc_copy(TDS_DESC * dest, TDS_DESC * src);
00427 SQLRETURN desc_free_records(TDS_DESC * desc);
00428
00429
00430
00431
00432 SQLRETURN _SQLRowCount(SQLHSTMT hstmt, SQLLEN FAR * pcrow);
00433
00434
00435
00436
00437 #if ENABLE_EXTRA_CHECKS
00438
00439 #define CHECK_ENV_EXTRA(env) odbc_check_env_extra(env)
00440 #define CHECK_DBC_EXTRA(dbc) odbc_check_dbc_extra(dbc)
00441 #define CHECK_STMT_EXTRA(stmt) odbc_check_stmt_extra(stmt)
00442 #define CHECK_DESC_EXTRA(desc) odbc_check_desc_extra(desc)
00443
00444 void odbc_check_env_extra(TDS_ENV * env);
00445 void odbc_check_dbc_extra(TDS_DBC * dbc);
00446 void odbc_check_stmt_extra(TDS_STMT * stmt);
00447 void odbc_check_desc_extra(TDS_DESC * desc);
00448 #else
00449
00450 #define CHECK_ENV_EXTRA(env)
00451 #define CHECK_DBC_EXTRA(dbc)
00452 #define CHECK_STMT_EXTRA(stmt)
00453 #define CHECK_DESC_EXTRA(desc)
00454 #endif
00455
00456
00457
00458
00459 int odbc_set_stmt_query(struct _hstmt *stmt, const char *sql, int sql_len);
00460 int odbc_set_stmt_prepared_query(struct _hstmt *stmt, const char *sql, int sql_len);
00461 void odbc_set_return_status(struct _hstmt *stmt);
00462 void odbc_set_return_params(struct _hstmt *stmt);
00463
00464 SQLSMALLINT odbc_server_to_sql_type(int col_type, int col_size);
00465 int odbc_sql_to_c_type_default(int sql_type);
00466 int odbc_sql_to_server_type(TDSSOCKET * tds, int sql_type);
00467 int odbc_c_to_server_type(int c_type);
00468
00469 void odbc_set_sql_type_info(TDSCOLUMN * col, struct _drecord *drec);
00470 SQLINTEGER odbc_sql_to_displaysize(int sqltype, int column_size, int column_prec);
00471 int odbc_get_string_size(int size, SQLCHAR * str);
00472 void odbc_rdbms_version(TDSSOCKET * tds_socket, char *pversion_string);
00473 SQLINTEGER odbc_get_param_len(const struct _drecord *drec_apd, const struct _drecord *drec_ipd);
00474
00475 SQLRETURN odbc_set_string(SQLPOINTER buffer, SQLSMALLINT cbBuffer, SQLSMALLINT FAR * pcbBuffer, const char *s, int len);
00476 SQLRETURN odbc_set_string_i(SQLPOINTER buffer, SQLINTEGER cbBuffer, SQLINTEGER FAR * pcbBuffer, const char *s, int len);
00477
00478 SQLSMALLINT odbc_get_concise_sql_type(SQLSMALLINT type, SQLSMALLINT interval);
00479 SQLRETURN odbc_set_concise_sql_type(SQLSMALLINT concise_type, struct _drecord *drec, int check_only);
00480 SQLSMALLINT odbc_get_concise_c_type(SQLSMALLINT type, SQLSMALLINT interval);
00481 SQLRETURN odbc_set_concise_c_type(SQLSMALLINT concise_type, struct _drecord *drec, int check_only);
00482
00483
00484
00485
00486 SQLRETURN prepare_call(struct _hstmt *stmt);
00487 SQLRETURN native_sql(struct _hdbc *dbc, char *s);
00488 int parse_prepared_query(struct _hstmt *stmt, int compute_row);
00489 int start_parse_prepared_query(struct _hstmt *stmt, int compute_row);
00490 int continue_parse_prepared_query(struct _hstmt *stmt, SQLPOINTER DataPtr, SQLLEN StrLen_or_Ind);
00491 const char *parse_const_param(const char * s, TDS_SERVER_TYPE *type);
00492
00493
00494
00495
00496 SQLRETURN sql2tds(TDS_STMT * stmt, const struct _drecord *drec_ipd, const struct _drecord *drec_apd, TDSPARAMINFO * info, int nparam, int compute_row);
00497
00498 #if defined(__GNUC__) && __GNUC__ >= 4
00499 #pragma GCC visibility pop
00500 #endif
00501
00502 #ifdef __cplusplus
00503 #if 0
00504 {
00505 #endif
00506 }
00507 #endif
00508
00509 #endif