3
* Copyright (c) 2001-2009 Christian Werner <chw@ch-werner.de>
4
* Portions copyright (c) 2004 Ryszard Niewisiewicz <micz@fibernet.pl>
5
* Portions copyright (c) 2006 Carl Blakeley <cblakeley@openlinksw.co.uk>
7
* See the file "COPYING" for information on usage
8
* and redistribution of this file and for a
9
* DISCLAIMER OF ALL WARRANTIES.
11
* $Id: odbc.c,v 1.61 2009/05/20 05:30:03 chw Exp chw $
16
#if defined(_WIN32) || defined(__CYGWIN32__) || defined(__MINGW32__)
28
#error Missing include: sql.h
33
#error Missing include: sqlext.h
35
#ifdef HAVE_ODBCINST_H
43
#ifndef HAVE_TYPE_SQLTCHAR
45
typedef SQLWCHAR SQLTCHAR;
47
typedef SQLCHAR SQLTCHAR;
51
#ifndef HAVE_TYPE_SQLLEN
52
#define SQLLEN SQLINTEGER
54
#ifndef HAVE_TYPE_SQLULEN
55
#define SQLULEN SQLUINTEGER
59
* Conditionally undefine aliases of ODBC installer UNICODE functions.
62
#if defined(UNICODE) && defined(HAVE_SQLINSTALLERERRORW)
63
#undef SQLInstallerError
65
#if defined(UNICODE) && defined(HAVE_SQLCONFIGDATASOURCEW)
66
#undef SQLConfigDataSource
68
#if defined(UNICODE) && defined(HAVE_SQLREADFILEDSNW)
71
#if defined(UNICODE) && defined(HAVE_SQLWRITEFILEDSNW)
72
#undef SQLWriteFileDSN
75
#if defined(UNICODE) && defined(USE_DLOPEN_FOR_ODBC_LIBS)
76
extern int ruby_odbc_have_func(char *name, void *addr);
81
* Declarations of required installer APIs in case
82
* header files don't provide them (unixODBC?).
85
#ifndef HAVE_SQLINSTALLERERRORW
86
SQLRETURN INSTAPI SQLInstallerErrorW(WORD, DWORD *, LPWSTR, WORD, WORD *);
88
#ifndef HAVE_SQLCONFIGDATASOURCEW
89
BOOL INSTAPI SQLConfigDataSourceW(HWND, WORD, LPWSTR, LPWSTR);
91
#ifndef HAVE_SQLREADFILEDSNW
92
BOOL INSTAPI SQLReadFileDSNW(LPWSTR, LPWSTR, LPWSTR, LPWSTR, WORD, WORD *);
94
#ifndef HAVE_SQLWRITEFILEDSNW
95
BOOL INSTAPI SQLWriteFileDSNW(LPWSTR, LPWSTR, LPWSTR, LPWSTR);
99
#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
100
#define rb_define_alloc_func(cls, func) \
101
rb_define_singleton_method(cls, "new", func, -1)
102
#define rb_undefine_alloc_func(cls) \
103
rb_undef_method(CLASS_OF(cls), "new")
106
#ifdef RB_CVAR_SET_4ARGS
107
#define CVAR_SET(x, y, z) rb_cvar_set(x, y, z, 0)
109
#define CVAR_SET(x, y, z) rb_cvar_set(x, y, z)
113
static int tracing = 0;
114
#define tracemsg(t, x) {if (tracing & t) { x }}
115
static SQLRETURN tracesql(SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt,
116
SQLRETURN ret, char *m);
118
#define tracemsg(t, x)
119
#define tracesql(a, b, c, d, e) d
122
#ifndef SQL_SUCCEEDED
123
#define SQL_SUCCEEDED(x) \
124
(((x) == SQL_SUCCESS) || ((x) == SQL_SUCCESS_WITH_INFO))
128
#define SQL_NO_DATA SQL_NO_DATA_FOUND
131
typedef struct link {
160
SQLSMALLINT nullable;
166
char buffer[sizeof (double) * 4];
178
typedef struct stmt {
200
static VALUE Ccolumn;
207
static VALUE Ctimestamp;
209
static VALUE rb_cDate;
212
static ID IDatatinfo;
213
static ID IDataterror;
229
static ID IDtable_names;
237
static ID IDnullable;
239
static ID IDprecision;
240
static ID IDsearchable;
241
static ID IDunsigned;
243
static ID IDoutput_size;
244
static ID IDoutput_type;
246
static ID IDstatement;
247
static ID IDreturn_output_param;
256
#define INFO_TABLES 0
257
#define INFO_COLUMNS 1
258
#define INFO_PRIMKEYS 2
259
#define INFO_INDEXES 3
261
#define INFO_FORKEYS 5
264
#define INFO_PROCCOLS 8
265
#define INFO_SPECCOLS 9
268
* Modes for make_result/stmt_exec_int
271
#define MAKERES_BLOCK 1
272
#define MAKERES_NOCLOSE 2
273
#define MAKERES_PREPARE 4
274
#define MAKERES_EXECD 8
275
#define EXEC_PARMXNULL(x) (16 | ((x) << 5))
276
#define EXEC_PARMXOUT(x) (((x) & 16) ? ((x) >> 5) : -1)
282
#define DOFETCH_ARY 0
283
#define DOFETCH_HASH 1
284
#define DOFETCH_HASH2 2
285
#define DOFETCH_HASHK 3
286
#define DOFETCH_HASHK2 4
287
#define DOFETCH_HASHN 5
288
#define DOFETCH_MODES 7
289
#define DOFETCH_BANG 8
292
* Size of segment when SQL_NO_TOTAL
295
#define SEGSIZE 65536
298
* Forward declarations.
301
static SQLRETURN callsql(SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt,
302
SQLRETURN ret, char *m);
304
static VALUE stmt_exec(int argc, VALUE *argv, VALUE self);
305
static VALUE stmt_each(VALUE self);
306
static VALUE stmt_each_hash(int argc, VALUE *argv, VALUE self);
307
static VALUE stmt_close(VALUE self);
308
static VALUE stmt_drop(VALUE self);
311
* Macro to align buffers.
314
#define LEN_ALIGN(x) \
315
((x) + sizeof (double) - (((x) + sizeof (double)) % sizeof (double)))
319
*----------------------------------------------------------------------
321
* UNICODE converters et.al.
323
*----------------------------------------------------------------------
329
uc_strlen(SQLWCHAR *str)
334
while (*str != '\0') {
343
uc_strchr(SQLWCHAR *str, SQLWCHAR c)
346
while ((*str != '\0') && (*str != c)) {
349
str = (*str == c) ? str : NULL;
355
mkutf(char *dest, SQLWCHAR *src, int len)
360
for (i = 0; i < len; i++) {
361
unsigned long c = src[i];
363
if (sizeof (SQLWCHAR) == (2 * sizeof (char))) {
368
} else if (c < 0x800) {
369
*cp++ = 0xc0 | ((c >> 6) & 0x1f);
370
*cp++ = 0x80 | (c & 0x3f);
371
} else if (c < 0x10000) {
372
if ((sizeof (SQLWCHAR) == (2 * sizeof (char))) &&
373
(c >= 0xd800) && (c <= 0xdbff) && ((i + 1) < len)) {
374
unsigned long c2 = src[i + 1] & 0xffff;
376
if ((c2 >= 0xdc00) && (c <= 0xdfff)) {
377
c = ((c & 0x3ff) | ((c2 & 0x3ff) << 10)) + 0x10000;
378
*cp++ = 0xf0 | ((c >> 18) & 0x07);
379
*cp++ = 0x80 | ((c >> 12) & 0x3f);
380
*cp++ = 0x80 | ((c >> 6) & 0x3f);
381
*cp++ = 0x80 | (c & 0x3f);
386
*cp++ = 0xe0 | ((c >> 12) & 0x0f);
387
*cp++ = 0x80 | ((c >> 6) & 0x3f);
388
*cp++ = 0x80 | (c & 0x3f);
389
} else if (c < 0x200000) {
390
*cp++ = 0xf0 | ((c >> 18) & 0x07);
391
*cp++ = 0x80 | ((c >> 12) & 0x3f);
392
*cp++ = 0x80 | ((c >> 6) & 0x3f);
393
*cp++ = 0x80 | (c & 0x3f);
394
} else if (c < 0x4000000) {
395
*cp++ = 0xf8 | ((c >> 24) & 0x03);
396
*cp++ = 0x80 | ((c >> 18) & 0x3f);
397
*cp++ = 0x80 | ((c >> 12) & 0x3f);
398
*cp++ = 0x80 | ((c >> 6) & 0x3f);
399
*cp++ = 0x80 | (c & 0x3f);
400
} else if (c < 0x80000000) {
401
*cp++ = 0xfc | ((c >> 31) & 0x01);
402
*cp++ = 0x80 | ((c >> 24) & 0x3f);
403
*cp++ = 0x80 | ((c >> 18) & 0x3f);
404
*cp++ = 0x80 | ((c >> 12) & 0x3f);
405
*cp++ = 0x80 | ((c >> 6) & 0x3f);
406
*cp++ = 0x80 | (c & 0x3f);
414
uc_tainted_str_new(SQLWCHAR *str, int len)
417
char *cp = xmalloc(len * 6 + 1);
420
if ((cp != NULL) && (str != NULL)) {
421
ulen = mkutf(cp, str, len);
423
v = rb_tainted_str_new((cp != NULL) ? cp : "", ulen);
431
uc_tainted_str_new2(SQLWCHAR *str)
433
return uc_tainted_str_new(str, uc_strlen(str));
437
uc_str_new(SQLWCHAR *str, int len)
440
char *cp = xmalloc(len * 6 + 1);
443
if ((cp != NULL) && (str != NULL)) {
444
ulen = mkutf(cp, str, len);
446
v = rb_str_new((cp != NULL) ? cp : "", ulen);
454
uc_str_new2(SQLWCHAR *str)
456
return uc_str_new(str, uc_strlen(str));
460
uc_str_cat(VALUE v, SQLWCHAR *str, int len)
463
char *cp = xmalloc(len * 6 + 1);
466
if ((cp != NULL) && (str != NULL)) {
467
ulen = mkutf(cp, str, len);
470
vv = rb_str_cat(v, cp, ulen);
477
uc_from_utf(unsigned char *str, int len)
483
unsigned char *strend;
486
len = strlen((char *) str);
489
uc = ALLOC_N(SQLWCHAR, len + 1);
491
while (str < strend) {
492
unsigned char c = str[0];
497
} else if (c < 0xe0) {
498
if ((str[1] & 0xc0) == 0x80) {
499
unsigned long t = ((c & 0x1f) << 6) | (str[1] & 0x3f);
507
} else if (c < 0xf0) {
508
if (((str[1] & 0xc0) == 0x80) &&
509
((str[2] & 0xc0) == 0x80)) {
510
unsigned long t = ((c & 0x0f) << 12) |
511
((str[1] & 0x3f) << 6) | (str[2] & 0x3f);
519
} else if (c < 0xf8) {
520
if (((str[1] & 0xc0) == 0x80) &&
521
((str[2] & 0xc0) == 0x80) &&
522
((str[3] & 0xc0) == 0x80)) {
523
unsigned long t = ((c & 0x03) << 18) |
524
((str[1] & 0x3f) << 12) | ((str[2] & 0x3f) << 6) |
527
if ((sizeof (SQLWCHAR) == (2 * sizeof (char))) &&
530
uc[i++] = 0xd800 | (t & 0x3ff);
531
t = 0xdc00 | ((t >> 10) & 0x3ff);
539
} else if (c < 0xfc) {
540
if (((str[1] & 0xc0) == 0x80) &&
541
((str[2] & 0xc0) == 0x80) &&
542
((str[3] & 0xc0) == 0x80) &&
543
((str[4] & 0xc0) == 0x80)) {
544
unsigned long t = ((c & 0x01) << 24) |
545
((str[1] & 0x3f) << 18) | ((str[2] & 0x3f) << 12) |
546
((str[4] & 0x3f) << 6) | (str[5] & 0x3f);
548
if ((sizeof (SQLWCHAR) == (2 * sizeof (char))) &&
551
uc[i++] = 0xd800 | (t & 0x3ff);
552
t = 0xdc00 | ((t >> 10) & 0x3ff);
572
uc_free(SQLWCHAR *str)
583
*----------------------------------------------------------------------
585
* Things for ODBC::DSN
587
*----------------------------------------------------------------------
590
#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
594
VALUE obj = rb_obj_alloc(Cdsn);
596
rb_obj_call_init(obj, 0, NULL);
604
rb_iv_set(self, "@name", Qnil);
605
rb_iv_set(self, "@descr", Qnil);
610
*----------------------------------------------------------------------
612
* Things for ODBC::Driver
614
*----------------------------------------------------------------------
617
#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
621
VALUE obj = rb_obj_alloc(Cdrv);
623
rb_obj_call_init(obj, 0, NULL);
631
rb_iv_set(self, "@name", Qnil);
632
rb_iv_set(self, "@attrs", rb_hash_new());
637
*----------------------------------------------------------------------
639
* Cleanup routines and GC mark/free callbacks.
641
*----------------------------------------------------------------------
645
list_init(LINK *link, int offs)
647
link->succ = link->pred = link->head = NULL;
652
list_add(LINK *link, LINK *head)
654
if (link->head != NULL) {
655
rb_fatal("RubyODBC: already in list");
658
rb_fatal("RubyODBC: invalid list head");
662
link->succ = head->succ;
664
if (link->succ != NULL) {
665
link->succ->pred = link;
673
rb_fatal("RubyODBC: invalid list item");
675
if (link->head == NULL) {
676
rb_fatal("RubyODBC: item not in list");
678
if (link->succ != NULL) {
679
link->succ->pred = link->pred;
681
if (link->pred != NULL) {
682
link->pred->succ = link->succ;
684
link->head->succ = link->succ;
686
link->succ = link->pred = link->head = NULL;
690
list_first(LINK *head)
692
if (head->succ == NULL) {
695
return (void *) ((char *) head->succ - head->offs);
699
list_empty(LINK *head)
701
return head->succ == NULL;
708
if (!list_empty(&e->dbcs)) {
711
tracemsg(2, fprintf(stderr, "ObjFree: ENV %p\n", e););
712
if (e->henv != SQL_NULL_HENV) {
713
callsql(SQL_NULL_HENV, e->henv, SQL_NULL_HSTMT,
714
SQLFreeEnv(e->henv), "SQLFreeEnv");
715
e->henv = SQL_NULL_HENV;
721
link_dbc(DBC *p, ENV *e)
724
list_add(&p->link, &e->dbcs);
734
if (p->envp != NULL) {
738
if (e->self == Qnil) {
748
p->self = p->env = Qnil;
749
if (!list_empty(&p->stmts)) {
752
tracemsg(2, fprintf(stderr, "ObjFree: DBC %p\n", p););
753
if (p->hdbc != SQL_NULL_HDBC) {
754
callsql(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
755
SQLDisconnect(p->hdbc), "SQLDisconnect");
756
callsql(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
757
SQLFreeConnect(p->hdbc), "SQLFreeConnect");
758
p->hdbc = SQL_NULL_HDBC;
765
free_stmt_sub(STMT *q)
767
if (q->pinfo != NULL) {
770
for (i = 0; i < q->nump; i++) {
771
if (q->pinfo[i].outbuf != NULL) {
772
xfree(q->pinfo[i].outbuf);
780
if (q->coltypes != NULL) {
784
if (q->colnames != NULL) {
788
if (q->dbufs != NULL) {
792
if (q->self != Qnil) {
795
v = rb_iv_get(q->self, "@_a");
799
v = rb_iv_get(q->self, "@_h");
801
rb_iv_set(q->self, "@_h", rb_hash_new());
807
link_stmt(STMT *q, DBC *p)
810
list_add(&q->link, &p->stmts);
820
if (q->dbcp != NULL) {
824
if (p->self == Qnil) {
834
VALUE qself = q->self;
836
q->self = q->dbc = Qnil;
838
tracemsg(2, fprintf(stderr, "ObjFree: STMT %p\n", q););
839
if (q->hstmt != SQL_NULL_HSTMT) {
840
/* Issue warning message. */
841
fprintf(stderr, "WARNING: #<ODBC::Statement:0x%lx> was not dropped"
842
" before garbage collection.\n", (long) qself);
843
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
844
SQLFreeStmt(q->hstmt, SQL_DROP), "SQLFreeStmt(SQL_DROP)");
845
q->hstmt = SQL_NULL_HSTMT;
854
rb_funcall(rb_mGC, IDstart, 0, NULL);
860
if (p->env != Qnil) {
868
if (q->dbc != Qnil) {
874
*----------------------------------------------------------------------
876
* Set internal error (or warning) message.
878
*----------------------------------------------------------------------
882
set_err(char *msg, int warn)
884
VALUE a, v = rb_str_new2("INTERN (0) [RubyODBC]");
886
v = rb_str_cat2(v, msg);
888
rb_ary_push(a, rb_obj_taint(v));
889
CVAR_SET(Cobj, warn ? IDatatinfo : IDataterror, a);
894
*----------------------------------------------------------------------
896
* Functions to retrieve last SQL error or warning.
898
*----------------------------------------------------------------------
902
get_err_or_info(SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt, int isinfo)
905
SQLWCHAR msg[SQL_MAX_MESSAGE_LENGTH], state[6 + 1];
907
SQLCHAR msg[SQL_MAX_MESSAGE_LENGTH], state[6 + 1];
909
char buf[32], tmp[SQL_MAX_MESSAGE_LENGTH];
911
SQLINTEGER nativeerr;
913
VALUE v0 = Qnil, a = Qnil, v;
918
err = tracesql(henv, hdbc, hstmt,
919
SQLError(henv, hdbc, hstmt, state, &nativeerr, msg,
920
SQL_MAX_MESSAGE_LENGTH - 1, &len),
923
msg[SQL_MAX_MESSAGE_LENGTH - 1] = '\0';
927
v = uc_str_new2(state);
929
v = rb_str_new2((char *) state);
931
sprintf(buf, " (%d) ", (int) nativeerr);
932
v = rb_str_cat2(v, buf);
934
v = uc_str_cat(v, msg, len);
936
v = rb_str_cat(v, (char *) msg, len);
940
if ((v0 == Qnil) && (!isinfo)) {
941
v = rb_str_new2("INTERN (0) [RubyODBC]No data found");
947
case SQL_INVALID_HANDLE:
948
v = rb_str_new2("INTERN (0) [RubyODBC]Invalid handle");
952
v = rb_str_new2("INTERN (0) [RubyODBC]Error reading error message");
956
sprintf(tmp, "INTERN (0) [RubyODBC]Unknown error %d", (int) err);
957
v = rb_str_new2(tmp);
966
rb_ary_push(a, rb_obj_taint(v));
967
tracemsg(1, fprintf(stderr, " | %s\n", STR2CSTR(v)););
970
CVAR_SET(Cobj, isinfo ? IDatatinfo : IDataterror, a);
974
return (v0 == Qnil) ? NULL : STR2CSTR(v0);
977
#if defined(HAVE_SQLINSTALLERERROR) || (defined(UNICODE) && defined(HAVE_SQLINSTALLERERRORW))
982
#ifdef HAVE_SQLINSTALLERERRORW
987
SQLWCHAR msg[SQL_MAX_MESSAGE_LENGTH];
989
char msg[SQL_MAX_MESSAGE_LENGTH];
993
VALUE v0 = Qnil, a = Qnil, v;
998
for (i = 1; (!done) && (i <= 8); i++) {
1001
#ifdef USE_DLOPEN_FOR_ODBC_LIBS
1002
have_w = ruby_odbc_have_func("SQLInstallerErrorW", SQLInstallerErrorW);
1005
err = tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, SQL_NULL_HSTMT,
1006
SQLInstallerErrorW(i, &insterrcode, msg,
1007
SQL_MAX_MESSAGE_LENGTH, &len),
1008
"SQLInstallerErrorW");
1009
msg[SQL_MAX_MESSAGE_LENGTH - 1] = 0;
1011
err = tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, SQL_NULL_HSTMT,
1012
SQLInstallerError(i, &insterrcode, (char *) msg,
1013
SQL_MAX_MESSAGE_LENGTH, &len),
1014
"SQLInstallerErrorW");
1015
((char *) msg)[SQL_MAX_MESSAGE_LENGTH - 1] = '\0';
1018
err = tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, SQL_NULL_HSTMT,
1019
SQLInstallerError(i, &insterrcode, msg,
1020
SQL_MAX_MESSAGE_LENGTH, &len),
1021
"SQLInstallerError");
1022
msg[SQL_MAX_MESSAGE_LENGTH - 1] = '\0';
1026
case SQL_SUCCESS_WITH_INFO:
1027
sprintf(buf, "INSTALLER (%d) ", (int) insterrcode);
1028
v = rb_str_new2(buf);
1031
v = uc_str_cat(v, msg, len);
1033
v = rb_str_cat(v, (char *) msg, len);
1036
v = rb_str_cat(v, msg, len);
1043
v = rb_str_new2("INTERN (0) [RubyODBC]");
1044
v = rb_str_cat2(v, "Error reading installer error message");
1048
v = rb_str_new2("INTERN (0) [RubyODBC]");
1049
sprintf(buf, "Unknown installer error %d", (int) err);
1050
v = rb_str_cat2(v, buf);
1059
rb_ary_push(a, rb_obj_taint(v));
1060
tracemsg(1, fprintf(stderr, " | %s\n", STR2CSTR(v)););
1063
CVAR_SET(Cobj, IDataterror, a);
1064
return (v0 == Qnil) ? NULL : STR2CSTR(v0);
1069
get_err(SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt)
1071
return get_err_or_info(henv, hdbc, hstmt, 0);
1076
trace_sql_ret(SQLRETURN ret)
1084
case SQL_SUCCESS_WITH_INFO:
1085
p = "SQL_SUCCESS_WITH_INFO";
1093
case SQL_INVALID_HANDLE:
1094
p = "SQL_INVALID_HANDLE";
1097
sprintf(msg, "SQL_RETURN=%d", (int) ret);
1101
fprintf(stderr, " < %s\n", p);
1105
tracesql(SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt, SQLRETURN ret, char *m)
1108
fprintf(stderr, "SQLCall: %s", m);
1109
fprintf(stderr, "\n > HENV=0x%lx, HDBC=0x%lx, HSTMT=0x%lx\n",
1110
(long) henv, (long) hdbc, (long) hstmt);
1118
callsql(SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt, SQLRETURN ret, char *m)
1122
err = tracesql(henv, hdbc, hstmt, ret, m);
1123
if (err != SQL_SUCCESS) {
1125
SQLWCHAR msg[SQL_MAX_MESSAGE_LENGTH], state[6 + 1];
1127
SQLCHAR msg[SQL_MAX_MESSAGE_LENGTH], state[6 + 1];
1129
SQLINTEGER nativeerr;
1134
err = tracesql(henv, hdbc, hstmt,
1135
SQLError(henv, hdbc, hstmt, state, &nativeerr, msg,
1136
SQL_MAX_MESSAGE_LENGTH - 1, &len),
1142
case SQL_INVALID_HANDLE:
1154
succeeded_common(SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt, SQLRETURN ret,
1157
if (!SQL_SUCCEEDED(ret)) {
1163
*msgp = get_err_or_info(henv, hdbc, hstmt, 0);
1166
if (ret == SQL_SUCCESS_WITH_INFO) {
1167
get_err_or_info(henv, hdbc, hstmt, 1);
1169
CVAR_SET(Cobj, IDatatinfo, Qnil);
1175
succeeded(SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt, SQLRETURN ret,
1176
char **msgp, char *m, ...)
1183
fprintf(stderr, "SQLCall: ");
1184
vfprintf(stderr, m, args);
1186
fprintf(stderr, "\n > HENV=0x%lx, HDBC=0x%lx, HSTMT=0x%lx\n",
1187
(long) henv, (long) hdbc, (long) hstmt);
1191
return succeeded_common(henv, hdbc, hstmt, ret, msgp);
1195
succeeded_nodata(SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt, SQLRETURN ret,
1196
char **msgp, char *m, ...)
1203
fprintf(stderr, "SQLCall: ");
1204
vfprintf(stderr, m, args);
1206
fprintf(stderr, "\n > HENV=0x%lx, HDBC=0x%lx, HSTMT=0x%lx\n",
1207
(long) henv, (long) hdbc, (long) hstmt);
1211
if (ret == SQL_NO_DATA) {
1212
CVAR_SET(Cobj, IDatatinfo, Qnil);
1215
return succeeded_common(henv, hdbc, hstmt, ret, msgp);
1219
*----------------------------------------------------------------------
1221
* Return ENV from VALUE.
1223
*----------------------------------------------------------------------
1229
if (rb_obj_is_kind_of(self, Cstmt) == Qtrue) {
1232
Data_Get_Struct(self, STMT, q);
1235
rb_raise(Cerror, set_err("Stale ODBC::Statement", 0));
1238
if (rb_obj_is_kind_of(self, Cdbc) == Qtrue) {
1241
Data_Get_Struct(self, DBC, p);
1244
rb_raise(Cerror, set_err("Stale ODBC::Database", 0));
1255
Data_Get_Struct(env_of(self), ENV, e);
1260
*----------------------------------------------------------------------
1262
* Return DBC from VALUE.
1264
*----------------------------------------------------------------------
1272
if (rb_obj_is_kind_of(self, Cstmt) == Qtrue) {
1275
Data_Get_Struct(self, STMT, q);
1278
rb_raise(Cerror, set_err("Stale ODBC::Statement", 0));
1281
Data_Get_Struct(self, DBC, p);
1286
*----------------------------------------------------------------------
1288
* Raise ODBC error from Ruby.
1290
*----------------------------------------------------------------------
1294
dbc_raise(VALUE self, VALUE msg)
1297
char buf[SQL_MAX_MESSAGE_LENGTH + 1], *p;
1299
if (TYPE(msg) == T_STRING) {
1302
v = rb_any_to_s(msg);
1304
strcpy(buf, "INTERN (1) [RubyODBC]");
1306
strncat(buf, p, SQL_MAX_MESSAGE_LENGTH - strlen(buf));
1307
buf[SQL_MAX_MESSAGE_LENGTH] = '\0';
1308
v = rb_str_new2(buf);
1310
rb_ary_push(a, rb_obj_taint(v));
1311
CVAR_SET(Cobj, IDataterror, a);
1312
rb_raise(Cerror, "%s", buf);
1317
*----------------------------------------------------------------------
1321
*----------------------------------------------------------------------
1328
SQLHENV henv = SQL_NULL_HENV;
1331
if (TYPE(self) == T_MODULE) {
1337
if ((!SQL_SUCCEEDED(SQLAllocEnv(&henv))) || (henv == SQL_NULL_HENV)) {
1338
rb_raise(Cerror, set_err("Cannot allocate SQLHENV", 0));
1340
obj = Data_Make_Struct(self, ENV, NULL, free_env, e);
1341
tracemsg(2, fprintf(stderr, "ObjAlloc: ENV %p\n", e););
1344
list_init(&e->dbcs, offsetof(DBC, link));
1345
#if defined(UNICODE) && defined(SQL_OV_ODBC3)
1346
callsql(henv, SQL_NULL_HDBC, SQL_NULL_HSTMT,
1347
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
1348
(SQLPOINTER) SQL_OV_ODBC3, 0),
1349
"SQLSetEnvAttr(SQL_OV_ODBC3)");
1355
*----------------------------------------------------------------------
1357
* Obtain array of known DSNs.
1359
*----------------------------------------------------------------------
1363
dbc_dsns(VALUE self)
1366
SQLWCHAR dsn[SQL_MAX_DSN_LENGTH], descr[SQL_MAX_MESSAGE_LENGTH * 2];
1368
char dsn[SQL_MAX_DSN_LENGTH], descr[SQL_MAX_MESSAGE_LENGTH * 2];
1370
SQLSMALLINT dsnLen = 0, descrLen = 0;
1375
env = env_new(Cenv);
1376
Data_Get_Struct(env, ENV, e);
1377
aret = rb_ary_new();
1378
while (succeeded(e->henv, SQL_NULL_HDBC, SQL_NULL_HSTMT,
1379
SQLDataSources(e->henv, (SQLUSMALLINT) (first ?
1380
SQL_FETCH_FIRST : SQL_FETCH_NEXT),
1382
(SQLSMALLINT) sizeof (dsn), &dsnLen,
1384
(SQLSMALLINT) sizeof (descr),
1386
NULL, "SQLDataSources")) {
1387
VALUE odsn = rb_obj_alloc(Cdsn);
1390
dsnLen = (dsnLen == 0) ? uc_strlen(dsn) : (dsnLen / sizeof (SQLWCHAR));
1391
descrLen = (descrLen == 0) ?
1392
uc_strlen(descr) : (descrLen / sizeof (SQLWCHAR));
1393
rb_iv_set(odsn, "@name", uc_tainted_str_new(dsn, dsnLen));
1394
rb_iv_set(odsn, "@descr", uc_tainted_str_new(descr, descrLen));
1396
dsnLen = (dsnLen == 0) ? strlen(dsn) : dsnLen;
1397
descrLen = (descrLen == 0) ? strlen(descr) : descrLen;
1398
rb_iv_set(odsn, "@name", rb_tainted_str_new(dsn, dsnLen));
1399
rb_iv_set(odsn, "@descr", rb_tainted_str_new(descr, descrLen));
1401
rb_ary_push(aret, odsn);
1402
first = dsnLen = descrLen = 0;
1408
*----------------------------------------------------------------------
1410
* Obtain array of known drivers.
1412
*----------------------------------------------------------------------
1416
dbc_drivers(VALUE self)
1419
SQLWCHAR driver[SQL_MAX_MESSAGE_LENGTH], attrs[SQL_MAX_MESSAGE_LENGTH * 2];
1422
char driver[SQL_MAX_MESSAGE_LENGTH], attrs[SQL_MAX_MESSAGE_LENGTH * 2];
1425
SQLSMALLINT driverLen = 0, attrsLen = 0;
1430
env = env_new(Cenv);
1431
Data_Get_Struct(env, ENV, e);
1432
aret = rb_ary_new();
1433
while (succeeded(e->henv, SQL_NULL_HDBC, SQL_NULL_HSTMT,
1434
SQLDrivers(e->henv, (SQLUSMALLINT) (first ?
1435
SQL_FETCH_FIRST : SQL_FETCH_NEXT),
1436
(SQLTCHAR *) driver,
1437
(SQLSMALLINT) sizeof (driver), &driverLen,
1439
(SQLSMALLINT) sizeof (attrs), &attrsLen),
1440
NULL, "SQLDrivers")) {
1441
VALUE odrv = rb_obj_alloc(Cdrv);
1442
VALUE h = rb_hash_new();
1446
driverLen = (driverLen == 0) ?
1447
uc_strlen(driver) : (driverLen / sizeof (SQLWCHAR));
1448
rb_iv_set(odrv, "@name", uc_tainted_str_new(driver, driverLen));
1449
for (attr = attrs; *attr; attr += uc_strlen(attr) + 1) {
1450
SQLWCHAR *p = uc_strchr(attr, (SQLWCHAR) '=');
1452
if ((p != NULL) && (p != attr)) {
1454
uc_tainted_str_new(attr, (p - attr) /
1456
uc_tainted_str_new2(p + 1));
1461
driverLen = (driverLen == 0) ? strlen(driver) : driverLen;
1462
rb_iv_set(odrv, "@name", rb_tainted_str_new(driver, driverLen));
1463
for (attr = attrs; *attr; attr += strlen(attr) + 1) {
1464
char *p = strchr(attr, '=');
1466
if ((p != NULL) && (p != attr)) {
1467
rb_hash_aset(h, rb_tainted_str_new(attr, p - attr),
1468
rb_tainted_str_new2(p + 1));
1474
rb_iv_set(odrv, "@attrs", h);
1476
rb_ary_push(aret, odrv);
1477
first = driverLen = attrsLen = 0;
1483
*----------------------------------------------------------------------
1485
* Management methods.
1487
*----------------------------------------------------------------------
1490
#ifdef HAVE_ODBCINST_H
1492
conf_dsn(int argc, VALUE *argv, VALUE self, int op)
1494
VALUE drv, attr, issys, astr;
1496
#ifdef HAVE_SQLCONFIGDATASOURCEW
1501
SQLWCHAR *sdrv, *sastr;
1506
rb_scan_args(argc, argv, "12", &drv, &attr, &issys);
1507
if (rb_obj_is_kind_of(drv, Cdrv) == Qtrue) {
1511
rb_raise(rb_eArgError, "wrong # of arguments");
1513
x = rb_iv_get(drv, "@name");
1514
a = rb_iv_get(drv, "@attrs");
1519
Check_Type(drv, T_STRING);
1522
case ODBC_ADD_DSN: op = ODBC_ADD_SYS_DSN; break;
1523
case ODBC_CONFIG_DSN: op = ODBC_CONFIG_SYS_DSN; break;
1524
case ODBC_REMOVE_DSN: op = ODBC_REMOVE_SYS_DSN; break;
1527
astr = rb_str_new2("");
1528
if (rb_obj_is_kind_of(attr, rb_cHash) == Qtrue) {
1531
a = rb_funcall(attr, IDkeys, 0, NULL);
1532
while ((x = rb_ary_shift(a)) != Qnil) {
1533
VALUE v = rb_hash_aref(attr, x);
1535
astr = rb_str_concat(astr, x);
1536
astr = rb_str_cat2(astr, "=");
1537
astr = rb_str_concat(astr, v);
1538
astr = rb_str_cat(astr, "", 1);
1541
astr = rb_str_cat(astr, "", 1);
1543
#ifdef USE_DLOPEN_FOR_ODBC_LIBS
1544
have_w = ruby_odbc_have_func("SQLConfigDataSourceW", SQLConfigDataSourceW);
1547
sdrv = uc_from_utf((unsigned char *) STR2CSTR(drv), -1);
1548
sastr = uc_from_utf((unsigned char *) STR2CSTR(astr), -1);
1549
if ((sdrv == NULL) || (sastr == NULL)) {
1552
rb_raise(Cerror, set_err("Out of memory", 0));
1554
if (SQLConfigDataSourceW(NULL, (WORD) op,
1555
(LPWSTR) sdrv, (LPWSTR) sastr)) {
1563
sdrv = (SQLWCHAR *) STR2CSTR(drv);
1564
sastr = (SQLWCHAR *) STR2CSTR(astr);
1565
if (SQLConfigDataSource(NULL, (WORD) op,
1566
(LPCSTR) sdrv, (LPCSTR) sastr)) {
1571
sdrv = STR2CSTR(drv);
1572
sastr = STR2CSTR(astr);
1573
if (SQLConfigDataSource(NULL, (WORD) op, sdrv, sastr)) {
1577
#if defined(HAVE_SQLINSTALLERERROR) || (defined(UNICODE) && defined(HAVE_SQLINSTALLERERRORW))
1578
rb_raise(Cerror, set_err(get_installer_err(), 0));
1580
rb_raise(Cerror, set_err("DSN configuration error", 0));
1587
dbc_adddsn(int argc, VALUE *argv, VALUE self)
1589
#ifdef HAVE_ODBCINST_H
1590
return conf_dsn(argc, argv, self, ODBC_ADD_DSN);
1592
rb_raise(Cerror, set_err("ODBC::add_dsn not supported", 0));
1598
dbc_confdsn(int argc, VALUE *argv, VALUE self)
1600
#ifdef HAVE_ODBCINST_H
1601
return conf_dsn(argc, argv, self, ODBC_CONFIG_DSN);
1603
rb_raise(Cerror, set_err("ODBC::config_dsn not supported", 0));
1609
dbc_deldsn(int argc, VALUE *argv, VALUE self)
1611
#ifdef HAVE_ODBCINST_H
1612
return conf_dsn(argc, argv, self, ODBC_REMOVE_DSN);
1614
rb_raise(Cerror, set_err("ODBC::del_dsn not supported", 0));
1620
dbc_wfdsn(int argc, VALUE *argv, VALUE self)
1622
#ifdef HAVE_ODBCINST_H
1623
VALUE fname, aname, kname, val;
1625
#ifdef HAVE_SQLWRITEFILEDSNW
1630
SQLWCHAR *sfname, *saname, *skname, *sval = NULL;
1632
char *sfname, *saname, *skname, *sval = NULL;
1635
rb_scan_args(argc, argv, "31", &fname, &aname, &kname, &val);
1636
Check_Type(fname, T_STRING);
1637
Check_Type(aname, T_STRING);
1638
Check_Type(kname, T_STRING);
1640
Check_Type(val, T_STRING);
1643
#ifdef USE_DLOPEN_FOR_ODBC_LIBS
1644
have_w = ruby_odbc_have_func("SQLWriteFileDSNW", SQLWriteFileDSNW);
1649
sfname = uc_from_utf((unsigned char *) STR2CSTR(fname), -1);
1650
saname = uc_from_utf((unsigned char *) STR2CSTR(aname), -1);
1651
skname = uc_from_utf((unsigned char *) STR2CSTR(kname), -1);
1652
if ((sfname == NULL) || (saname == NULL) || (skname == NULL)) {
1657
rb_raise(Cerror, set_err("Out of memory", 0));
1660
sval = uc_from_utf((unsigned char *) STR2CSTR(val), -1);
1665
rc = SQLWriteFileDSNW(sfname, saname, skname, sval);
1674
sfname = (SQLWCHAR *) STR2CSTR(fname);
1675
saname = (SQLWCHAR *) STR2CSTR(aname);
1676
skname = (SQLWCHAR *) STR2CSTR(kname);
1678
sval = (SQLWCHAR *) STR2CSTR(val);
1680
if (SQLWriteFileDSN((LPCSTR) sfname, (LPCSTR) saname,
1681
(LPCSTR) skname, (LPCSTR) sval)) {
1686
sfname = STR2CSTR(fname);
1687
saname = STR2CSTR(aname);
1688
skname = STR2CSTR(kname);
1690
sval = STR2CSTR(val);
1692
if (SQLWriteFileDSN(sfname, saname, skname, sval)) {
1696
#if defined(HAVE_SQLINSTALLERERROR) || (defined(UNICODE) && defined(HAVE_SQLINSTALLERERRORW))
1697
rb_raise(Cerror, set_err(get_installer_err(), 0));
1699
rb_raise(Cerror, set_err("File DSN configuration error", 0));
1702
rb_raise(Cerror, set_err("ODBC::write_file_dsn not supported", 0));
1708
dbc_rfdsn(int argc, VALUE *argv, VALUE self)
1710
#ifdef HAVE_ODBCINST_H
1711
VALUE fname, aname, kname;
1713
#ifdef HAVE_SQLREADFILEDSNW
1718
SQLWCHAR *sfname, *saname, *skname, valbuf[SQL_MAX_MESSAGE_LENGTH];
1720
char *sfname, *saname, *skname, valbuf[SQL_MAX_MESSAGE_LENGTH];
1723
rb_scan_args(argc, argv, "30", &fname, &aname, &kname);
1724
Check_Type(fname, T_STRING);
1725
Check_Type(aname, T_STRING);
1726
Check_Type(kname, T_STRING);
1728
#ifdef USE_DLOPEN_FOR_ODBC_LIBS
1729
have_w = ruby_odbc_have_func("SQLReadFileDSNW", SQLReadFileDSNW);
1734
sfname = uc_from_utf((unsigned char *) STR2CSTR(fname), -1);
1735
saname = uc_from_utf((unsigned char *) STR2CSTR(aname), -1);
1736
skname = uc_from_utf((unsigned char *) STR2CSTR(kname), -1);
1738
if ((sfname == NULL) || (saname == NULL) || (skname == NULL)) {
1742
rb_raise(Cerror, set_err("Out of memory", 0));
1744
rc = SQLReadFileDSNW(sfname, saname, skname, valbuf,
1745
sizeof (valbuf), NULL);
1750
return uc_tainted_str_new2(valbuf);
1753
sfname = (SQLWCHAR *) STR2CSTR(fname);
1754
saname = (SQLWCHAR *) STR2CSTR(aname);
1755
skname = (SQLWCHAR *) STR2CSTR(kname);
1757
if (SQLReadFileDSN((LPCSTR) sfname, (LPCSTR) saname,
1758
(LPCSTR) skname, (LPSTR) valbuf,
1759
sizeof (valbuf), NULL)) {
1760
return rb_tainted_str_new2((char *) valbuf);
1764
sfname = STR2CSTR(fname);
1765
saname = STR2CSTR(aname);
1766
skname = STR2CSTR(kname);
1768
if (SQLReadFileDSN(sfname, saname, skname, valbuf,
1769
sizeof (valbuf), NULL)) {
1770
return rb_tainted_str_new2(valbuf);
1773
#if defined(HAVE_SQLINSTALLERERROR) || (defined(UNICODE) && defined(HAVE_SQLINSTALLERERRORW))
1774
rb_raise(Cerror, set_err(get_installer_err(), 0));
1776
rb_raise(Cerror, set_err("File DSN configuration error", 0));
1779
rb_raise(Cerror, set_err("ODBC::read_file_dsn not supported", 0));
1785
*----------------------------------------------------------------------
1787
* Return last ODBC error or warning.
1789
*----------------------------------------------------------------------
1793
dbc_error(VALUE self)
1795
return rb_cvar_get(Cobj, IDataterror);
1799
dbc_warn(VALUE self)
1801
return rb_cvar_get(Cobj, IDatatinfo);
1805
dbc_clrerror(VALUE self)
1807
CVAR_SET(Cobj, IDataterror, Qnil);
1808
CVAR_SET(Cobj, IDatatinfo, Qnil);
1813
*----------------------------------------------------------------------
1815
* Connection instance initializer.
1817
*----------------------------------------------------------------------
1820
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
1822
dbc_alloc(VALUE self)
1825
VALUE obj = Data_Make_Struct(self, DBC, mark_dbc, free_dbc, p);
1827
tracemsg(2, fprintf(stderr, "ObjAlloc: DBC %p\n", p););
1828
list_init(&p->link, offsetof(DBC, link));
1832
list_init(&p->stmts, offsetof(STMT, link));
1833
p->hdbc = SQL_NULL_HDBC;
1839
dbc_new(int argc, VALUE *argv, VALUE self)
1842
VALUE obj, env = Qnil;
1844
if (TYPE(self) == T_MODULE) {
1850
if (rb_obj_is_kind_of(self, Cenv) == Qtrue) {
1854
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
1855
obj = rb_obj_alloc(Cdbc);
1856
Data_Get_Struct(obj, DBC, p);
1859
obj = Data_Make_Struct(self, DBC, mark_dbc, free_dbc, p);
1860
tracemsg(2, fprintf(stderr, "ObjAlloc: DBC %p\n", p););
1861
list_init(&p->link, offsetof(DBC, link));
1865
list_init(&p->stmts, offsetof(STMT, link));
1866
p->hdbc = SQL_NULL_HDBC;
1872
Data_Get_Struct(env, ENV, e);
1876
rb_obj_call_init(obj, argc, argv);
1882
*----------------------------------------------------------------------
1884
* Connect to data source.
1886
*----------------------------------------------------------------------
1890
dbc_connect(int argc, VALUE *argv, VALUE self)
1894
VALUE dsn, user, passwd;
1896
SQLWCHAR *sdsn = NULL, *suser = NULL, *spasswd = NULL;
1898
char *sdsn, *suser = NULL, *spasswd = NULL;
1903
rb_scan_args(argc, argv, "03", &dsn, &user, &passwd);
1905
if (rb_obj_is_kind_of(dsn, Cdsn) == Qtrue) {
1906
dsn = rb_iv_get(dsn, "@name");
1908
Check_Type(dsn, T_STRING);
1911
Check_Type(user, T_STRING);
1913
if (passwd != Qnil) {
1914
Check_Type(passwd, T_STRING);
1917
if (p->hdbc != SQL_NULL_HDBC) {
1918
rb_raise(Cerror, set_err("Already connected", 0));
1920
if (p->env == Qnil) {
1921
p->env = env_new(Cenv);
1922
e = get_env(p->env);
1925
e = get_env(p->env);
1932
suser = uc_from_utf((unsigned char *) STR2CSTR(user), -1);
1934
if (passwd != Qnil) {
1935
spasswd = uc_from_utf((unsigned char *) STR2CSTR(passwd), -1);
1937
sdsn = uc_from_utf((unsigned char *) STR2CSTR(dsn), -1);
1938
if (((suser == NULL) && (user != Qnil)) ||
1939
((spasswd == NULL) && (passwd != Qnil)) ||
1944
rb_raise(Cerror, set_err("Out of memory", 0));
1948
suser = STR2CSTR(user);
1950
if (passwd != Qnil) {
1951
spasswd = STR2CSTR(passwd);
1953
sdsn = STR2CSTR(dsn);
1955
if (!succeeded(e->henv, SQL_NULL_HDBC, SQL_NULL_HSTMT,
1956
SQLAllocConnect(e->henv, &dbc), &msg, "SQLAllocConnect")) {
1962
rb_raise(Cerror, "%s", msg);
1964
if (!succeeded(SQL_NULL_HENV, dbc, SQL_NULL_HSTMT,
1965
SQLConnect(dbc, (SQLTCHAR *) sdsn, SQL_NTS,
1967
(SQLSMALLINT) (suser ? SQL_NTS : 0),
1968
(SQLTCHAR *) spasswd,
1969
(SQLSMALLINT) (spasswd ? SQL_NTS : 0)),
1971
"SQLConnect('%s')", sdsn)) {
1977
callsql(SQL_NULL_HENV, dbc, SQL_NULL_HSTMT,
1978
SQLFreeConnect(dbc), "SQLFreeConnect");
1979
rb_raise(Cerror, "%s", msg);
1991
dbc_drvconnect(VALUE self, VALUE drv)
2003
if (rb_obj_is_kind_of(drv, Cdrv) == Qtrue) {
2006
d = rb_str_new2("");
2007
a = rb_funcall(rb_iv_get(drv, "@attrs"), IDkeys, 0, NULL);
2008
while ((x = rb_ary_shift(a)) != Qnil) {
2009
VALUE v = rb_hash_aref(rb_iv_get(drv, "@attrs"), x);
2011
d = rb_str_concat(d, x);
2012
d = rb_str_cat2(d, "=");
2013
d = rb_str_concat(d, v);
2014
d = rb_str_cat2(d, ";");
2018
Check_Type(drv, T_STRING);
2020
if (p->hdbc != SQL_NULL_HDBC) {
2021
rb_raise(Cerror, set_err("Already connected", 0));
2023
if (p->env == Qnil) {
2024
p->env = env_new(Cenv);
2025
e = get_env(p->env);
2028
e = get_env(p->env);
2031
sdrv = uc_from_utf((unsigned char *) STR2CSTR(drv), -1);
2033
rb_raise(Cerror, set_err("Out of memory", 0));
2036
sdrv = STR2CSTR(drv);
2038
if (!succeeded(e->henv, SQL_NULL_HDBC, SQL_NULL_HSTMT,
2039
SQLAllocConnect(e->henv, &dbc), &msg, "SQLAllocConnect")) {
2043
rb_raise(Cerror, "%s", msg);
2045
if (!succeeded(e->henv, dbc, SQL_NULL_HSTMT,
2046
SQLDriverConnect(dbc, NULL, (SQLTCHAR *) sdrv, SQL_NTS,
2047
NULL, 0, NULL, SQL_DRIVER_NOPROMPT),
2048
&msg, "SQLDriverConnect")) {
2052
callsql(SQL_NULL_HENV, dbc, SQL_NULL_HSTMT,
2053
SQLFreeConnect(dbc), "SQLFreeConnect");
2054
rb_raise(Cerror, "%s", msg);
2064
dbc_connected(VALUE self)
2066
DBC *p = get_dbc(self);
2068
return (p->hdbc == SQL_NULL_HDBC) ? Qfalse : Qtrue;
2072
*----------------------------------------------------------------------
2074
* Drop all active statements from data source.
2076
*----------------------------------------------------------------------
2080
dbc_dropall(VALUE self)
2082
DBC *p = get_dbc(self);
2084
while (!list_empty(&p->stmts)) {
2085
STMT *q = list_first(&p->stmts);
2087
if (q->self == Qnil) {
2088
rb_fatal("RubyODBC: invalid stmt in dropall");
2096
*----------------------------------------------------------------------
2098
* Disconnect from data source.
2100
*----------------------------------------------------------------------
2104
dbc_disconnect(int argc, VALUE *argv, VALUE self)
2106
DBC *p = get_dbc(self);
2107
VALUE nodrop = Qfalse;
2110
rb_scan_args(argc, argv, "01", &nodrop);
2111
if (!RTEST(nodrop)) {
2114
if (p->hdbc == SQL_NULL_HDBC) {
2117
if (list_empty(&p->stmts)) {
2118
callsql(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
2119
SQLDisconnect(p->hdbc), "SQLDisconnect");
2120
if (!succeeded(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
2121
SQLFreeConnect(p->hdbc), &msg, "SQLFreeConnect")) {
2122
rb_raise(Cerror, "%s", msg);
2124
p->hdbc = SQL_NULL_HDBC;
2133
*----------------------------------------------------------------------
2135
* Database meta data via SQLGetInfo()
2137
*----------------------------------------------------------------------
2140
#define GI_CONST_SINT(x) { #x, x, SQL_C_SHORT }
2141
#define GI_CONST_INT(x) { #x, x, SQL_C_LONG }
2142
#define GI_CONST_BITS(x) { #x, x, SQL_C_LONG }
2143
#define GI_CONST_STR(x) { #x, x, SQL_C_CHAR }
2144
#define GI_CONST_END { NULL, -1, -1 }
2149
} get_info_map[] = {
2152
GI_CONST_SINT(SQL_ACTIVE_ENVIRONMENTS),
2153
GI_CONST_SINT(SQL_ACTIVE_CONNECTIONS),
2154
GI_CONST_SINT(SQL_ACTIVE_STATEMENTS),
2155
GI_CONST_INT(SQL_ASYNC_MODE),
2156
GI_CONST_SINT(SQL_CATALOG_LOCATION),
2157
GI_CONST_SINT(SQL_CONCAT_NULL_BEHAVIOR),
2158
GI_CONST_SINT(SQL_CORRELATION_NAME),
2159
GI_CONST_SINT(SQL_CURSOR_COMMIT_BEHAVIOR),
2160
GI_CONST_SINT(SQL_CURSOR_ROLLBACK_BEHAVIOR),
2161
GI_CONST_INT(SQL_CURSOR_SENSITIVITY),
2162
GI_CONST_INT(SQL_DDL_INDEX),
2163
GI_CONST_INT(SQL_DEFAULT_TXN_ISOLATION),
2164
GI_CONST_INT(SQL_DRIVER_HDBC),
2165
GI_CONST_INT(SQL_DRIVER_HENV),
2166
GI_CONST_INT(SQL_DRIVER_HDESC),
2167
GI_CONST_INT(SQL_DRIVER_HLIB),
2168
GI_CONST_INT(SQL_DRIVER_HSTMT),
2169
GI_CONST_SINT(SQL_FILE_USAGE),
2170
GI_CONST_SINT(SQL_GROUP_BY),
2171
GI_CONST_SINT(SQL_IDENTIFIER_CASE),
2172
GI_CONST_INT(SQL_MAX_ASYNC_CONCURRENT_STATEMENTS),
2173
GI_CONST_INT(SQL_MAX_BINARY_LITERAL_LEN),
2174
GI_CONST_SINT(SQL_MAX_CATALOG_NAME_LEN),
2175
GI_CONST_INT(SQL_MAX_CHAR_LITERAL_LEN),
2176
GI_CONST_SINT(SQL_MAX_COLUMN_NAME_LEN),
2177
GI_CONST_SINT(SQL_MAX_COLUMNS_IN_GROUP_BY),
2178
GI_CONST_SINT(SQL_MAX_COLUMNS_IN_INDEX),
2179
GI_CONST_SINT(SQL_MAX_COLUMNS_IN_ORDER_BY),
2180
GI_CONST_SINT(SQL_MAX_COLUMNS_IN_SELECT),
2181
GI_CONST_SINT(SQL_MAX_COLUMNS_IN_TABLE),
2182
GI_CONST_SINT(SQL_MAX_CONCURRENT_ACTIVITIES),
2183
GI_CONST_SINT(SQL_MAX_CURSOR_NAME_LEN),
2184
GI_CONST_SINT(SQL_MAX_DRIVER_CONNECTIONS),
2185
GI_CONST_SINT(SQL_MAX_IDENTIFIER_LEN),
2186
GI_CONST_INT(SQL_MAX_INDEX_SIZE),
2187
GI_CONST_SINT(SQL_MAX_OWNER_NAME_LEN),
2188
GI_CONST_SINT(SQL_MAX_PROCEDURE_NAME_LEN),
2189
GI_CONST_SINT(SQL_MAX_QUALIFIER_NAME_LEN),
2190
GI_CONST_INT(SQL_MAX_ROW_SIZE),
2191
GI_CONST_SINT(SQL_MAX_SCHEMA_NAME_LEN),
2192
GI_CONST_INT(SQL_MAX_STATEMENT_LEN),
2193
GI_CONST_SINT(SQL_MAX_TABLE_NAME_LEN),
2194
GI_CONST_SINT(SQL_MAX_TABLES_IN_SELECT),
2195
GI_CONST_SINT(SQL_MAX_USER_NAME_LEN),
2196
GI_CONST_SINT(SQL_NON_NULLABLE_COLUMNS),
2197
GI_CONST_SINT(SQL_NULL_COLLATION),
2198
GI_CONST_SINT(SQL_ODBC_API_CONFORMANCE),
2199
GI_CONST_INT(SQL_ODBC_INTERFACE_CONFORMANCE),
2200
GI_CONST_SINT(SQL_ODBC_SAG_CLI_CONFORMANCE),
2201
GI_CONST_SINT(SQL_ODBC_SQL_CONFORMANCE),
2202
GI_CONST_INT(SQL_PARAM_ARRAY_ROW_COUNTS),
2203
GI_CONST_INT(SQL_PARAM_ARRAY_SELECTS),
2204
GI_CONST_SINT(SQL_QUALIFIER_LOCATION),
2205
GI_CONST_SINT(SQL_QUOTED_IDENTIFIER_CASE),
2206
GI_CONST_INT(SQL_SQL_CONFORMANCE),
2207
GI_CONST_SINT(SQL_TXN_CAPABLE),
2209
/* yielding ints (but bitmasks) */
2210
GI_CONST_BITS(SQL_AGGREGATE_FUNCTIONS),
2211
GI_CONST_BITS(SQL_ALTER_DOMAIN),
2212
GI_CONST_BITS(SQL_ALTER_TABLE),
2213
GI_CONST_BITS(SQL_BATCH_ROW_COUNT),
2214
GI_CONST_BITS(SQL_BATCH_SUPPORT),
2215
GI_CONST_BITS(SQL_BOOKMARK_PERSISTENCE),
2216
GI_CONST_BITS(SQL_CATALOG_USAGE),
2217
GI_CONST_BITS(SQL_CONVERT_BINARY),
2218
GI_CONST_BITS(SQL_CONVERT_BIT),
2219
GI_CONST_BITS(SQL_CONVERT_CHAR),
2220
#ifdef SQL_CONVERT_GUID
2221
GI_CONST_BITS(SQL_CONVERT_GUID),
2223
GI_CONST_BITS(SQL_CONVERT_DATE),
2224
GI_CONST_BITS(SQL_CONVERT_DECIMAL),
2225
GI_CONST_BITS(SQL_CONVERT_DOUBLE),
2226
GI_CONST_BITS(SQL_CONVERT_FLOAT),
2227
GI_CONST_BITS(SQL_CONVERT_FUNCTIONS),
2228
GI_CONST_BITS(SQL_CONVERT_INTEGER),
2229
GI_CONST_BITS(SQL_CONVERT_INTERVAL_YEAR_MONTH),
2230
GI_CONST_BITS(SQL_CONVERT_INTERVAL_DAY_TIME),
2231
GI_CONST_BITS(SQL_CONVERT_LONGVARBINARY),
2232
GI_CONST_BITS(SQL_CONVERT_LONGVARCHAR),
2233
GI_CONST_BITS(SQL_CONVERT_NUMERIC),
2234
GI_CONST_BITS(SQL_CONVERT_REAL),
2235
GI_CONST_BITS(SQL_CONVERT_SMALLINT),
2236
GI_CONST_BITS(SQL_CONVERT_TIME),
2237
GI_CONST_BITS(SQL_CONVERT_TIMESTAMP),
2238
GI_CONST_BITS(SQL_CONVERT_TINYINT),
2239
GI_CONST_BITS(SQL_CONVERT_VARBINARY),
2240
GI_CONST_BITS(SQL_CONVERT_VARCHAR),
2241
GI_CONST_BITS(SQL_CONVERT_WCHAR),
2242
GI_CONST_BITS(SQL_CONVERT_WLONGVARCHAR),
2243
GI_CONST_BITS(SQL_CONVERT_WVARCHAR),
2244
GI_CONST_BITS(SQL_CREATE_ASSERTION),
2245
GI_CONST_BITS(SQL_CREATE_CHARACTER_SET),
2246
GI_CONST_BITS(SQL_CREATE_COLLATION),
2247
GI_CONST_BITS(SQL_CREATE_DOMAIN),
2248
GI_CONST_BITS(SQL_CREATE_SCHEMA),
2249
GI_CONST_BITS(SQL_CREATE_TABLE),
2250
GI_CONST_BITS(SQL_CREATE_TRANSLATION),
2251
GI_CONST_BITS(SQL_CREATE_VIEW),
2252
GI_CONST_BITS(SQL_DATETIME_LITERALS),
2253
GI_CONST_BITS(SQL_DROP_ASSERTION),
2254
GI_CONST_BITS(SQL_DROP_CHARACTER_SET),
2255
GI_CONST_BITS(SQL_DROP_COLLATION),
2256
GI_CONST_BITS(SQL_DROP_DOMAIN),
2257
GI_CONST_BITS(SQL_DROP_SCHEMA),
2258
GI_CONST_BITS(SQL_DROP_TABLE),
2259
GI_CONST_BITS(SQL_DROP_TRANSLATION),
2260
GI_CONST_BITS(SQL_DROP_VIEW),
2261
GI_CONST_BITS(SQL_DTC_TRANSITION_COST),
2262
GI_CONST_BITS(SQL_DYNAMIC_CURSOR_ATTRIBUTES1),
2263
GI_CONST_BITS(SQL_DYNAMIC_CURSOR_ATTRIBUTES2),
2264
GI_CONST_BITS(SQL_FETCH_DIRECTION),
2265
GI_CONST_BITS(SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1),
2266
GI_CONST_BITS(SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2),
2267
GI_CONST_BITS(SQL_GETDATA_EXTENSIONS),
2268
GI_CONST_BITS(SQL_KEYSET_CURSOR_ATTRIBUTES1),
2269
GI_CONST_BITS(SQL_KEYSET_CURSOR_ATTRIBUTES2),
2270
GI_CONST_BITS(SQL_INDEX_KEYWORDS),
2271
GI_CONST_BITS(SQL_INFO_SCHEMA_VIEWS),
2272
GI_CONST_BITS(SQL_INSERT_STATEMENT),
2273
GI_CONST_BITS(SQL_LOCK_TYPES),
2274
GI_CONST_BITS(SQL_NUMERIC_FUNCTIONS),
2275
GI_CONST_BITS(SQL_OJ_CAPABILITIES),
2276
GI_CONST_BITS(SQL_OWNER_USAGE),
2277
GI_CONST_BITS(SQL_POS_OPERATIONS),
2278
GI_CONST_BITS(SQL_POSITIONED_STATEMENTS),
2279
GI_CONST_BITS(SQL_QUALIFIER_USAGE),
2280
GI_CONST_BITS(SQL_SCHEMA_USAGE),
2281
GI_CONST_BITS(SQL_SCROLL_CONCURRENCY),
2282
GI_CONST_BITS(SQL_SCROLL_OPTIONS),
2283
GI_CONST_BITS(SQL_SQL92_DATETIME_FUNCTIONS),
2284
GI_CONST_BITS(SQL_SQL92_FOREIGN_KEY_DELETE_RULE),
2285
GI_CONST_BITS(SQL_SQL92_FOREIGN_KEY_UPDATE_RULE),
2286
GI_CONST_BITS(SQL_SQL92_GRANT),
2287
GI_CONST_BITS(SQL_SQL92_NUMERIC_VALUE_FUNCTIONS),
2288
GI_CONST_BITS(SQL_SQL92_PREDICATES),
2289
GI_CONST_BITS(SQL_SQL92_RELATIONAL_JOIN_OPERATORS),
2290
GI_CONST_BITS(SQL_SQL92_REVOKE),
2291
GI_CONST_BITS(SQL_SQL92_ROW_VALUE_CONSTRUCTOR),
2292
GI_CONST_BITS(SQL_SQL92_STRING_FUNCTIONS),
2293
GI_CONST_BITS(SQL_SQL92_VALUE_EXPRESSIONS),
2294
GI_CONST_BITS(SQL_STANDARD_CLI_CONFORMANCE),
2295
GI_CONST_BITS(SQL_STATIC_CURSOR_ATTRIBUTES1),
2296
GI_CONST_BITS(SQL_STATIC_CURSOR_ATTRIBUTES2),
2297
GI_CONST_BITS(SQL_STATIC_SENSITIVITY),
2298
GI_CONST_BITS(SQL_STRING_FUNCTIONS),
2299
GI_CONST_BITS(SQL_SUBQUERIES),
2300
GI_CONST_BITS(SQL_SYSTEM_FUNCTIONS),
2301
GI_CONST_BITS(SQL_TIMEDATE_ADD_INTERVALS),
2302
GI_CONST_BITS(SQL_TIMEDATE_DIFF_INTERVALS),
2303
GI_CONST_BITS(SQL_TIMEDATE_FUNCTIONS),
2304
GI_CONST_BITS(SQL_TXN_ISOLATION_OPTION),
2305
GI_CONST_BITS(SQL_UNION),
2307
/* yielding strings */
2308
GI_CONST_STR(SQL_ACCESSIBLE_PROCEDURES),
2309
GI_CONST_STR(SQL_ACCESSIBLE_TABLES),
2310
GI_CONST_STR(SQL_CATALOG_NAME),
2311
GI_CONST_STR(SQL_CATALOG_NAME_SEPARATOR),
2312
GI_CONST_STR(SQL_CATALOG_TERM),
2313
GI_CONST_STR(SQL_COLLATION_SEQ),
2314
GI_CONST_STR(SQL_COLUMN_ALIAS),
2315
GI_CONST_STR(SQL_DATA_SOURCE_NAME),
2316
GI_CONST_STR(SQL_DATA_SOURCE_READ_ONLY),
2317
GI_CONST_STR(SQL_DATABASE_NAME),
2318
GI_CONST_STR(SQL_DBMS_NAME),
2319
GI_CONST_STR(SQL_DBMS_VER),
2320
GI_CONST_STR(SQL_DESCRIBE_PARAMETER),
2321
GI_CONST_STR(SQL_DM_VER),
2322
GI_CONST_STR(SQL_DRIVER_NAME),
2323
GI_CONST_STR(SQL_DRIVER_ODBC_VER),
2324
GI_CONST_STR(SQL_DRIVER_VER),
2325
GI_CONST_STR(SQL_EXPRESSIONS_IN_ORDERBY),
2326
GI_CONST_STR(SQL_IDENTIFIER_QUOTE_CHAR),
2327
GI_CONST_STR(SQL_INTEGRITY),
2328
GI_CONST_STR(SQL_KEYWORDS),
2329
GI_CONST_STR(SQL_LIKE_ESCAPE_CLAUSE),
2330
GI_CONST_STR(SQL_MAX_ROW_SIZE_INCLUDES_LONG),
2331
GI_CONST_STR(SQL_MULT_RESULT_SETS),
2332
GI_CONST_STR(SQL_MULTIPLE_ACTIVE_TXN),
2333
GI_CONST_STR(SQL_NEED_LONG_DATA_LEN),
2334
GI_CONST_STR(SQL_ODBC_SQL_OPT_IEF),
2335
GI_CONST_STR(SQL_ODBC_VER),
2336
GI_CONST_STR(SQL_ORDER_BY_COLUMNS_IN_SELECT),
2337
GI_CONST_STR(SQL_OUTER_JOINS),
2338
GI_CONST_STR(SQL_OWNER_TERM),
2339
GI_CONST_STR(SQL_PROCEDURE_TERM),
2340
GI_CONST_STR(SQL_PROCEDURES),
2341
GI_CONST_STR(SQL_QUALIFIER_NAME_SEPARATOR),
2342
GI_CONST_STR(SQL_QUALIFIER_TERM),
2343
GI_CONST_STR(SQL_ROW_UPDATES),
2344
GI_CONST_STR(SQL_SCHEMA_TERM),
2345
GI_CONST_STR(SQL_SEARCH_PATTERN_ESCAPE),
2346
GI_CONST_STR(SQL_SERVER_NAME),
2347
GI_CONST_STR(SQL_SPECIAL_CHARACTERS),
2348
GI_CONST_STR(SQL_TABLE_TERM),
2349
GI_CONST_STR(SQL_USER_NAME),
2350
GI_CONST_STR(SQL_XOPEN_CLI_YEAR),
2356
#define GI_CONST_BITMAP(x) { #x, x }
2357
#define GI_CONST_BITMAP_END { NULL, 0 }
2361
} get_info_bitmap[] = {
2362
GI_CONST_BITMAP(SQL_AD_ADD_CONSTRAINT_DEFERRABLE),
2363
GI_CONST_BITMAP(SQL_AD_ADD_CONSTRAINT_INITIALLY_DEFERRED),
2364
GI_CONST_BITMAP(SQL_AD_ADD_CONSTRAINT_INITIALLY_IMMEDIATE),
2365
GI_CONST_BITMAP(SQL_AD_ADD_CONSTRAINT_NON_DEFERRABLE),
2366
GI_CONST_BITMAP(SQL_AD_ADD_DOMAIN_CONSTRAINT),
2367
GI_CONST_BITMAP(SQL_AD_ADD_DOMAIN_DEFAULT),
2368
GI_CONST_BITMAP(SQL_AD_CONSTRAINT_NAME_DEFINITION),
2369
GI_CONST_BITMAP(SQL_AD_DROP_DOMAIN_CONSTRAINT),
2370
GI_CONST_BITMAP(SQL_AD_DROP_DOMAIN_DEFAULT),
2371
GI_CONST_BITMAP(SQL_AF_ALL),
2372
GI_CONST_BITMAP(SQL_AF_AVG),
2373
GI_CONST_BITMAP(SQL_AF_COUNT),
2374
GI_CONST_BITMAP(SQL_AF_DISTINCT),
2375
GI_CONST_BITMAP(SQL_AF_MAX),
2376
GI_CONST_BITMAP(SQL_AF_MIN),
2377
GI_CONST_BITMAP(SQL_AF_SUM),
2378
GI_CONST_BITMAP(SQL_AM_CONNECTION),
2379
GI_CONST_BITMAP(SQL_AM_NONE),
2380
GI_CONST_BITMAP(SQL_AM_STATEMENT),
2381
GI_CONST_BITMAP(SQL_AT_ADD_COLUMN),
2382
GI_CONST_BITMAP(SQL_AT_ADD_COLUMN_COLLATION),
2383
GI_CONST_BITMAP(SQL_AT_ADD_COLUMN_DEFAULT),
2384
GI_CONST_BITMAP(SQL_AT_ADD_COLUMN_SINGLE),
2385
GI_CONST_BITMAP(SQL_AT_ADD_CONSTRAINT),
2386
GI_CONST_BITMAP(SQL_AT_ADD_TABLE_CONSTRAINT),
2387
#ifdef SQL_AT_COLUMN_SINGLE
2388
GI_CONST_BITMAP(SQL_AT_COLUMN_SINGLE),
2390
GI_CONST_BITMAP(SQL_AT_CONSTRAINT_DEFERRABLE),
2391
GI_CONST_BITMAP(SQL_AT_CONSTRAINT_INITIALLY_DEFERRED),
2392
GI_CONST_BITMAP(SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATE),
2393
GI_CONST_BITMAP(SQL_AT_CONSTRAINT_NAME_DEFINITION),
2394
GI_CONST_BITMAP(SQL_AT_CONSTRAINT_NON_DEFERRABLE),
2395
GI_CONST_BITMAP(SQL_AT_DROP_COLUMN),
2396
GI_CONST_BITMAP(SQL_AT_DROP_COLUMN_CASCADE),
2397
GI_CONST_BITMAP(SQL_AT_DROP_COLUMN_DEFAULT),
2398
GI_CONST_BITMAP(SQL_AT_DROP_COLUMN_RESTRICT),
2399
GI_CONST_BITMAP(SQL_AT_DROP_TABLE_CONSTRAINT_CASCADE),
2400
GI_CONST_BITMAP(SQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT),
2401
GI_CONST_BITMAP(SQL_AT_SET_COLUMN_DEFAULT),
2402
GI_CONST_BITMAP(SQL_BP_CLOSE),
2403
GI_CONST_BITMAP(SQL_BP_DELETE),
2404
GI_CONST_BITMAP(SQL_BP_DROP),
2405
GI_CONST_BITMAP(SQL_BP_OTHER_HSTMT),
2406
GI_CONST_BITMAP(SQL_BP_SCROLL),
2407
GI_CONST_BITMAP(SQL_BP_TRANSACTION),
2408
GI_CONST_BITMAP(SQL_BP_UPDATE),
2409
GI_CONST_BITMAP(SQL_BRC_EXPLICIT),
2410
GI_CONST_BITMAP(SQL_BRC_PROCEDURES),
2411
GI_CONST_BITMAP(SQL_BRC_ROLLED_UP),
2412
GI_CONST_BITMAP(SQL_BS_ROW_COUNT_EXPLICIT),
2413
GI_CONST_BITMAP(SQL_BS_ROW_COUNT_PROC),
2414
GI_CONST_BITMAP(SQL_BS_SELECT_EXPLICIT),
2415
GI_CONST_BITMAP(SQL_BS_SELECT_PROC),
2416
GI_CONST_BITMAP(SQL_CA1_ABSOLUTE),
2417
GI_CONST_BITMAP(SQL_CA1_BOOKMARK),
2418
GI_CONST_BITMAP(SQL_CA1_BULK_ADD),
2419
GI_CONST_BITMAP(SQL_CA1_BULK_DELETE_BY_BOOKMARK),
2420
GI_CONST_BITMAP(SQL_CA1_BULK_FETCH_BY_BOOKMARK),
2421
GI_CONST_BITMAP(SQL_CA1_BULK_UPDATE_BY_BOOKMARK),
2422
GI_CONST_BITMAP(SQL_CA1_LOCK_EXCLUSIVE),
2423
GI_CONST_BITMAP(SQL_CA1_LOCK_NO_CHANGE),
2424
GI_CONST_BITMAP(SQL_CA1_LOCK_UNLOCK),
2425
GI_CONST_BITMAP(SQL_CA1_NEXT),
2426
GI_CONST_BITMAP(SQL_CA1_POS_DELETE),
2427
GI_CONST_BITMAP(SQL_CA1_POSITIONED_DELETE),
2428
GI_CONST_BITMAP(SQL_CA1_POSITIONED_UPDATE),
2429
GI_CONST_BITMAP(SQL_CA1_POS_POSITION),
2430
GI_CONST_BITMAP(SQL_CA1_POS_REFRESH),
2431
GI_CONST_BITMAP(SQL_CA1_POS_UPDATE),
2432
GI_CONST_BITMAP(SQL_CA1_RELATIVE),
2433
GI_CONST_BITMAP(SQL_CA1_SELECT_FOR_UPDATE),
2434
GI_CONST_BITMAP(SQL_CA2_CRC_APPROXIMATE),
2435
GI_CONST_BITMAP(SQL_CA2_CRC_EXACT),
2436
GI_CONST_BITMAP(SQL_CA2_LOCK_CONCURRENCY),
2437
GI_CONST_BITMAP(SQL_CA2_MAX_ROWS_AFFECTS_ALL),
2438
GI_CONST_BITMAP(SQL_CA2_MAX_ROWS_CATALOG),
2439
GI_CONST_BITMAP(SQL_CA2_MAX_ROWS_DELETE),
2440
GI_CONST_BITMAP(SQL_CA2_MAX_ROWS_INSERT),
2441
GI_CONST_BITMAP(SQL_CA2_MAX_ROWS_SELECT),
2442
GI_CONST_BITMAP(SQL_CA2_MAX_ROWS_UPDATE),
2443
GI_CONST_BITMAP(SQL_CA2_OPT_ROWVER_CONCURRENCY),
2444
GI_CONST_BITMAP(SQL_CA2_OPT_VALUES_CONCURRENCY),
2445
GI_CONST_BITMAP(SQL_CA2_READ_ONLY_CONCURRENCY),
2446
GI_CONST_BITMAP(SQL_CA2_SENSITIVITY_ADDITIONS),
2447
GI_CONST_BITMAP(SQL_CA2_SENSITIVITY_DELETIONS),
2448
GI_CONST_BITMAP(SQL_CA2_SENSITIVITY_UPDATES),
2449
GI_CONST_BITMAP(SQL_CA2_SIMULATE_NON_UNIQUE),
2450
GI_CONST_BITMAP(SQL_CA2_SIMULATE_TRY_UNIQUE),
2451
GI_CONST_BITMAP(SQL_CA2_SIMULATE_UNIQUE),
2452
GI_CONST_BITMAP(SQL_CA_CONSTRAINT_DEFERRABLE),
2453
GI_CONST_BITMAP(SQL_CA_CONSTRAINT_INITIALLY_DEFERRED),
2454
GI_CONST_BITMAP(SQL_CA_CONSTRAINT_INITIALLY_IMMEDIATE),
2455
GI_CONST_BITMAP(SQL_CA_CONSTRAINT_NON_DEFERRABLE),
2456
GI_CONST_BITMAP(SQL_CA_CREATE_ASSERTION),
2457
GI_CONST_BITMAP(SQL_CB_CLOSE),
2458
GI_CONST_BITMAP(SQL_CB_DELETE),
2459
GI_CONST_BITMAP(SQL_CB_NON_NULL),
2460
GI_CONST_BITMAP(SQL_CB_NULL),
2461
GI_CONST_BITMAP(SQL_CB_PRESERVE),
2462
GI_CONST_BITMAP(SQL_CC_CLOSE),
2463
GI_CONST_BITMAP(SQL_CC_DELETE),
2464
GI_CONST_BITMAP(SQL_CCOL_CREATE_COLLATION),
2465
GI_CONST_BITMAP(SQL_CC_PRESERVE),
2466
GI_CONST_BITMAP(SQL_CCS_COLLATE_CLAUSE),
2467
GI_CONST_BITMAP(SQL_CCS_CREATE_CHARACTER_SET),
2468
GI_CONST_BITMAP(SQL_CCS_LIMITED_COLLATION),
2469
GI_CONST_BITMAP(SQL_CDO_COLLATION),
2470
GI_CONST_BITMAP(SQL_CDO_CONSTRAINT),
2471
GI_CONST_BITMAP(SQL_CDO_CONSTRAINT_DEFERRABLE),
2472
GI_CONST_BITMAP(SQL_CDO_CONSTRAINT_INITIALLY_DEFERRED),
2473
GI_CONST_BITMAP(SQL_CDO_CONSTRAINT_INITIALLY_IMMEDIATE),
2474
GI_CONST_BITMAP(SQL_CDO_CONSTRAINT_NAME_DEFINITION),
2475
GI_CONST_BITMAP(SQL_CDO_CONSTRAINT_NON_DEFERRABLE),
2476
GI_CONST_BITMAP(SQL_CDO_CREATE_DOMAIN),
2477
GI_CONST_BITMAP(SQL_CDO_DEFAULT),
2478
GI_CONST_BITMAP(SQL_CL_END),
2479
GI_CONST_BITMAP(SQL_CL_START),
2480
GI_CONST_BITMAP(SQL_CN_ANY),
2481
GI_CONST_BITMAP(SQL_CN_DIFFERENT),
2482
GI_CONST_BITMAP(SQL_CN_NONE),
2483
GI_CONST_BITMAP(SQL_CONCUR_TIMESTAMP),
2484
GI_CONST_BITMAP(SQL_CR_CLOSE),
2485
GI_CONST_BITMAP(SQL_CR_DELETE),
2486
GI_CONST_BITMAP(SQL_CR_PRESERVE),
2487
GI_CONST_BITMAP(SQL_CS_AUTHORIZATION),
2488
GI_CONST_BITMAP(SQL_CS_CREATE_SCHEMA),
2489
GI_CONST_BITMAP(SQL_CS_DEFAULT_CHARACTER_SET),
2490
GI_CONST_BITMAP(SQL_CT_COLUMN_COLLATION),
2491
GI_CONST_BITMAP(SQL_CT_COLUMN_CONSTRAINT),
2492
GI_CONST_BITMAP(SQL_CT_COLUMN_DEFAULT),
2493
GI_CONST_BITMAP(SQL_CT_COMMIT_DELETE),
2494
GI_CONST_BITMAP(SQL_CT_COMMIT_PRESERVE),
2495
GI_CONST_BITMAP(SQL_CT_CONSTRAINT_DEFERRABLE),
2496
GI_CONST_BITMAP(SQL_CT_CONSTRAINT_INITIALLY_DEFERRED),
2497
GI_CONST_BITMAP(SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATE),
2498
GI_CONST_BITMAP(SQL_CT_CONSTRAINT_NAME_DEFINITION),
2499
GI_CONST_BITMAP(SQL_CT_CONSTRAINT_NON_DEFERRABLE),
2500
GI_CONST_BITMAP(SQL_CT_CREATE_TABLE),
2501
GI_CONST_BITMAP(SQL_CT_GLOBAL_TEMPORARY),
2502
GI_CONST_BITMAP(SQL_CT_LOCAL_TEMPORARY),
2503
GI_CONST_BITMAP(SQL_CTR_CREATE_TRANSLATION),
2504
GI_CONST_BITMAP(SQL_CT_TABLE_CONSTRAINT),
2505
GI_CONST_BITMAP(SQL_CU_DML_STATEMENTS),
2506
GI_CONST_BITMAP(SQL_CU_INDEX_DEFINITION),
2507
GI_CONST_BITMAP(SQL_CU_PRIVILEGE_DEFINITION),
2508
GI_CONST_BITMAP(SQL_CU_PROCEDURE_INVOCATION),
2509
GI_CONST_BITMAP(SQL_CU_TABLE_DEFINITION),
2510
GI_CONST_BITMAP(SQL_CV_CASCADED),
2511
GI_CONST_BITMAP(SQL_CV_CHECK_OPTION),
2512
GI_CONST_BITMAP(SQL_CV_CREATE_VIEW),
2513
GI_CONST_BITMAP(SQL_CV_LOCAL),
2514
GI_CONST_BITMAP(SQL_CVT_BIGINT),
2515
GI_CONST_BITMAP(SQL_CVT_BINARY),
2516
GI_CONST_BITMAP(SQL_CVT_BIT),
2517
GI_CONST_BITMAP(SQL_CVT_CHAR),
2518
GI_CONST_BITMAP(SQL_CVT_DATE),
2519
GI_CONST_BITMAP(SQL_CVT_DECIMAL),
2520
GI_CONST_BITMAP(SQL_CVT_DOUBLE),
2521
GI_CONST_BITMAP(SQL_CVT_FLOAT),
2522
GI_CONST_BITMAP(SQL_CVT_INTEGER),
2523
GI_CONST_BITMAP(SQL_CVT_INTERVAL_DAY_TIME),
2524
GI_CONST_BITMAP(SQL_CVT_INTERVAL_YEAR_MONTH),
2525
GI_CONST_BITMAP(SQL_CVT_LONGVARBINARY),
2526
GI_CONST_BITMAP(SQL_CVT_LONGVARCHAR),
2527
GI_CONST_BITMAP(SQL_CVT_NUMERIC),
2528
GI_CONST_BITMAP(SQL_CVT_REAL),
2529
GI_CONST_BITMAP(SQL_CVT_SMALLINT),
2530
GI_CONST_BITMAP(SQL_CVT_TIME),
2531
GI_CONST_BITMAP(SQL_CVT_TIMESTAMP),
2532
GI_CONST_BITMAP(SQL_CVT_TINYINT),
2533
GI_CONST_BITMAP(SQL_CVT_VARBINARY),
2534
GI_CONST_BITMAP(SQL_CVT_VARCHAR),
2535
GI_CONST_BITMAP(SQL_CVT_WCHAR),
2536
GI_CONST_BITMAP(SQL_CVT_WLONGVARCHAR),
2537
GI_CONST_BITMAP(SQL_CVT_WVARCHAR),
2538
GI_CONST_BITMAP(SQL_DA_DROP_ASSERTION),
2539
GI_CONST_BITMAP(SQL_DC_DROP_COLLATION),
2540
GI_CONST_BITMAP(SQL_DCS_DROP_CHARACTER_SET),
2541
GI_CONST_BITMAP(SQL_DD_CASCADE),
2542
GI_CONST_BITMAP(SQL_DD_DROP_DOMAIN),
2543
GI_CONST_BITMAP(SQL_DD_RESTRICT),
2544
GI_CONST_BITMAP(SQL_DI_CREATE_INDEX),
2545
GI_CONST_BITMAP(SQL_DI_DROP_INDEX),
2546
GI_CONST_BITMAP(SQL_DL_SQL92_DATE),
2547
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_DAY),
2548
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR),
2549
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE),
2550
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND),
2551
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_HOUR),
2552
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE),
2553
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND),
2554
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_MINUTE),
2555
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND),
2556
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_MONTH),
2557
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_SECOND),
2558
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_YEAR),
2559
GI_CONST_BITMAP(SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH),
2560
GI_CONST_BITMAP(SQL_DL_SQL92_TIME),
2561
GI_CONST_BITMAP(SQL_DL_SQL92_TIMESTAMP),
2562
GI_CONST_BITMAP(SQL_DS_CASCADE),
2563
GI_CONST_BITMAP(SQL_DS_DROP_SCHEMA),
2564
GI_CONST_BITMAP(SQL_DS_RESTRICT),
2565
GI_CONST_BITMAP(SQL_DT_CASCADE),
2566
GI_CONST_BITMAP(SQL_DTC_ENLIST_EXPENSIVE),
2567
GI_CONST_BITMAP(SQL_DTC_UNENLIST_EXPENSIVE),
2568
GI_CONST_BITMAP(SQL_DT_DROP_TABLE),
2569
GI_CONST_BITMAP(SQL_DTR_DROP_TRANSLATION),
2570
GI_CONST_BITMAP(SQL_DT_RESTRICT),
2571
GI_CONST_BITMAP(SQL_DV_CASCADE),
2572
GI_CONST_BITMAP(SQL_DV_DROP_VIEW),
2573
GI_CONST_BITMAP(SQL_DV_RESTRICT),
2574
GI_CONST_BITMAP(SQL_FD_FETCH_ABSOLUTE),
2575
GI_CONST_BITMAP(SQL_FD_FETCH_BOOKMARK),
2576
GI_CONST_BITMAP(SQL_FD_FETCH_FIRST),
2577
GI_CONST_BITMAP(SQL_FD_FETCH_LAST),
2578
GI_CONST_BITMAP(SQL_FD_FETCH_NEXT),
2579
GI_CONST_BITMAP(SQL_FD_FETCH_PRIOR),
2580
GI_CONST_BITMAP(SQL_FD_FETCH_RELATIVE),
2581
#ifdef SQL_FD_FETCH_RESUME
2582
GI_CONST_BITMAP(SQL_FD_FETCH_RESUME),
2584
GI_CONST_BITMAP(SQL_FILE_CATALOG),
2585
GI_CONST_BITMAP(SQL_FILE_NOT_SUPPORTED),
2586
GI_CONST_BITMAP(SQL_FILE_QUALIFIER),
2587
GI_CONST_BITMAP(SQL_FILE_TABLE),
2588
GI_CONST_BITMAP(SQL_FN_CVT_CAST),
2589
GI_CONST_BITMAP(SQL_FN_CVT_CONVERT),
2590
GI_CONST_BITMAP(SQL_FN_NUM_ABS),
2591
GI_CONST_BITMAP(SQL_FN_NUM_ACOS),
2592
GI_CONST_BITMAP(SQL_FN_NUM_ASIN),
2593
GI_CONST_BITMAP(SQL_FN_NUM_ATAN),
2594
GI_CONST_BITMAP(SQL_FN_NUM_ATAN2),
2595
GI_CONST_BITMAP(SQL_FN_NUM_CEILING),
2596
GI_CONST_BITMAP(SQL_FN_NUM_COS),
2597
GI_CONST_BITMAP(SQL_FN_NUM_COT),
2598
GI_CONST_BITMAP(SQL_FN_NUM_DEGREES),
2599
GI_CONST_BITMAP(SQL_FN_NUM_EXP),
2600
GI_CONST_BITMAP(SQL_FN_NUM_FLOOR),
2601
GI_CONST_BITMAP(SQL_FN_NUM_LOG),
2602
GI_CONST_BITMAP(SQL_FN_NUM_LOG10),
2603
GI_CONST_BITMAP(SQL_FN_NUM_MOD),
2604
GI_CONST_BITMAP(SQL_FN_NUM_PI),
2605
GI_CONST_BITMAP(SQL_FN_NUM_POWER),
2606
GI_CONST_BITMAP(SQL_FN_NUM_RADIANS),
2607
GI_CONST_BITMAP(SQL_FN_NUM_RAND),
2608
GI_CONST_BITMAP(SQL_FN_NUM_ROUND),
2609
GI_CONST_BITMAP(SQL_FN_NUM_SIGN),
2610
GI_CONST_BITMAP(SQL_FN_NUM_SIN),
2611
GI_CONST_BITMAP(SQL_FN_NUM_SQRT),
2612
GI_CONST_BITMAP(SQL_FN_NUM_TAN),
2613
GI_CONST_BITMAP(SQL_FN_NUM_TRUNCATE),
2614
GI_CONST_BITMAP(SQL_FN_STR_ASCII),
2615
GI_CONST_BITMAP(SQL_FN_STR_BIT_LENGTH),
2616
GI_CONST_BITMAP(SQL_FN_STR_CHAR),
2617
GI_CONST_BITMAP(SQL_FN_STR_CHARACTER_LENGTH),
2618
GI_CONST_BITMAP(SQL_FN_STR_CHAR_LENGTH),
2619
GI_CONST_BITMAP(SQL_FN_STR_CONCAT),
2620
GI_CONST_BITMAP(SQL_FN_STR_DIFFERENCE),
2621
GI_CONST_BITMAP(SQL_FN_STR_INSERT),
2622
GI_CONST_BITMAP(SQL_FN_STR_LCASE),
2623
GI_CONST_BITMAP(SQL_FN_STR_LEFT),
2624
GI_CONST_BITMAP(SQL_FN_STR_LENGTH),
2625
GI_CONST_BITMAP(SQL_FN_STR_LOCATE),
2626
GI_CONST_BITMAP(SQL_FN_STR_LOCATE_2),
2627
GI_CONST_BITMAP(SQL_FN_STR_LTRIM),
2628
GI_CONST_BITMAP(SQL_FN_STR_OCTET_LENGTH),
2629
GI_CONST_BITMAP(SQL_FN_STR_POSITION),
2630
GI_CONST_BITMAP(SQL_FN_STR_REPEAT),
2631
GI_CONST_BITMAP(SQL_FN_STR_REPLACE),
2632
GI_CONST_BITMAP(SQL_FN_STR_RIGHT),
2633
GI_CONST_BITMAP(SQL_FN_STR_RTRIM),
2634
GI_CONST_BITMAP(SQL_FN_STR_SOUNDEX),
2635
GI_CONST_BITMAP(SQL_FN_STR_SPACE),
2636
GI_CONST_BITMAP(SQL_FN_STR_SUBSTRING),
2637
GI_CONST_BITMAP(SQL_FN_STR_UCASE),
2638
GI_CONST_BITMAP(SQL_FN_SYS_DBNAME),
2639
GI_CONST_BITMAP(SQL_FN_SYS_IFNULL),
2640
GI_CONST_BITMAP(SQL_FN_SYS_USERNAME),
2641
GI_CONST_BITMAP(SQL_FN_TD_CURDATE),
2642
GI_CONST_BITMAP(SQL_FN_TD_CURRENT_DATE),
2643
GI_CONST_BITMAP(SQL_FN_TD_CURRENT_TIME),
2644
GI_CONST_BITMAP(SQL_FN_TD_CURRENT_TIMESTAMP),
2645
GI_CONST_BITMAP(SQL_FN_TD_CURTIME),
2646
GI_CONST_BITMAP(SQL_FN_TD_DAYNAME),
2647
GI_CONST_BITMAP(SQL_FN_TD_DAYOFMONTH),
2648
GI_CONST_BITMAP(SQL_FN_TD_DAYOFWEEK),
2649
GI_CONST_BITMAP(SQL_FN_TD_DAYOFYEAR),
2650
GI_CONST_BITMAP(SQL_FN_TD_EXTRACT),
2651
GI_CONST_BITMAP(SQL_FN_TD_HOUR),
2652
GI_CONST_BITMAP(SQL_FN_TD_MINUTE),
2653
GI_CONST_BITMAP(SQL_FN_TD_MONTH),
2654
GI_CONST_BITMAP(SQL_FN_TD_MONTHNAME),
2655
GI_CONST_BITMAP(SQL_FN_TD_NOW),
2656
GI_CONST_BITMAP(SQL_FN_TD_QUARTER),
2657
GI_CONST_BITMAP(SQL_FN_TD_SECOND),
2658
GI_CONST_BITMAP(SQL_FN_TD_TIMESTAMPADD),
2659
GI_CONST_BITMAP(SQL_FN_TD_TIMESTAMPDIFF),
2660
GI_CONST_BITMAP(SQL_FN_TD_WEEK),
2661
GI_CONST_BITMAP(SQL_FN_TD_YEAR),
2662
GI_CONST_BITMAP(SQL_FN_TSI_DAY),
2663
GI_CONST_BITMAP(SQL_FN_TSI_FRAC_SECOND),
2664
GI_CONST_BITMAP(SQL_FN_TSI_HOUR),
2665
GI_CONST_BITMAP(SQL_FN_TSI_MINUTE),
2666
GI_CONST_BITMAP(SQL_FN_TSI_MONTH),
2667
GI_CONST_BITMAP(SQL_FN_TSI_QUARTER),
2668
GI_CONST_BITMAP(SQL_FN_TSI_SECOND),
2669
GI_CONST_BITMAP(SQL_FN_TSI_WEEK),
2670
GI_CONST_BITMAP(SQL_FN_TSI_YEAR),
2671
GI_CONST_BITMAP(SQL_GB_COLLATE),
2672
GI_CONST_BITMAP(SQL_GB_GROUP_BY_CONTAINS_SELECT),
2673
GI_CONST_BITMAP(SQL_GB_GROUP_BY_EQUALS_SELECT),
2674
GI_CONST_BITMAP(SQL_GB_NO_RELATION),
2675
GI_CONST_BITMAP(SQL_GB_NOT_SUPPORTED),
2676
GI_CONST_BITMAP(SQL_GD_ANY_COLUMN),
2677
GI_CONST_BITMAP(SQL_GD_ANY_ORDER),
2678
GI_CONST_BITMAP(SQL_GD_BLOCK),
2679
GI_CONST_BITMAP(SQL_GD_BOUND),
2680
GI_CONST_BITMAP(SQL_IC_LOWER),
2681
GI_CONST_BITMAP(SQL_IC_MIXED),
2682
GI_CONST_BITMAP(SQL_IC_SENSITIVE),
2683
GI_CONST_BITMAP(SQL_IC_UPPER),
2684
GI_CONST_BITMAP(SQL_IK_ALL),
2685
GI_CONST_BITMAP(SQL_IK_ASC),
2686
GI_CONST_BITMAP(SQL_IK_DESC),
2687
GI_CONST_BITMAP(SQL_IK_NONE),
2688
GI_CONST_BITMAP(SQL_IS_INSERT_LITERALS),
2689
GI_CONST_BITMAP(SQL_IS_INSERT_SEARCHED),
2690
GI_CONST_BITMAP(SQL_IS_SELECT_INTO),
2691
GI_CONST_BITMAP(SQL_ISV_ASSERTIONS),
2692
GI_CONST_BITMAP(SQL_ISV_CHARACTER_SETS),
2693
GI_CONST_BITMAP(SQL_ISV_CHECK_CONSTRAINTS),
2694
GI_CONST_BITMAP(SQL_ISV_COLLATIONS),
2695
GI_CONST_BITMAP(SQL_ISV_COLUMN_DOMAIN_USAGE),
2696
GI_CONST_BITMAP(SQL_ISV_COLUMN_PRIVILEGES),
2697
GI_CONST_BITMAP(SQL_ISV_COLUMNS),
2698
GI_CONST_BITMAP(SQL_ISV_CONSTRAINT_COLUMN_USAGE),
2699
GI_CONST_BITMAP(SQL_ISV_CONSTRAINT_TABLE_USAGE),
2700
GI_CONST_BITMAP(SQL_ISV_DOMAIN_CONSTRAINTS),
2701
GI_CONST_BITMAP(SQL_ISV_DOMAINS),
2702
GI_CONST_BITMAP(SQL_ISV_KEY_COLUMN_USAGE),
2703
GI_CONST_BITMAP(SQL_ISV_REFERENTIAL_CONSTRAINTS),
2704
GI_CONST_BITMAP(SQL_ISV_SCHEMATA),
2705
GI_CONST_BITMAP(SQL_ISV_SQL_LANGUAGES),
2706
GI_CONST_BITMAP(SQL_ISV_TABLE_CONSTRAINTS),
2707
GI_CONST_BITMAP(SQL_ISV_TABLE_PRIVILEGES),
2708
GI_CONST_BITMAP(SQL_ISV_TABLES),
2709
GI_CONST_BITMAP(SQL_ISV_TRANSLATIONS),
2710
GI_CONST_BITMAP(SQL_ISV_USAGE_PRIVILEGES),
2711
GI_CONST_BITMAP(SQL_ISV_VIEW_COLUMN_USAGE),
2712
GI_CONST_BITMAP(SQL_ISV_VIEWS),
2713
GI_CONST_BITMAP(SQL_ISV_VIEW_TABLE_USAGE),
2714
GI_CONST_BITMAP(SQL_LCK_EXCLUSIVE),
2715
GI_CONST_BITMAP(SQL_LCK_NO_CHANGE),
2716
GI_CONST_BITMAP(SQL_LCK_UNLOCK),
2717
GI_CONST_BITMAP(SQL_NC_END),
2718
GI_CONST_BITMAP(SQL_NC_HIGH),
2719
GI_CONST_BITMAP(SQL_NC_LOW),
2720
GI_CONST_BITMAP(SQL_NC_START),
2721
GI_CONST_BITMAP(SQL_NNC_NON_NULL),
2722
GI_CONST_BITMAP(SQL_NNC_NULL),
2723
GI_CONST_BITMAP(SQL_OAC_LEVEL1),
2724
GI_CONST_BITMAP(SQL_OAC_LEVEL2),
2725
GI_CONST_BITMAP(SQL_OAC_NONE),
2726
GI_CONST_BITMAP(SQL_OIC_CORE),
2727
GI_CONST_BITMAP(SQL_OIC_LEVEL1),
2728
GI_CONST_BITMAP(SQL_OIC_LEVEL2),
2729
GI_CONST_BITMAP(SQL_OJ_ALL_COMPARISON_OPS),
2730
GI_CONST_BITMAP(SQL_OJ_FULL),
2731
GI_CONST_BITMAP(SQL_OJ_INNER),
2732
GI_CONST_BITMAP(SQL_OJ_LEFT),
2733
GI_CONST_BITMAP(SQL_OJ_NESTED),
2734
GI_CONST_BITMAP(SQL_OJ_NOT_ORDERED),
2735
GI_CONST_BITMAP(SQL_OJ_RIGHT),
2736
GI_CONST_BITMAP(SQL_OSCC_COMPLIANT),
2737
GI_CONST_BITMAP(SQL_OSCC_NOT_COMPLIANT),
2738
GI_CONST_BITMAP(SQL_OSC_CORE),
2739
GI_CONST_BITMAP(SQL_OSC_EXTENDED),
2740
GI_CONST_BITMAP(SQL_OSC_MINIMUM),
2741
GI_CONST_BITMAP(SQL_OU_DML_STATEMENTS),
2742
GI_CONST_BITMAP(SQL_OU_INDEX_DEFINITION),
2743
GI_CONST_BITMAP(SQL_OU_PRIVILEGE_DEFINITION),
2744
GI_CONST_BITMAP(SQL_OU_PROCEDURE_INVOCATION),
2745
GI_CONST_BITMAP(SQL_OU_TABLE_DEFINITION),
2746
GI_CONST_BITMAP(SQL_PARC_BATCH),
2747
GI_CONST_BITMAP(SQL_PARC_NO_BATCH),
2748
GI_CONST_BITMAP(SQL_PAS_BATCH),
2749
GI_CONST_BITMAP(SQL_PAS_NO_BATCH),
2750
GI_CONST_BITMAP(SQL_PAS_NO_SELECT),
2751
GI_CONST_BITMAP(SQL_POS_ADD),
2752
GI_CONST_BITMAP(SQL_POS_DELETE),
2753
GI_CONST_BITMAP(SQL_POS_POSITION),
2754
GI_CONST_BITMAP(SQL_POS_REFRESH),
2755
GI_CONST_BITMAP(SQL_POS_UPDATE),
2756
GI_CONST_BITMAP(SQL_PS_POSITIONED_DELETE),
2757
GI_CONST_BITMAP(SQL_PS_POSITIONED_UPDATE),
2758
GI_CONST_BITMAP(SQL_PS_SELECT_FOR_UPDATE),
2759
GI_CONST_BITMAP(SQL_QL_END),
2760
GI_CONST_BITMAP(SQL_QL_START),
2761
GI_CONST_BITMAP(SQL_QU_DML_STATEMENTS),
2762
GI_CONST_BITMAP(SQL_QU_INDEX_DEFINITION),
2763
GI_CONST_BITMAP(SQL_QU_PRIVILEGE_DEFINITION),
2764
GI_CONST_BITMAP(SQL_QU_PROCEDURE_INVOCATION),
2765
GI_CONST_BITMAP(SQL_QU_TABLE_DEFINITION),
2766
GI_CONST_BITMAP(SQL_SCC_ISO92_CLI),
2767
GI_CONST_BITMAP(SQL_SCCO_LOCK),
2768
GI_CONST_BITMAP(SQL_SCCO_OPT_ROWVER),
2769
GI_CONST_BITMAP(SQL_SCCO_OPT_TIMESTAMP),
2770
GI_CONST_BITMAP(SQL_SCCO_OPT_VALUES),
2771
GI_CONST_BITMAP(SQL_SCCO_READ_ONLY),
2772
GI_CONST_BITMAP(SQL_SCC_XOPEN_CLI_VERSION1),
2773
GI_CONST_BITMAP(SQL_SC_FIPS127_2_TRANSITIONAL),
2774
GI_CONST_BITMAP(SQL_SC_NON_UNIQUE),
2775
GI_CONST_BITMAP(SQL_SC_SQL92_ENTRY),
2776
GI_CONST_BITMAP(SQL_SC_SQL92_FULL),
2777
GI_CONST_BITMAP(SQL_SC_SQL92_INTERMEDIATE),
2778
GI_CONST_BITMAP(SQL_SC_TRY_UNIQUE),
2779
GI_CONST_BITMAP(SQL_SC_UNIQUE),
2780
GI_CONST_BITMAP(SQL_SDF_CURRENT_DATE),
2781
GI_CONST_BITMAP(SQL_SDF_CURRENT_TIME),
2782
GI_CONST_BITMAP(SQL_SDF_CURRENT_TIMESTAMP),
2783
GI_CONST_BITMAP(SQL_SFKD_CASCADE),
2784
GI_CONST_BITMAP(SQL_SFKD_NO_ACTION),
2785
GI_CONST_BITMAP(SQL_SFKD_SET_DEFAULT),
2786
GI_CONST_BITMAP(SQL_SFKD_SET_NULL),
2787
GI_CONST_BITMAP(SQL_SFKU_CASCADE),
2788
GI_CONST_BITMAP(SQL_SFKU_NO_ACTION),
2789
GI_CONST_BITMAP(SQL_SFKU_SET_DEFAULT),
2790
GI_CONST_BITMAP(SQL_SFKU_SET_NULL),
2791
GI_CONST_BITMAP(SQL_SG_DELETE_TABLE),
2792
GI_CONST_BITMAP(SQL_SG_INSERT_COLUMN),
2793
GI_CONST_BITMAP(SQL_SG_INSERT_TABLE),
2794
GI_CONST_BITMAP(SQL_SG_REFERENCES_COLUMN),
2795
GI_CONST_BITMAP(SQL_SG_REFERENCES_TABLE),
2796
GI_CONST_BITMAP(SQL_SG_SELECT_TABLE),
2797
GI_CONST_BITMAP(SQL_SG_UPDATE_COLUMN),
2798
GI_CONST_BITMAP(SQL_SG_UPDATE_TABLE),
2799
GI_CONST_BITMAP(SQL_SG_USAGE_ON_CHARACTER_SET),
2800
GI_CONST_BITMAP(SQL_SG_USAGE_ON_COLLATION),
2801
GI_CONST_BITMAP(SQL_SG_USAGE_ON_DOMAIN),
2802
GI_CONST_BITMAP(SQL_SG_USAGE_ON_TRANSLATION),
2803
GI_CONST_BITMAP(SQL_SG_WITH_GRANT_OPTION),
2804
GI_CONST_BITMAP(SQL_SNVF_BIT_LENGTH),
2805
GI_CONST_BITMAP(SQL_SNVF_CHARACTER_LENGTH),
2806
GI_CONST_BITMAP(SQL_SNVF_CHAR_LENGTH),
2807
GI_CONST_BITMAP(SQL_SNVF_EXTRACT),
2808
GI_CONST_BITMAP(SQL_SNVF_OCTET_LENGTH),
2809
GI_CONST_BITMAP(SQL_SNVF_POSITION),
2810
GI_CONST_BITMAP(SQL_SO_DYNAMIC),
2811
GI_CONST_BITMAP(SQL_SO_FORWARD_ONLY),
2812
GI_CONST_BITMAP(SQL_SO_KEYSET_DRIVEN),
2813
GI_CONST_BITMAP(SQL_SO_MIXED),
2814
GI_CONST_BITMAP(SQL_SO_STATIC),
2815
GI_CONST_BITMAP(SQL_SP_BETWEEN),
2816
GI_CONST_BITMAP(SQL_SP_COMPARISON),
2817
GI_CONST_BITMAP(SQL_SP_EXISTS),
2818
GI_CONST_BITMAP(SQL_SP_IN),
2819
GI_CONST_BITMAP(SQL_SP_ISNOTNULL),
2820
GI_CONST_BITMAP(SQL_SP_ISNULL),
2821
GI_CONST_BITMAP(SQL_SP_LIKE),
2822
GI_CONST_BITMAP(SQL_SP_MATCH_FULL),
2823
GI_CONST_BITMAP(SQL_SP_MATCH_PARTIAL),
2824
GI_CONST_BITMAP(SQL_SP_MATCH_UNIQUE_FULL),
2825
GI_CONST_BITMAP(SQL_SP_MATCH_UNIQUE_PARTIAL),
2826
GI_CONST_BITMAP(SQL_SP_OVERLAPS),
2827
GI_CONST_BITMAP(SQL_SP_QUANTIFIED_COMPARISON),
2828
GI_CONST_BITMAP(SQL_SP_UNIQUE),
2829
GI_CONST_BITMAP(SQL_SQ_COMPARISON),
2830
GI_CONST_BITMAP(SQL_SQ_CORRELATED_SUBQUERIES),
2831
GI_CONST_BITMAP(SQL_SQ_EXISTS),
2832
GI_CONST_BITMAP(SQL_SQ_IN),
2833
GI_CONST_BITMAP(SQL_SQ_QUANTIFIED),
2834
GI_CONST_BITMAP(SQL_SR_CASCADE),
2835
GI_CONST_BITMAP(SQL_SR_DELETE_TABLE),
2836
GI_CONST_BITMAP(SQL_SR_GRANT_OPTION_FOR),
2837
GI_CONST_BITMAP(SQL_SR_INSERT_COLUMN),
2838
GI_CONST_BITMAP(SQL_SR_INSERT_TABLE),
2839
GI_CONST_BITMAP(SQL_SRJO_CORRESPONDING_CLAUSE),
2840
GI_CONST_BITMAP(SQL_SRJO_CROSS_JOIN),
2841
GI_CONST_BITMAP(SQL_SRJO_EXCEPT_JOIN),
2842
GI_CONST_BITMAP(SQL_SRJO_FULL_OUTER_JOIN),
2843
GI_CONST_BITMAP(SQL_SRJO_INNER_JOIN),
2844
GI_CONST_BITMAP(SQL_SRJO_INTERSECT_JOIN),
2845
GI_CONST_BITMAP(SQL_SRJO_LEFT_OUTER_JOIN),
2846
GI_CONST_BITMAP(SQL_SRJO_NATURAL_JOIN),
2847
GI_CONST_BITMAP(SQL_SRJO_RIGHT_OUTER_JOIN),
2848
GI_CONST_BITMAP(SQL_SRJO_UNION_JOIN),
2849
GI_CONST_BITMAP(SQL_SR_REFERENCES_COLUMN),
2850
GI_CONST_BITMAP(SQL_SR_REFERENCES_TABLE),
2851
GI_CONST_BITMAP(SQL_SR_RESTRICT),
2852
GI_CONST_BITMAP(SQL_SR_SELECT_TABLE),
2853
GI_CONST_BITMAP(SQL_SR_UPDATE_COLUMN),
2854
GI_CONST_BITMAP(SQL_SR_UPDATE_TABLE),
2855
GI_CONST_BITMAP(SQL_SR_USAGE_ON_CHARACTER_SET),
2856
GI_CONST_BITMAP(SQL_SR_USAGE_ON_COLLATION),
2857
GI_CONST_BITMAP(SQL_SR_USAGE_ON_DOMAIN),
2858
GI_CONST_BITMAP(SQL_SR_USAGE_ON_TRANSLATION),
2859
GI_CONST_BITMAP(SQL_SRVC_DEFAULT),
2860
GI_CONST_BITMAP(SQL_SRVC_NULL),
2861
GI_CONST_BITMAP(SQL_SRVC_ROW_SUBQUERY),
2862
GI_CONST_BITMAP(SQL_SRVC_VALUE_EXPRESSION),
2863
GI_CONST_BITMAP(SQL_SS_ADDITIONS),
2864
GI_CONST_BITMAP(SQL_SS_DELETIONS),
2865
GI_CONST_BITMAP(SQL_SSF_CONVERT),
2866
GI_CONST_BITMAP(SQL_SSF_LOWER),
2867
GI_CONST_BITMAP(SQL_SSF_SUBSTRING),
2868
GI_CONST_BITMAP(SQL_SSF_TRANSLATE),
2869
GI_CONST_BITMAP(SQL_SSF_TRIM_BOTH),
2870
GI_CONST_BITMAP(SQL_SSF_TRIM_LEADING),
2871
GI_CONST_BITMAP(SQL_SSF_TRIM_TRAILING),
2872
GI_CONST_BITMAP(SQL_SSF_UPPER),
2873
GI_CONST_BITMAP(SQL_SS_UPDATES),
2874
GI_CONST_BITMAP(SQL_SU_DML_STATEMENTS),
2875
GI_CONST_BITMAP(SQL_SU_INDEX_DEFINITION),
2876
GI_CONST_BITMAP(SQL_SU_PRIVILEGE_DEFINITION),
2877
GI_CONST_BITMAP(SQL_SU_PROCEDURE_INVOCATION),
2878
GI_CONST_BITMAP(SQL_SU_TABLE_DEFINITION),
2879
GI_CONST_BITMAP(SQL_SVE_CASE),
2880
GI_CONST_BITMAP(SQL_SVE_CAST),
2881
GI_CONST_BITMAP(SQL_SVE_COALESCE),
2882
GI_CONST_BITMAP(SQL_SVE_NULLIF),
2883
GI_CONST_BITMAP(SQL_TC_ALL),
2884
GI_CONST_BITMAP(SQL_TC_DDL_COMMIT),
2885
GI_CONST_BITMAP(SQL_TC_DDL_IGNORE),
2886
GI_CONST_BITMAP(SQL_TC_DML),
2887
GI_CONST_BITMAP(SQL_TC_NONE),
2888
GI_CONST_BITMAP(SQL_TRANSACTION_READ_COMMITTED),
2889
GI_CONST_BITMAP(SQL_TRANSACTION_READ_UNCOMMITTED),
2890
GI_CONST_BITMAP(SQL_TRANSACTION_REPEATABLE_READ),
2891
GI_CONST_BITMAP(SQL_TRANSACTION_SERIALIZABLE),
2892
GI_CONST_BITMAP(SQL_TXN_READ_COMMITTED),
2893
GI_CONST_BITMAP(SQL_TXN_READ_UNCOMMITTED),
2894
GI_CONST_BITMAP(SQL_TXN_REPEATABLE_READ),
2895
GI_CONST_BITMAP(SQL_TXN_SERIALIZABLE),
2896
#ifdef SQL_TXN_VERSIONING
2897
GI_CONST_BITMAP(SQL_TXN_VERSIONING),
2899
GI_CONST_BITMAP(SQL_US_UNION),
2900
GI_CONST_BITMAP(SQL_US_UNION_ALL),
2901
GI_CONST_BITMAP(SQL_U_UNION),
2902
GI_CONST_BITMAP(SQL_U_UNION_ALL),
2909
dbc_getinfo(int argc, VALUE *argv, VALUE self)
2911
DBC *p = get_dbc(self);
2914
int i, k, info = -1, maptype = -1, info_found = 0;
2915
char buffer[513], *string = NULL;
2916
SQLSMALLINT len_in = sizeof (buffer) - 1, len_out;
2918
rb_scan_args(argc, argv, "11", &which, &vtype);
2919
switch (TYPE(which)) {
2921
string = STR2CSTR(rb_any_to_s(which));
2924
string = STR2CSTR(which);
2926
for (i = 0; get_info_map[i].name != NULL; i++) {
2927
if (strcmp(string, get_info_map[i].name) == 0) {
2928
info = get_info_map[i].info;
2929
maptype = get_info_map[i].maptype;
2937
k = (int) NUM2DBL(which);
2944
for (i = 0; get_info_map[i].name != NULL; i++) {
2945
if (k == get_info_map[i].info) {
2946
info = get_info_map[i].info;
2947
maptype = get_info_map[i].maptype;
2954
switch (info_found) {
2957
set_err("Invalid info type for ODBC::Connection.get_info",
2961
sprintf(buffer, "Unknown info type %d for ODBC::Connection.get_info",
2966
if (vtype != Qnil) {
2967
switch (TYPE(vtype)) {
2969
maptype = FIX2INT(vtype);
2973
maptype = (int) NUM2DBL(vtype);
2976
rb_raise(rb_eTypeError, "need number for sql_type");
2990
#ifdef SQL_C_UBIGINT
2993
maptype = SQL_C_LONG;
2998
case SQL_C_UTINYINT:
2999
maptype = SQL_C_SHORT;
3002
maptype = SQL_C_CHAR;
3006
memset(buffer, 0, sizeof (buffer));
3007
ret = SQLGetInfo(p->hdbc, (SQLUSMALLINT) info,
3008
(SQLPOINTER) buffer, len_in, &len_out);
3009
if (!SQL_SUCCEEDED(ret)) {
3010
rb_raise(Cerror, "%s",
3011
get_err(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT));
3015
return INT2NUM(*((SQLUSMALLINT *) buffer));
3017
return INT2NUM(*((SQLUINTEGER *) buffer));
3020
return rb_str_new(buffer, len_out);
3026
*----------------------------------------------------------------------
3028
* Fill column type array for statement.
3030
*----------------------------------------------------------------------
3034
make_coltypes(SQLHSTMT hstmt, int ncols, char **msgp)
3037
COLTYPE *ret = NULL;
3040
for (i = 0; i < ncols; i++) {
3041
SQLUSMALLINT ic = i + 1;
3043
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3044
SQLColAttributes(hstmt, ic,
3045
SQL_COLUMN_TYPE, NULL, 0, NULL,
3047
msgp, "SQLColAttributes(SQL_COLUMN_TYPE)")) {
3050
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3051
SQLColAttributes(hstmt, ic,
3052
SQL_COLUMN_DISPLAY_SIZE,
3053
NULL, 0, NULL, &size),
3054
msgp, "SQLColAttributes(SQL_COLUMN_DISPLAY_SIZE)")) {
3058
ret = ALLOC_N(COLTYPE, ncols);
3061
*msgp = set_err("Out of memory", 0);
3065
for (i = 0; i < ncols; i++) {
3066
SQLUSMALLINT ic = i + 1;
3068
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3069
SQLColAttributes(hstmt, ic,
3071
NULL, 0, NULL, &type),
3072
"SQLColAttributes(SQL_COLUMN_TYPE)");
3073
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3074
SQLColAttributes(hstmt, ic,
3075
SQL_COLUMN_DISPLAY_SIZE,
3076
NULL, 0, NULL, &size),
3077
"SQLColAttributes(SQL_COLUMN_DISPLAY_SIZE)");
3088
size = sizeof (SQLINTEGER);
3093
type = SQL_C_DOUBLE;
3094
size = sizeof (double);
3097
#ifdef SQL_TYPE_DATE
3101
size = sizeof (DATE_STRUCT);
3104
#ifdef SQL_TYPE_TIME
3108
size = sizeof (TIME_STRUCT);
3111
#ifdef SQL_TYPE_TIMESTAMP
3112
case SQL_TYPE_TIMESTAMP:
3114
type = SQL_C_TIMESTAMP;
3115
size = sizeof (TIMESTAMP_STRUCT);
3117
case SQL_LONGVARBINARY:
3118
type = SQL_C_BINARY;
3119
size = SQL_NO_TOTAL;
3121
case SQL_LONGVARCHAR:
3123
case SQL_WLONGVARCHAR:
3128
size = SQL_NO_TOTAL;
3132
if (sizeof (SQLBIGINT) == sizeof (SQLINTEGER)) {
3134
size = sizeof (SQLINTEGER);
3136
type = SQL_C_SBIGINT;
3137
size = sizeof (SQLBIGINT);
3143
if (sizeof (SQLBIGINT) == sizeof (SQLINTEGER)) {
3145
size = sizeof (SQLINTEGER);
3147
type = SQL_C_UBIGINT;
3148
size = sizeof (SQLBIGINT);
3155
if (size != SQL_NO_TOTAL) {
3156
size *= sizeof (SQLWCHAR);
3157
size += sizeof (SQLWCHAR);
3161
if (size != SQL_NO_TOTAL) {
3174
*----------------------------------------------------------------------
3176
* Fill parameter info array for statement.
3178
*----------------------------------------------------------------------
3182
make_pinfo(SQLHSTMT hstmt, int nump, char **msgp)
3185
PINFO *pinfo = NULL;
3187
pinfo = ALLOC_N(PINFO, nump);
3188
if (pinfo == NULL) {
3190
*msgp = set_err("Out of memory", 0);
3194
for (i = 0; i < nump; i++) {
3195
pinfo[i].iotype = SQL_PARAM_INPUT;
3196
pinfo[i].outsize = 0;
3197
pinfo[i].outbuf = NULL;
3198
pinfo[i].rlen = SQL_NULL_DATA;
3199
pinfo[i].ctype = SQL_C_CHAR;
3200
pinfo[i].outtype = SQL_CHAR;
3201
pinfo[i].coldef_max = 0;
3202
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3203
SQLDescribeParam(hstmt, (SQLUSMALLINT) (i + 1),
3204
&pinfo[i].type, &pinfo[i].coldef,
3206
&pinfo[i].nullable),
3207
NULL, "SQLDescribeParam")) {
3208
pinfo[i].type = SQL_VARCHAR;
3209
pinfo[i].coldef = 0;
3211
pinfo[i].nullable = SQL_NULLABLE_UNKNOWN;
3212
pinfo[i].override = 0;
3219
retain_pinfo_override(STMT *q, int nump, PINFO *pinfo)
3221
if ((q->pinfo != NULL) && (q->nump == nump)) {
3224
for (i = 0; i < nump; i++) {
3225
pinfo[i].iotype = q->pinfo[i].iotype;
3226
pinfo[i].rlen = q->pinfo[i].rlen;
3227
pinfo[i].ctype = q->pinfo[i].ctype;
3228
pinfo[i].outtype = q->pinfo[i].outtype;
3229
pinfo[i].outsize = q->pinfo[i].outsize;
3230
if (q->pinfo[i].outbuf != NULL) {
3231
pinfo[i].outbuf = q->pinfo[i].outbuf;
3232
q->pinfo[i].outbuf = NULL;
3234
if (q->pinfo[i].override) {
3235
pinfo[i].override = q->pinfo[i].override;
3236
pinfo[i].type = q->pinfo[i].type;
3237
pinfo[i].coldef = q->pinfo[i].coldef;
3238
pinfo[i].scale = q->pinfo[i].scale;
3245
*----------------------------------------------------------------------
3247
* Wrap SQLHSTMT into struct/VALUE.
3249
*----------------------------------------------------------------------
3253
wrap_stmt(VALUE dbc, DBC *p, SQLHSTMT hstmt, STMT **qp)
3258
stmt = Data_Make_Struct(Cstmt, STMT, mark_stmt, free_stmt, q);
3259
tracemsg(2, fprintf(stderr, "ObjAlloc: STMT %p\n", q););
3260
list_init(&q->link, offsetof(STMT, link));
3267
q->colnames = q->dbufs = NULL;
3271
rb_iv_set(q->self, "@_a", rb_ary_new());
3272
rb_iv_set(q->self, "@_h", rb_hash_new());
3281
*----------------------------------------------------------------------
3283
* Create statement with result.
3285
*----------------------------------------------------------------------
3289
make_result(VALUE dbc, SQLHSTMT hstmt, VALUE result, int mode)
3293
SQLSMALLINT cols = 0, nump;
3294
COLTYPE *coltypes = NULL;
3295
PINFO *pinfo = NULL;
3298
Data_Get_Struct(dbc, DBC, p);
3299
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3300
SQLNumParams(hstmt, &nump), NULL, "SQLNumParams")) {
3304
pinfo = make_pinfo(hstmt, nump, &msg);
3305
if (pinfo == NULL) {
3309
if ((mode & MAKERES_PREPARE) ||
3310
(!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3311
SQLNumResultCols(hstmt, &cols), NULL,
3312
"SQLNumResultCols"))) {
3316
coltypes = make_coltypes(hstmt, cols, &msg);
3317
if (coltypes == NULL) {
3321
if (result == Qnil) {
3322
result = wrap_stmt(dbc, p, hstmt, &q);
3324
Data_Get_Struct(result, STMT, q);
3325
retain_pinfo_override(q, nump, pinfo);
3327
if (q->dbc != dbc) {
3337
q->coltypes = coltypes;
3338
if ((mode & MAKERES_BLOCK) && rb_block_given_p()) {
3339
if (mode & MAKERES_NOCLOSE) {
3340
return rb_yield(result);
3342
return rb_ensure(rb_yield, result, stmt_close, result);
3346
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3347
SQLFreeStmt(hstmt, SQL_DROP), "SQLFreeStmt(SQL_DROP)");
3348
if (result != Qnil) {
3349
Data_Get_Struct(result, STMT, q);
3350
if (q->hstmt == hstmt) {
3351
q->hstmt = SQL_NULL_HSTMT;
3355
if (pinfo != NULL) {
3358
if (coltypes != NULL) {
3361
rb_raise(Cerror, "%s", msg);
3366
upcase_if(char *string, int upc)
3368
if (upc && (string != NULL)) {
3369
unsigned char *p = (unsigned char *) string;
3371
while (*p != '\0') {
3373
if ((*p < 0x80) && ISLOWER(*p))
3387
*----------------------------------------------------------------------
3389
* Constructor: make column from statement.
3391
*----------------------------------------------------------------------
3395
make_col(SQLHSTMT hstmt, int i, int upc)
3398
SQLUSMALLINT ic = i + 1;
3401
SQLWCHAR name[SQL_MAX_MESSAGE_LENGTH];
3403
char name[SQL_MAX_MESSAGE_LENGTH];
3406
SQLSMALLINT name_len;
3409
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3410
SQLColAttributes(hstmt, ic, SQL_COLUMN_LABEL, name,
3411
(SQLSMALLINT) sizeof (name),
3413
&msg, "SQLColAttributes(SQL_COLUMN_LABEL)")) {
3414
rb_raise(Cerror, "%s", msg);
3416
obj = rb_obj_alloc(Ccolumn);
3417
if (name_len >= sizeof (name)) {
3418
name_len = sizeof (name) - 1;
3421
name[name_len / sizeof (name[0])] = 0;
3425
int len = uc_strlen(name);
3427
char *tmp = xmalloc(len);
3433
mkutf(tmp, name, len);
3434
rb_iv_set(obj, "@name", rb_tainted_str_new2(upcase_if(tmp, 1)));
3435
if ((tmp != NULL) && (tmp != tmpbuf)) {
3439
rb_iv_set(obj, "@name", uc_tainted_str_new2(name));
3442
rb_iv_set(obj, "@name", rb_tainted_str_new2(upcase_if(name, upc)));
3446
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3447
SQLColAttributes(hstmt, ic, SQL_COLUMN_TABLE_NAME, name,
3448
(SQLSMALLINT) sizeof (name),
3450
NULL, "SQLColAttributes(SQL_COLUMN_TABLE_NAME)")) {
3451
if (name_len > sizeof (name)) {
3452
name_len = sizeof (name) - 1;
3455
name[name_len / sizeof (name[0])] = 0;
3458
v = uc_tainted_str_new2(name);
3460
v = rb_tainted_str_new2(name);
3463
rb_iv_set(obj, "@table", v);
3464
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3465
SQLColAttributes(hstmt, ic, SQL_COLUMN_TYPE, NULL,
3467
NULL, "SQLColAttributes(SQL_COLUMN_TYPE)")) {
3470
v = INT2NUM(SQL_UNKNOWN_TYPE);
3472
rb_iv_set(obj, "@type", v);
3474
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3475
SQLColAttributes(hstmt, ic,
3476
#if (ODBCVER >= 0x0300)
3481
NULL, 0, NULL, &iv),
3483
#if (ODBCVER >= 0x0300)
3484
"SQLColAttributes(SQL_DESC_LENGTH)"
3486
"SQLColAttributes(SQL_COLUMN_LENGTH)"
3490
} else if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3491
SQLColAttributes(hstmt, ic,
3492
SQL_COLUMN_DISPLAY_SIZE, NULL,
3494
NULL, "SQLColAttributes(SQL_COLUMN_DISPLAY_SIZE)")) {
3497
rb_iv_set(obj, "@length", v);
3499
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3500
SQLColAttributes(hstmt, ic, SQL_COLUMN_NULLABLE, NULL,
3502
NULL, "SQLColAttributes(SQL_COLUMN_NULLABLE)")) {
3503
v = (iv == SQL_NO_NULLS) ? Qfalse : Qtrue;
3505
rb_iv_set(obj, "@nullable", v);
3507
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3508
SQLColAttributes(hstmt, ic, SQL_COLUMN_SCALE, NULL,
3510
NULL, "SQLColAttributes(SQL_COLUMN_SCALE)")) {
3513
rb_iv_set(obj, "@scale", v);
3515
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3516
SQLColAttributes(hstmt, ic, SQL_COLUMN_PRECISION, NULL,
3518
NULL, "SQLColAttributes(SQL_COLUMN_PRECISION)")) {
3521
rb_iv_set(obj, "@precision", v);
3523
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3524
SQLColAttributes(hstmt, ic, SQL_COLUMN_SEARCHABLE, NULL,
3526
NULL, "SQLColAttributes(SQL_COLUMN_SEARCHABLE)")) {
3527
v = (iv == SQL_NO_NULLS) ? Qfalse : Qtrue;
3529
rb_iv_set(obj, "@searchable", v);
3531
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3532
SQLColAttributes(hstmt, ic, SQL_COLUMN_UNSIGNED, NULL,
3534
NULL, "SQLColAttributes(SQL_COLUMN_UNSIGNED)")) {
3535
v = (iv == SQL_NO_NULLS) ? Qfalse : Qtrue;
3537
rb_iv_set(obj, "@unsigned", v);
3539
#ifdef SQL_COLUMN_AUTO_INCREMENT
3540
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3541
SQLColAttributes(hstmt, ic, SQL_COLUMN_AUTO_INCREMENT, NULL,
3543
NULL, "SQLColAttributes(SQL_COLUMN_AUTO_INCREMENT)")) {
3544
v = (iv == SQL_FALSE) ? Qfalse : Qtrue;
3547
rb_iv_set(obj, "@autoincrement", v);
3552
*----------------------------------------------------------------------
3554
* Constructor: make parameter from statement.
3556
*----------------------------------------------------------------------
3560
make_par(STMT *q, int i)
3565
obj = rb_obj_alloc(Cparam);
3566
v = q->pinfo ? q->pinfo[i].type : SQL_VARCHAR;
3567
rb_iv_set(obj, "@type", INT2NUM(v));
3568
v = q->pinfo ? q->pinfo[i].coldef : 0;
3569
rb_iv_set(obj, "@precision", INT2NUM(v));
3570
v = q->pinfo ? q->pinfo[i].scale : 0;
3571
rb_iv_set(obj, "@scale", INT2NUM(v));
3572
v = q->pinfo ? q->pinfo[i].nullable : SQL_NULLABLE_UNKNOWN;
3573
rb_iv_set(obj, "@nullable", INT2NUM(v));
3574
v = q->pinfo ? q->pinfo[i].iotype : SQL_PARAM_INPUT;
3575
rb_iv_set(obj, "@iotype", INT2NUM(v));
3576
v = q->pinfo ? q->pinfo[i].outsize : 0;
3577
rb_iv_set(obj, "@output_size", INT2NUM(v));
3578
v = q->pinfo ? q->pinfo[i].outtype : SQL_CHAR;
3579
rb_iv_set(obj, "@output_type", INT2NUM(v));
3584
*----------------------------------------------------------------------
3586
* Query tables/columns/keys/indexes/types of data source.
3588
*----------------------------------------------------------------------
3592
dbc_info(int argc, VALUE *argv, VALUE self, int mode)
3594
DBC *p = get_dbc(self);
3595
VALUE which = Qnil, which2 = Qnil, which3 = Qnil;
3597
SQLWCHAR *swhich = NULL, *swhich2 = NULL;
3599
SQLCHAR *swhich = NULL, *swhich2 = NULL;
3601
char *msg, *argspec = NULL;
3603
int needstr = 1, itype = SQL_ALL_TYPES;
3604
int iid = SQL_BEST_ROWID, iscope = SQL_SCOPE_CURROW;
3606
if (p->hdbc == SQL_NULL_HDBC) {
3607
rb_raise(Cerror, set_err("No connection", 0));
3631
rb_raise(Cerror, set_err("Invalid info mode", 0));
3634
rb_scan_args(argc, argv, argspec, &which, &which2, &which3);
3635
if (which != Qnil) {
3637
Check_Type(which, T_STRING);
3639
swhich = (SQLWCHAR *) which;
3641
swhich = (SQLCHAR *) STR2CSTR(which);
3644
itype = NUM2INT(which);
3647
if (which2 != Qnil) {
3648
if (mode == INFO_SPECCOLS) {
3649
iid = NUM2INT(which2);
3650
} else if (mode != INFO_INDEXES) {
3651
Check_Type(which2, T_STRING);
3653
swhich2 = (SQLWCHAR *) which2;
3655
swhich2 = (SQLCHAR *) STR2CSTR(which2);
3660
if (swhich != NULL) {
3661
swhich = uc_from_utf((unsigned char *) STR2CSTR((VALUE) swhich), -1);
3662
if (swhich == NULL) {
3663
rb_raise(Cerror, set_err("Out of memory", 0));
3666
if (swhich2 != NULL) {
3667
swhich2 = uc_from_utf((unsigned char *) STR2CSTR((VALUE) swhich2), -1);
3668
if (swhich2 == NULL) {
3670
rb_raise(Cerror, set_err("Out of memory", 0));
3674
if (which3 != Qnil) {
3675
iscope = NUM2INT(which3);
3677
if (!succeeded(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
3678
SQLAllocStmt(p->hdbc, &hstmt), &msg, "SQLAllocStmt")) {
3683
rb_raise(Cerror, "%s", msg);
3687
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3688
SQLTables(hstmt, NULL, 0, NULL, 0,
3689
swhich, (swhich == NULL) ? 0 : SQL_NTS,
3691
&msg, "SQLTables")) {
3696
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3697
SQLColumns(hstmt, NULL, 0, NULL, 0,
3698
swhich, (swhich == NULL) ? 0 : SQL_NTS,
3699
swhich2, (swhich2 == NULL) ? 0 : SQL_NTS),
3700
&msg, "SQLColumns")) {
3705
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3706
SQLPrimaryKeys(hstmt, NULL, 0, NULL, 0,
3707
swhich, (swhich == NULL) ? 0 : SQL_NTS),
3708
&msg, "SQLPrimaryKeys")) {
3713
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3714
SQLStatistics(hstmt, NULL, 0, NULL, 0,
3715
swhich, (swhich == NULL) ? 0 : SQL_NTS,
3716
(SQLUSMALLINT) (RTEST(which2) ?
3717
SQL_INDEX_UNIQUE : SQL_INDEX_ALL),
3719
&msg, "SQLStatistics")) {
3724
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3725
SQLGetTypeInfo(hstmt, (SQLSMALLINT) itype),
3726
&msg, "SQLGetTypeInfo")) {
3731
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3732
SQLForeignKeys(hstmt, NULL, 0, NULL, 0,
3733
swhich, (swhich == NULL) ? 0 : SQL_NTS,
3735
swhich2, (swhich2 == NULL) ? 0 : SQL_NTS),
3736
&msg, "SQLForeignKeys")) {
3741
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3742
SQLTablePrivileges(hstmt, NULL, 0, NULL, 0, swhich,
3743
(swhich == NULL) ? 0 : SQL_NTS),
3744
&msg, "SQLTablePrivileges")) {
3749
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3750
SQLProcedures(hstmt, NULL, 0, NULL, 0,
3751
swhich, (swhich == NULL) ? 0 : SQL_NTS),
3752
&msg, "SQLProcedures")) {
3757
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3758
SQLProcedureColumns(hstmt, NULL, 0, NULL, 0,
3760
(swhich == NULL) ? 0 : SQL_NTS,
3762
(swhich2 == NULL) ? 0 : SQL_NTS),
3763
&msg, "SQLProcedureColumns")) {
3768
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3769
SQLSpecialColumns(hstmt, (SQLUSMALLINT) iid,
3772
(swhich == NULL) ? 0 : SQL_NTS,
3773
(SQLUSMALLINT) iscope,
3775
&msg, "SQLSpecialColumns")) {
3784
return make_result(self, hstmt, Qnil, MAKERES_BLOCK);
3790
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
3791
SQLFreeStmt(hstmt, SQL_DROP), "SQLFreeStmt(SQL_DROP)");
3792
rb_raise(Cerror, "%s", msg);
3797
dbc_tables(int argc, VALUE *argv, VALUE self)
3799
return dbc_info(argc, argv, self, INFO_TABLES);
3803
dbc_columns(int argc, VALUE *argv, VALUE self)
3805
return dbc_info(argc, argv, self, INFO_COLUMNS);
3809
dbc_primkeys(int argc, VALUE *argv, VALUE self)
3811
return dbc_info(argc, argv, self, INFO_PRIMKEYS);
3815
dbc_indexes(int argc, VALUE *argv, VALUE self)
3817
return dbc_info(argc, argv, self, INFO_INDEXES);
3821
dbc_types(int argc, VALUE *argv, VALUE self)
3823
return dbc_info(argc, argv, self, INFO_TYPES);
3827
dbc_forkeys(int argc, VALUE *argv, VALUE self)
3829
return dbc_info(argc, argv, self, INFO_FORKEYS);
3833
dbc_tpriv(int argc, VALUE *argv, VALUE self)
3835
return dbc_info(argc, argv, self, INFO_TPRIV);
3839
dbc_procs(int argc, VALUE *argv, VALUE self)
3841
return dbc_info(argc, argv, self, INFO_PROCS);
3845
dbc_proccols(int argc, VALUE *argv, VALUE self)
3847
return dbc_info(argc, argv, self, INFO_PROCCOLS);
3851
dbc_speccols(int argc, VALUE *argv, VALUE self)
3853
return dbc_info(argc, argv, self, INFO_SPECCOLS);
3857
*----------------------------------------------------------------------
3859
* Transaction stuff.
3861
*----------------------------------------------------------------------
3865
dbc_trans(VALUE self, int what)
3868
SQLHDBC dbc = SQL_NULL_HDBC;
3872
if (rb_obj_is_kind_of(self, Cdbc) == Qtrue) {
3878
if (!succeeded(e->henv, dbc, SQL_NULL_HSTMT,
3879
#if (ODBCVER >= 0x0300)
3880
SQLEndTran((SQLSMALLINT)
3881
((dbc == SQL_NULL_HDBC) ? SQL_HANDLE_ENV :
3883
(dbc == SQL_NULL_HDBC) ? e->henv : dbc,
3884
(SQLSMALLINT) what),
3887
SQLTransact(e->henv, dbc, (SQLUSMALLINT) what),
3891
rb_raise(Cerror, "%s", msg);
3897
dbc_commit(VALUE self)
3899
return dbc_trans(self, SQL_COMMIT);
3903
dbc_rollback(VALUE self)
3905
return dbc_trans(self, SQL_ROLLBACK);
3915
dbc_transbody(VALUE self)
3917
return rb_yield(rb_ary_entry(self, 0));
3921
dbc_transfail(VALUE self, VALUE err)
3923
rb_ary_store(self, 1, err);
3924
dbc_rollback(rb_ary_entry(self, 0));
3929
dbc_transaction(VALUE self)
3933
if (!rb_block_given_p()) {
3934
rb_raise(rb_eArgError, "block required");
3936
rb_ensure(dbc_commit, self, dbc_nop, self);
3938
rb_ary_store(a, 0, self);
3939
rb_ary_store(a, 1, Qnil);
3940
if ((ret = rb_rescue2(dbc_transbody, a, dbc_transfail, a,
3941
rb_eException)) != Qundef) {
3945
ret = rb_ary_entry(a, 1);
3946
rb_exc_raise(rb_exc_new3(CLASS_OF(ret), ret));
3951
*----------------------------------------------------------------------
3953
* Environment attribute handling.
3955
*----------------------------------------------------------------------
3958
#if (ODBCVER >= 0x0300)
3960
do_attr(int argc, VALUE *argv, VALUE self, int op)
3962
SQLHENV henv = SQL_NULL_HENV;
3969
if (self != Modbc) {
3970
henv = get_env(self)->henv;
3972
rb_scan_args(argc, argv, "01", &val);
3974
if (!succeeded(henv, SQL_NULL_HDBC, SQL_NULL_HSTMT,
3975
SQLGetEnvAttr(henv, (SQLINTEGER) op,
3976
(SQLPOINTER) &v, sizeof (v), &l),
3977
&msg, "SQLGetEnvAttr(%d)", op)) {
3978
rb_raise(Cerror, "%s", msg);
3980
return rb_int2inum(v);
3983
vp = (SQLPOINTER) v;
3984
if (!succeeded(henv, SQL_NULL_HDBC, SQL_NULL_HSTMT,
3985
SQLSetEnvAttr(henv, (SQLINTEGER) op, vp, SQL_IS_INTEGER),
3986
&msg, "SQLSetEnvAttr(%d)", op)) {
3987
rb_raise(Cerror, "%s", msg);
3994
env_cpooling(int argc, VALUE *argv, VALUE self)
3996
#if (ODBCVER >= 0x0300)
3997
return do_attr(argc, argv, self, SQL_ATTR_CONNECTION_POOLING);
3999
rb_raise(Cerror, set_err("Unsupported in ODBC < 3.0", 0));
4005
env_cpmatch(int argc, VALUE *argv, VALUE self)
4007
#if (ODBCVER >= 0x0300)
4008
return do_attr(argc, argv, self, SQL_ATTR_CP_MATCH);
4010
rb_raise(Cerror, set_err("Unsupported in ODBC < 3.0", 0));
4016
env_odbcver(int argc, VALUE *argv, VALUE self)
4018
#if (ODBCVER >= 0x0300)
4019
return do_attr(argc, argv, self, SQL_ATTR_ODBC_VERSION);
4023
rb_scan_args(argc, argv, "01", &val);
4025
return rb_int2inum(ODBCVER >> 8);
4027
rb_raise(Cerror, set_err("Unsupported in ODBC < 3.0", 0));
4032
*----------------------------------------------------------------------
4034
* Connection/statement option handling.
4037
* ODBC 2 allows statement options to be set using SQLSetConnectOption,
4038
* establishing the statement option as a default for any hstmts
4039
* later allocated for that hdbc. This feature was deprecated in
4040
* ODBC 3.x and may not work with ODBC 3.x drivers.
4042
* Although the Database class includes attribute accessors for
4043
* statement-level options, a safer alternative, if using an ODBC 3
4044
* driver, is to set the option directly on the Statement instance.
4046
*----------------------------------------------------------------------
4049
#define OPT_LEVEL_STMT 1
4050
#define OPT_LEVEL_DBC 2
4051
#define OPT_LEVEL_BOTH (OPT_LEVEL_STMT | OPT_LEVEL_DBC)
4053
#define OPT_CONST_INT(x, level) { #x, x, level }
4054
#define OPT_CONST_END { NULL, -1 }
4062
OPT_CONST_INT(SQL_AUTOCOMMIT, OPT_LEVEL_DBC),
4063
OPT_CONST_INT(SQL_NOSCAN, OPT_LEVEL_BOTH),
4064
OPT_CONST_INT(SQL_CONCURRENCY, OPT_LEVEL_BOTH),
4065
OPT_CONST_INT(SQL_QUERY_TIMEOUT, OPT_LEVEL_BOTH),
4066
OPT_CONST_INT(SQL_MAX_ROWS, OPT_LEVEL_BOTH),
4067
OPT_CONST_INT(SQL_MAX_LENGTH, OPT_LEVEL_BOTH),
4068
OPT_CONST_INT(SQL_ROWSET_SIZE, OPT_LEVEL_BOTH),
4069
OPT_CONST_INT(SQL_CURSOR_TYPE, OPT_LEVEL_BOTH),
4076
do_option(int argc, VALUE *argv, VALUE self, int isstmt, int op)
4083
int level = isstmt ? OPT_LEVEL_STMT : OPT_LEVEL_DBC;
4085
rb_scan_args(argc, argv, (op == -1) ? "11" : "01", &val, &val2);
4087
Data_Get_Struct(self, STMT, q);
4088
if (q->dbc == Qnil) {
4089
rb_raise(Cerror, set_err("Stale ODBC::Statement", 0));
4091
if (q->hstmt == SQL_NULL_HSTMT) {
4092
rb_raise(Cerror, set_err("No statement", 0));
4096
if (p->hdbc == SQL_NULL_HDBC) {
4097
rb_raise(Cerror, set_err("No connection", 0));
4102
int i, op_found = 0;
4104
switch (TYPE(val)) {
4106
string = STR2CSTR(rb_any_to_s(val));
4109
string = STR2CSTR(val);
4111
for (i = 0; option_map[i].name != NULL; i++) {
4112
if (strcmp(string, option_map[i].name) == 0) {
4113
op = option_map[i].option;
4114
level = option_map[i].level;
4122
op = (int) NUM2DBL(val);
4128
for (i = 0; option_map[i].name != NULL; i++) {
4129
if (op == option_map[i].option) {
4130
level = option_map[i].level;
4138
rb_raise(Cerror, set_err("Unknown option", 0));
4143
if ((isstmt && (!(level & OPT_LEVEL_STMT))) ||
4144
(!isstmt && (!(level & OPT_LEVEL_DBC)))) {
4145
rb_raise(Cerror, set_err("Invalid option type for this level", 0));
4150
if (!succeeded(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
4151
SQLGetConnectOption(p->hdbc, (SQLUSMALLINT) op,
4153
&msg, "SQLGetConnectOption(%d)", op)) {
4154
rb_raise(Cerror, "%s", msg);
4157
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HSTMT, q->hstmt,
4158
SQLGetStmtOption(q->hstmt, (SQLUSMALLINT) op,
4160
&msg, "SQLGetStmtOption(%d)", op)) {
4161
rb_raise(Cerror, "%s", msg);
4166
case SQL_AUTOCOMMIT:
4168
return v ? Qtrue : Qfalse;
4170
v = (TYPE(val) == T_FIXNUM) ?
4171
(FIX2INT(val) ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF) :
4172
(RTEST(val) ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF);
4177
return v ? Qtrue : Qfalse;
4179
v = (TYPE(val) == T_FIXNUM) ?
4180
(FIX2INT(val) ? SQL_NOSCAN_ON : SQL_NOSCAN_OFF) :
4181
(RTEST(val) ? SQL_NOSCAN_ON : SQL_NOSCAN_OFF);
4184
case SQL_CONCURRENCY:
4185
case SQL_QUERY_TIMEOUT:
4187
case SQL_MAX_LENGTH:
4188
case SQL_ROWSET_SIZE:
4189
case SQL_CURSOR_TYPE:
4192
return rb_int2inum(v);
4194
Check_Type(val, T_FIXNUM);
4196
if (op == SQL_ROWSET_SIZE) {
4197
rb_raise(Cerror, set_err("Read only attribute", 0));
4202
if (!succeeded(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
4203
SQLSetConnectOption(p->hdbc, (SQLUSMALLINT) op,
4205
&msg, "SQLSetConnectOption(%d)", op)) {
4206
rb_raise(Cerror, "%s", msg);
4209
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
4210
SQLSetStmtOption(q->hstmt, (SQLUSMALLINT) op,
4212
&msg, "SQLSetStmtOption(%d)", op)) {
4213
rb_raise(Cerror, "%s", msg);
4220
dbc_autocommit(int argc, VALUE *argv, VALUE self)
4222
return do_option(argc, argv, self, 0, SQL_AUTOCOMMIT);
4226
dbc_concurrency(int argc, VALUE *argv, VALUE self)
4228
return do_option(argc, argv, self, 0, SQL_CONCURRENCY);
4232
dbc_maxrows(int argc, VALUE *argv, VALUE self)
4234
return do_option(argc, argv, self, 0, SQL_MAX_ROWS);
4238
dbc_timeout(int argc, VALUE *argv, VALUE self)
4240
return do_option(argc, argv, self, 0, SQL_QUERY_TIMEOUT);
4244
dbc_maxlength(int argc, VALUE *argv, VALUE self)
4246
return do_option(argc, argv, self, 0, SQL_MAX_LENGTH);
4250
dbc_rowsetsize(int argc, VALUE *argv, VALUE self)
4252
return do_option(argc, argv, self, 0, SQL_ROWSET_SIZE);
4256
dbc_cursortype(int argc, VALUE *argv, VALUE self)
4258
return do_option(argc, argv, self, 0, SQL_CURSOR_TYPE);
4262
dbc_noscan(int argc, VALUE *argv, VALUE self)
4264
return do_option(argc, argv, self, 0, SQL_NOSCAN);
4268
dbc_getsetoption(int argc, VALUE *argv, VALUE self)
4270
return do_option(argc, argv, self, 0, -1);
4274
stmt_concurrency(int argc, VALUE *argv, VALUE self)
4276
return do_option(argc, argv, self, 1, SQL_CONCURRENCY);
4280
stmt_maxrows(int argc, VALUE *argv, VALUE self)
4282
return do_option(argc, argv, self, 1, SQL_MAX_ROWS);
4286
stmt_timeout(int argc, VALUE *argv, VALUE self)
4288
return do_option(argc, argv, self, 1, SQL_QUERY_TIMEOUT);
4292
stmt_maxlength(int argc, VALUE *argv, VALUE self)
4294
return do_option(argc, argv, self, 1, SQL_MAX_LENGTH);
4298
stmt_rowsetsize(int argc, VALUE *argv, VALUE self)
4300
return do_option(argc, argv, self, 1, SQL_ROWSET_SIZE);
4304
stmt_cursortype(int argc, VALUE *argv, VALUE self)
4306
return do_option(argc, argv, self, 1, SQL_CURSOR_TYPE);
4310
stmt_noscan(int argc, VALUE *argv, VALUE self)
4312
return do_option(argc, argv, self, 1, SQL_NOSCAN);
4316
stmt_getsetoption(int argc, VALUE *argv, VALUE self)
4318
return do_option(argc, argv, self, 1, -1);
4322
*----------------------------------------------------------------------
4324
* Scan literal date/time/timestamp to TIMESTAMP_STRUCT.
4326
*----------------------------------------------------------------------
4330
scan_dtts(VALUE str, int do_d, int do_t, TIMESTAMP_STRUCT *ts)
4332
int yy = 0, mm = 0, dd = 0, hh = 0, mmm = 0, ss = 0, ff = 0, i;
4333
char c, *cstr = STR2CSTR(str);
4335
memset(ts, 0, sizeof (TIMESTAMP_STRUCT));
4336
if (((sscanf(cstr, "{ts '%d-%d-%d %d:%d:%d.%d' %c",
4337
&yy, &mm, &dd, &hh, &mmm, &ss, &ff, &c) == 8) ||
4338
(sscanf(cstr, "{ts '%d-%d-%d %d:%d:%d' %c",
4339
&yy, &mm, &dd, &hh, &mmm, &ss, &c) == 7)) &&
4351
(sscanf(cstr, "{d '%d-%d-%d' %c", &yy, &mm, &dd, &c) == 4) &&
4359
(sscanf(cstr, "{t '%d:%d:%d' %c", &hh, &mmm, &ss, &c) == 4) &&
4367
i = sscanf(cstr, "%d-%d-%d %d:%d:%d%c%d",
4368
&yy, &mm, &dd, &hh, &mmm, &ss, &c, &ff);
4370
if ((i > 6) && (strchr(". \t", c) == NULL)) {
4384
if (do_d && (sscanf(cstr, "%d-%d-%d", &yy, &mm, &dd) == 3)) {
4390
if (do_t && (sscanf(cstr, "%d:%d:%d", &hh, &mmm, &ss) == 3)) {
4400
*----------------------------------------------------------------------
4404
*----------------------------------------------------------------------
4407
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
4409
date_alloc(VALUE self)
4412
VALUE obj = Data_Make_Struct(self, DATE_STRUCT, 0, xfree, date);
4414
memset(date, 0, sizeof (*date));
4419
date_new(int argc, VALUE *argv, VALUE self)
4422
VALUE obj = Data_Make_Struct(self, DATE_STRUCT, 0, xfree, date);
4424
rb_obj_call_init(obj, argc, argv);
4430
date_load1(VALUE self, VALUE str, int load)
4432
TIMESTAMP_STRUCT tss;
4434
if (scan_dtts(str, 1, 0, &tss)) {
4439
obj = Data_Make_Struct(self, DATE_STRUCT, 0, xfree, date);
4442
Data_Get_Struct(self, DATE_STRUCT, date);
4444
date->year = tss.year;
4445
date->month = tss.month;
4446
date->day = tss.day;
4450
rb_raise(rb_eTypeError, "marshaled ODBC::Date format error");
4456
date_load(VALUE self, VALUE str)
4458
return date_load1(self, str, 1);
4462
date_init(int argc, VALUE *argv, VALUE self)
4467
rb_scan_args(argc, argv, "03", &y, &m, &d);
4468
if (rb_obj_is_kind_of(y, Cdate) == Qtrue) {
4472
rb_raise(rb_eArgError, "wrong # arguments");
4474
Data_Get_Struct(self, DATE_STRUCT, date);
4475
Data_Get_Struct(y, DATE_STRUCT, date2);
4479
if (rb_obj_is_kind_of(y, Ctimestamp) == Qtrue) {
4480
TIMESTAMP_STRUCT *ts;
4483
rb_raise(rb_eArgError, "wrong # arguments");
4485
Data_Get_Struct(self, DATE_STRUCT, date);
4486
Data_Get_Struct(y, TIMESTAMP_STRUCT, ts);
4487
date->year = ts->year;
4488
date->month = ts->month;
4489
date->day = ts->day;
4492
if (rb_obj_is_kind_of(y, rb_cTime) == Qtrue) {
4494
rb_raise(rb_eArgError, "wrong # arguments");
4496
d = rb_funcall(y, IDday, 0, NULL);
4497
m = rb_funcall(y, IDmonth, 0, NULL);
4498
y = rb_funcall(y, IDyear, 0, NULL);
4499
} else if (rb_obj_is_kind_of(y, rb_cDate) == Qtrue) {
4501
rb_raise(rb_eArgError, "wrong # arguments");
4503
d = rb_funcall(y, IDmday, 0, NULL);
4504
m = rb_funcall(y, IDmonth, 0, NULL);
4505
y = rb_funcall(y, IDyear, 0, NULL);
4506
} else if ((argc == 1) && (rb_obj_is_kind_of(y, rb_cString) == Qtrue)) {
4507
if (date_load1(self, y, 0) != Qnil) {
4511
Data_Get_Struct(self, DATE_STRUCT, date);
4512
date->year = (y == Qnil) ? 0 : NUM2INT(y);
4513
date->month = (m == Qnil) ? 0 : NUM2INT(m);
4514
date->day = (d == Qnil) ? 0 : NUM2INT(d);
4519
date_clone(VALUE self)
4521
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
4522
VALUE obj = rb_obj_alloc(CLASS_OF(self));
4523
DATE_STRUCT *date1, *date2;
4525
Data_Get_Struct(self, DATE_STRUCT, date1);
4526
Data_Get_Struct(obj, DATE_STRUCT, date2);
4530
return date_new(1, &self, CLASS_OF(self));
4535
date_to_s(VALUE self)
4540
Data_Get_Struct(self, DATE_STRUCT, date);
4541
sprintf(buf, "%04d-%02d-%02d", date->year, date->month, date->day);
4542
return rb_str_new2(buf);
4546
date_dump(VALUE self, VALUE depth)
4548
return date_to_s(self);
4552
date_inspect(VALUE self)
4554
VALUE s = rb_str_new2("#<ODBC::Date: ");
4556
s = rb_str_append(s, date_to_s(self));
4557
return rb_str_append(s, rb_str_new2(">"));
4561
date_year(int argc, VALUE *argv, VALUE self)
4566
rb_scan_args(argc, argv, "01", &v);
4567
Data_Get_Struct(self, DATE_STRUCT, date);
4569
return INT2NUM(date->year);
4571
date->year = NUM2INT(v);
4576
date_month(int argc, VALUE *argv, VALUE self)
4581
rb_scan_args(argc, argv, "01", &v);
4582
Data_Get_Struct(self, DATE_STRUCT, date);
4584
return INT2NUM(date->month);
4586
date->month = NUM2INT(v);
4591
date_day(int argc, VALUE *argv, VALUE self)
4596
rb_scan_args(argc, argv, "01", &v);
4597
Data_Get_Struct(self, DATE_STRUCT, date);
4599
return INT2NUM(date->day);
4601
date->day = NUM2INT(v);
4606
date_cmp(VALUE self, VALUE date)
4608
DATE_STRUCT *date1, *date2;
4610
if (rb_obj_is_kind_of(date, Cdate) != Qtrue) {
4611
rb_raise(rb_eTypeError, "need ODBC::Date as argument");
4613
Data_Get_Struct(self, DATE_STRUCT, date1);
4614
Data_Get_Struct(date, DATE_STRUCT, date2);
4615
if (date1->year < date2->year) {
4618
if (date1->year == date2->year) {
4619
if (date1->month < date2->month) {
4622
if (date1->month == date2->month) {
4623
if (date1->day < date2->day) {
4626
if (date1->day == date2->day) {
4635
*----------------------------------------------------------------------
4639
*----------------------------------------------------------------------
4642
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
4644
time_alloc(VALUE self)
4647
VALUE obj = Data_Make_Struct(self, TIME_STRUCT, 0, xfree, time);
4649
memset(time, 0, sizeof (*time));
4654
time_new(int argc, VALUE *argv, VALUE self)
4657
VALUE obj = Data_Make_Struct(self, TIME_STRUCT, 0, xfree, time);
4659
rb_obj_call_init(obj, argc, argv);
4665
time_load1(VALUE self, VALUE str, int load)
4667
TIMESTAMP_STRUCT tss;
4669
if (scan_dtts(str, 0, 1, &tss)) {
4674
obj = Data_Make_Struct(self, TIME_STRUCT, 0, xfree, time);
4677
Data_Get_Struct(self, TIME_STRUCT, time);
4679
time->hour = tss.hour;
4680
time->minute = tss.minute;
4681
time->second = tss.second;
4685
rb_raise(rb_eTypeError, "marshaled ODBC::Time format error");
4691
time_load(VALUE self, VALUE str)
4693
return time_load1(self, str, 1);
4697
time_init(int argc, VALUE *argv, VALUE self)
4702
rb_scan_args(argc, argv, "03", &h, &m, &s);
4703
if (rb_obj_is_kind_of(h, Ctime) == Qtrue) {
4707
rb_raise(rb_eArgError, "wrong # arguments");
4709
Data_Get_Struct(self, TIME_STRUCT, time);
4710
Data_Get_Struct(h, TIME_STRUCT, time2);
4714
if (rb_obj_is_kind_of(h, Ctimestamp) == Qtrue) {
4715
TIMESTAMP_STRUCT *ts;
4718
rb_raise(rb_eArgError, "wrong # arguments");
4720
Data_Get_Struct(self, TIME_STRUCT, time);
4721
Data_Get_Struct(h, TIMESTAMP_STRUCT, ts);
4722
time->hour = ts->hour;
4723
time->minute = ts->minute;
4724
time->second = ts->second;
4727
if (rb_obj_is_kind_of(h, rb_cTime) == Qtrue) {
4729
rb_raise(rb_eArgError, "wrong # arguments");
4731
s = rb_funcall(h, IDsec, 0, NULL);
4732
m = rb_funcall(h, IDmin, 0, NULL);
4733
h = rb_funcall(h, IDhour, 0, NULL);
4734
} else if ((argc == 1) && (rb_obj_is_kind_of(h, rb_cString) == Qtrue)) {
4735
if (time_load1(self, h, 0) != Qnil) {
4739
Data_Get_Struct(self, TIME_STRUCT, time);
4740
time->hour = (h == Qnil) ? 0 : NUM2INT(h);
4741
time->minute = (m == Qnil) ? 0 : NUM2INT(m);
4742
time->second = (s == Qnil) ? 0 : NUM2INT(s);
4747
time_clone(VALUE self)
4749
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
4750
VALUE obj = rb_obj_alloc(CLASS_OF(self));
4751
TIME_STRUCT *time1, *time2;
4753
Data_Get_Struct(self, TIME_STRUCT, time1);
4754
Data_Get_Struct(obj, TIME_STRUCT, time2);
4758
return time_new(1, &self, CLASS_OF(self));
4763
time_to_s(VALUE self)
4768
Data_Get_Struct(self, TIME_STRUCT, time);
4769
sprintf(buf, "%02d:%02d:%02d", time->hour, time->minute, time->second);
4770
return rb_str_new2(buf);
4774
time_dump(VALUE self, VALUE depth)
4776
return time_to_s(self);
4780
time_inspect(VALUE self)
4782
VALUE s = rb_str_new2("#<ODBC::Time: ");
4784
s = rb_str_append(s, time_to_s(self));
4785
return rb_str_append(s, rb_str_new2(">"));
4789
time_hour(int argc, VALUE *argv, VALUE self)
4794
rb_scan_args(argc, argv, "01", &v);
4795
Data_Get_Struct(self, TIME_STRUCT, time);
4797
return INT2NUM(time->hour);
4799
time->hour = NUM2INT(v);
4804
time_min(int argc, VALUE *argv, VALUE self)
4809
rb_scan_args(argc, argv, "01", &v);
4810
Data_Get_Struct(self, TIME_STRUCT, time);
4812
return INT2NUM(time->minute);
4814
time->minute = NUM2INT(v);
4819
time_sec(int argc, VALUE *argv, VALUE self)
4824
rb_scan_args(argc, argv, "01", &v);
4825
Data_Get_Struct(self, TIME_STRUCT, time);
4827
return INT2NUM(time->second);
4829
time->second = NUM2INT(v);
4834
time_cmp(VALUE self, VALUE time)
4836
TIME_STRUCT *time1, *time2;
4838
if (rb_obj_is_kind_of(time, Ctime) != Qtrue) {
4839
rb_raise(rb_eTypeError, "need ODBC::Time as argument");
4841
Data_Get_Struct(self, TIME_STRUCT, time1);
4842
Data_Get_Struct(time, TIME_STRUCT, time2);
4843
if (time1->hour < time2->hour) {
4846
if (time1->hour == time2->hour) {
4847
if (time1->minute < time2->minute) {
4850
if (time1->minute == time2->minute) {
4851
if (time1->second < time2->second) {
4854
if (time1->second == time2->second) {
4863
*----------------------------------------------------------------------
4865
* TimeStamp methods.
4867
*----------------------------------------------------------------------
4870
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
4872
timestamp_alloc(VALUE self)
4874
TIMESTAMP_STRUCT *ts;
4875
VALUE obj = Data_Make_Struct(self, TIMESTAMP_STRUCT, 0, xfree, ts);
4877
memset(ts, 0, sizeof (*ts));
4882
timestamp_new(int argc, VALUE *argv, VALUE self)
4884
TIMESTAMP_STRUCT *ts;
4885
VALUE obj = Data_Make_Struct(self, TIMESTAMP_STRUCT, 0, xfree, ts);
4887
rb_obj_call_init(obj, argc, argv);
4893
timestamp_load1(VALUE self, VALUE str, int load)
4895
TIMESTAMP_STRUCT tss;
4897
if (scan_dtts(str, !load, !load, &tss)) {
4898
TIMESTAMP_STRUCT *ts;
4902
obj = Data_Make_Struct(self, TIMESTAMP_STRUCT, 0, xfree, ts);
4905
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
4911
rb_raise(rb_eTypeError, "marshaled ODBC::TimeStamp format error");
4917
timestamp_load(VALUE self, VALUE str)
4919
return timestamp_load1(self, str, 1);
4923
timestamp_init(int argc, VALUE *argv, VALUE self)
4925
TIMESTAMP_STRUCT *ts;
4926
VALUE d, m, y, hh, mm, ss, f;
4928
rb_scan_args(argc, argv, "07", &y, &m, &d, &hh, &mm, &ss, &f);
4929
if (rb_obj_is_kind_of(y, Ctimestamp) == Qtrue) {
4930
TIMESTAMP_STRUCT *ts2;
4933
rb_raise(rb_eArgError, "wrong # arguments");
4935
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
4936
Data_Get_Struct(y, TIMESTAMP_STRUCT, ts2);
4940
if (rb_obj_is_kind_of(y, Cdate) == Qtrue) {
4945
rb_raise(rb_eArgError, "wrong # arguments");
4947
if (rb_obj_is_kind_of(m, Ctime) == Qtrue) {
4950
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
4951
Data_Get_Struct(m, TIME_STRUCT, time);
4952
ts->hour = time->hour;
4953
ts->minute = time->minute;
4954
ts->second = time->second;
4956
rb_raise(rb_eArgError, "need ODBC::Time argument");
4959
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
4960
Data_Get_Struct(y, DATE_STRUCT, date);
4961
ts->year = date->year;
4962
ts->year = date->year;
4963
ts->year = date->year;
4967
if (rb_obj_is_kind_of(y, rb_cTime) == Qtrue) {
4969
rb_raise(rb_eArgError, "wrong # arguments");
4971
f = rb_funcall(y, IDusec, 0, NULL);
4972
ss = rb_funcall(y, IDsec, 0, NULL);
4973
mm = rb_funcall(y, IDmin, 0, NULL);
4974
hh = rb_funcall(y, IDhour, 0, NULL);
4975
d = rb_funcall(y, IDday, 0, NULL);
4976
m = rb_funcall(y, IDmonth, 0, NULL);
4977
y = rb_funcall(y, IDyear, 0, NULL);
4978
f = INT2NUM(NUM2INT(f) * 1000);
4979
} else if (rb_obj_is_kind_of(y, rb_cDate) == Qtrue) {
4981
rb_raise(rb_eArgError, "wrong # arguments");
4987
d = rb_funcall(y, IDmday, 0, NULL);
4988
m = rb_funcall(y, IDmonth, 0, NULL);
4989
y = rb_funcall(y, IDyear, 0, NULL);
4990
} else if ((argc == 1) && (rb_obj_is_kind_of(y, rb_cString) == Qtrue)) {
4991
if (timestamp_load1(self, y, 0) != Qnil) {
4995
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
4996
ts->year = (y == Qnil) ? 0 : NUM2INT(y);
4997
ts->month = (m == Qnil) ? 0 : NUM2INT(m);
4998
ts->day = (d == Qnil) ? 0 : NUM2INT(d);
4999
ts->hour = (hh == Qnil) ? 0 : NUM2INT(hh);
5000
ts->minute = (mm == Qnil) ? 0 : NUM2INT(mm);
5001
ts->second = (ss == Qnil) ? 0 : NUM2INT(ss);
5002
ts->fraction = (f == Qnil) ? 0 : NUM2INT(f);
5007
timestamp_clone(VALUE self)
5009
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
5010
VALUE obj = rb_obj_alloc(CLASS_OF(self));
5011
TIMESTAMP_STRUCT *ts1, *ts2;
5013
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts1);
5014
Data_Get_Struct(obj, TIMESTAMP_STRUCT, ts2);
5018
return timestamp_new(1, &self, CLASS_OF(self));
5023
timestamp_to_s(VALUE self)
5025
TIMESTAMP_STRUCT *ts;
5028
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
5029
sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d %u",
5030
ts->year, ts->month, ts->day,
5031
ts->hour, ts->minute, ts->second,
5032
(unsigned int) ts->fraction);
5033
return rb_str_new2(buf);
5037
timestamp_dump(VALUE self, VALUE depth)
5039
return timestamp_to_s(self);
5043
timestamp_inspect(VALUE self)
5045
VALUE s = rb_str_new2("#<ODBC::TimeStamp: \"");
5047
s = rb_str_append(s, timestamp_to_s(self));
5048
return rb_str_append(s, rb_str_new2("\">"));
5052
timestamp_year(int argc, VALUE *argv, VALUE self)
5054
TIMESTAMP_STRUCT *ts;
5057
rb_scan_args(argc, argv, "01", &v);
5058
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
5060
return INT2NUM(ts->year);
5062
ts->year = NUM2INT(v);
5067
timestamp_month(int argc, VALUE *argv, VALUE self)
5069
TIMESTAMP_STRUCT *ts;
5072
rb_scan_args(argc, argv, "01", &v);
5073
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
5075
return INT2NUM(ts->month);
5077
ts->month = NUM2INT(v);
5082
timestamp_day(int argc, VALUE *argv, VALUE self)
5084
TIMESTAMP_STRUCT *ts;
5087
rb_scan_args(argc, argv, "01", &v);
5088
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
5090
return INT2NUM(ts->day);
5092
ts->day = NUM2INT(v);
5097
timestamp_hour(int argc, VALUE *argv, VALUE self)
5099
TIMESTAMP_STRUCT *ts;
5102
rb_scan_args(argc, argv, "01", &v);
5103
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
5105
return INT2NUM(ts->hour);
5107
ts->hour = NUM2INT(v);
5112
timestamp_min(int argc, VALUE *argv, VALUE self)
5114
TIMESTAMP_STRUCT *ts;
5117
rb_scan_args(argc, argv, "01", &v);
5118
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
5120
return INT2NUM(ts->minute);
5122
ts->minute = NUM2INT(v);
5127
timestamp_sec(int argc, VALUE *argv, VALUE self)
5129
TIMESTAMP_STRUCT *ts;
5132
rb_scan_args(argc, argv, "01", &v);
5133
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
5135
return INT2NUM(ts->second);
5137
ts->second = NUM2INT(v);
5142
timestamp_fraction(int argc, VALUE *argv, VALUE self)
5144
TIMESTAMP_STRUCT *ts;
5147
rb_scan_args(argc, argv, "01", &v);
5148
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts);
5150
return INT2NUM(ts->fraction);
5152
ts->fraction = NUM2INT(v);
5157
timestamp_cmp(VALUE self, VALUE timestamp)
5159
TIMESTAMP_STRUCT *ts1, *ts2;
5161
if (rb_obj_is_kind_of(timestamp, Ctimestamp) != Qtrue) {
5162
rb_raise(rb_eTypeError, "need ODBC::TimeStamp as argument");
5164
Data_Get_Struct(self, TIMESTAMP_STRUCT, ts1);
5165
Data_Get_Struct(timestamp, TIMESTAMP_STRUCT, ts2);
5166
if (ts1->year < ts2->year) {
5169
if (ts1->year == ts2->year) {
5170
if (ts1->month < ts2->month) {
5173
if (ts1->month == ts2->month) {
5174
if (ts1->day < ts2->day) {
5177
if (ts1->day == ts2->day) {
5178
if (ts1->hour < ts2->hour) {
5181
if (ts1->hour == ts2->hour) {
5182
if (ts1->minute < ts2->minute) {
5185
if (ts1->minute == ts2->minute) {
5186
if (ts1->second < ts2->second) {
5189
if (ts1->second == ts2->second) {
5190
if (ts1->fraction < ts2->fraction) {
5193
if (ts1->fraction == ts2->fraction) {
5206
*----------------------------------------------------------------------
5208
* Statement methods.
5210
*----------------------------------------------------------------------
5214
stmt_drop(VALUE self)
5218
Data_Get_Struct(self, STMT, q);
5219
if (q->hstmt != SQL_NULL_HSTMT) {
5220
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5221
SQLFreeStmt(q->hstmt, SQL_DROP), "SQLFreeStmt(SQL_DROP)");
5222
q->hstmt = SQL_NULL_HSTMT;
5230
stmt_close(VALUE self)
5234
Data_Get_Struct(self, STMT, q);
5235
if (q->hstmt != SQL_NULL_HSTMT) {
5236
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5237
SQLFreeStmt(q->hstmt, SQL_CLOSE), "SQLFreeStmt(SQL_CLOSE)");
5244
stmt_cancel(VALUE self)
5249
Data_Get_Struct(self, STMT, q);
5250
if (q->hstmt != SQL_NULL_HSTMT) {
5251
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5252
SQLCancel(q->hstmt), &msg, "SQLCancel")) {
5253
rb_raise(Cerror, "%s", msg);
5260
check_ncols(STMT *q)
5262
if ((q->hstmt != SQL_NULL_HSTMT) && (q->ncols <= 0) &&
5263
(q->coltypes == NULL)) {
5264
COLTYPE *coltypes = NULL;
5265
SQLSMALLINT cols = 0;
5267
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5268
SQLNumResultCols(q->hstmt, &cols), NULL,
5271
coltypes = make_coltypes(q->hstmt, cols, NULL);
5272
if (coltypes != NULL) {
5274
q->coltypes = coltypes;
5281
stmt_ncols(VALUE self)
5285
Data_Get_Struct(self, STMT, q);
5287
return INT2FIX(q->ncols);
5291
stmt_nrows(VALUE self)
5297
Data_Get_Struct(self, STMT, q);
5298
if ((q->hstmt != SQL_NULL_HSTMT) &&
5299
(!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5300
SQLRowCount(q->hstmt, &rows), &msg, "SQLRowCount"))) {
5301
rb_raise(Cerror, "%s", msg);
5303
return INT2NUM(rows);
5307
stmt_nparams(VALUE self)
5311
Data_Get_Struct(self, STMT, q);
5312
return INT2FIX(q->nump);
5316
param_num_check(STMT *q, VALUE pnum, int mkpinfo, int needout)
5320
Check_Type(pnum, T_FIXNUM);
5321
vnum = NUM2INT(pnum);
5322
if (mkpinfo && (q->pinfo == NULL)) {
5324
SQLSMALLINT nump = 0;
5326
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5327
SQLNumParams(q->hstmt, &nump), NULL, "SQLNumParams")) {
5331
PINFO *pinfo = make_pinfo(q->hstmt, nump, &msg);
5333
if (pinfo == NULL) {
5334
rb_raise(Cerror, "%s", msg);
5337
if (q->pinfo != NULL) {
5342
if ((q->pinfo == NULL) || (vnum < 0) || (vnum >= q->nump)) {
5343
rb_raise(rb_eArgError, "parameter number out of bounds");
5346
if ((q->pinfo[vnum].iotype != SQL_PARAM_OUTPUT) &&
5347
(q->pinfo[vnum].iotype != SQL_PARAM_INPUT_OUTPUT)) {
5348
rb_raise(Cerror, "not an output parameter");
5355
stmt_param_type(int argc, VALUE *argv, VALUE self)
5357
VALUE pnum, ptype, pcoldef, pscale;
5361
rb_scan_args(argc, argv, "13", &pnum, &ptype, &pcoldef, &pscale);
5362
Data_Get_Struct(self, STMT, q);
5363
vnum = param_num_check(q, pnum, 1, 0);
5365
int vtype, vcoldef, vscale;
5367
Check_Type(ptype, T_FIXNUM);
5368
vtype = NUM2INT(ptype);
5370
Check_Type(pcoldef, T_FIXNUM);
5371
vcoldef = NUM2INT(pcoldef);
5373
Check_Type(pscale, T_FIXNUM);
5374
vscale = NUM2INT(pscale);
5375
q->pinfo[vnum].scale = vscale;
5377
q->pinfo[vnum].coldef = vcoldef;
5379
q->pinfo[vnum].type = vtype;
5380
q->pinfo[vnum].override = 1;
5383
return INT2NUM(q->pinfo[vnum].type);
5387
stmt_param_iotype(int argc, VALUE *argv, VALUE self)
5389
VALUE pnum, piotype;
5393
rb_scan_args(argc, argv, "11", &pnum, &piotype);
5394
Data_Get_Struct(self, STMT, q);
5395
vnum = param_num_check(q, pnum, 1, 0);
5397
Check_Type(piotype, T_FIXNUM);
5398
viotype = NUM2INT(piotype);
5400
case SQL_PARAM_INPUT:
5401
case SQL_PARAM_INPUT_OUTPUT:
5402
case SQL_PARAM_OUTPUT:
5403
q->pinfo[vnum].iotype = viotype;
5407
return INT2NUM(q->pinfo[vnum].iotype);
5411
stmt_param_output_value(int argc, VALUE *argv, VALUE self)
5417
rb_scan_args(argc, argv, "10", &pnum);
5418
Data_Get_Struct(self, STMT, q);
5419
vnum = param_num_check(q, pnum, 0, 1);
5421
if (q->pinfo[vnum].rlen == SQL_NULL_DATA) {
5424
if (q->pinfo[vnum].outbuf == NULL) {
5425
rb_raise(Cerror, "no output value available");
5427
switch (q->pinfo[vnum].ctype) {
5429
v = INT2NUM(*((SQLINTEGER *) q->pinfo[vnum].outbuf));
5432
v = rb_float_new(*((double *) q->pinfo[vnum].outbuf));
5438
v = Data_Make_Struct(Cdate, DATE_STRUCT, 0, xfree, date);
5439
*date = *((DATE_STRUCT *) q->pinfo[vnum].outbuf);
5446
v = Data_Make_Struct(Ctime, TIME_STRUCT, 0, xfree, time);
5447
*time = *((TIME_STRUCT *) q->pinfo[vnum].outbuf);
5450
case SQL_C_TIMESTAMP:
5452
TIMESTAMP_STRUCT *ts;
5454
v = Data_Make_Struct(Ctimestamp, TIMESTAMP_STRUCT,
5456
*ts = *((TIMESTAMP_STRUCT *) q->pinfo[vnum].outbuf);
5461
v = uc_tainted_str_new((SQLWCHAR *) q->pinfo[vnum].outbuf,
5462
q->pinfo[vnum].rlen / sizeof (SQLWCHAR));
5466
v = rb_tainted_str_new(q->pinfo[vnum].outbuf, q->pinfo[vnum].rlen);
5473
stmt_param_output_size(int argc, VALUE *argv, VALUE self)
5479
rb_scan_args(argc, argv, "11", &pnum, &psize);
5480
Data_Get_Struct(self, STMT, q);
5481
vnum = param_num_check(q, pnum, 0, 1);
5483
Check_Type(psize, T_FIXNUM);
5484
vsize = NUM2INT(psize);
5485
if ((vsize > 0) && (vsize < 4 * sizeof (double))) {
5486
vsize = 4 * sizeof (double);
5488
q->pinfo[vnum].outsize = (vsize > 0) ? vsize : 0;
5490
return INT2NUM(q->pinfo[vnum].outsize);
5494
stmt_param_output_type(int argc, VALUE *argv, VALUE self)
5500
rb_scan_args(argc, argv, "11", &pnum, &ptype);
5501
Data_Get_Struct(self, STMT, q);
5502
vnum = param_num_check(q, pnum, 0, 1);
5504
Check_Type(ptype, T_FIXNUM);
5505
vtype = NUM2INT(ptype);
5506
q->pinfo[vnum].outtype = vtype;
5508
return INT2NUM(q->pinfo[vnum].outtype);
5512
stmt_cursorname(int argc, VALUE *argv, VALUE self)
5517
SQLWCHAR cname[SQL_MAX_MESSAGE_LENGTH];
5520
SQLCHAR cname[SQL_MAX_MESSAGE_LENGTH];
5524
SQLSMALLINT cnLen = 0;
5526
rb_scan_args(argc, argv, "01", &cn);
5527
Data_Get_Struct(self, STMT, q);
5529
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5530
SQLGetCursorName(q->hstmt, (SQLTCHAR *) cname,
5531
(SQLSMALLINT) sizeof (cname), &cnLen),
5532
&msg, "SQLGetCursorName")) {
5533
rb_raise(Cerror, "%s", msg);
5536
cnLen = (cnLen == 0) ? uc_strlen(cname) : (cnLen / sizeof (SQLWCHAR));
5537
return uc_tainted_str_new(cname, cnLen);
5539
cnLen = (cnLen == 0) ? strlen((char *) cname) : cnLen;
5540
return rb_tainted_str_new((char *) cname, cnLen);
5543
if (TYPE(cn) != T_STRING) {
5544
cn = rb_any_to_s(cn);
5547
cp = uc_from_utf((unsigned char *) STR2CSTR(cn), -1);
5549
rb_raise(Cerror, set_err("Out of memory", 0));
5552
cp = (SQLCHAR *) STR2CSTR(cn);
5554
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5555
SQLSetCursorName(q->hstmt, cp, SQL_NTS),
5556
&msg, "SQLSetCursorName")) {
5560
rb_raise(Cerror, "%s", msg);
5569
stmt_column(int argc, VALUE *argv, VALUE self)
5574
rb_scan_args(argc, argv, "1", &col);
5575
Check_Type(col, T_FIXNUM);
5576
Data_Get_Struct(self, STMT, q);
5578
return make_col(q->hstmt, FIX2INT(col), q->upc);
5582
stmt_columns(int argc, VALUE *argv, VALUE self)
5586
VALUE res, as_ary = Qfalse;
5588
rb_scan_args(argc, argv, "01", &as_ary);
5589
Data_Get_Struct(self, STMT, q);
5591
if (rb_block_given_p()) {
5592
for (i = 0; i < q->ncols; i++) {
5593
rb_yield(make_col(q->hstmt, i, q->upc));
5597
if (RTEST(as_ary)) {
5598
res = rb_ary_new2(q->ncols);
5600
res = rb_hash_new();
5602
for (i = 0; i < q->ncols; i++) {
5605
obj = make_col(q->hstmt, i, q->upc);
5606
if (RTEST(as_ary)) {
5607
rb_ary_store(res, i, obj);
5609
VALUE name = rb_iv_get(obj, "@name");
5611
if (rb_funcall(res, IDkeyp, 1, name) == Qtrue) {
5614
sprintf(buf, "#%d", i);
5615
name = rb_str_dup(name);
5616
name = rb_obj_taint(rb_str_cat2(name, buf));
5618
rb_hash_aset(res, name, obj);
5625
stmt_param(int argc, VALUE *argv, VALUE self)
5631
rb_scan_args(argc, argv, "1", &par);
5632
Check_Type(par, T_FIXNUM);
5633
Data_Get_Struct(self, STMT, q);
5635
if ((i < 0) || (i >= q->nump)) {
5636
rb_raise(Cerror, set_err("Parameter out of bounds", 0));
5638
return make_par(q, i);
5642
stmt_params(VALUE self)
5648
Data_Get_Struct(self, STMT, q);
5649
if (rb_block_given_p()) {
5650
for (i = 0; i < q->nump; i++) {
5651
rb_yield(make_par(q, i));
5655
res = rb_ary_new2(q->nump);
5656
for (i = 0; i < q->nump; i++) {
5659
obj = make_par(q, i);
5660
rb_ary_store(res, i, obj);
5666
do_fetch(STMT *q, int mode)
5672
if (q->ncols <= 0) {
5673
rb_raise(Cerror, set_err("No columns in result set", 0));
5675
if (++q->fetchc >= 500) {
5681
int need = sizeof (char *) * q->ncols, needp;
5684
need = LEN_ALIGN(need);
5686
for (i = 0; i < q->ncols; i++) {
5687
if (q->coltypes[i].size != SQL_NO_TOTAL) {
5688
need += LEN_ALIGN(q->coltypes[i].size);
5691
p = ALLOC_N(char, need);
5693
rb_raise(Cerror, set_err("Out of memory", 0));
5695
q->dbufs = bufs = (char **) p;
5697
for (i = 0; i < q->ncols; i++) {
5698
int len = q->coltypes[i].size;
5700
if (len == SQL_NO_TOTAL) {
5704
p += LEN_ALIGN(len);
5708
switch (mode & DOFETCH_MODES) {
5712
case DOFETCH_HASHK2:
5713
if (q->colnames == NULL) {
5714
int need = sizeof (char *) * 4 * q->ncols + sizeof (char *);
5715
int max_len[2] = { 0, 0 };
5718
SQLWCHAR name[SQL_MAX_MESSAGE_LENGTH];
5720
char name[SQL_MAX_MESSAGE_LENGTH];
5722
SQLSMALLINT name_len;
5724
for (i = 0; i < q->ncols; i++) {
5728
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5729
SQLColAttributes(q->hstmt,
5730
(SQLUSMALLINT) (i + 1),
5731
SQL_COLUMN_TABLE_NAME,
5736
"SQLColAttributes(SQL_COLUMN_TABLE_NAME)")) {
5737
rb_raise(Cerror, "%s", msg);
5739
if (name_len >= sizeof (name)) {
5740
name_len = sizeof (name) - 1;
5743
name[name_len / sizeof (name[0])] = 0;
5746
need_len = 6 * (uc_strlen(name) + 1);
5748
need_len = 2 * (strlen(name) + 1);
5751
if (max_len[0] < need_len) {
5752
max_len[0] = need_len;
5755
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5756
SQLColAttributes(q->hstmt,
5757
(SQLUSMALLINT) (i + 1),
5758
SQL_COLUMN_LABEL, name,
5761
&msg, "SQLColAttributes(SQL_COLUMN_LABEL)")) {
5762
rb_raise(Cerror, "%s", msg);
5764
if (name_len >= sizeof (name)) {
5765
name_len = sizeof (name) - 1;
5768
name[name_len / sizeof (name[0])] = 0;
5771
need_len = 6 * 2 * (uc_strlen(name) + 1);
5773
need_len = 2 * (strlen(name) + 1);
5776
if (max_len[1] < need_len) {
5777
max_len[1] = need_len;
5780
need += max_len[0] + max_len[1] + 32;
5781
p = ALLOC_N(char, need);
5783
rb_raise(Cerror, set_err("Out of memory", 0));
5786
p += sizeof (char *) * 4 * q->ncols + sizeof (char *);
5787
for (i = 0; i < q->ncols; i++) {
5791
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5792
SQLColAttributes(q->hstmt, (SQLUSMALLINT) (i + 1),
5793
SQL_COLUMN_TABLE_NAME, name,
5794
sizeof (name), &name_len, NULL),
5795
"SQLColAttributes(SQL_COLUMN_TABLE_NAME)");
5796
if (name_len >= sizeof (name)) {
5797
name_len = sizeof (name) - 1;
5800
name[name_len / sizeof (name[0])] = 0;
5802
na[i + q->ncols] = p;
5804
p += mkutf(p, name, uc_strlen(name));
5812
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5813
SQLColAttributes(q->hstmt, (SQLUSMALLINT) (i + 1),
5814
SQL_COLUMN_LABEL, name,
5815
sizeof (name), &name_len, NULL),
5816
"SQLColAttributes(SQL_COLUMN_LABEL)");
5817
if (name_len >= sizeof (name)) {
5818
name_len = sizeof (name) - 1;
5821
name[name_len / sizeof (name[0])] = 0;
5825
p += mkutf(p, name, uc_strlen(name)) + 1;
5830
na[i + 3 * q->ncols] = p;
5831
strcpy(p, na[i + q->ncols]);
5832
p += p0 - na[i + q->ncols];
5833
na[i + 2 * q->ncols] = upcase_if(p, 1);
5836
/* reserved space for later adjustments */
5837
na[4 * q->ncols] = p;
5842
if (mode & DOFETCH_BANG) {
5843
res = rb_iv_get(q->self, "@_h");
5845
res = rb_hash_new();
5846
rb_iv_set(q->self, "@_h", res);
5849
res = rb_hash_new();
5853
if (mode & DOFETCH_BANG) {
5854
res = rb_iv_get(q->self, "@_a");
5856
res = rb_ary_new2(q->ncols);
5857
rb_iv_set(q->self, "@_a", res);
5862
res = rb_ary_new2(q->ncols);
5865
offc = q->upc ? (2 * q->ncols) : 0;
5866
for (i = 0; i < q->ncols; i++) {
5867
SQLLEN curlen, totlen;
5868
SQLSMALLINT type = q->coltypes[i].type;
5870
char *valp, *freep = NULL;
5872
curlen = q->coltypes[i].size;
5873
if (curlen == SQL_NO_TOTAL) {
5874
SQLLEN chunksize = SEGSIZE;
5878
valp = ALLOC_N(char, chunksize + sizeof (SQLWCHAR));
5880
valp = ALLOC_N(char, chunksize + 1);
5883
while ((curlen == SQL_NO_TOTAL) || (curlen > chunksize)) {
5887
rc = SQLGetData(q->hstmt, (SQLUSMALLINT) (i + 1),
5888
type, (SQLPOINTER) (valp + totlen),
5890
((type == SQL_C_CHAR) || (type == SQL_C_WCHAR)) ?
5891
(chunksize + sizeof (SQLWCHAR)) : chunksize,
5893
(type == SQL_C_CHAR) ?
5894
(chunksize + 1) : chunksize,
5897
if (rc == SQL_NO_DATA) {
5898
if (curlen == SQL_NO_TOTAL) {
5903
ret = succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5904
rc, &msg, "SQLGetData");
5907
rb_raise(Cerror, "%s", msg);
5909
if (curlen == SQL_NULL_DATA) {
5912
if (curlen == SQL_NO_TOTAL) {
5913
totlen += chunksize;
5914
} else if (curlen > chunksize) {
5915
totlen += chunksize;
5916
chunksize = curlen - chunksize;
5922
REALLOC_N(valp, char, totlen + chunksize + sizeof (SQLWCHAR));
5924
REALLOC_N(valp, char, totlen + chunksize + 1);
5927
if (freep != NULL) {
5930
rb_raise(Cerror, set_err("Out of memory", 0));
5940
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
5941
SQLGetData(q->hstmt, (SQLUSMALLINT) (i + 1), type,
5942
(SQLPOINTER) valp, totlen, &curlen),
5943
&msg, "SQLGetData")) {
5944
rb_raise(Cerror, "%s", msg);
5947
if (curlen == SQL_NULL_DATA) {
5952
v = INT2NUM(*((SQLINTEGER *) valp));
5955
v = rb_float_new(*((double *) valp));
5957
#ifdef SQL_C_SBIGINT
5960
v = LL2NUM(*((SQLBIGINT *) valp));
5962
v = INT2NUM(*((SQLBIGINT *) valp));
5966
#ifdef SQL_C_UBIGINT
5969
v = ULL2NUM(*((SQLBIGINT *) valp));
5971
v = UINT2NUM(*((SQLBIGINT *) valp));
5979
v = Data_Make_Struct(Cdate, DATE_STRUCT, 0, xfree, date);
5980
*date = *(DATE_STRUCT *) valp;
5987
v = Data_Make_Struct(Ctime, TIME_STRUCT, 0, xfree, time);
5988
*time = *(TIME_STRUCT *) valp;
5991
case SQL_C_TIMESTAMP:
5993
TIMESTAMP_STRUCT *ts;
5995
v = Data_Make_Struct(Ctimestamp, TIMESTAMP_STRUCT,
5997
*ts = *(TIMESTAMP_STRUCT *) valp;
6002
v = uc_tainted_str_new((SQLWCHAR *) valp,
6003
curlen / sizeof (SQLWCHAR));
6007
v = rb_tainted_str_new(valp, curlen);
6011
if (freep != NULL) {
6014
switch (mode & DOFETCH_MODES) {
6016
valp = q->colnames[i + offc];
6019
valp = q->colnames[i + offc + q->ncols];
6021
name = rb_tainted_str_new2(valp);
6022
if (rb_funcall(res, IDkeyp, 1, name) == Qtrue) {
6025
p = q->colnames[4 * q->ncols];
6026
sprintf(p, "#%d", i);
6027
name = rb_str_cat2(name, p);
6029
rb_hash_aset(res, name, v);
6032
valp = q->colnames[i + offc];
6034
case DOFETCH_HASHK2:
6035
valp = q->colnames[i + offc + q->ncols];
6037
name = ID2SYM(rb_intern(valp));
6038
if (rb_funcall(res, IDkeyp, 1, name) == Qtrue) {
6041
p = q->colnames[4 * q->ncols];
6042
sprintf(p, "%s#%d", valp, i);
6043
name = ID2SYM(rb_intern(p));
6045
rb_hash_aset(res, name, v);
6049
rb_hash_aset(res, name, v);
6052
rb_ary_push(res, v);
6059
stmt_fetch1(VALUE self, int bang)
6064
#if (ODBCVER < 0x0300)
6066
SQLUSMALLINT rowStat[1];
6069
Data_Get_Struct(self, STMT, q);
6070
if (q->ncols <= 0) {
6076
#if (ODBCVER < 0x0300)
6077
msg = "SQLExtendedFetch(SQL_FETCH_NEXT)";
6078
ret = SQLExtendedFetch(q->hstmt, SQL_FETCH_NEXT, 0, &nRows, rowStat);
6080
msg = "SQLFetchScroll(SQL_FETCH_NEXT)";
6081
ret = SQLFetchScroll(q->hstmt, SQL_FETCH_NEXT, 0);
6083
if (ret == SQL_NO_DATA) {
6084
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
6087
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, &err, msg)) {
6088
return do_fetch(q, DOFETCH_ARY | (bang ? DOFETCH_BANG : 0));
6090
if ((err != NULL) &&
6091
((strncmp(err, "IM001", 5) == 0) ||
6092
(strncmp(err, "HYC00", 5) == 0))) {
6094
/* Fallback to SQLFetch() when others not implemented */
6097
ret = SQLFetch(q->hstmt);
6098
if (ret == SQL_NO_DATA) {
6099
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
6102
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret,
6104
return do_fetch(q, DOFETCH_ARY | (bang ? DOFETCH_BANG : 0));
6107
rb_raise(Cerror, "%s", err);
6112
stmt_fetch(VALUE self)
6114
if (rb_block_given_p()) {
6115
return stmt_each(self);
6117
return stmt_fetch1(self, 0);
6121
stmt_fetch_bang(VALUE self)
6123
if (rb_block_given_p()) {
6124
return stmt_each(self);
6126
return stmt_fetch1(self, 1);
6130
stmt_fetch_first1(VALUE self, int bang, int nopos)
6135
#if (ODBCVER < 0x0300)
6137
SQLUSMALLINT rowStat[1];
6140
Data_Get_Struct(self, STMT, q);
6141
if (q->ncols <= 0) {
6147
#if (ODBCVER < 0x0300)
6148
msg = "SQLExtendedFetch(SQL_FETCH_FIRST)";
6149
ret = SQLExtendedFetch(q->hstmt, SQL_FETCH_FIRST, 0, &nRows, rowStat);
6151
msg = "SQLFetchScroll(SQL_FETCH_FIRST)";
6152
ret = SQLFetchScroll(q->hstmt, SQL_FETCH_FIRST, 0);
6154
if (ret == SQL_NO_DATA) {
6155
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
6158
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, &err, msg)) {
6160
return do_fetch(q, DOFETCH_ARY | (bang ? DOFETCH_BANG : 0));
6162
rb_raise(Cerror, "%s", err);
6167
stmt_fetch_first(VALUE self)
6169
return stmt_fetch_first1(self, 0, 0);
6173
stmt_fetch_first_bang(VALUE self)
6175
return stmt_fetch_first1(self, 1, 0);
6179
stmt_fetch_scroll1(int argc, VALUE *argv, VALUE self, int bang)
6184
int idir, ioffs = 1;
6185
char msg[128], *err;
6186
#if (ODBCVER < 0x0300)
6188
SQLUSMALLINT rowStat[1];
6191
rb_scan_args(argc, argv, "11", &dir, &offs);
6192
idir = NUM2INT(dir);
6194
ioffs = NUM2INT(offs);
6196
Data_Get_Struct(self, STMT, q);
6197
if (q->ncols <= 0) {
6200
#if (ODBCVER < 0x0300)
6201
sprintf(msg, "SQLExtendedFetch(%d)", idir);
6202
ret = SQLExtendedFetch(q->hstmt, (SQLSMALLINT) idir, (SQLINTEGER) ioffs,
6205
sprintf(msg, "SQLFetchScroll(%d)", idir);
6206
ret = SQLFetchScroll(q->hstmt, (SQLSMALLINT) idir, (SQLINTEGER) ioffs);
6208
if (ret == SQL_NO_DATA) {
6209
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
6212
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, &err, msg)) {
6213
return do_fetch(q, DOFETCH_ARY | (bang ? DOFETCH_BANG : 0));
6215
rb_raise(Cerror, "%s", err);
6220
stmt_fetch_scroll(int argc, VALUE *argv, VALUE self)
6222
return stmt_fetch_scroll1(argc, argv, self, 0);
6226
stmt_fetch_scroll_bang(int argc, VALUE *argv, VALUE self)
6228
return stmt_fetch_scroll1(argc, argv, self, 1);
6232
stmt_fetch_many(VALUE self, VALUE arg)
6234
int i, max = 0, all = arg == Qnil;
6241
for (i = 0; all || (i < max); i++) {
6242
VALUE v = stmt_fetch1(self, 0);
6247
rb_ary_push(res, v);
6249
return (i == 0) ? Qnil : res;
6253
stmt_fetch_all(VALUE self)
6255
return stmt_fetch_many(self, Qnil);
6259
stmt_hash_mode(int argc, VALUE *argv, VALUE self)
6261
VALUE withtab = Qnil, usesym = Qnil;
6262
int mode = DOFETCH_HASH;
6264
rb_scan_args(argc, argv, "02", &withtab, &usesym);
6265
if ((withtab != Qtrue) && (withtab != Qfalse) && (withtab != Modbc) &&
6266
(rb_obj_is_kind_of(withtab, rb_cHash) == Qtrue)) {
6269
v = rb_hash_aref(withtab, ID2SYM(IDkey));
6270
if (v == ID2SYM(IDSymbol)) {
6271
mode = DOFETCH_HASHK;
6272
} else if (v == ID2SYM(IDString)) {
6273
mode = DOFETCH_HASH;
6274
} else if (v == ID2SYM(IDFixnum)) {
6275
mode = DOFETCH_HASHN;
6277
rb_raise(Cerror, "Unsupported key mode");
6279
if (mode != DOFETCH_HASHN) {
6280
v = rb_hash_aref(withtab, ID2SYM(IDtable_names));
6282
mode = (mode == DOFETCH_HASHK)
6283
? DOFETCH_HASHK2 : DOFETCH_HASH2;
6288
if (withtab == Modbc) {
6289
return DOFETCH_HASHN;
6291
mode = RTEST(withtab) ? DOFETCH_HASH2 : DOFETCH_HASH;
6292
if (RTEST(usesym)) {
6293
mode = (mode == DOFETCH_HASH2) ? DOFETCH_HASHK2 : DOFETCH_HASHK;
6299
stmt_fetch_hash1(int argc, VALUE *argv, VALUE self, int bang)
6303
int mode = stmt_hash_mode(argc, argv, self);
6305
#if (ODBCVER < 0x0300)
6307
SQLUSMALLINT rowStat[1];
6310
Data_Get_Struct(self, STMT, q);
6311
if (q->ncols <= 0) {
6317
#if (ODBCVER < 0x0300)
6318
msg = "SQLExtendedFetch(SQL_FETCH_NEXT)";
6319
ret = SQLExtendedFetch(q->hstmt, SQL_FETCH_NEXT, 0, &nRows, rowStat);
6321
msg = "SQLFetchScroll(SQL_FETCH_NEXT)";
6322
ret = SQLFetchScroll(q->hstmt, SQL_FETCH_NEXT, 0);
6324
if (ret == SQL_NO_DATA) {
6325
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
6328
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, &err, msg)) {
6329
return do_fetch(q, mode | (bang ? DOFETCH_BANG : 0));
6331
if ((err != NULL) &&
6332
((strncmp(err, "IM001", 5) == 0) ||
6333
(strncmp(err, "HYC00", 5) == 0))) {
6335
/* Fallback to SQLFetch() when others not implemented */
6338
ret = SQLFetch(q->hstmt);
6339
if (ret == SQL_NO_DATA) {
6340
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
6343
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret,
6345
return do_fetch(q, mode | (bang ? DOFETCH_BANG : 0));
6348
rb_raise(Cerror, "%s", err);
6353
stmt_fetch_hash(int argc, VALUE *argv, VALUE self)
6355
if (rb_block_given_p()) {
6356
return stmt_each_hash(argc, argv, self);
6358
return stmt_fetch_hash1(argc, argv, self, 0);
6362
stmt_fetch_hash_bang(int argc, VALUE *argv, VALUE self)
6364
if (rb_block_given_p()) {
6365
return stmt_each_hash(argc, argv, self);
6367
return stmt_fetch_hash1(argc, argv, self, 1);
6371
stmt_fetch_first_hash1(int argc, VALUE *argv, VALUE self, int bang, int nopos)
6375
int mode = stmt_hash_mode(argc, argv, self);
6377
#if (ODBCVER < 0x0300)
6379
SQLUSMALLINT rowStat[1];
6382
Data_Get_Struct(self, STMT, q);
6383
if (q->ncols <= 0) {
6389
#if (ODBCVER < 0x0300)
6390
msg = "SQLExtendedFetch(SQL_FETCH_FIRST)";
6391
ret = SQLExtendedFetch(q->hstmt, SQL_FETCH_FIRST, 0, &nRows, rowStat);
6393
msg = "SQLFetchScroll(SQL_FETCH_FIRST)";
6394
ret = SQLFetchScroll(q->hstmt, SQL_FETCH_FIRST, 0);
6396
if (ret == SQL_NO_DATA) {
6397
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
6400
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, &err, msg)) {
6402
return do_fetch(q, mode | (bang ? DOFETCH_BANG : 0));
6404
rb_raise(Cerror, "%s", err);
6409
stmt_fetch_first_hash(int argc, VALUE *argv, VALUE self)
6411
return stmt_fetch_first_hash1(argc, argv, self, 0, 0);
6415
stmt_each(VALUE self)
6419
#if (ODBCVER < 0x0300)
6421
SQLUSMALLINT rowStat[1];
6424
Data_Get_Struct(self, STMT, q);
6425
#if (ODBCVER < 0x0300)
6426
switch (callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6427
SQLExtendedFetch(q->hstmt, SQL_FETCH_FIRST, 0, &nRows,
6429
"SQLExtendedFetch(SQL_FETCH_FIRST)"))
6431
switch (callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6432
SQLFetchScroll(q->hstmt, SQL_FETCH_FIRST, 0),
6433
"SQLFetchScroll(SQL_FETCH_FIRST)"))
6440
case SQL_SUCCESS_WITH_INFO:
6441
row = stmt_fetch_first1(self, 0, 1);
6444
row = stmt_fetch1(self, 0);
6446
while (row != Qnil) {
6448
row = stmt_fetch1(self, 0);
6454
stmt_each_hash(int argc, VALUE *argv, VALUE self)
6456
VALUE row, withtab[2];
6458
int mode = stmt_hash_mode(argc, argv, self);
6459
#if (ODBCVER < 0x0300)
6461
SQLUSMALLINT rowStat[1];
6464
if (mode == DOFETCH_HASHN) {
6466
withtab[1] = Qfalse;
6468
withtab[0] = ((mode == DOFETCH_HASH2) || (mode == DOFETCH_HASHK2))
6470
withtab[1] = ((mode == DOFETCH_HASHK) || (mode == DOFETCH_HASHK2))
6473
Data_Get_Struct(self, STMT, q);
6474
#if (ODBCVER < 0x0300)
6475
switch (callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6476
SQLExtendedFetch(q->hstmt, SQL_FETCH_FIRST, 0, &nRows,
6478
"SQLExtendedFetch(SQL_FETCH_FIRST)"))
6480
switch (callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6481
SQLFetchScroll(q->hstmt, SQL_FETCH_FIRST, 0),
6482
"SQLFetchScroll(SQL_FETCH_FIRST)"))
6489
case SQL_SUCCESS_WITH_INFO:
6490
row = stmt_fetch_first_hash1(2, withtab, self, 0, 1);
6493
row = stmt_fetch_hash1(2, withtab, self, 0);
6495
while (row != Qnil) {
6497
row = stmt_fetch_hash1(2, withtab, self, 0);
6503
stmt_more_results(VALUE self)
6507
if (rb_block_given_p()) {
6508
rb_raise(rb_eArgError, "block not allowed");
6510
Data_Get_Struct(self, STMT, q);
6511
if (q->hstmt == SQL_NULL_HSTMT) {
6514
switch (tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6515
SQLMoreResults(q->hstmt), "SQLMoreResults")) {
6519
case SQL_SUCCESS_WITH_INFO:
6520
make_result(q->dbc, q->hstmt, self, 0);
6523
rb_raise(Cerror, "%s",
6524
get_err(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt));
6530
stmt_prep_int(int argc, VALUE *argv, VALUE self, int mode)
6532
DBC *p = get_dbc(self);
6534
VALUE sql, dbc, stmt;
6537
SQLWCHAR *ssql = NULL;
6539
SQLCHAR *ssql = NULL;
6541
char *csql = NULL, *msg = NULL;
6543
if (rb_obj_is_kind_of(self, Cstmt) == Qtrue) {
6544
Data_Get_Struct(self, STMT, q);
6545
if (q->hstmt == SQL_NULL_HSTMT) {
6546
if (!succeeded(SQL_NULL_HENV, p->hdbc, q->hstmt,
6547
SQLAllocStmt(p->hdbc, &q->hstmt),
6548
&msg, "SQLAllocStmt")) {
6549
rb_raise(Cerror, "%s", msg);
6551
} else if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6552
SQLFreeStmt(q->hstmt, SQL_CLOSE),
6553
&msg, "SQLFreeStmt(SQL_CLOSE)")) {
6554
rb_raise(Cerror, "%s", msg);
6560
if (!succeeded(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
6561
SQLAllocStmt(p->hdbc, &hstmt),
6562
&msg, "SQLAllocStmt")) {
6563
rb_raise(Cerror, "%s", msg);
6568
rb_scan_args(argc, argv, "1", &sql);
6569
Check_Type(sql, T_STRING);
6571
csql = STR2CSTR(sql);
6572
ssql = uc_from_utf((unsigned char *) csql, -1);
6574
rb_raise(Cerror, set_err("Out of memory", 0));
6577
csql = STR2CSTR(sql);
6578
ssql = (SQLCHAR *) csql;
6580
if ((mode & MAKERES_EXECD)) {
6583
if (!succeeded_nodata(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
6584
(ret = SQLExecDirect(hstmt, ssql, SQL_NTS)),
6585
&msg, "SQLExecDirect('%s')", csql)) {
6588
if (ret == SQL_NO_DATA) {
6594
} else if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
6595
SQLPrepare(hstmt, ssql, SQL_NTS),
6596
&msg, "SQLPrepare('%s')", csql)) {
6601
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
6602
SQLFreeStmt(hstmt, SQL_DROP), "SQLFreeStmt(SQL_DROP)");
6604
q->hstmt = SQL_NULL_HSTMT;
6607
rb_raise(Cerror, "%s", msg);
6609
mode |= MAKERES_PREPARE;
6614
return make_result(dbc, hstmt, stmt, mode);
6618
stmt_prep(int argc, VALUE *argv, VALUE self)
6620
return stmt_prep_int(argc, argv, self, MAKERES_BLOCK);
6624
bind_one_param(int pnum, VALUE arg, STMT *q, char **msgp, int *outpp)
6626
SQLPOINTER valp = (SQLPOINTER) &q->pinfo[pnum].buffer;
6627
SQLSMALLINT ctype, stype;
6628
SQLINTEGER vlen, rlen;
6635
q->pinfo[pnum].tofree = NULL;
6637
switch (TYPE(arg)) {
6640
ctype = SQL_C_WCHAR;
6641
up = (SQLWCHAR *) rb_str2cstr(arg, &llen);
6642
if (llen != strlen((char *) up)) {
6643
ctype = SQL_C_BINARY;
6644
valp = (SQLPOINTER) up;
6649
up = uc_from_utf((unsigned char *) up, llen);
6653
*(SQLWCHAR **) valp = up;
6654
rlen = uc_strlen(up) * sizeof (SQLWCHAR);
6655
vlen = rlen + sizeof (SQLWCHAR);
6656
q->pinfo[pnum].tofree = up;
6659
valp = (SQLPOINTER) rb_str2cstr(arg, &llen);
6661
if (rlen != strlen((char *) valp)) {
6662
ctype = SQL_C_BINARY;
6669
*(SQLINTEGER *) valp = FIX2INT(arg);
6671
vlen = sizeof (SQLINTEGER);
6674
ctype = SQL_C_DOUBLE;
6675
*(double *) valp = NUM2DBL(arg);
6677
vlen = sizeof (double);
6682
rlen = SQL_NULL_DATA;
6689
if (arg == ID2SYM(IDNULL)) {
6690
rlen = SQL_NULL_DATA;
6691
} else if (arg == ID2SYM(IDdefault)) {
6692
rlen = SQL_DEFAULT_PARAM;
6696
if (rb_obj_is_kind_of(arg, Cdate) == Qtrue) {
6700
Data_Get_Struct(arg, DATE_STRUCT, date);
6701
valp = (SQLPOINTER) date;
6703
vlen = sizeof (DATE_STRUCT);
6706
if (rb_obj_is_kind_of(arg, Ctime) == Qtrue) {
6710
Data_Get_Struct(arg, TIME_STRUCT, time);
6711
valp = (SQLPOINTER) time;
6713
vlen = sizeof (TIME_STRUCT);
6716
if (rb_obj_is_kind_of(arg, Ctimestamp) == Qtrue) {
6717
TIMESTAMP_STRUCT *ts;
6719
ctype = SQL_C_TIMESTAMP;
6720
Data_Get_Struct(arg, TIMESTAMP_STRUCT, ts);
6721
valp = (SQLPOINTER) ts;
6723
vlen = sizeof (TIMESTAMP_STRUCT);
6727
valp = (SQLPOINTER *) rb_str2cstr(rb_str_to_str(arg), &llen);
6729
if (rlen != strlen((char *) valp)) {
6730
ctype = SQL_C_BINARY;
6735
stype = q->pinfo[pnum].type;
6736
coldef = q->pinfo[pnum].coldef;
6737
q->pinfo[pnum].rlen = rlen;
6738
q->pinfo[pnum].ctype = ctype;
6746
if (stype == SQL_VARCHAR) {
6756
case SQL_C_TIMESTAMP:
6761
* Patch adopted from the Perl DBD::ODBC module ...
6762
* per patch from Paul G. Weiss, who was experiencing re-preparing
6763
* of queries when the size of the bound string's were increasing
6764
* for example select * from tabtest where name = ?
6765
* then executing with 'paul' and then 'thomas' would cause
6766
* SQLServer to prepare the query twice, but if we ran 'thomas'
6767
* then 'paul', it would not re-prepare the query. The key seems
6768
* to be allocating enough space for the largest parameter.
6769
* TBD: the default for this should be a tunable parameter.
6771
if ((stype == SQL_VARCHAR) &&
6772
(q->pinfo[pnum].iotype != SQL_PARAM_INPUT_OUTPUT) &&
6773
(q->pinfo[pnum].iotype != SQL_PARAM_OUTPUT)) {
6774
if (q->pinfo[pnum].coldef_max == 0) {
6775
q->pinfo[pnum].coldef_max = (vlen > 128) ? vlen : 128;
6777
/* bump up max, if needed */
6778
if (vlen > q->pinfo[pnum].coldef_max) {
6779
q->pinfo[pnum].coldef_max = vlen;
6782
coldef = q->pinfo[pnum].coldef_max;
6789
if ((q->pinfo[pnum].iotype == SQL_PARAM_INPUT_OUTPUT) ||
6790
(q->pinfo[pnum].iotype == SQL_PARAM_OUTPUT)) {
6792
if (q->pinfo[pnum].outsize > 0) {
6793
if (q->pinfo[pnum].outbuf != NULL) {
6794
xfree(q->pinfo[pnum].outbuf);
6796
q->pinfo[pnum].outbuf = xmalloc(q->pinfo[pnum].outsize);
6797
if (q->pinfo[pnum].outbuf == NULL) {
6800
ctype = q->pinfo[pnum].ctype = q->pinfo[pnum].outtype;
6802
valp = q->pinfo[pnum].outbuf;
6803
vlen = q->pinfo[pnum].outsize;
6806
if (q->pinfo[pnum].outbuf != NULL) {
6807
xfree(q->pinfo[pnum].outbuf);
6809
q->pinfo[pnum].outbuf = xmalloc(vlen);
6810
if (q->pinfo[pnum].outbuf == NULL) {
6813
if (q->pinfo[pnum].tofree != NULL) {
6814
uc_free(q->pinfo[pnum].tofree);
6815
q->pinfo[pnum].tofree = NULL;
6818
*msgp = set_err("Out of memory", 0);
6822
if (ctype == SQL_C_WCHAR) {
6823
memcpy(q->pinfo[pnum].outbuf, *(SQLWCHAR **) valp, vlen);
6826
memcpy(q->pinfo[pnum].outbuf, valp, vlen);
6828
if (ctype == SQL_C_WCHAR) {
6829
*(SQLWCHAR **) valp = (SQLWCHAR *) q->pinfo[pnum].outbuf;
6832
valp = q->pinfo[pnum].outbuf;
6838
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6839
SQLBindParameter(q->hstmt, (SQLUSMALLINT) (pnum + 1),
6840
q->pinfo[pnum].iotype,
6841
ctype, stype, coldef,
6842
q->pinfo[pnum].scale,
6843
(ctype == SQL_C_WCHAR) ?
6844
*(SQLWCHAR **) valp : valp,
6845
vlen, &q->pinfo[pnum].rlen),
6846
msgp, "SQLBindParameter(%d)", pnum + 1))
6848
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6849
SQLBindParameter(q->hstmt, (SQLUSMALLINT) (pnum + 1),
6850
q->pinfo[pnum].iotype,
6851
ctype, stype, coldef,
6852
q->pinfo[pnum].scale,
6853
valp, vlen, &q->pinfo[pnum].rlen),
6854
msgp, "SQLBindParameter(%d)", pnum + 1))
6859
if (stype == SQL_VARCHAR) {
6860
/* maybe MS Jet memo field */
6861
stype = SQL_LONGVARCHAR;
6865
if (stype == SQL_WVARCHAR) {
6866
stype = SQL_WLONGVARCHAR;
6877
stmt_exec_int(int argc, VALUE *argv, VALUE self, int mode)
6880
int i, argnum, has_out_parms = 0;
6884
Data_Get_Struct(self, STMT, q);
6885
if (argc > q->nump - (EXEC_PARMXOUT(mode) < 0 ? 0 : 1)) {
6886
rb_raise(Cerror, set_err("Too much parameters", 0));
6888
if (q->hstmt == SQL_NULL_HSTMT) {
6889
rb_raise(Cerror, set_err("Stale ODBC::Statement", 0));
6891
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6892
SQLFreeStmt(q->hstmt, SQL_CLOSE),
6893
&msg, "SQLFreeStmt(SQL_CLOSE)")) {
6896
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6897
SQLFreeStmt(q->hstmt, SQL_RESET_PARAMS),
6898
"SQLFreeStmt(SQL_RESET_PARMS)");
6899
for (i = argnum = 0; i < q->nump; i++) {
6902
if (i == EXEC_PARMXOUT(mode)) {
6903
if (bind_one_param(i, Qnil, q, &msg, &has_out_parms) < 0) {
6908
arg = argnum < argc ? argv[argnum++] : Qnil;
6909
if (bind_one_param(i, arg, q, &msg, &has_out_parms) < 0) {
6913
if (!succeeded_nodata(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6914
(ret = SQLExecute(q->hstmt)),
6915
&msg, "SQLExecute")) {
6918
for (i = 0; i < q->nump; i++) {
6919
if (q->pinfo[i].tofree != NULL) {
6920
uc_free(q->pinfo[i].tofree);
6921
q->pinfo[i].tofree = NULL;
6925
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6926
SQLFreeStmt(q->hstmt, SQL_DROP), "SQLFreeStmt(SQL_DROP)");
6927
q->hstmt = SQL_NULL_HSTMT;
6929
rb_raise(Cerror, "%s", msg);
6932
for (i = 0; i < q->nump; i++) {
6933
if (q->pinfo[i].tofree != NULL) {
6934
uc_free(q->pinfo[i].tofree);
6935
q->pinfo[i].tofree = NULL;
6939
if (!has_out_parms) {
6940
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
6941
SQLFreeStmt(q->hstmt, SQL_RESET_PARAMS),
6942
"SQLFreeStmt(SQL_RESET_PARAMS)");
6944
if (ret == SQL_NO_DATA) {
6947
return make_result(q->dbc, q->hstmt, self, mode);
6951
stmt_exec(int argc, VALUE *argv, VALUE self)
6953
return stmt_exec_int(argc, argv, self, MAKERES_BLOCK);
6957
stmt_run(int argc, VALUE *argv, VALUE self)
6960
rb_raise(rb_eArgError, "wrong # of arguments");
6963
return stmt_prep_int(1, argv, self,
6964
MAKERES_EXECD | MAKERES_BLOCK);
6966
return stmt_exec(argc - 1, argv + 1, stmt_prep_int(1, argv, self, 0));
6970
stmt_do(int argc, VALUE *argv, VALUE self)
6975
rb_raise(rb_eArgError, "wrong # of arguments");
6978
stmt = stmt_prep_int(1, argv, self,
6979
MAKERES_EXECD | MAKERES_BLOCK | MAKERES_NOCLOSE);
6981
stmt = stmt_prep_int(1, argv, self, 0);
6982
stmt_exec_int(argc - 1, argv + 1, stmt,
6983
MAKERES_BLOCK | MAKERES_NOCLOSE);
6985
return rb_ensure(stmt_nrows, stmt, stmt_drop, stmt);
6989
stmt_ignorecase(int argc, VALUE *argv, VALUE self)
6994
rb_scan_args(argc, argv, "01", &onoff);
6995
if (rb_obj_is_kind_of(self, Cstmt) == Qtrue) {
6998
Data_Get_Struct(self, STMT, q);
7000
} else if (rb_obj_is_kind_of(self, Cdbc) == Qtrue) {
7003
Data_Get_Struct(self, DBC, p);
7006
rb_raise(rb_eTypeError, "ODBC::Statement or ODBC::Database expected");
7010
*flag = RTEST(onoff);
7012
return *flag ? Qtrue : Qfalse;
7016
*----------------------------------------------------------------------
7018
* Create statement without implicit SQL prepare or execute.
7020
*----------------------------------------------------------------------
7023
stmt_new(VALUE self)
7029
Data_Get_Struct(self, DBC, p);
7030
if (!succeeded(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
7031
SQLAllocStmt(p->hdbc, &hstmt),
7032
&msg, "SQLAllocStmt")) {
7033
rb_raise(Cerror, "%s", msg);
7035
return wrap_stmt(self, p, hstmt, NULL);
7039
*----------------------------------------------------------------------
7041
* Procedures with statements.
7043
*----------------------------------------------------------------------
7047
stmt_proc_init(int argc, VALUE *argv, VALUE self)
7049
VALUE stmt = (argc > 0) ? argv[0] : Qnil;
7051
if (rb_obj_is_kind_of(stmt, Cstmt) == Qtrue) {
7052
rb_iv_set(self, "@statement", stmt);
7053
rb_iv_set(self, "@return_output_param", (argc > 1) ? argv[1] : Qnil);
7056
rb_raise(rb_eTypeError, "need ODBC::Statement as argument");
7061
stmt_proc_call(int argc, VALUE *argv, VALUE self)
7065
stmt = rb_iv_get(self, "@statement");
7066
val = rb_iv_get(self, "@return_output_param");
7068
int parnum = NUM2INT(val);
7070
stmt_exec_int(argc, argv, stmt, EXEC_PARMXNULL(parnum));
7071
rb_call_super(1, &stmt);
7072
return stmt_param_output_value(1, &val, stmt);
7074
stmt_exec_int(argc, argv, stmt, 0);
7075
return rb_call_super(1, &stmt);
7079
stmt_proc(int argc, VALUE *argv, VALUE self)
7081
VALUE sql, ptype, psize, pnum = Qnil, stmt, args[2];
7084
rb_scan_args(argc, argv, "13", &sql, &ptype, &psize, &pnum);
7085
if (!rb_block_given_p()) {
7086
rb_raise(rb_eArgError, "block required");
7088
stmt = stmt_prep_int(1, &sql, self, 0);
7090
return rb_funcall(Cproc, IDnew, 1, stmt);
7092
if ((argc < 4) || (pnum == Qnil)) {
7093
pnum = INT2NUM(parnum);
7095
parnum = NUM2INT(pnum);
7098
args[1] = INT2NUM(SQL_PARAM_OUTPUT);
7099
stmt_param_iotype(2, args, stmt);
7101
stmt_param_output_type(2, args, stmt);
7105
args[1] = INT2NUM(256);
7107
stmt_param_output_size(2, args, stmt);
7108
return rb_funcall(Cproc, IDnew, 2, stmt, pnum);
7112
stmt_procwrap(int argc, VALUE *argv, VALUE self)
7114
VALUE arg0 = Qnil, arg1 = Qnil;
7116
rb_scan_args(argc, argv, "02", &arg0, &arg1);
7117
if (rb_obj_is_kind_of(self, Cstmt) == Qtrue) {
7119
rb_raise(rb_eArgError, "wrong # arguments");
7123
} else if (rb_obj_is_kind_of(arg0, Cstmt) != Qtrue) {
7124
rb_raise(rb_eTypeError, "need ODBC::Statement as 1st argument");
7126
return rb_funcall(Cproc, IDnew, 2, arg0, arg1);
7130
*----------------------------------------------------------------------
7134
*----------------------------------------------------------------------
7138
mod_dbcdisc(VALUE dbc)
7140
return dbc_disconnect(0, NULL, dbc);
7144
mod_connect(int argc, VALUE *argv, VALUE self)
7146
VALUE dbc = dbc_new(argc, argv, self);
7148
if (rb_block_given_p()) {
7149
return rb_ensure(rb_yield, dbc, mod_dbcdisc, dbc);
7155
mod_2time(int argc, VALUE *argv, VALUE self)
7158
VALUE y, m, d, hh, mm, ss, us;
7161
rb_scan_args(argc, argv, "11", &a1, &a2);
7163
if (rb_obj_is_kind_of(a1, Ctimestamp) == Qtrue) {
7164
TIMESTAMP_STRUCT *ts;
7167
rb_raise(rb_eArgError, "wrong # arguments(2 for 1)");
7169
Data_Get_Struct(a1, TIMESTAMP_STRUCT, ts);
7170
y = INT2NUM(ts->year);
7171
m = INT2NUM(ts->month);
7172
d = INT2NUM(ts->day);
7173
hh = INT2NUM(ts->hour);
7174
mm = INT2NUM(ts->minute);
7175
ss = INT2NUM(ts->second);
7176
us = INT2NUM(ts->fraction / 1000);
7179
if (rb_obj_is_kind_of(a1, Cdate) == Qtrue) {
7183
if (rb_obj_is_kind_of(a2, Ctime) == Qtrue) {
7186
Data_Get_Struct(a2, TIME_STRUCT, time);
7187
hh = INT2NUM(time->hour);
7188
mm = INT2NUM(time->minute);
7189
ss = INT2NUM(time->second);
7191
rb_raise(rb_eTypeError, "expecting ODBC::Time");
7198
Data_Get_Struct(a1, DATE_STRUCT, date);
7199
y = INT2NUM(date->year);
7200
m = INT2NUM(date->month);
7201
d = INT2NUM(date->day);
7204
if (rb_obj_is_kind_of(a1, Ctime) == Qtrue) {
7208
if (rb_obj_is_kind_of(a2, Cdate) == Qtrue) {
7211
Data_Get_Struct(a2, DATE_STRUCT, date);
7212
y = INT2NUM(date->year);
7213
m = INT2NUM(date->month);
7214
d = INT2NUM(date->day);
7216
rb_raise(rb_eTypeError, "expecting ODBC::Date");
7219
VALUE now = rb_funcall(rb_cTime, IDnow, 0, NULL);
7221
y = rb_funcall(rb_cTime, IDyear, 1, now);
7222
m = rb_funcall(rb_cTime, IDmonth, 1, now);
7223
d = rb_funcall(rb_cTime, IDday, 1, now);
7225
Data_Get_Struct(a1, TIME_STRUCT, time);
7226
hh = INT2NUM(time->hour);
7227
mm = INT2NUM(time->minute);
7228
ss = INT2NUM(time->second);
7231
return rb_funcall(rb_cTime, IDlocal, 7, y, m, d, hh, mm, ss, us);
7233
if ((!once) && ((m = timestamp_load1(Ctimestamp, a1, -1)) != Qnil)) {
7238
if ((!once) && ((m = date_load1(Cdate, a1, -1)) != Qnil)) {
7240
if ((argc > 1) && ((m = time_load1(Ctime, a2, -1)) != Qnil)) {
7246
if ((!once) && ((m = time_load1(Ctime, a1, -1)) != Qnil)) {
7248
if ((argc > 1) && ((m = date_load1(Cdate, a2, -1)) != Qnil)) {
7254
rb_raise(rb_eTypeError,
7255
"expecting ODBC::TimeStamp or ODBC::Date/Time or String");
7260
mod_2date(VALUE self, VALUE arg)
7266
if (rb_obj_is_kind_of(arg, Cdate) == Qtrue) {
7269
Data_Get_Struct(arg, DATE_STRUCT, date);
7270
y = INT2NUM(date->year);
7271
m = INT2NUM(date->month);
7272
d = INT2NUM(date->day);
7275
if (rb_obj_is_kind_of(arg, Ctimestamp) == Qtrue){
7276
TIMESTAMP_STRUCT *ts;
7278
Data_Get_Struct(arg, TIMESTAMP_STRUCT, ts);
7279
y = INT2NUM(ts->year);
7280
m = INT2NUM(ts->month);
7281
d = INT2NUM(ts->day);
7283
return rb_funcall(rb_cDate, IDnew, 3, y, m, d);
7286
(((m = date_load1(Cdate, arg, -1)) != Qnil) ||
7287
((m = timestamp_load1(Ctimestamp, arg, -1)) != Qnil))) {
7292
rb_raise(rb_eTypeError, "expecting ODBC::Date/Timestamp or String");
7297
mod_trace(int argc, VALUE *argv, VALUE self)
7301
rb_scan_args(argc, argv, "01", &v);
7304
tracing = NUM2INT(v);
7306
return INT2NUM(tracing);
7313
*----------------------------------------------------------------------
7315
* Table of constants and intern'ed string mappings.
7317
*----------------------------------------------------------------------
7320
#define O_CONST(x) { #x, x }
7321
#define O_CONSTU(x) { #x, SQL_UNKNOWN_TYPE }
7322
#define O_CONST2(x,y) { #x, y }
7323
#define O_CONST_END { NULL, -1 }
7329
O_CONST(SQL_CURSOR_FORWARD_ONLY),
7330
O_CONST(SQL_CURSOR_KEYSET_DRIVEN),
7331
O_CONST(SQL_CURSOR_DYNAMIC),
7332
O_CONST(SQL_CURSOR_STATIC),
7333
O_CONST(SQL_CONCUR_READ_ONLY),
7334
O_CONST(SQL_CONCUR_LOCK),
7335
O_CONST(SQL_CONCUR_ROWVER),
7336
O_CONST(SQL_CONCUR_VALUES),
7337
O_CONST(SQL_FETCH_NEXT),
7338
O_CONST(SQL_FETCH_FIRST),
7339
O_CONST(SQL_FETCH_LAST),
7340
O_CONST(SQL_FETCH_PRIOR),
7341
O_CONST(SQL_FETCH_ABSOLUTE),
7342
O_CONST(SQL_FETCH_RELATIVE),
7343
O_CONST(SQL_UNKNOWN_TYPE),
7345
O_CONST(SQL_NUMERIC),
7346
O_CONST(SQL_DECIMAL),
7347
O_CONST(SQL_INTEGER),
7348
O_CONST(SQL_SMALLINT),
7351
O_CONST(SQL_DOUBLE),
7352
O_CONST(SQL_VARCHAR),
7354
O_CONST(SQL_DATETIME),
7356
O_CONSTU(SQL_DATETIME),
7363
#ifdef SQL_TYPE_DATE
7364
O_CONST(SQL_TYPE_DATE),
7366
O_CONSTU(SQL_TYPE_DATE),
7373
#ifdef SQL_TYPE_TIME
7374
O_CONST(SQL_TYPE_TIME),
7376
O_CONSTU(SQL_TYPE_TIME),
7378
#ifdef SQL_TIMESTAMP
7379
O_CONST(SQL_TIMESTAMP),
7381
O_CONSTU(SQL_TIMESTAMP),
7383
#ifdef SQL_TYPE_TIMESTAMP
7384
O_CONST(SQL_TYPE_TIMESTAMP),
7386
O_CONSTU(SQL_TYPE_TIMESTAMP),
7388
#ifdef SQL_LONGVARCHAR
7389
O_CONST(SQL_LONGVARCHAR),
7391
O_CONSTU(SQL_LONGVARCHAR),
7394
O_CONST(SQL_BINARY),
7396
O_CONSTU(SQL_BINARY),
7398
#ifdef SQL_VARBINARY
7399
O_CONST(SQL_VARBINARY),
7401
O_CONSTU(SQL_VARBINARY),
7403
#ifdef SQL_LONGVARBINARY
7404
O_CONST(SQL_LONGVARBINARY),
7406
O_CONSTU(SQL_LONGVARBINARY),
7409
O_CONST(SQL_BIGINT),
7411
O_CONSTU(SQL_BIGINT),
7414
O_CONST(SQL_TINYINT),
7416
O_CONSTU(SQL_TINYINT),
7431
O_CONSTU(SQL_WCHAR),
7434
O_CONST(SQL_WVARCHAR),
7436
O_CONSTU(SQL_WVARCHAR),
7438
#ifdef SQL_WLONGVARCHAR
7439
O_CONST(SQL_WLONGVARCHAR),
7441
O_CONSTU(SQL_WLONGVARCHAR),
7443
#ifdef SQL_ATTR_ODBC_VERSION
7444
O_CONST(SQL_OV_ODBC2),
7445
O_CONST(SQL_OV_ODBC3),
7447
O_CONST2(SQL_OV_ODBC2, 2),
7448
O_CONST2(SQL_OV_ODBC3, 3),
7450
#ifdef SQL_ATTR_CONNECTION_POOLING
7451
O_CONST(SQL_CP_OFF),
7452
O_CONST(SQL_CP_ONE_PER_DRIVER),
7453
O_CONST(SQL_CP_ONE_PER_HENV),
7454
O_CONST(SQL_CP_DEFAULT),
7456
O_CONST2(SQL_CP_OFF, 0),
7457
O_CONST2(SQL_CP_ONE_PER_DRIVER, 0),
7458
O_CONST2(SQL_CP_ONE_PER_HENV, 0),
7459
O_CONST2(SQL_CP_DEFAULT, 0),
7461
#ifdef SQL_ATTR_CP_MATCH
7462
O_CONST(SQL_CP_STRICT_MATCH),
7463
O_CONST(SQL_CP_RELAXED_MATCH),
7464
O_CONST(SQL_CP_MATCH_DEFAULT),
7466
O_CONST2(SQL_CP_STRICT_MATCH, 0),
7467
O_CONST2(SQL_CP_RELAXED_MATCH, 0),
7468
O_CONST2(SQL_CP_MATCH_DEFAULT, 0),
7470
#ifdef SQL_SCOPE_CURROW
7471
O_CONST(SQL_SCOPE_CURROW),
7473
O_CONST2(SQL_SCOPE_CURROW, 0),
7475
#ifdef SQL_SCOPE_TRANSACTION
7476
O_CONST(SQL_SCOPE_TRANSACTION),
7478
O_CONST2(SQL_SCOPE_TRANSACTION, 0),
7480
#ifdef SQL_SCOPE_SESSION
7481
O_CONST(SQL_SCOPE_SESSION),
7483
O_CONST2(SQL_SCOPE_SESSION, 0),
7485
#ifdef SQL_BEST_ROWID
7486
O_CONST(SQL_BEST_ROWID),
7488
O_CONST2(SQL_BEST_ROWID, 0),
7491
O_CONST(SQL_ROWVER),
7493
O_CONST2(SQL_ROWVER, 0),
7495
O_CONST(SQL_PARAM_TYPE_UNKNOWN),
7496
O_CONST(SQL_PARAM_INPUT),
7497
O_CONST(SQL_PARAM_OUTPUT),
7498
O_CONST(SQL_PARAM_INPUT_OUTPUT),
7499
O_CONST(SQL_DEFAULT_PARAM),
7500
O_CONST(SQL_RETURN_VALUE),
7501
O_CONST(SQL_RESULT_COL),
7502
O_CONST(SQL_PT_UNKNOWN),
7503
O_CONST(SQL_PT_PROCEDURE),
7504
O_CONST(SQL_PT_FUNCTION),
7514
{ &IDstart, "start" },
7515
{ &IDatatinfo, "@@info" },
7516
{ &IDataterror, "@@error" },
7517
{ &IDkeys, "keys" },
7518
{ &IDatattrs, "@attrs" },
7520
{ &IDmonth, "month" },
7521
{ &IDyear, "year" },
7522
{ &IDmday, "mday" },
7525
{ &IDhour, "hour" },
7526
{ &IDusec, "usec" },
7527
{ &IDkeyp, "key?" },
7529
{ &IDSymbol, "Symbol" },
7530
{ &IDString, "String" },
7531
{ &IDFixnum, "Fixnum" },
7532
{ &IDtable_names, "table_names" },
7535
{ &IDlocal, "local" },
7536
{ &IDname, "name" },
7537
{ &IDtable, "table" },
7538
{ &IDtype, "type" },
7539
{ &IDlength, "length" },
7540
{ &IDnullable, "nullable" },
7541
{ &IDscale, "scale" },
7542
{ &IDprecision, "precision" },
7543
{ &IDsearchable, "searchable" },
7544
{ &IDunsigned, "unsigned" },
7545
{ &IDiotype, "iotype" },
7546
{ &IDoutput_size, "output_size" },
7547
{ &IDoutput_type, "output_type" },
7548
{ &IDdescr, "descr" },
7549
{ &IDstatement, "statement" },
7550
{ &IDreturn_output_param, "return_output_param" },
7551
{ &IDattrs, "attrs" },
7552
{ &IDNULL, "NULL" },
7553
{ &IDdefault, "default" }
7557
*----------------------------------------------------------------------
7559
* Module initializer.
7561
*----------------------------------------------------------------------
7572
char *modname = "ODBC";
7573
ID modid = rb_intern(modname);
7577
rb_cDate = rb_eval_string("Date");
7579
if (rb_const_defined(rb_cObject, modid)) {
7580
v = rb_const_get(rb_cObject, modid);
7581
if (TYPE(v) != T_MODULE) {
7582
rb_raise(rb_eTypeError, "%s already defined", modname);
7587
modname = "ODBC_UTF8";
7589
modname = "ODBC_NONE";
7593
for (i = 0; i < sizeof (ids) / sizeof (ids[0]); i++) {
7594
*(ids[i].idp) = rb_intern(ids[i].str);
7597
Modbc = rb_define_module(modname);
7598
Cobj = rb_define_class_under(Modbc, "Object", rb_cObject);
7599
rb_define_class_variable(Cobj, "@@error", Qnil);
7600
rb_define_class_variable(Cobj, "@@info", Qnil);
7602
Cenv = rb_define_class_under(Modbc, "Environment", Cobj);
7603
Cdbc = rb_define_class_under(Modbc, "Database", Cenv);
7604
Cstmt = rb_define_class_under(Modbc, "Statement", Cdbc);
7605
rb_include_module(Cstmt, rb_mEnumerable);
7607
Ccolumn = rb_define_class_under(Modbc, "Column", Cobj);
7608
rb_attr(Ccolumn, IDname, 1, 0, Qfalse);
7609
rb_attr(Ccolumn, IDtable, 1, 0, Qfalse);
7610
rb_attr(Ccolumn, IDtype, 1, 0, Qfalse);
7611
rb_attr(Ccolumn, IDlength, 1, 0, Qfalse);
7612
rb_attr(Ccolumn, IDnullable, 1, 0, Qfalse);
7613
rb_attr(Ccolumn, IDscale, 1, 0, Qfalse);
7614
rb_attr(Ccolumn, IDprecision, 1, 0, Qfalse);
7615
rb_attr(Ccolumn, IDsearchable, 1, 0, Qfalse);
7616
rb_attr(Ccolumn, IDunsigned, 1, 0, Qfalse);
7618
Cparam = rb_define_class_under(Modbc, "Parameter", Cobj);
7619
rb_attr(Cparam, IDtype, 1, 0, Qfalse);
7620
rb_attr(Cparam, IDprecision, 1, 0, Qfalse);
7621
rb_attr(Cparam, IDscale, 1, 0, Qfalse);
7622
rb_attr(Cparam, IDnullable, 1, 0, Qfalse);
7623
rb_attr(Cparam, IDiotype, 1, 0, Qfalse);
7624
rb_attr(Cparam, IDoutput_size, 1, 0, Qfalse);
7625
rb_attr(Cparam, IDoutput_type, 1, 0, Qfalse);
7627
Cdsn = rb_define_class_under(Modbc, "DSN", Cobj);
7628
rb_attr(Cdsn, IDname, 1, 1, Qfalse);
7629
rb_attr(Cdsn, IDdescr, 1, 1, Qfalse);
7631
Cdrv = rb_define_class_under(Modbc, "Driver", Cobj);
7632
rb_attr(Cdrv, IDname, 1, 1, Qfalse);
7633
rb_attr(Cdrv, IDattrs, 1, 1, Qfalse);
7635
Cerror = rb_define_class_under(Modbc, "Error", rb_eStandardError);
7637
Cproc = rb_define_class("ODBCProc", rb_cProc);
7639
Cdate = rb_define_class_under(Modbc, "Date", Cobj);
7640
rb_include_module(Cdate, rb_mComparable);
7641
Ctime = rb_define_class_under(Modbc, "Time", Cobj);
7642
rb_include_module(Ctime, rb_mComparable);
7643
Ctimestamp = rb_define_class_under(Modbc, "TimeStamp", Cobj);
7644
rb_include_module(Ctimestamp, rb_mComparable);
7646
/* module functions */
7647
rb_define_module_function(Modbc, "trace", mod_trace, -1);
7648
rb_define_module_function(Modbc, "trace=", mod_trace, -1);
7649
rb_define_module_function(Modbc, "connect", mod_connect, -1);
7650
rb_define_module_function(Modbc, "datasources", dbc_dsns, 0);
7651
rb_define_module_function(Modbc, "drivers", dbc_drivers, 0);
7652
rb_define_module_function(Modbc, "error", dbc_error, 0);
7653
rb_define_module_function(Modbc, "info", dbc_warn, 0);
7654
rb_define_module_function(Modbc, "clear_error", dbc_clrerror, 0);
7655
rb_define_module_function(Modbc, "newenv", env_new, 0);
7656
rb_define_module_function(Modbc, "to_time", mod_2time, -1);
7657
rb_define_module_function(Modbc, "to_date", mod_2date, 1);
7658
rb_define_module_function(Modbc, "connection_pooling", env_cpooling, -1);
7659
rb_define_module_function(Modbc, "connection_pooling=", env_cpooling, -1);
7660
rb_define_module_function(Modbc, "raise", dbc_raise, 1);
7662
/* singleton methods and constructors */
7663
rb_define_singleton_method(Cobj, "error", dbc_error, 0);
7664
rb_define_singleton_method(Cobj, "info", dbc_warn, 0);
7665
rb_define_singleton_method(Cobj, "clear_error", dbc_clrerror, 0);
7666
rb_define_singleton_method(Cobj, "raise", dbc_raise, 1);
7667
rb_define_alloc_func(Cenv, env_new);
7668
rb_define_singleton_method(Cenv, "connect", dbc_new, -1);
7669
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
7670
rb_define_alloc_func(Cdbc, dbc_alloc);
7672
rb_define_alloc_func(Cdbc, dbc_new);
7673
rb_define_alloc_func(Cdsn, dsn_new);
7674
rb_define_alloc_func(Cdrv, drv_new);
7676
rb_define_method(Cdsn, "initialize", dsn_init, 0);
7677
rb_define_method(Cdrv, "initialize", drv_init, 0);
7678
rb_define_method(Cdbc, "newstmt", stmt_new, 0);
7680
/* common (Cobj) methods */
7681
rb_define_method(Cobj, "error", dbc_error, 0);
7682
rb_define_method(Cobj, "info", dbc_warn, 0);
7683
rb_define_method(Cobj, "clear_error", dbc_clrerror, 0);
7684
rb_define_method(Cobj, "raise", dbc_raise, 1);
7686
/* common (Cenv) methods */
7687
rb_define_method(Cenv, "connect", dbc_new, -1);
7688
rb_define_method(Cenv, "environment", env_of, 0);
7689
rb_define_method(Cenv, "transaction", dbc_transaction, 0);
7690
rb_define_method(Cenv, "commit", dbc_commit, 0);
7691
rb_define_method(Cenv, "rollback", dbc_rollback, 0);
7692
rb_define_method(Cenv, "connection_pooling", env_cpooling, -1);
7693
rb_define_method(Cenv, "connection_pooling=", env_cpooling, -1);
7694
rb_define_method(Cenv, "cp_match", env_cpmatch, -1);
7695
rb_define_method(Cenv, "cp_match=", env_cpmatch, -1);
7696
rb_define_method(Cenv, "odbc_version", env_odbcver, -1);
7697
rb_define_method(Cenv, "odbc_version=", env_odbcver, -1);
7699
/* management things (odbcinst.h) */
7700
rb_define_module_function(Modbc, "add_dsn", dbc_adddsn, -1);
7701
rb_define_module_function(Modbc, "config_dsn", dbc_confdsn, -1);
7702
rb_define_module_function(Modbc, "del_dsn", dbc_deldsn, -1);
7703
rb_define_module_function(Modbc, "write_file_dsn", dbc_wfdsn, -1);
7704
rb_define_module_function(Modbc, "read_file_dsn", dbc_rfdsn, -1);
7706
/* connection (database) methods */
7707
rb_define_method(Cdbc, "initialize", dbc_connect, -1);
7708
rb_define_method(Cdbc, "connect", dbc_connect, -1);
7709
rb_define_method(Cdbc, "connected?", dbc_connected, 0);
7710
rb_define_method(Cdbc, "drvconnect", dbc_drvconnect, 1);
7711
rb_define_method(Cdbc, "drop_all", dbc_dropall, 0);
7712
rb_define_method(Cdbc, "disconnect", dbc_disconnect, -1);
7713
rb_define_method(Cdbc, "tables", dbc_tables, -1);
7714
rb_define_method(Cdbc, "columns", dbc_columns, -1);
7715
rb_define_method(Cdbc, "primary_keys", dbc_primkeys, -1);
7716
rb_define_method(Cdbc, "indexes", dbc_indexes, -1);
7717
rb_define_method(Cdbc, "types", dbc_types, -1);
7718
rb_define_method(Cdbc, "foreign_keys", dbc_forkeys, -1);
7719
rb_define_method(Cdbc, "table_privileges", dbc_tpriv, -1);
7720
rb_define_method(Cdbc, "procedures", dbc_procs, -1);
7721
rb_define_method(Cdbc, "procedure_columns", dbc_proccols, -1);
7722
rb_define_method(Cdbc, "special_columns", dbc_speccols, -1);
7723
rb_define_method(Cdbc, "get_info", dbc_getinfo, -1);
7724
rb_define_method(Cdbc, "prepare", stmt_prep, -1);
7725
rb_define_method(Cdbc, "run", stmt_run, -1);
7726
rb_define_method(Cdbc, "do", stmt_do, -1);
7727
rb_define_method(Cdbc, "proc", stmt_proc, -1);
7729
/* connection options */
7730
rb_define_method(Cdbc, "get_option", dbc_getsetoption, -1);
7731
rb_define_method(Cdbc, "set_option", dbc_getsetoption, -1);
7732
rb_define_method(Cdbc, "autocommit", dbc_autocommit, -1);
7733
rb_define_method(Cdbc, "autocommit=", dbc_autocommit, -1);
7734
rb_define_method(Cdbc, "concurrency", dbc_concurrency, -1);
7735
rb_define_method(Cdbc, "concurrency=", dbc_concurrency, -1);
7736
rb_define_method(Cdbc, "maxrows", dbc_maxrows, -1);
7737
rb_define_method(Cdbc, "maxrows=", dbc_maxrows, -1);
7738
rb_define_method(Cdbc, "timeout", dbc_timeout, -1);
7739
rb_define_method(Cdbc, "timeout=", dbc_timeout, -1);
7740
rb_define_method(Cdbc, "maxlength", dbc_maxlength, -1);
7741
rb_define_method(Cdbc, "maxlength=", dbc_maxlength, -1);
7742
rb_define_method(Cdbc, "rowsetsize", dbc_rowsetsize, -1);
7743
rb_define_method(Cdbc, "cursortype", dbc_cursortype, -1);
7744
rb_define_method(Cdbc, "cursortype=", dbc_cursortype, -1);
7745
rb_define_method(Cdbc, "noscan", dbc_noscan, -1);
7746
rb_define_method(Cdbc, "noscan=", dbc_noscan, -1);
7747
rb_define_method(Cdbc, "ignorecase", stmt_ignorecase, -1);
7748
rb_define_method(Cdbc, "ignorecase=", stmt_ignorecase, -1);
7750
/* statement methods */
7751
rb_define_method(Cstmt, "drop", stmt_drop, 0);
7752
rb_define_method(Cstmt, "close", stmt_close, 0);
7753
rb_define_method(Cstmt, "cancel", stmt_cancel, 0);
7754
rb_define_method(Cstmt, "column", stmt_column, -1);
7755
rb_define_method(Cstmt, "columns", stmt_columns, -1);
7756
rb_define_method(Cstmt, "parameter", stmt_param, -1);
7757
rb_define_method(Cstmt, "parameters", stmt_params, 0);
7758
rb_define_method(Cstmt, "param_type", stmt_param_type, -1);
7759
rb_define_method(Cstmt, "param_iotype", stmt_param_iotype, -1);
7760
rb_define_method(Cstmt, "param_output_size", stmt_param_output_size, -1);
7761
rb_define_method(Cstmt, "param_output_type", stmt_param_output_type, -1);
7762
rb_define_method(Cstmt, "param_output_value", stmt_param_output_value, -1);
7763
rb_define_method(Cstmt, "ncols", stmt_ncols, 0);
7764
rb_define_method(Cstmt, "nrows", stmt_nrows, 0);
7765
rb_define_method(Cstmt, "nparams", stmt_nparams, 0);
7766
rb_define_method(Cstmt, "cursorname", stmt_cursorname, -1);
7767
rb_define_method(Cstmt, "cursorname=", stmt_cursorname, -1);
7768
rb_define_method(Cstmt, "fetch", stmt_fetch, 0);
7769
rb_define_method(Cstmt, "fetch!", stmt_fetch_bang, 0);
7770
rb_define_method(Cstmt, "fetch_first", stmt_fetch_first, 0);
7771
rb_define_method(Cstmt, "fetch_first!", stmt_fetch_first_bang, 0);
7772
rb_define_method(Cstmt, "fetch_scroll", stmt_fetch_scroll, -1);
7773
rb_define_method(Cstmt, "fetch_scroll!", stmt_fetch_scroll_bang, -1);
7774
rb_define_method(Cstmt, "fetch_hash", stmt_fetch_hash, -1);
7775
rb_define_method(Cstmt, "fetch_hash!", stmt_fetch_hash_bang, -1);
7776
rb_define_method(Cstmt, "fetch_first_hash", stmt_fetch_first_hash, 0);
7777
rb_define_method(Cstmt, "fetch_many", stmt_fetch_many, 1);
7778
rb_define_method(Cstmt, "fetch_all", stmt_fetch_all, 0);
7779
rb_define_method(Cstmt, "each", stmt_each, 0);
7780
rb_define_method(Cstmt, "each_hash", stmt_each_hash, -1);
7781
rb_define_method(Cstmt, "execute", stmt_exec, -1);
7782
rb_define_method(Cstmt, "make_proc", stmt_procwrap, -1);
7783
rb_define_method(Cstmt, "more_results", stmt_more_results, 0);
7784
rb_define_method(Cstmt, "prepare", stmt_prep, -1);
7785
rb_define_method(Cstmt, "run", stmt_run, -1);
7786
rb_define_singleton_method(Cstmt, "make_proc", stmt_procwrap, -1);
7788
/* statement options */
7789
rb_define_method(Cstmt, "get_option", stmt_getsetoption, -1);
7790
rb_define_method(Cstmt, "set_option", stmt_getsetoption, -1);
7791
rb_define_method(Cstmt, "concurrency", stmt_concurrency, -1);
7792
rb_define_method(Cstmt, "concurrency=", stmt_concurrency, -1);
7793
rb_define_method(Cstmt, "maxrows", stmt_maxrows, -1);
7794
rb_define_method(Cstmt, "maxrows=", stmt_maxrows, -1);
7795
rb_define_method(Cstmt, "timeout", stmt_timeout, -1);
7796
rb_define_method(Cstmt, "timeout=", stmt_timeout, -1);
7797
rb_define_method(Cstmt, "maxlength", stmt_maxlength, -1);
7798
rb_define_method(Cstmt, "maxlength=", stmt_maxlength, -1);
7799
rb_define_method(Cstmt, "cursortype", stmt_cursortype, -1);
7800
rb_define_method(Cstmt, "cursortype=", stmt_cursortype, -1);
7801
rb_define_method(Cstmt, "noscan", stmt_noscan, -1);
7802
rb_define_method(Cstmt, "noscan=", stmt_noscan, -1);
7803
rb_define_method(Cstmt, "rowsetsize", stmt_rowsetsize, -1);
7805
/* data type methods */
7806
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
7807
rb_define_alloc_func(Cdate, date_alloc);
7809
rb_define_singleton_method(Cdate, "new", date_new, -1);
7811
rb_define_singleton_method(Cdate, "_load", date_load, 1);
7812
rb_define_method(Cdate, "initialize", date_init, -1);
7813
rb_define_method(Cdate, "clone", date_clone, 0);
7814
rb_define_method(Cdate, "to_s", date_to_s, 0);
7815
rb_define_method(Cdate, "_dump", date_dump, 1);
7816
rb_define_method(Cdate, "inspect", date_inspect, 0);
7817
rb_define_method(Cdate, "year", date_year, -1);
7818
rb_define_method(Cdate, "month", date_month, -1);
7819
rb_define_method(Cdate, "day", date_day, -1);
7820
rb_define_method(Cdate, "year=", date_year, -1);
7821
rb_define_method(Cdate, "month=", date_month, -1);
7822
rb_define_method(Cdate, "day=", date_day, -1);
7823
rb_define_method(Cdate, "<=>", date_cmp, 1);
7825
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
7826
rb_define_alloc_func(Ctime, time_alloc);
7828
rb_define_singleton_method(Ctime, "new", time_new, -1);
7830
rb_define_singleton_method(Ctime, "_load", time_load, 1);
7831
rb_define_method(Ctime, "initialize", time_init, -1);
7832
rb_define_method(Ctime, "clone", time_clone, 0);
7833
rb_define_method(Ctime, "to_s", time_to_s, 0);
7834
rb_define_method(Ctime, "_dump", time_dump, 1);
7835
rb_define_method(Ctime, "inspect", time_inspect, 0);
7836
rb_define_method(Ctime, "hour", time_hour, -1);
7837
rb_define_method(Ctime, "minute", time_min, -1);
7838
rb_define_method(Ctime, "second", time_sec, -1);
7839
rb_define_method(Ctime, "hour=", time_hour, -1);
7840
rb_define_method(Ctime, "minute=", time_min, -1);
7841
rb_define_method(Ctime, "second=", time_sec, -1);
7842
rb_define_method(Ctime, "<=>", time_cmp, 1);
7844
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
7845
rb_define_alloc_func(Ctimestamp, timestamp_alloc);
7847
rb_define_singleton_method(Ctimestamp, "new", timestamp_new, -1);
7849
rb_define_singleton_method(Ctimestamp, "_load", timestamp_load, 1);
7850
rb_define_method(Ctimestamp, "initialize", timestamp_init, -1);
7851
rb_define_method(Ctimestamp, "clone", timestamp_clone, 0);
7852
rb_define_method(Ctimestamp, "to_s", timestamp_to_s, 0);
7853
rb_define_method(Ctimestamp, "_dump", timestamp_dump, 1);
7854
rb_define_method(Ctimestamp, "inspect", timestamp_inspect, 0);
7855
rb_define_method(Ctimestamp, "year", timestamp_year, -1);
7856
rb_define_method(Ctimestamp, "month", timestamp_month, -1);
7857
rb_define_method(Ctimestamp, "day", timestamp_day, -1);
7858
rb_define_method(Ctimestamp, "hour", timestamp_hour, -1);
7859
rb_define_method(Ctimestamp, "minute", timestamp_min, -1);
7860
rb_define_method(Ctimestamp, "second", timestamp_sec, -1);
7861
rb_define_method(Ctimestamp, "fraction", timestamp_fraction, -1);
7862
rb_define_method(Ctimestamp, "year=", timestamp_year, -1);
7863
rb_define_method(Ctimestamp, "month=", timestamp_month, -1);
7864
rb_define_method(Ctimestamp, "day=", timestamp_day, -1);
7865
rb_define_method(Ctimestamp, "hour=", timestamp_hour, -1);
7866
rb_define_method(Ctimestamp, "minute=", timestamp_min, -1);
7867
rb_define_method(Ctimestamp, "second=", timestamp_sec, -1);
7868
rb_define_method(Ctimestamp, "fraction=", timestamp_fraction, -1);
7869
rb_define_method(Ctimestamp, "<=>", timestamp_cmp, 1);
7871
/* procedure methods */
7872
rb_define_method(Cproc, "initialize", stmt_proc_init, -1);
7873
rb_define_method(Cproc, "call", stmt_proc_call, -1);
7874
rb_define_method(Cproc, "[]", stmt_proc_call, -1);
7875
rb_attr(Cproc, IDstatement, 1, 0, Qfalse);
7876
rb_attr(Cproc, IDreturn_output_param, 1, 0, Qfalse);
7877
#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
7878
rb_enable_super(Cproc, "call");
7879
rb_enable_super(Cproc, "[]");
7883
for (i = 0; o_const[i].name != NULL; i++) {
7884
rb_define_const(Modbc, o_const[i].name,
7885
INT2NUM(o_const[i].value));
7887
for (i = 0; get_info_map[i].name != NULL; i++) {
7888
rb_define_const(Modbc, get_info_map[i].name,
7889
INT2NUM(get_info_map[i].info));
7891
for (i = 0; get_info_bitmap[i].name != NULL; i++) {
7892
rb_define_const(Modbc, get_info_bitmap[i].name,
7893
INT2NUM(get_info_bitmap[i].bits));
7895
for (i = 0; option_map[i].name != NULL; i++) {
7896
rb_define_const(Modbc, option_map[i].name,
7897
INT2NUM(option_map[i].option));