ruby-odbc 0.99995 → 0.99996
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ChangeLog +6 -0
- data/README +2 -2
- data/ext/extconf.rb +34 -0
- data/ext/odbc.c +1080 -127
- data/ruby-odbc.gemspec +1 -1
- data/test/45delete.rb +8 -0
- data/test/test.rb +3 -3
- data/test/utf8/test.rb +3 -3
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7504ee7d8bcf0055aa40cdb22f44a7bf697f3494
|
4
|
+
data.tar.gz: 10f13522e517035268aaee2af4964911e06068d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7d6a796455a8bd4e9cdb8dfff99b30424a4cc15a4346a95bdedb7975dcdc48e729090ae7d1c34f589c29d705c8f8b8c1ba153234373f9cf0f75707043922002
|
7
|
+
data.tar.gz: 3478edc7204561c5b930e203b0879bf93d3d19a15b653750e4395a2b22c9c0ec2de49b37f9b8d45659760acaf0a9584cc91ddcccfb27f441f2334d0523f791b1
|
data/ChangeLog
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
ODBC binding for Ruby
|
2
2
|
---------------------
|
3
3
|
|
4
|
+
Wed Mar 25 2015 version 0.99996 released
|
5
|
+
|
6
|
+
* when built for Ruby >= 2.0 release GVL for potentially
|
7
|
+
long running ODBC API functions, thanks Matt Conover
|
8
|
+
for initial implementation
|
9
|
+
|
4
10
|
Wed Mar 13 2013 version 0.99995 released
|
5
11
|
|
6
12
|
* added ODBC::Database.use_sql_column_name= flag to switch
|
data/README
CHANGED
data/ext/extconf.rb
CHANGED
@@ -78,6 +78,40 @@ rescue
|
|
78
78
|
puts "WARNING: the option -DHAVE_TYPE_SQLULEN"
|
79
79
|
end
|
80
80
|
$have_odbcinst_h = have_header("odbcinst.h")
|
81
|
+
begin
|
82
|
+
if PLATFORM !~ /(mingw|cygwin)/ then
|
83
|
+
header = "sqltypes.h"
|
84
|
+
else
|
85
|
+
header = ["windows.h", "sqltypes.h"]
|
86
|
+
end
|
87
|
+
if defined? have_type
|
88
|
+
have_type("SQLROWOFFSET", header)
|
89
|
+
else
|
90
|
+
throw
|
91
|
+
end
|
92
|
+
rescue
|
93
|
+
puts "WARNING: please check sqltypes.h for SQLROWOFFSET manually,"
|
94
|
+
puts "WARNING: if defined, modify CFLAGS in Makefile to contain"
|
95
|
+
puts "WARNING: the option -DHAVE_TYPE_SQLROWOFFSET"
|
96
|
+
end
|
97
|
+
$have_odbcinst_h = have_header("odbcinst.h")
|
98
|
+
begin
|
99
|
+
if PLATFORM !~ /(mingw|cygwin)/ then
|
100
|
+
header = "sqltypes.h"
|
101
|
+
else
|
102
|
+
header = ["windows.h", "sqltypes.h"]
|
103
|
+
end
|
104
|
+
if defined? have_type
|
105
|
+
have_type("SQLROWSETSIZE", header)
|
106
|
+
else
|
107
|
+
throw
|
108
|
+
end
|
109
|
+
rescue
|
110
|
+
puts "WARNING: please check sqltypes.h for SQLROWSETSIZE manually,"
|
111
|
+
puts "WARNING: if defined, modify CFLAGS in Makefile to contain"
|
112
|
+
puts "WARNING: the option -DHAVE_TYPE_SQLROWSETSIZE"
|
113
|
+
end
|
114
|
+
$have_odbcinst_h = have_header("odbcinst.h")
|
81
115
|
|
82
116
|
if PLATFORM =~ /mswin32/ then
|
83
117
|
if !have_library_ex("odbc32", "SQLAllocConnect", "sql.h") ||
|
data/ext/odbc.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* ODBC-Ruby binding
|
3
|
-
* Copyright (c) 2001-
|
3
|
+
* Copyright (c) 2001-2015 Christian Werner <chw@ch-werner.de>
|
4
4
|
* Portions copyright (c) 2004 Ryszard Niewisiewicz <micz@fibernet.pl>
|
5
5
|
* Portions copyright (c) 2006 Carl Blakeley <cblakeley@openlinksw.co.uk>
|
6
6
|
*
|
@@ -8,7 +8,7 @@
|
|
8
8
|
* and redistribution of this file and for a
|
9
9
|
* DISCLAIMER OF ALL WARRANTIES.
|
10
10
|
*
|
11
|
-
* $Id: odbc.c,v 1.
|
11
|
+
* $Id: odbc.c,v 1.76 2015/03/25 10:55:52 chw Exp chw $
|
12
12
|
*/
|
13
13
|
|
14
14
|
#undef ODBCVER
|
@@ -49,16 +49,26 @@ typedef SQLCHAR SQLTCHAR;
|
|
49
49
|
#endif
|
50
50
|
|
51
51
|
#ifndef HAVE_TYPE_SQLLEN
|
52
|
-
#define SQLLEN
|
52
|
+
#define SQLLEN SQLINTEGER
|
53
53
|
#endif
|
54
54
|
#ifndef HAVE_TYPE_SQLULEN
|
55
55
|
#define SQLULEN SQLUINTEGER
|
56
56
|
#endif
|
57
|
+
#ifndef HAVE_TYPE_SQLROWOFFSET
|
58
|
+
#define SQLROWOFFSET SQLLEN
|
59
|
+
#endif
|
60
|
+
#ifndef HAVE_TYPE_SQLROWSETSIZE
|
61
|
+
#define SQLROWSETSIZE SQLULEN
|
62
|
+
#endif
|
57
63
|
|
58
64
|
#if (RUBY_VERSION_MAJOR <= 1) && (RUBY_VERSION_MINOR < 9)
|
59
65
|
#define TIME_USE_USEC 1
|
60
66
|
#endif
|
61
67
|
|
68
|
+
#ifdef HAVE_RUBY_THREAD_H
|
69
|
+
#include "ruby/thread.h"
|
70
|
+
#endif
|
71
|
+
|
62
72
|
/*
|
63
73
|
* Conditionally undefine aliases of ODBC installer UNICODE functions.
|
64
74
|
*/
|
@@ -163,7 +173,7 @@ typedef struct dbc {
|
|
163
173
|
VALUE self;
|
164
174
|
VALUE env;
|
165
175
|
struct env *envp;
|
166
|
-
LINK stmts;
|
176
|
+
LINK stmts;
|
167
177
|
SQLHDBC hdbc;
|
168
178
|
VALUE rbtime;
|
169
179
|
VALUE gmtime;
|
@@ -355,7 +365,911 @@ static const char *colnamebuf[] = {
|
|
355
365
|
/*
|
356
366
|
*----------------------------------------------------------------------
|
357
367
|
*
|
358
|
-
*
|
368
|
+
* Wrappers for long running SQL APIs with GVL released.
|
369
|
+
*
|
370
|
+
*----------------------------------------------------------------------
|
371
|
+
*/
|
372
|
+
|
373
|
+
#ifdef RUBY_CALL_WO_GVL_FLAG_SKIP_CHECK_INTS_
|
374
|
+
|
375
|
+
static void
|
376
|
+
empty_ubf(void *args)
|
377
|
+
{
|
378
|
+
}
|
379
|
+
|
380
|
+
struct S_SQLCONNECT {
|
381
|
+
SQLHDBC hdbc;
|
382
|
+
SQLTCHAR *dsn;
|
383
|
+
SQLSMALLINT dsn_len;
|
384
|
+
SQLTCHAR *usr;
|
385
|
+
SQLSMALLINT usr_len;
|
386
|
+
SQLTCHAR *pwd;
|
387
|
+
SQLSMALLINT pwd_len;
|
388
|
+
};
|
389
|
+
|
390
|
+
static void *
|
391
|
+
F_SQLCONNECT(void *args)
|
392
|
+
{
|
393
|
+
size_t ret;
|
394
|
+
struct S_SQLCONNECT *argp = (struct S_SQLCONNECT *) args;
|
395
|
+
|
396
|
+
ret = SQLConnect(argp->hdbc, argp->dsn, argp->dsn_len,
|
397
|
+
argp->usr, argp->usr_len, argp->pwd, argp->pwd_len);
|
398
|
+
return (void *) ret;
|
399
|
+
}
|
400
|
+
|
401
|
+
static inline SQLRETURN
|
402
|
+
SQLCONNECT(SQLHDBC hdbc, SQLTCHAR *dsn, SQLSMALLINT dsn_len, SQLTCHAR *usr,
|
403
|
+
SQLSMALLINT usr_len, SQLTCHAR *pwd, SQLSMALLINT pwd_len)
|
404
|
+
{
|
405
|
+
size_t ret;
|
406
|
+
struct S_SQLCONNECT arg;
|
407
|
+
|
408
|
+
arg.hdbc = hdbc;
|
409
|
+
arg.dsn = dsn;
|
410
|
+
arg.dsn_len = dsn_len;
|
411
|
+
arg.usr = usr;
|
412
|
+
arg.usr_len = usr_len;
|
413
|
+
arg.pwd = pwd;
|
414
|
+
arg.pwd_len = pwd_len;
|
415
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLCONNECT, &arg,
|
416
|
+
empty_ubf, &arg);
|
417
|
+
return ret;
|
418
|
+
}
|
419
|
+
|
420
|
+
struct S_SQLDRIVERCONNECT {
|
421
|
+
SQLHDBC hdbc;
|
422
|
+
SQLHWND hwnd;
|
423
|
+
SQLTCHAR *connin;
|
424
|
+
SQLSMALLINT connin_len;
|
425
|
+
SQLTCHAR *connout;
|
426
|
+
SQLSMALLINT connout_max;
|
427
|
+
SQLSMALLINT *connout_len;
|
428
|
+
SQLUSMALLINT compl;
|
429
|
+
};
|
430
|
+
|
431
|
+
static void *
|
432
|
+
F_SQLDRIVERCONNECT(void *args)
|
433
|
+
{
|
434
|
+
size_t ret;
|
435
|
+
struct S_SQLDRIVERCONNECT *argp = (struct S_SQLDRIVERCONNECT *) args;
|
436
|
+
|
437
|
+
ret = SQLDriverConnect(argp->hdbc, argp->hwnd, argp->connin,
|
438
|
+
argp->connin_len, argp->connout, argp->connout_max,
|
439
|
+
argp->connout_len, argp->compl);
|
440
|
+
return (void *) ret;
|
441
|
+
}
|
442
|
+
|
443
|
+
static inline SQLRETURN
|
444
|
+
SQLDRIVERCONNECT(SQLHDBC hdbc, SQLHWND hwnd, SQLTCHAR *connin,
|
445
|
+
SQLSMALLINT connin_len, SQLTCHAR *connout,
|
446
|
+
SQLSMALLINT connout_max, SQLSMALLINT *connout_len,
|
447
|
+
SQLUSMALLINT compl)
|
448
|
+
{
|
449
|
+
size_t ret;
|
450
|
+
struct S_SQLDRIVERCONNECT arg;
|
451
|
+
|
452
|
+
arg.hdbc = hdbc;
|
453
|
+
arg.hwnd = hwnd;
|
454
|
+
arg.connin = connin;
|
455
|
+
arg.connin_len = connin_len;
|
456
|
+
arg.connout = connout;
|
457
|
+
arg.connout_max = connout_max;
|
458
|
+
arg.connout_len = connout_len;
|
459
|
+
arg.compl = compl;
|
460
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLDRIVERCONNECT, &arg,
|
461
|
+
empty_ubf, &arg);
|
462
|
+
return ret;
|
463
|
+
}
|
464
|
+
|
465
|
+
struct S_SQLDISCONNECT {
|
466
|
+
SQLHSTMT hstmt;
|
467
|
+
};
|
468
|
+
|
469
|
+
static void *
|
470
|
+
F_SQLDISCONNECT(void *args)
|
471
|
+
{
|
472
|
+
size_t ret;
|
473
|
+
struct S_SQLDISCONNECT *argp = (struct S_SQLDISCONNECT *) args;
|
474
|
+
|
475
|
+
ret = SQLDisconnect(argp->hstmt);
|
476
|
+
return (void *) ret;
|
477
|
+
}
|
478
|
+
|
479
|
+
static inline SQLRETURN
|
480
|
+
SQLDISCONNECT(SQLHSTMT hstmt)
|
481
|
+
{
|
482
|
+
size_t ret;
|
483
|
+
struct S_SQLDISCONNECT arg;
|
484
|
+
|
485
|
+
arg.hstmt = hstmt;
|
486
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLDISCONNECT, &arg,
|
487
|
+
empty_ubf, &arg);
|
488
|
+
return ret;
|
489
|
+
}
|
490
|
+
|
491
|
+
struct S_SQLTABLES {
|
492
|
+
SQLHSTMT hdbc;
|
493
|
+
SQLTCHAR *cat;
|
494
|
+
SQLSMALLINT cat_len;
|
495
|
+
SQLTCHAR *sch;
|
496
|
+
SQLSMALLINT sch_len;
|
497
|
+
SQLTCHAR *tbl;
|
498
|
+
SQLSMALLINT tbl_len;
|
499
|
+
SQLTCHAR *typ;
|
500
|
+
SQLSMALLINT typ_len;
|
501
|
+
};
|
502
|
+
|
503
|
+
static void *
|
504
|
+
F_SQLTABLES(void *args)
|
505
|
+
{
|
506
|
+
size_t ret;
|
507
|
+
struct S_SQLTABLES *argp = (struct S_SQLTABLES *) args;
|
508
|
+
|
509
|
+
ret = SQLTables(argp->hdbc, argp->cat, argp->cat_len,
|
510
|
+
argp->sch, argp->sch_len, argp->tbl,
|
511
|
+
argp->tbl_len, argp->typ, argp->typ_len);
|
512
|
+
return (void *) ret;
|
513
|
+
}
|
514
|
+
|
515
|
+
static inline SQLRETURN
|
516
|
+
SQLTABLES(SQLHDBC hdbc, SQLTCHAR *cat, SQLSMALLINT cat_len,
|
517
|
+
SQLTCHAR *sch, SQLSMALLINT sch_len, SQLTCHAR *tbl,
|
518
|
+
SQLSMALLINT tbl_len, SQLTCHAR *typ, SQLSMALLINT typ_len)
|
519
|
+
{
|
520
|
+
size_t ret;
|
521
|
+
struct S_SQLTABLES arg;
|
522
|
+
|
523
|
+
arg.hdbc = hdbc;
|
524
|
+
arg.cat = cat;
|
525
|
+
arg.cat_len = cat_len;
|
526
|
+
arg.sch = sch;
|
527
|
+
arg.sch_len = sch_len;
|
528
|
+
arg.tbl = tbl;
|
529
|
+
arg.tbl_len = tbl_len;
|
530
|
+
arg.typ = typ;
|
531
|
+
arg.typ_len = typ_len;
|
532
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLTABLES, &arg,
|
533
|
+
empty_ubf, &arg);
|
534
|
+
return ret;
|
535
|
+
}
|
536
|
+
|
537
|
+
struct S_SQLCOLUMNS {
|
538
|
+
SQLHSTMT hdbc;
|
539
|
+
SQLTCHAR *cat;
|
540
|
+
SQLSMALLINT cat_len;
|
541
|
+
SQLTCHAR *sch;
|
542
|
+
SQLSMALLINT sch_len;
|
543
|
+
SQLTCHAR *tbl;
|
544
|
+
SQLSMALLINT tbl_len;
|
545
|
+
SQLTCHAR *col;
|
546
|
+
SQLSMALLINT col_len;
|
547
|
+
};
|
548
|
+
|
549
|
+
static void *
|
550
|
+
F_SQLCOLUMNS(void *args)
|
551
|
+
{
|
552
|
+
size_t ret;
|
553
|
+
struct S_SQLCOLUMNS *argp = (struct S_SQLCOLUMNS *) args;
|
554
|
+
|
555
|
+
ret = SQLColumns(argp->hdbc, argp->cat, argp->cat_len,
|
556
|
+
argp->sch, argp->sch_len, argp->tbl,
|
557
|
+
argp->tbl_len, argp->col, argp->col_len);
|
558
|
+
return (void *) ret;
|
559
|
+
}
|
560
|
+
|
561
|
+
static inline SQLRETURN
|
562
|
+
SQLCOLUMNS(SQLHDBC hdbc, SQLTCHAR *cat, SQLSMALLINT cat_len,
|
563
|
+
SQLTCHAR *sch, SQLSMALLINT sch_len, SQLTCHAR *tbl,
|
564
|
+
SQLSMALLINT tbl_len, SQLTCHAR *col, SQLSMALLINT col_len)
|
565
|
+
{
|
566
|
+
size_t ret;
|
567
|
+
struct S_SQLCOLUMNS arg;
|
568
|
+
|
569
|
+
arg.hdbc = hdbc;
|
570
|
+
arg.cat = cat;
|
571
|
+
arg.cat_len = cat_len;
|
572
|
+
arg.sch = sch;
|
573
|
+
arg.sch_len = sch_len;
|
574
|
+
arg.tbl = tbl;
|
575
|
+
arg.tbl_len = tbl_len;
|
576
|
+
arg.col = col;
|
577
|
+
arg.col_len = col_len;
|
578
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLCOLUMNS, &arg,
|
579
|
+
empty_ubf, &arg);
|
580
|
+
return ret;
|
581
|
+
}
|
582
|
+
|
583
|
+
struct S_SQLPRIMARYKEYS {
|
584
|
+
SQLHSTMT hdbc;
|
585
|
+
SQLTCHAR *cat;
|
586
|
+
SQLSMALLINT cat_len;
|
587
|
+
SQLTCHAR *sch;
|
588
|
+
SQLSMALLINT sch_len;
|
589
|
+
SQLTCHAR *tbl;
|
590
|
+
SQLSMALLINT tbl_len;
|
591
|
+
};
|
592
|
+
|
593
|
+
static void *
|
594
|
+
F_SQLPRIMARYKEYS(void *args)
|
595
|
+
{
|
596
|
+
size_t ret;
|
597
|
+
struct S_SQLPRIMARYKEYS *argp = (struct S_SQLPRIMARYKEYS *) args;
|
598
|
+
|
599
|
+
ret = SQLPrimaryKeys(argp->hdbc, argp->cat, argp->cat_len,
|
600
|
+
argp->sch, argp->sch_len, argp->tbl, argp->tbl_len);
|
601
|
+
return (void *) ret;
|
602
|
+
}
|
603
|
+
|
604
|
+
static inline SQLRETURN
|
605
|
+
SQLPRIMARYKEYS(SQLHDBC hdbc, SQLTCHAR *cat, SQLSMALLINT cat_len,
|
606
|
+
SQLTCHAR *sch, SQLSMALLINT sch_len, SQLTCHAR *tbl,
|
607
|
+
SQLSMALLINT tbl_len)
|
608
|
+
{
|
609
|
+
size_t ret;
|
610
|
+
struct S_SQLPRIMARYKEYS arg;
|
611
|
+
|
612
|
+
arg.hdbc = hdbc;
|
613
|
+
arg.cat = cat;
|
614
|
+
arg.cat_len = cat_len;
|
615
|
+
arg.sch = sch;
|
616
|
+
arg.sch_len = sch_len;
|
617
|
+
arg.tbl = tbl;
|
618
|
+
arg.tbl_len = tbl_len;
|
619
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLPRIMARYKEYS, &arg,
|
620
|
+
empty_ubf, &arg);
|
621
|
+
return ret;
|
622
|
+
}
|
623
|
+
|
624
|
+
struct S_SQLFOREIGNKEYS {
|
625
|
+
SQLHSTMT hdbc;
|
626
|
+
SQLTCHAR *pkcat;
|
627
|
+
SQLSMALLINT pkcat_len;
|
628
|
+
SQLTCHAR *pksch;
|
629
|
+
SQLSMALLINT pksch_len;
|
630
|
+
SQLTCHAR *pktbl;
|
631
|
+
SQLSMALLINT pktbl_len;
|
632
|
+
SQLTCHAR *fkcat;
|
633
|
+
SQLSMALLINT fkcat_len;
|
634
|
+
SQLTCHAR *fksch;
|
635
|
+
SQLSMALLINT fksch_len;
|
636
|
+
SQLTCHAR *fktbl;
|
637
|
+
SQLSMALLINT fktbl_len;
|
638
|
+
};
|
639
|
+
|
640
|
+
static void *
|
641
|
+
F_SQLFOREIGNKEYS(void *args)
|
642
|
+
{
|
643
|
+
size_t ret;
|
644
|
+
struct S_SQLFOREIGNKEYS *argp = (struct S_SQLFOREIGNKEYS *) args;
|
645
|
+
|
646
|
+
ret = SQLForeignKeys(argp->hdbc, argp->pkcat, argp->pkcat_len,
|
647
|
+
argp->pksch, argp->pksch_len,
|
648
|
+
argp->pktbl, argp->pktbl_len,
|
649
|
+
argp->fkcat, argp->fkcat_len,
|
650
|
+
argp->fksch, argp->fksch_len,
|
651
|
+
argp->fktbl, argp->fktbl_len);
|
652
|
+
return (void *) ret;
|
653
|
+
}
|
654
|
+
|
655
|
+
static inline SQLRETURN
|
656
|
+
SQLFOREIGNKEYS(SQLHDBC hdbc, SQLTCHAR *pkcat, SQLSMALLINT pkcat_len,
|
657
|
+
SQLTCHAR *pksch, SQLSMALLINT pksch_len, SQLTCHAR *pktbl,
|
658
|
+
SQLSMALLINT pktbl_len, SQLTCHAR *fkcat, SQLSMALLINT fkcat_len,
|
659
|
+
SQLTCHAR *fksch, SQLSMALLINT fksch_len, SQLTCHAR *fktbl,
|
660
|
+
SQLSMALLINT fktbl_len)
|
661
|
+
{
|
662
|
+
size_t ret;
|
663
|
+
struct S_SQLFOREIGNKEYS arg;
|
664
|
+
|
665
|
+
arg.hdbc = hdbc;
|
666
|
+
arg.pkcat = pkcat;
|
667
|
+
arg.pkcat_len = pkcat_len;
|
668
|
+
arg.pksch = pksch;
|
669
|
+
arg.pksch_len = pksch_len;
|
670
|
+
arg.pktbl = pktbl;
|
671
|
+
arg.pktbl_len = pktbl_len;
|
672
|
+
arg.fkcat = fkcat;
|
673
|
+
arg.fkcat_len = fkcat_len;
|
674
|
+
arg.fksch = fksch;
|
675
|
+
arg.fksch_len = fksch_len;
|
676
|
+
arg.fktbl = fktbl;
|
677
|
+
arg.fktbl_len = fktbl_len;
|
678
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLFOREIGNKEYS, &arg,
|
679
|
+
empty_ubf, &arg);
|
680
|
+
return ret;
|
681
|
+
}
|
682
|
+
|
683
|
+
struct S_SQLPROCEDURES {
|
684
|
+
SQLHSTMT hdbc;
|
685
|
+
SQLTCHAR *cat;
|
686
|
+
SQLSMALLINT cat_len;
|
687
|
+
SQLTCHAR *sch;
|
688
|
+
SQLSMALLINT sch_len;
|
689
|
+
SQLTCHAR *prc;
|
690
|
+
SQLSMALLINT prc_len;
|
691
|
+
};
|
692
|
+
|
693
|
+
static void *
|
694
|
+
F_SQLPROCEDURES(void *args)
|
695
|
+
{
|
696
|
+
size_t ret;
|
697
|
+
struct S_SQLPROCEDURES *argp = (struct S_SQLPROCEDURES *) args;
|
698
|
+
|
699
|
+
ret = SQLProcedures(argp->hdbc, argp->cat, argp->cat_len,
|
700
|
+
argp->sch, argp->sch_len, argp->prc, argp->prc_len);
|
701
|
+
return (void *) ret;
|
702
|
+
}
|
703
|
+
|
704
|
+
static inline SQLRETURN
|
705
|
+
SQLPROCEDURES(SQLHDBC hdbc, SQLTCHAR *cat, SQLSMALLINT cat_len,
|
706
|
+
SQLTCHAR *sch, SQLSMALLINT sch_len, SQLTCHAR *prc,
|
707
|
+
SQLSMALLINT prc_len)
|
708
|
+
{
|
709
|
+
size_t ret;
|
710
|
+
struct S_SQLPROCEDURES arg;
|
711
|
+
|
712
|
+
arg.hdbc = hdbc;
|
713
|
+
arg.cat = cat;
|
714
|
+
arg.cat_len = cat_len;
|
715
|
+
arg.sch = sch;
|
716
|
+
arg.sch_len = sch_len;
|
717
|
+
arg.prc = prc;
|
718
|
+
arg.prc_len = prc_len;
|
719
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLPROCEDURES, &arg,
|
720
|
+
empty_ubf, &arg);
|
721
|
+
return ret;
|
722
|
+
}
|
723
|
+
|
724
|
+
struct S_SQLPROCEDURECOLUMNS {
|
725
|
+
SQLHSTMT hdbc;
|
726
|
+
SQLTCHAR *cat;
|
727
|
+
SQLSMALLINT cat_len;
|
728
|
+
SQLTCHAR *sch;
|
729
|
+
SQLSMALLINT sch_len;
|
730
|
+
SQLTCHAR *prc;
|
731
|
+
SQLSMALLINT prc_len;
|
732
|
+
SQLTCHAR *col;
|
733
|
+
SQLSMALLINT col_len;
|
734
|
+
};
|
735
|
+
|
736
|
+
static void *
|
737
|
+
F_SQLPROCEDURECOLUMNS(void *args)
|
738
|
+
{
|
739
|
+
size_t ret;
|
740
|
+
struct S_SQLPROCEDURECOLUMNS *argp = (struct S_SQLPROCEDURECOLUMNS *) args;
|
741
|
+
|
742
|
+
ret = SQLProcedureColumns(argp->hdbc, argp->cat, argp->cat_len,
|
743
|
+
argp->sch, argp->sch_len, argp->prc,
|
744
|
+
argp->prc_len, argp->col, argp->col_len);
|
745
|
+
return (void *) ret;
|
746
|
+
}
|
747
|
+
|
748
|
+
static inline SQLRETURN
|
749
|
+
SQLPROCEDURECOLUMNS(SQLHDBC hdbc, SQLTCHAR *cat, SQLSMALLINT cat_len,
|
750
|
+
SQLTCHAR *sch, SQLSMALLINT sch_len, SQLTCHAR *prc,
|
751
|
+
SQLSMALLINT prc_len, SQLTCHAR *col, SQLSMALLINT col_len)
|
752
|
+
{
|
753
|
+
size_t ret;
|
754
|
+
struct S_SQLPROCEDURECOLUMNS arg;
|
755
|
+
|
756
|
+
arg.hdbc = hdbc;
|
757
|
+
arg.cat = cat;
|
758
|
+
arg.cat_len = cat_len;
|
759
|
+
arg.sch = sch;
|
760
|
+
arg.sch_len = sch_len;
|
761
|
+
arg.prc = prc;
|
762
|
+
arg.prc_len = prc_len;
|
763
|
+
arg.col = col;
|
764
|
+
arg.col_len = col_len;
|
765
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLPROCEDURECOLUMNS, &arg,
|
766
|
+
empty_ubf, &arg);
|
767
|
+
return ret;
|
768
|
+
}
|
769
|
+
|
770
|
+
struct S_SQLTABLEPRIVILEGES {
|
771
|
+
SQLHSTMT hdbc;
|
772
|
+
SQLTCHAR *cat;
|
773
|
+
SQLSMALLINT cat_len;
|
774
|
+
SQLTCHAR *sch;
|
775
|
+
SQLSMALLINT sch_len;
|
776
|
+
SQLTCHAR *tbl;
|
777
|
+
SQLSMALLINT tbl_len;
|
778
|
+
};
|
779
|
+
|
780
|
+
static void *
|
781
|
+
F_SQLTABLEPRIVILEGES(void *args)
|
782
|
+
{
|
783
|
+
size_t ret;
|
784
|
+
struct S_SQLTABLEPRIVILEGES *argp = (struct S_SQLTABLEPRIVILEGES *) args;
|
785
|
+
|
786
|
+
ret = SQLTablePrivileges(argp->hdbc, argp->cat, argp->cat_len,
|
787
|
+
argp->sch, argp->sch_len, argp->tbl,
|
788
|
+
argp->tbl_len);
|
789
|
+
return (void *) ret;
|
790
|
+
}
|
791
|
+
|
792
|
+
static inline SQLRETURN
|
793
|
+
SQLTABLEPRIVILEGES(SQLHDBC hdbc, SQLTCHAR *cat, SQLSMALLINT cat_len,
|
794
|
+
SQLTCHAR *sch, SQLSMALLINT sch_len, SQLTCHAR *tbl,
|
795
|
+
SQLSMALLINT tbl_len)
|
796
|
+
{
|
797
|
+
size_t ret;
|
798
|
+
struct S_SQLTABLEPRIVILEGES arg;
|
799
|
+
|
800
|
+
arg.hdbc = hdbc;
|
801
|
+
arg.cat = cat;
|
802
|
+
arg.cat_len = cat_len;
|
803
|
+
arg.sch = sch;
|
804
|
+
arg.sch_len = sch_len;
|
805
|
+
arg.tbl = tbl;
|
806
|
+
arg.tbl_len = tbl_len;
|
807
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLTABLEPRIVILEGES, &arg,
|
808
|
+
empty_ubf, &arg);
|
809
|
+
return ret;
|
810
|
+
}
|
811
|
+
|
812
|
+
struct S_SQLSTATISTICS {
|
813
|
+
SQLHSTMT hdbc;
|
814
|
+
SQLTCHAR *cat;
|
815
|
+
SQLSMALLINT cat_len;
|
816
|
+
SQLTCHAR *sch;
|
817
|
+
SQLSMALLINT sch_len;
|
818
|
+
SQLTCHAR *tbl;
|
819
|
+
SQLSMALLINT tbl_len;
|
820
|
+
SQLUSMALLINT uniq;
|
821
|
+
SQLUSMALLINT resv;
|
822
|
+
};
|
823
|
+
|
824
|
+
static void *
|
825
|
+
F_SQLSTATISTICS(void *args)
|
826
|
+
{
|
827
|
+
size_t ret;
|
828
|
+
struct S_SQLSTATISTICS *argp = (struct S_SQLSTATISTICS *) args;
|
829
|
+
|
830
|
+
ret = SQLStatistics(argp->hdbc, argp->cat, argp->cat_len,
|
831
|
+
argp->sch, argp->sch_len, argp->tbl,
|
832
|
+
argp->tbl_len, argp->uniq, argp->resv);
|
833
|
+
return (void *) ret;
|
834
|
+
}
|
835
|
+
|
836
|
+
static inline SQLRETURN
|
837
|
+
SQLSTATISTICS(SQLHDBC hdbc, SQLTCHAR *cat, SQLSMALLINT cat_len,
|
838
|
+
SQLTCHAR *sch, SQLSMALLINT sch_len, SQLTCHAR *tbl,
|
839
|
+
SQLSMALLINT tbl_len, SQLUSMALLINT uniq, SQLUSMALLINT resv)
|
840
|
+
{
|
841
|
+
size_t ret;
|
842
|
+
struct S_SQLSTATISTICS arg;
|
843
|
+
|
844
|
+
arg.hdbc = hdbc;
|
845
|
+
arg.cat = cat;
|
846
|
+
arg.cat_len = cat_len;
|
847
|
+
arg.sch = sch;
|
848
|
+
arg.sch_len = sch_len;
|
849
|
+
arg.tbl = tbl;
|
850
|
+
arg.tbl_len = tbl_len;
|
851
|
+
arg.uniq = uniq;
|
852
|
+
arg.resv = resv;
|
853
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLSTATISTICS, &arg,
|
854
|
+
empty_ubf, &arg);
|
855
|
+
return ret;
|
856
|
+
}
|
857
|
+
|
858
|
+
struct S_SQLSPECIALCOLUMNS {
|
859
|
+
SQLHSTMT hdbc;
|
860
|
+
SQLUSMALLINT idtyp;
|
861
|
+
SQLTCHAR *cat;
|
862
|
+
SQLSMALLINT cat_len;
|
863
|
+
SQLTCHAR *sch;
|
864
|
+
SQLSMALLINT sch_len;
|
865
|
+
SQLTCHAR *tbl;
|
866
|
+
SQLSMALLINT tbl_len;
|
867
|
+
SQLUSMALLINT scope;
|
868
|
+
SQLUSMALLINT nulbl;
|
869
|
+
};
|
870
|
+
|
871
|
+
static void *
|
872
|
+
F_SQLSPECIALCOLUMNS(void *args)
|
873
|
+
{
|
874
|
+
size_t ret;
|
875
|
+
struct S_SQLSPECIALCOLUMNS *argp = (struct S_SQLSPECIALCOLUMNS *) args;
|
876
|
+
|
877
|
+
ret = SQLSpecialColumns(argp->hdbc, argp->idtyp, argp->cat, argp->cat_len,
|
878
|
+
argp->sch, argp->sch_len, argp->tbl,
|
879
|
+
argp->tbl_len, argp->scope, argp->nulbl);
|
880
|
+
return (void *) ret;
|
881
|
+
}
|
882
|
+
|
883
|
+
static inline SQLRETURN
|
884
|
+
SQLSPECIALCOLUMNS(SQLHDBC hdbc, SQLUSMALLINT idtyp, SQLTCHAR *cat,
|
885
|
+
SQLSMALLINT cat_len, SQLTCHAR *sch, SQLSMALLINT sch_len,
|
886
|
+
SQLTCHAR *tbl, SQLSMALLINT tbl_len,
|
887
|
+
SQLUSMALLINT scope, SQLUSMALLINT nulbl)
|
888
|
+
{
|
889
|
+
size_t ret;
|
890
|
+
struct S_SQLSPECIALCOLUMNS arg;
|
891
|
+
|
892
|
+
arg.hdbc = hdbc;
|
893
|
+
arg.idtyp = idtyp;
|
894
|
+
arg.cat = cat;
|
895
|
+
arg.cat_len = cat_len;
|
896
|
+
arg.sch = sch;
|
897
|
+
arg.sch_len = sch_len;
|
898
|
+
arg.tbl = tbl;
|
899
|
+
arg.tbl_len = tbl_len;
|
900
|
+
arg.scope = scope;
|
901
|
+
arg.nulbl = nulbl;
|
902
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLSPECIALCOLUMNS, &arg,
|
903
|
+
empty_ubf, &arg);
|
904
|
+
return ret;
|
905
|
+
}
|
906
|
+
|
907
|
+
struct S_SQLGETTYPEINFO {
|
908
|
+
SQLHSTMT hdbc;
|
909
|
+
SQLSMALLINT type;
|
910
|
+
};
|
911
|
+
|
912
|
+
static void *
|
913
|
+
F_SQLGETTYPEINFO(void *args)
|
914
|
+
{
|
915
|
+
size_t ret;
|
916
|
+
struct S_SQLGETTYPEINFO *argp = (struct S_SQLGETTYPEINFO *) args;
|
917
|
+
|
918
|
+
ret = SQLGetTypeInfo(argp->hdbc, argp->type);
|
919
|
+
return (void *) ret;
|
920
|
+
}
|
921
|
+
|
922
|
+
static inline SQLRETURN
|
923
|
+
SQLGETTYPEINFO(SQLHDBC hdbc, SQLSMALLINT type)
|
924
|
+
{
|
925
|
+
size_t ret;
|
926
|
+
struct S_SQLGETTYPEINFO arg;
|
927
|
+
|
928
|
+
arg.hdbc = hdbc;
|
929
|
+
arg.type = type;
|
930
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLGETTYPEINFO, &arg,
|
931
|
+
empty_ubf, &arg);
|
932
|
+
return ret;
|
933
|
+
}
|
934
|
+
|
935
|
+
#if (ODBCVER >= 0x0300)
|
936
|
+
|
937
|
+
struct S_SQLENDTRAN {
|
938
|
+
SQLSMALLINT htype;
|
939
|
+
SQLHANDLE handle;
|
940
|
+
SQLSMALLINT op;
|
941
|
+
};
|
942
|
+
|
943
|
+
static void *
|
944
|
+
F_SQLENDTRAN(void *args)
|
945
|
+
{
|
946
|
+
size_t ret;
|
947
|
+
struct S_SQLENDTRAN *argp = (struct S_SQLENDTRAN *) args;
|
948
|
+
|
949
|
+
ret = SQLEndTran(argp->htype, argp->handle, argp->op);
|
950
|
+
return (void *) ret;
|
951
|
+
}
|
952
|
+
|
953
|
+
static inline SQLRETURN
|
954
|
+
SQLENDTRAN(SQLUSMALLINT htype, SQLHANDLE handle, SQLUSMALLINT op)
|
955
|
+
{
|
956
|
+
size_t ret;
|
957
|
+
struct S_SQLENDTRAN arg;
|
958
|
+
|
959
|
+
arg.htype = htype;
|
960
|
+
arg.handle = handle;
|
961
|
+
arg.op = op;
|
962
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLENDTRAN, &arg,
|
963
|
+
empty_ubf, &arg);
|
964
|
+
return ret;
|
965
|
+
}
|
966
|
+
|
967
|
+
#else
|
968
|
+
|
969
|
+
struct S_SQLTRANSACT {
|
970
|
+
SQLHENV henv;
|
971
|
+
SQLHDBC hdbc;
|
972
|
+
SQLSMALLINT op;
|
973
|
+
};
|
974
|
+
|
975
|
+
static void *
|
976
|
+
F_SQLTRANSACT(void *args)
|
977
|
+
{
|
978
|
+
size_t ret;
|
979
|
+
struct S_SQLTRANSACT *argp = (struct S_SQLTRANSACT *) args;
|
980
|
+
|
981
|
+
ret = SQLTransact(argp->henv, argp->hdbc, argp->op);
|
982
|
+
return (void *) ret;
|
983
|
+
}
|
984
|
+
|
985
|
+
static inline SQLRETURN
|
986
|
+
SQLTRANSACT(SQLHENV henv, SQLHDBC hdbc, SQLUSMALLINT op)
|
987
|
+
{
|
988
|
+
size_t ret;
|
989
|
+
struct S_SQLTRANSACT arg;
|
990
|
+
|
991
|
+
arg.henv = henv;
|
992
|
+
arg.hdbc = hdbc;
|
993
|
+
arg.op = op;
|
994
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLTRANCACT, &arg,
|
995
|
+
empty_ubf, &arg);
|
996
|
+
return ret;
|
997
|
+
}
|
998
|
+
|
999
|
+
#endif
|
1000
|
+
|
1001
|
+
struct S_SQLEXECDIRECT {
|
1002
|
+
SQLHSTMT hstmt;
|
1003
|
+
SQLTCHAR *sql;
|
1004
|
+
SQLINTEGER len;
|
1005
|
+
};
|
1006
|
+
|
1007
|
+
static void *
|
1008
|
+
F_SQLEXECDIRECT(void *args)
|
1009
|
+
{
|
1010
|
+
size_t ret;
|
1011
|
+
struct S_SQLEXECDIRECT *argp = (struct S_SQLEXECDIRECT *) args;
|
1012
|
+
|
1013
|
+
ret = SQLExecDirect(argp->hstmt, argp->sql, argp->len);
|
1014
|
+
return (void *) ret;
|
1015
|
+
}
|
1016
|
+
|
1017
|
+
static void
|
1018
|
+
F_SQLEXECDIRECT_UBF(void *args)
|
1019
|
+
{
|
1020
|
+
struct S_SQLEXECDIRECT *argp = (struct S_SQLEXECDIRECT *) args;
|
1021
|
+
|
1022
|
+
SQLCancel(argp->hstmt);
|
1023
|
+
}
|
1024
|
+
|
1025
|
+
static inline SQLRETURN
|
1026
|
+
SQLEXECDIRECT(SQLHSTMT hstmt, SQLTCHAR *sql, SQLINTEGER len)
|
1027
|
+
{
|
1028
|
+
size_t ret;
|
1029
|
+
struct S_SQLEXECDIRECT arg;
|
1030
|
+
|
1031
|
+
arg.hstmt = hstmt;
|
1032
|
+
arg.sql = sql;
|
1033
|
+
arg.len = len;
|
1034
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLEXECDIRECT, &arg,
|
1035
|
+
F_SQLEXECDIRECT_UBF, &arg);
|
1036
|
+
return ret;
|
1037
|
+
}
|
1038
|
+
|
1039
|
+
struct S_SQLEXECUTE {
|
1040
|
+
SQLHSTMT hstmt;
|
1041
|
+
};
|
1042
|
+
|
1043
|
+
static void *
|
1044
|
+
F_SQLEXECUTE(void *args)
|
1045
|
+
{
|
1046
|
+
size_t ret;
|
1047
|
+
struct S_SQLEXECUTE *argp = (struct S_SQLEXECUTE *) args;
|
1048
|
+
|
1049
|
+
ret = SQLExecute(argp->hstmt);
|
1050
|
+
return (void *) ret;
|
1051
|
+
}
|
1052
|
+
|
1053
|
+
static void
|
1054
|
+
F_SQLEXECUTE_UBF(void *args)
|
1055
|
+
{
|
1056
|
+
struct S_SQLEXECUTE *argp = (struct S_SQLEXECUTE *) args;
|
1057
|
+
|
1058
|
+
SQLCancel(argp->hstmt);
|
1059
|
+
}
|
1060
|
+
|
1061
|
+
static inline SQLRETURN
|
1062
|
+
SQLEXECUTE(SQLHSTMT hstmt)
|
1063
|
+
{
|
1064
|
+
size_t ret;
|
1065
|
+
struct S_SQLEXECUTE arg;
|
1066
|
+
|
1067
|
+
arg.hstmt = hstmt;
|
1068
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLEXECUTE, &arg,
|
1069
|
+
F_SQLEXECUTE_UBF, &arg);
|
1070
|
+
return ret;
|
1071
|
+
}
|
1072
|
+
|
1073
|
+
struct S_SQLPREPARE {
|
1074
|
+
SQLHSTMT hstmt;
|
1075
|
+
SQLTCHAR *sql;
|
1076
|
+
SQLINTEGER len;
|
1077
|
+
};
|
1078
|
+
|
1079
|
+
static void *
|
1080
|
+
F_SQLPREPARE(void *args)
|
1081
|
+
{
|
1082
|
+
size_t ret;
|
1083
|
+
struct S_SQLPREPARE *argp = (struct S_SQLPREPARE *) args;
|
1084
|
+
|
1085
|
+
ret = SQLPrepare(argp->hstmt, argp->sql, argp->len);
|
1086
|
+
return (void *) ret;
|
1087
|
+
}
|
1088
|
+
|
1089
|
+
static void
|
1090
|
+
F_SQLPREPARE_UBF(void *args)
|
1091
|
+
{
|
1092
|
+
struct S_SQLPREPARE *argp = (struct S_SQLPREPARE *) args;
|
1093
|
+
|
1094
|
+
SQLCancel(argp->hstmt);
|
1095
|
+
}
|
1096
|
+
|
1097
|
+
static inline SQLRETURN
|
1098
|
+
SQLPREPARE(SQLHSTMT hstmt, SQLTCHAR *sql, SQLINTEGER len)
|
1099
|
+
{
|
1100
|
+
size_t ret;
|
1101
|
+
struct S_SQLPREPARE arg;
|
1102
|
+
|
1103
|
+
arg.hstmt = hstmt;
|
1104
|
+
arg.sql = sql;
|
1105
|
+
arg.len = len;
|
1106
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLPREPARE, &arg,
|
1107
|
+
F_SQLPREPARE_UBF, &arg);
|
1108
|
+
return ret;
|
1109
|
+
}
|
1110
|
+
|
1111
|
+
struct S_SQLMORERESULTS {
|
1112
|
+
SQLHSTMT hstmt;
|
1113
|
+
};
|
1114
|
+
|
1115
|
+
static void *
|
1116
|
+
F_SQLMORERESULTS(void *args)
|
1117
|
+
{
|
1118
|
+
size_t ret;
|
1119
|
+
struct S_SQLMORERESULTS *argp = (struct S_SQLMORERESULTS *) args;
|
1120
|
+
|
1121
|
+
ret = SQLMoreResults(argp->hstmt);
|
1122
|
+
return (void *) ret;
|
1123
|
+
}
|
1124
|
+
|
1125
|
+
static inline SQLRETURN
|
1126
|
+
SQLMORERESULTS(SQLHSTMT hstmt)
|
1127
|
+
{
|
1128
|
+
size_t ret;
|
1129
|
+
struct S_SQLMORERESULTS arg;
|
1130
|
+
|
1131
|
+
arg.hstmt = hstmt;
|
1132
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLMORERESULTS, &arg,
|
1133
|
+
empty_ubf, &arg);
|
1134
|
+
return ret;
|
1135
|
+
}
|
1136
|
+
|
1137
|
+
struct S_SQLFETCH {
|
1138
|
+
SQLHSTMT hstmt;
|
1139
|
+
};
|
1140
|
+
|
1141
|
+
static void *
|
1142
|
+
F_SQLFETCH(void *args)
|
1143
|
+
{
|
1144
|
+
size_t ret;
|
1145
|
+
struct S_SQLFETCH *argp = (struct S_SQLFETCH *) args;
|
1146
|
+
|
1147
|
+
ret = SQLFetch(argp->hstmt);
|
1148
|
+
return (void *) ret;
|
1149
|
+
}
|
1150
|
+
|
1151
|
+
static inline SQLRETURN
|
1152
|
+
SQLFETCH(SQLHSTMT hstmt)
|
1153
|
+
{
|
1154
|
+
size_t ret;
|
1155
|
+
struct S_SQLFETCH arg;
|
1156
|
+
|
1157
|
+
arg.hstmt = hstmt;
|
1158
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLFETCH, &arg,
|
1159
|
+
empty_ubf, &arg);
|
1160
|
+
return ret;
|
1161
|
+
}
|
1162
|
+
|
1163
|
+
#if (ODBCVER >= 0x0300)
|
1164
|
+
|
1165
|
+
struct S_SQLFETCHSCROLL {
|
1166
|
+
SQLHSTMT hstmt;
|
1167
|
+
SQLSMALLINT dir;
|
1168
|
+
SQLROWOFFSET offs;
|
1169
|
+
};
|
1170
|
+
|
1171
|
+
static void *
|
1172
|
+
F_SQLFETCHSCROLL(void *args)
|
1173
|
+
{
|
1174
|
+
size_t ret;
|
1175
|
+
struct S_SQLFETCHSCROLL *argp = (struct S_SQLFETCHSCROLL *) args;
|
1176
|
+
|
1177
|
+
ret = SQLFetchScroll(argp->hstmt, argp->dir, argp->offs);
|
1178
|
+
return (void *) ret;
|
1179
|
+
}
|
1180
|
+
|
1181
|
+
static inline SQLRETURN
|
1182
|
+
SQLFETCHSCROLL(SQLHSTMT hstmt, SQLSMALLINT dir, SQLROWOFFSET offs)
|
1183
|
+
{
|
1184
|
+
size_t ret;
|
1185
|
+
struct S_SQLFETCHSCROLL arg;
|
1186
|
+
|
1187
|
+
arg.hstmt = hstmt;
|
1188
|
+
arg.dir = dir;
|
1189
|
+
arg.offs = offs;
|
1190
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLFETCHSCROLL, &arg,
|
1191
|
+
empty_ubf, &arg);
|
1192
|
+
return ret;
|
1193
|
+
}
|
1194
|
+
|
1195
|
+
#else
|
1196
|
+
|
1197
|
+
struct S_SQLEXTENDEDFETCH {
|
1198
|
+
SQLHSTMT hstmt;
|
1199
|
+
SQLUSMALLINT type;
|
1200
|
+
SQLROWOFFSET row;
|
1201
|
+
SQLROWSETSIZE *rowp;
|
1202
|
+
SQLUSMALLINT *status
|
1203
|
+
};
|
1204
|
+
|
1205
|
+
static void *
|
1206
|
+
F_SQLEXTENDEDFETCH(void *args)
|
1207
|
+
{
|
1208
|
+
size_t ret;
|
1209
|
+
struct S_SQLEXTENDEDFETCH *argp = (struct S_SQLEXTENDEDFETCH *) args;
|
1210
|
+
|
1211
|
+
ret = SQLExtendedFetch(argp->hstmt, argp->type, argp->row, argp->rowp,
|
1212
|
+
argp->status);
|
1213
|
+
return (void *) ret;
|
1214
|
+
}
|
1215
|
+
|
1216
|
+
static inline SQLRETURN
|
1217
|
+
SQLEXTENDEDFETCH(SQLHSTMT hstmt, SQLUSMALLINT type, SQLROWOFFSET row,
|
1218
|
+
SQLROWSETSIZE *rowp, SQLUSMALLINT *status)
|
1219
|
+
{
|
1220
|
+
size_t ret;
|
1221
|
+
struct S_SQLEXTENDEDFETCH arg;
|
1222
|
+
|
1223
|
+
arg.hstmt = hstmt;
|
1224
|
+
arg.type = type;
|
1225
|
+
arg.row = row;
|
1226
|
+
arg.rowp = rowp;
|
1227
|
+
arg.status = status;
|
1228
|
+
ret = (size_t) rb_thread_call_without_gvl(F_SQLEXTENDEDFETCH, &arg,
|
1229
|
+
empty_ubf, &arg);
|
1230
|
+
return ret;
|
1231
|
+
}
|
1232
|
+
|
1233
|
+
#endif
|
1234
|
+
|
1235
|
+
#else
|
1236
|
+
|
1237
|
+
#define SQLCONNECT SQLConnect
|
1238
|
+
#define SQLDRIVERCONNECT SQLDriverConnect
|
1239
|
+
#define SQLDISCONNECT SQLDisconnect
|
1240
|
+
#define SQLTABLES SQLTables
|
1241
|
+
#define SQLCOLUMNS SQLColumns
|
1242
|
+
#define SQLPRIMARYKEYS SQLPrimaryKeys
|
1243
|
+
#define SQLFOREGINKEYS SQLForeignKeys
|
1244
|
+
#define SQLPROCEDURES SQLProcedures
|
1245
|
+
#define SQLPROCEDURECOLUMNS SQLProcedureColumns
|
1246
|
+
#define SQLTABLEPRIVILEGES SQLTablePrivileges
|
1247
|
+
#define SQLSTATISTICS SQLStatistics
|
1248
|
+
#define SQLSPECIALCOLUMNS SQLSpecialColumns
|
1249
|
+
#define SQLGETTYPEINFO SQLGetTypeInfo
|
1250
|
+
#if (ODBCVER >= 0x0300)
|
1251
|
+
#define SQLENDTRAN SQLEndTran
|
1252
|
+
#else
|
1253
|
+
#define SQLTRANSACT SQLTransact
|
1254
|
+
#endif
|
1255
|
+
#define SQLEXECDIRECT SQLExecDirect
|
1256
|
+
#define SQLEXECUTE SQLExecute
|
1257
|
+
#define SQLPREPARE SQLPrepare
|
1258
|
+
#define SQLMORERESULTS SQLMoreResults
|
1259
|
+
#define SQLFETCH SQLFetch
|
1260
|
+
#if (ODBCVER >= 0x0300)
|
1261
|
+
#define SQLFETCHSCROLL SQLFetchScroll
|
1262
|
+
#else
|
1263
|
+
#define SQLEXTENDEDFETCH SQLExtendedFetch
|
1264
|
+
#endif
|
1265
|
+
|
1266
|
+
#endif
|
1267
|
+
|
1268
|
+
|
1269
|
+
/*
|
1270
|
+
*----------------------------------------------------------------------
|
1271
|
+
*
|
1272
|
+
* UNICODE converters et.al.
|
359
1273
|
*
|
360
1274
|
*----------------------------------------------------------------------
|
361
1275
|
*/
|
@@ -390,7 +1304,7 @@ uc_strchr(SQLWCHAR *str, SQLWCHAR c)
|
|
390
1304
|
|
391
1305
|
static int
|
392
1306
|
mkutf(char *dest, SQLWCHAR *src, int len)
|
393
|
-
{
|
1307
|
+
{
|
394
1308
|
int i;
|
395
1309
|
char *cp = dest;
|
396
1310
|
|
@@ -629,7 +1543,7 @@ uc_free(SQLWCHAR *str)
|
|
629
1543
|
/*
|
630
1544
|
*----------------------------------------------------------------------
|
631
1545
|
*
|
632
|
-
*
|
1546
|
+
* Things for ODBC::DSN
|
633
1547
|
*
|
634
1548
|
*----------------------------------------------------------------------
|
635
1549
|
*/
|
@@ -656,7 +1570,7 @@ dsn_init(VALUE self)
|
|
656
1570
|
/*
|
657
1571
|
*----------------------------------------------------------------------
|
658
1572
|
*
|
659
|
-
*
|
1573
|
+
* Things for ODBC::Driver
|
660
1574
|
*
|
661
1575
|
*----------------------------------------------------------------------
|
662
1576
|
*/
|
@@ -683,7 +1597,7 @@ drv_init(VALUE self)
|
|
683
1597
|
/*
|
684
1598
|
*----------------------------------------------------------------------
|
685
1599
|
*
|
686
|
-
*
|
1600
|
+
* Cleanup routines and GC mark/free callbacks.
|
687
1601
|
*
|
688
1602
|
*----------------------------------------------------------------------
|
689
1603
|
*/
|
@@ -745,7 +1659,7 @@ list_first(LINK *head)
|
|
745
1659
|
static int
|
746
1660
|
list_empty(LINK *head)
|
747
1661
|
{
|
748
|
-
return head->succ == NULL;
|
1662
|
+
return head->succ == NULL;
|
749
1663
|
}
|
750
1664
|
|
751
1665
|
static void
|
@@ -799,7 +1713,7 @@ free_dbc(DBC *p)
|
|
799
1713
|
tracemsg(2, fprintf(stderr, "ObjFree: DBC %p\n", p););
|
800
1714
|
if (p->hdbc != SQL_NULL_HDBC) {
|
801
1715
|
callsql(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
|
802
|
-
|
1716
|
+
SQLDISCONNECT(p->hdbc), "SQLDisconnect");
|
803
1717
|
callsql(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
|
804
1718
|
SQLFreeConnect(p->hdbc), "SQLFreeConnect");
|
805
1719
|
p->hdbc = SQL_NULL_HDBC;
|
@@ -932,7 +1846,7 @@ mark_stmt(STMT *q)
|
|
932
1846
|
/*
|
933
1847
|
*----------------------------------------------------------------------
|
934
1848
|
*
|
935
|
-
*
|
1849
|
+
* Set internal error (or warning) message.
|
936
1850
|
*
|
937
1851
|
*----------------------------------------------------------------------
|
938
1852
|
*/
|
@@ -955,7 +1869,7 @@ set_err(const char *msg, int warn)
|
|
955
1869
|
/*
|
956
1870
|
*----------------------------------------------------------------------
|
957
1871
|
*
|
958
|
-
*
|
1872
|
+
* Functions to retrieve last SQL error or warning.
|
959
1873
|
*
|
960
1874
|
*----------------------------------------------------------------------
|
961
1875
|
*/
|
@@ -1286,7 +2200,7 @@ succeeded_nodata(SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt, SQLRETURN ret,
|
|
1286
2200
|
/*
|
1287
2201
|
*----------------------------------------------------------------------
|
1288
2202
|
*
|
1289
|
-
*
|
2203
|
+
* Return ENV from VALUE.
|
1290
2204
|
*
|
1291
2205
|
*----------------------------------------------------------------------
|
1292
2206
|
*/
|
@@ -1327,7 +2241,7 @@ get_env(VALUE self)
|
|
1327
2241
|
/*
|
1328
2242
|
*----------------------------------------------------------------------
|
1329
2243
|
*
|
1330
|
-
*
|
2244
|
+
* Return DBC from VALUE.
|
1331
2245
|
*
|
1332
2246
|
*----------------------------------------------------------------------
|
1333
2247
|
*/
|
@@ -1353,7 +2267,7 @@ get_dbc(VALUE self)
|
|
1353
2267
|
/*
|
1354
2268
|
*----------------------------------------------------------------------
|
1355
2269
|
*
|
1356
|
-
*
|
2270
|
+
* Raise ODBC error from Ruby.
|
1357
2271
|
*
|
1358
2272
|
*----------------------------------------------------------------------
|
1359
2273
|
*/
|
@@ -1384,7 +2298,7 @@ dbc_raise(VALUE self, VALUE msg)
|
|
1384
2298
|
/*
|
1385
2299
|
*----------------------------------------------------------------------
|
1386
2300
|
*
|
1387
|
-
*
|
2301
|
+
* Obtain an ENV.
|
1388
2302
|
*
|
1389
2303
|
*----------------------------------------------------------------------
|
1390
2304
|
*/
|
@@ -1422,7 +2336,7 @@ env_new(VALUE self)
|
|
1422
2336
|
/*
|
1423
2337
|
*----------------------------------------------------------------------
|
1424
2338
|
*
|
1425
|
-
*
|
2339
|
+
* Obtain array of known DSNs.
|
1426
2340
|
*
|
1427
2341
|
*----------------------------------------------------------------------
|
1428
2342
|
*/
|
@@ -1477,7 +2391,7 @@ dbc_dsns(VALUE self)
|
|
1477
2391
|
/*
|
1478
2392
|
*----------------------------------------------------------------------
|
1479
2393
|
*
|
1480
|
-
*
|
2394
|
+
* Obtain array of known drivers.
|
1481
2395
|
*
|
1482
2396
|
*----------------------------------------------------------------------
|
1483
2397
|
*/
|
@@ -1553,7 +2467,7 @@ dbc_drivers(VALUE self)
|
|
1553
2467
|
/*
|
1554
2468
|
*----------------------------------------------------------------------
|
1555
2469
|
*
|
1556
|
-
*
|
2470
|
+
* Management methods.
|
1557
2471
|
*
|
1558
2472
|
*----------------------------------------------------------------------
|
1559
2473
|
*/
|
@@ -1872,7 +2786,7 @@ dbc_rfdsn(int argc, VALUE *argv, VALUE self)
|
|
1872
2786
|
/*
|
1873
2787
|
*----------------------------------------------------------------------
|
1874
2788
|
*
|
1875
|
-
*
|
2789
|
+
* Return last ODBC error or warning.
|
1876
2790
|
*
|
1877
2791
|
*----------------------------------------------------------------------
|
1878
2792
|
*/
|
@@ -1900,7 +2814,7 @@ dbc_clrerror(VALUE self)
|
|
1900
2814
|
/*
|
1901
2815
|
*----------------------------------------------------------------------
|
1902
2816
|
*
|
1903
|
-
*
|
2817
|
+
* Connection instance initializer.
|
1904
2818
|
*
|
1905
2819
|
*----------------------------------------------------------------------
|
1906
2820
|
*/
|
@@ -1972,7 +2886,7 @@ dbc_new(int argc, VALUE *argv, VALUE self)
|
|
1972
2886
|
/*
|
1973
2887
|
*----------------------------------------------------------------------
|
1974
2888
|
*
|
1975
|
-
*
|
2889
|
+
* Connect to data source.
|
1976
2890
|
*
|
1977
2891
|
*----------------------------------------------------------------------
|
1978
2892
|
*/
|
@@ -2062,7 +2976,7 @@ dbc_connect(int argc, VALUE *argv, VALUE self)
|
|
2062
2976
|
rb_raise(Cerror, "%s", msg);
|
2063
2977
|
}
|
2064
2978
|
if (!succeeded(SQL_NULL_HENV, dbc, SQL_NULL_HSTMT,
|
2065
|
-
|
2979
|
+
SQLCONNECT(dbc, (SQLTCHAR *) sdsn, SQL_NTS,
|
2066
2980
|
(SQLTCHAR *) suser,
|
2067
2981
|
(SQLSMALLINT) (suser ? SQL_NTS : 0),
|
2068
2982
|
(SQLTCHAR *) spasswd,
|
@@ -2146,7 +3060,7 @@ dbc_drvconnect(VALUE self, VALUE drv)
|
|
2146
3060
|
rb_raise(Cerror, "%s", msg);
|
2147
3061
|
}
|
2148
3062
|
if (!succeeded(e->henv, dbc, SQL_NULL_HSTMT,
|
2149
|
-
|
3063
|
+
SQLDRIVERCONNECT(dbc, NULL, (SQLTCHAR *) sdrv, SQL_NTS,
|
2150
3064
|
NULL, 0, NULL, SQL_DRIVER_NOPROMPT),
|
2151
3065
|
&msg, "SQLDriverConnect")) {
|
2152
3066
|
#ifdef UNICODE
|
@@ -2214,7 +3128,7 @@ dbc_use_scn(int argc, VALUE *argv, VALUE self)
|
|
2214
3128
|
/*
|
2215
3129
|
*----------------------------------------------------------------------
|
2216
3130
|
*
|
2217
|
-
*
|
3131
|
+
* Drop all active statements from data source.
|
2218
3132
|
*
|
2219
3133
|
*----------------------------------------------------------------------
|
2220
3134
|
*/
|
@@ -2238,7 +3152,7 @@ dbc_dropall(VALUE self)
|
|
2238
3152
|
/*
|
2239
3153
|
*----------------------------------------------------------------------
|
2240
3154
|
*
|
2241
|
-
*
|
3155
|
+
* Disconnect from data source.
|
2242
3156
|
*
|
2243
3157
|
*----------------------------------------------------------------------
|
2244
3158
|
*/
|
@@ -2259,7 +3173,7 @@ dbc_disconnect(int argc, VALUE *argv, VALUE self)
|
|
2259
3173
|
}
|
2260
3174
|
if (list_empty(&p->stmts)) {
|
2261
3175
|
callsql(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
|
2262
|
-
|
3176
|
+
SQLDISCONNECT(p->hdbc), "SQLDisconnect");
|
2263
3177
|
if (!succeeded(SQL_NULL_HENV, p->hdbc, SQL_NULL_HSTMT,
|
2264
3178
|
SQLFreeConnect(p->hdbc), &msg, "SQLFreeConnect")) {
|
2265
3179
|
rb_raise(Cerror, "%s", msg);
|
@@ -2275,11 +3189,21 @@ dbc_disconnect(int argc, VALUE *argv, VALUE self)
|
|
2275
3189
|
/*
|
2276
3190
|
*----------------------------------------------------------------------
|
2277
3191
|
*
|
2278
|
-
*
|
3192
|
+
* Database meta data via SQLGetInfo()
|
2279
3193
|
*
|
2280
3194
|
*----------------------------------------------------------------------
|
2281
3195
|
*/
|
2282
3196
|
|
3197
|
+
#ifndef SQL_DTC_TRANSITION_COST
|
3198
|
+
#define SQL_DTC_TRANSITION_COST 1750
|
3199
|
+
#endif
|
3200
|
+
#ifndef SQL_DTC_ENLIST_EXPENSIZE
|
3201
|
+
#define SQL_DTC_ENLIST_EXPENDSIZE 1
|
3202
|
+
#endif
|
3203
|
+
#ifndef SQL_DTC_UNENLIST_EXPENSIZE
|
3204
|
+
#define SQL_DTC_UNENLIST_EXPENDSIZE 2
|
3205
|
+
#endif
|
3206
|
+
|
2283
3207
|
#define GI_CONST_SINT(x) { #x, x, SQL_C_SHORT }
|
2284
3208
|
#define GI_CONST_INT(x) { #x, x, SQL_C_LONG }
|
2285
3209
|
#define GI_CONST_BITS(x) { #x, x, SQL_C_LONG }
|
@@ -3189,7 +4113,7 @@ dbc_getinfo(int argc, VALUE *argv, VALUE self)
|
|
3189
4113
|
/*
|
3190
4114
|
*----------------------------------------------------------------------
|
3191
4115
|
*
|
3192
|
-
*
|
4116
|
+
* Fill column type array for statement.
|
3193
4117
|
*
|
3194
4118
|
*----------------------------------------------------------------------
|
3195
4119
|
*/
|
@@ -3340,7 +4264,7 @@ make_coltypes(SQLHSTMT hstmt, int ncols, char **msgp)
|
|
3340
4264
|
/*
|
3341
4265
|
*----------------------------------------------------------------------
|
3342
4266
|
*
|
3343
|
-
*
|
4267
|
+
* Fill parameter info array for statement.
|
3344
4268
|
*
|
3345
4269
|
*----------------------------------------------------------------------
|
3346
4270
|
*/
|
@@ -3420,7 +4344,7 @@ retain_paraminfo_override(STMT *q, int nump, PARAMINFO *paraminfo)
|
|
3420
4344
|
/*
|
3421
4345
|
*----------------------------------------------------------------------
|
3422
4346
|
*
|
3423
|
-
*
|
4347
|
+
* Wrap SQLHSTMT into struct/VALUE.
|
3424
4348
|
*
|
3425
4349
|
*----------------------------------------------------------------------
|
3426
4350
|
*/
|
@@ -3465,7 +4389,7 @@ wrap_stmt(VALUE dbc, DBC *p, SQLHSTMT hstmt, STMT **qp)
|
|
3465
4389
|
/*
|
3466
4390
|
*----------------------------------------------------------------------
|
3467
4391
|
*
|
3468
|
-
*
|
4392
|
+
* Create statement with result.
|
3469
4393
|
*
|
3470
4394
|
*----------------------------------------------------------------------
|
3471
4395
|
*/
|
@@ -3575,7 +4499,7 @@ upcase_if(char *string, int upc)
|
|
3575
4499
|
/*
|
3576
4500
|
*----------------------------------------------------------------------
|
3577
4501
|
*
|
3578
|
-
*
|
4502
|
+
* Constructor: make column from statement.
|
3579
4503
|
*
|
3580
4504
|
*----------------------------------------------------------------------
|
3581
4505
|
*/
|
@@ -3747,7 +4671,7 @@ make_column(SQLHSTMT hstmt, int i, int upc, int use_scn)
|
|
3747
4671
|
/*
|
3748
4672
|
*----------------------------------------------------------------------
|
3749
4673
|
*
|
3750
|
-
*
|
4674
|
+
* Constructor: make parameter from statement.
|
3751
4675
|
*
|
3752
4676
|
*----------------------------------------------------------------------
|
3753
4677
|
*/
|
@@ -3787,7 +4711,7 @@ make_param(STMT *q, int i)
|
|
3787
4711
|
/*
|
3788
4712
|
*----------------------------------------------------------------------
|
3789
4713
|
*
|
3790
|
-
*
|
4714
|
+
* Query tables/columns/keys/indexes/types of data source.
|
3791
4715
|
*
|
3792
4716
|
*----------------------------------------------------------------------
|
3793
4717
|
*/
|
@@ -3900,7 +4824,7 @@ dbc_info(int argc, VALUE *argv, VALUE self, int mode)
|
|
3900
4824
|
switch (mode) {
|
3901
4825
|
case INFO_TABLES:
|
3902
4826
|
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
|
3903
|
-
|
4827
|
+
SQLTABLES(hstmt, NULL, 0, NULL, 0,
|
3904
4828
|
swhich, (swhich == NULL) ? 0 : SQL_NTS,
|
3905
4829
|
NULL, 0),
|
3906
4830
|
&msg, "SQLTables")) {
|
@@ -3909,7 +4833,7 @@ dbc_info(int argc, VALUE *argv, VALUE self, int mode)
|
|
3909
4833
|
break;
|
3910
4834
|
case INFO_COLUMNS:
|
3911
4835
|
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
|
3912
|
-
|
4836
|
+
SQLCOLUMNS(hstmt, NULL, 0, NULL, 0,
|
3913
4837
|
swhich, (swhich == NULL) ? 0 : SQL_NTS,
|
3914
4838
|
swhich2, (swhich2 == NULL) ? 0 : SQL_NTS),
|
3915
4839
|
&msg, "SQLColumns")) {
|
@@ -3918,7 +4842,7 @@ dbc_info(int argc, VALUE *argv, VALUE self, int mode)
|
|
3918
4842
|
break;
|
3919
4843
|
case INFO_PRIMKEYS:
|
3920
4844
|
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
|
3921
|
-
|
4845
|
+
SQLPRIMARYKEYS(hstmt, NULL, 0, NULL, 0,
|
3922
4846
|
swhich, (swhich == NULL) ? 0 : SQL_NTS),
|
3923
4847
|
&msg, "SQLPrimaryKeys")) {
|
3924
4848
|
goto error;
|
@@ -3926,7 +4850,7 @@ dbc_info(int argc, VALUE *argv, VALUE self, int mode)
|
|
3926
4850
|
break;
|
3927
4851
|
case INFO_INDEXES:
|
3928
4852
|
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
|
3929
|
-
|
4853
|
+
SQLSTATISTICS(hstmt, NULL, 0, NULL, 0,
|
3930
4854
|
swhich, (swhich == NULL) ? 0 : SQL_NTS,
|
3931
4855
|
(SQLUSMALLINT) (RTEST(which2) ?
|
3932
4856
|
SQL_INDEX_UNIQUE : SQL_INDEX_ALL),
|
@@ -3937,14 +4861,14 @@ dbc_info(int argc, VALUE *argv, VALUE self, int mode)
|
|
3937
4861
|
break;
|
3938
4862
|
case INFO_TYPES:
|
3939
4863
|
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
|
3940
|
-
|
4864
|
+
SQLGETTYPEINFO(hstmt, (SQLSMALLINT) itype),
|
3941
4865
|
&msg, "SQLGetTypeInfo")) {
|
3942
4866
|
goto error;
|
3943
4867
|
}
|
3944
4868
|
break;
|
3945
4869
|
case INFO_FORKEYS:
|
3946
4870
|
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
|
3947
|
-
|
4871
|
+
SQLFOREIGNKEYS(hstmt, NULL, 0, NULL, 0,
|
3948
4872
|
swhich, (swhich == NULL) ? 0 : SQL_NTS,
|
3949
4873
|
NULL, 0, NULL, 0,
|
3950
4874
|
swhich2, (swhich2 == NULL) ? 0 : SQL_NTS),
|
@@ -3954,7 +4878,7 @@ dbc_info(int argc, VALUE *argv, VALUE self, int mode)
|
|
3954
4878
|
break;
|
3955
4879
|
case INFO_TPRIV:
|
3956
4880
|
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
|
3957
|
-
|
4881
|
+
SQLTABLEPRIVILEGES(hstmt, NULL, 0, NULL, 0, swhich,
|
3958
4882
|
(swhich == NULL) ? 0 : SQL_NTS),
|
3959
4883
|
&msg, "SQLTablePrivileges")) {
|
3960
4884
|
goto error;
|
@@ -3962,7 +4886,7 @@ dbc_info(int argc, VALUE *argv, VALUE self, int mode)
|
|
3962
4886
|
break;
|
3963
4887
|
case INFO_PROCS:
|
3964
4888
|
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
|
3965
|
-
|
4889
|
+
SQLPROCEDURES(hstmt, NULL, 0, NULL, 0,
|
3966
4890
|
swhich, (swhich == NULL) ? 0 : SQL_NTS),
|
3967
4891
|
&msg, "SQLProcedures")) {
|
3968
4892
|
goto error;
|
@@ -3970,7 +4894,7 @@ dbc_info(int argc, VALUE *argv, VALUE self, int mode)
|
|
3970
4894
|
break;
|
3971
4895
|
case INFO_PROCCOLS:
|
3972
4896
|
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
|
3973
|
-
|
4897
|
+
SQLPROCEDURECOLUMNS(hstmt, NULL, 0, NULL, 0,
|
3974
4898
|
swhich,
|
3975
4899
|
(swhich == NULL) ? 0 : SQL_NTS,
|
3976
4900
|
swhich2,
|
@@ -3981,7 +4905,7 @@ dbc_info(int argc, VALUE *argv, VALUE self, int mode)
|
|
3981
4905
|
break;
|
3982
4906
|
case INFO_SPECCOLS:
|
3983
4907
|
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
|
3984
|
-
|
4908
|
+
SQLSPECIALCOLUMNS(hstmt, (SQLUSMALLINT) iid,
|
3985
4909
|
NULL, 0, NULL, 0,
|
3986
4910
|
swhich,
|
3987
4911
|
(swhich == NULL) ? 0 : SQL_NTS,
|
@@ -4071,7 +4995,7 @@ dbc_speccols(int argc, VALUE *argv, VALUE self)
|
|
4071
4995
|
/*
|
4072
4996
|
*----------------------------------------------------------------------
|
4073
4997
|
*
|
4074
|
-
*
|
4998
|
+
* Transaction stuff.
|
4075
4999
|
*
|
4076
5000
|
*----------------------------------------------------------------------
|
4077
5001
|
*/
|
@@ -4081,6 +5005,7 @@ dbc_trans(VALUE self, int what)
|
|
4081
5005
|
{
|
4082
5006
|
ENV *e;
|
4083
5007
|
SQLHDBC dbc = SQL_NULL_HDBC;
|
5008
|
+
SQLRETURN ret;
|
4084
5009
|
char *msg;
|
4085
5010
|
|
4086
5011
|
e = get_env(self);
|
@@ -4090,16 +5015,18 @@ dbc_trans(VALUE self, int what)
|
|
4090
5015
|
d = get_dbc(self);
|
4091
5016
|
dbc = d->hdbc;
|
4092
5017
|
}
|
4093
|
-
if (!succeeded(e->henv, dbc, SQL_NULL_HSTMT,
|
4094
5018
|
#if (ODBCVER >= 0x0300)
|
4095
|
-
|
4096
|
-
|
4097
|
-
|
4098
|
-
|
4099
|
-
|
5019
|
+
ret = SQLENDTRAN((SQLSMALLINT)
|
5020
|
+
((dbc == SQL_NULL_HDBC) ? SQL_HANDLE_ENV : SQL_HANDLE_DBC),
|
5021
|
+
(dbc == SQL_NULL_HDBC) ? e->henv : dbc,
|
5022
|
+
(SQLSMALLINT) what);
|
5023
|
+
#else
|
5024
|
+
ret = SQLTRANSACT(e->henv, dbc, (SQLUSMALLINT) what);
|
5025
|
+
#endif
|
5026
|
+
if (!succeeded(e->henv, dbc, SQL_NULL_HSTMT, ret,
|
5027
|
+
#if (ODBCVER >= 0x0300)
|
4100
5028
|
&msg, "SQLEndTran"
|
4101
5029
|
#else
|
4102
|
-
SQLTransact(e->henv, dbc, (SQLUSMALLINT) what),
|
4103
5030
|
&msg, "SQLTransact"
|
4104
5031
|
#endif
|
4105
5032
|
)) {
|
@@ -4166,7 +5093,7 @@ dbc_transaction(VALUE self)
|
|
4166
5093
|
/*
|
4167
5094
|
*----------------------------------------------------------------------
|
4168
5095
|
*
|
4169
|
-
*
|
5096
|
+
* Environment attribute handling.
|
4170
5097
|
*
|
4171
5098
|
*----------------------------------------------------------------------
|
4172
5099
|
*/
|
@@ -4247,17 +5174,17 @@ env_odbcver(int argc, VALUE *argv, VALUE self)
|
|
4247
5174
|
/*
|
4248
5175
|
*----------------------------------------------------------------------
|
4249
5176
|
*
|
4250
|
-
*
|
5177
|
+
* Connection/statement option handling.
|
4251
5178
|
*
|
4252
|
-
*
|
4253
|
-
*
|
4254
|
-
*
|
4255
|
-
*
|
4256
|
-
*
|
5179
|
+
* Note:
|
5180
|
+
* ODBC 2 allows statement options to be set using SQLSetConnectOption,
|
5181
|
+
* establishing the statement option as a default for any hstmts
|
5182
|
+
* later allocated for that hdbc. This feature was deprecated in
|
5183
|
+
* ODBC 3.x and may not work with ODBC 3.x drivers.
|
4257
5184
|
*
|
4258
|
-
*
|
4259
|
-
*
|
4260
|
-
*
|
5185
|
+
* Although the Database class includes attribute accessors for
|
5186
|
+
* statement-level options, a safer alternative, if using an ODBC 3
|
5187
|
+
* driver, is to set the option directly on the Statement instance.
|
4261
5188
|
*
|
4262
5189
|
*----------------------------------------------------------------------
|
4263
5190
|
*/
|
@@ -4385,8 +5312,8 @@ do_option(int argc, VALUE *argv, VALUE self, int isstmt, int op)
|
|
4385
5312
|
if (val == Qnil) {
|
4386
5313
|
return v ? Qtrue : Qfalse;
|
4387
5314
|
}
|
4388
|
-
v = (TYPE(val) == T_FIXNUM) ?
|
4389
|
-
(FIX2INT(val) ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF) :
|
5315
|
+
v = (TYPE(val) == T_FIXNUM) ?
|
5316
|
+
(FIX2INT(val) ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF) :
|
4390
5317
|
(RTEST(val) ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF);
|
4391
5318
|
break;
|
4392
5319
|
|
@@ -4394,8 +5321,8 @@ do_option(int argc, VALUE *argv, VALUE self, int isstmt, int op)
|
|
4394
5321
|
if (val == Qnil) {
|
4395
5322
|
return v ? Qtrue : Qfalse;
|
4396
5323
|
}
|
4397
|
-
v = (TYPE(val) == T_FIXNUM) ?
|
4398
|
-
(FIX2INT(val) ? SQL_NOSCAN_ON : SQL_NOSCAN_OFF) :
|
5324
|
+
v = (TYPE(val) == T_FIXNUM) ?
|
5325
|
+
(FIX2INT(val) ? SQL_NOSCAN_ON : SQL_NOSCAN_OFF) :
|
4399
5326
|
(RTEST(val) ? SQL_NOSCAN_ON : SQL_NOSCAN_OFF);
|
4400
5327
|
break;
|
4401
5328
|
|
@@ -4424,7 +5351,7 @@ do_option(int argc, VALUE *argv, VALUE self, int isstmt, int op)
|
|
4424
5351
|
rb_raise(Cerror, "%s", msg);
|
4425
5352
|
}
|
4426
5353
|
} else {
|
4427
|
-
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
|
5354
|
+
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
|
4428
5355
|
SQLSetStmtOption(q->hstmt, (SQLUSMALLINT) op,
|
4429
5356
|
(SQLUINTEGER) v),
|
4430
5357
|
&msg, "SQLSetStmtOption(%d)", op)) {
|
@@ -4539,7 +5466,7 @@ stmt_getsetoption(int argc, VALUE *argv, VALUE self)
|
|
4539
5466
|
/*
|
4540
5467
|
*----------------------------------------------------------------------
|
4541
5468
|
*
|
4542
|
-
*
|
5469
|
+
* Scan literal date/time/timestamp to TIMESTAMP_STRUCT.
|
4543
5470
|
*
|
4544
5471
|
*----------------------------------------------------------------------
|
4545
5472
|
*/
|
@@ -4573,7 +5500,7 @@ scan_dtts(VALUE str, int do_d, int do_t, TIMESTAMP_STRUCT *ts)
|
|
4573
5500
|
ts->day = dd;
|
4574
5501
|
return 1;
|
4575
5502
|
}
|
4576
|
-
if (do_t &&
|
5503
|
+
if (do_t &&
|
4577
5504
|
(sscanf(cstr, "{t '%d:%d:%d' %c", &hh, &mmm, &ss, &c) == 4) &&
|
4578
5505
|
(c == '}')) {
|
4579
5506
|
ts->hour = yy;
|
@@ -4617,7 +5544,7 @@ next:
|
|
4617
5544
|
/*
|
4618
5545
|
*----------------------------------------------------------------------
|
4619
5546
|
*
|
4620
|
-
*
|
5547
|
+
* Date methods.
|
4621
5548
|
*
|
4622
5549
|
*----------------------------------------------------------------------
|
4623
5550
|
*/
|
@@ -4638,7 +5565,7 @@ date_new(int argc, VALUE *argv, VALUE self)
|
|
4638
5565
|
{
|
4639
5566
|
DATE_STRUCT *date;
|
4640
5567
|
VALUE obj = Data_Make_Struct(self, DATE_STRUCT, 0, xfree, date);
|
4641
|
-
|
5568
|
+
|
4642
5569
|
rb_obj_call_init(obj, argc, argv);
|
4643
5570
|
return obj;
|
4644
5571
|
}
|
@@ -4852,7 +5779,7 @@ date_cmp(VALUE self, VALUE date)
|
|
4852
5779
|
/*
|
4853
5780
|
*----------------------------------------------------------------------
|
4854
5781
|
*
|
4855
|
-
*
|
5782
|
+
* Time methods.
|
4856
5783
|
*
|
4857
5784
|
*----------------------------------------------------------------------
|
4858
5785
|
*/
|
@@ -4873,7 +5800,7 @@ time_new(int argc, VALUE *argv, VALUE self)
|
|
4873
5800
|
{
|
4874
5801
|
TIME_STRUCT *time;
|
4875
5802
|
VALUE obj = Data_Make_Struct(self, TIME_STRUCT, 0, xfree, time);
|
4876
|
-
|
5803
|
+
|
4877
5804
|
rb_obj_call_init(obj, argc, argv);
|
4878
5805
|
return obj;
|
4879
5806
|
}
|
@@ -4887,7 +5814,7 @@ time_load1(VALUE self, VALUE str, int load)
|
|
4887
5814
|
if (scan_dtts(str, 0, 1, &tss)) {
|
4888
5815
|
TIME_STRUCT *time;
|
4889
5816
|
VALUE obj;
|
4890
|
-
|
5817
|
+
|
4891
5818
|
if (load) {
|
4892
5819
|
obj = Data_Make_Struct(self, TIME_STRUCT, 0, xfree, time);
|
4893
5820
|
} else {
|
@@ -5080,7 +6007,7 @@ time_cmp(VALUE self, VALUE time)
|
|
5080
6007
|
/*
|
5081
6008
|
*----------------------------------------------------------------------
|
5082
6009
|
*
|
5083
|
-
*
|
6010
|
+
* TimeStamp methods.
|
5084
6011
|
*
|
5085
6012
|
*----------------------------------------------------------------------
|
5086
6013
|
*/
|
@@ -5423,7 +6350,7 @@ timestamp_cmp(VALUE self, VALUE timestamp)
|
|
5423
6350
|
/*
|
5424
6351
|
*----------------------------------------------------------------------
|
5425
6352
|
*
|
5426
|
-
*
|
6353
|
+
* Statement methods.
|
5427
6354
|
*
|
5428
6355
|
*----------------------------------------------------------------------
|
5429
6356
|
*/
|
@@ -5481,7 +6408,7 @@ check_ncols(STMT *q)
|
|
5481
6408
|
(q->coltypes == NULL)) {
|
5482
6409
|
COLTYPE *coltypes = NULL;
|
5483
6410
|
SQLSMALLINT cols = 0;
|
5484
|
-
|
6411
|
+
|
5485
6412
|
if (succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
|
5486
6413
|
SQLNumResultCols(q->hstmt, &cols), NULL,
|
5487
6414
|
"SQLNumResultCols")
|
@@ -5985,7 +6912,7 @@ do_fetch(STMT *q, int mode)
|
|
5985
6912
|
}
|
5986
6913
|
if (q->dbcp != NULL && q->dbcp->use_sql_column_name == Qtrue) {
|
5987
6914
|
use_scn = 1;
|
5988
|
-
}
|
6915
|
+
}
|
5989
6916
|
switch (mode & DOFETCH_MODES) {
|
5990
6917
|
case DOFETCH_HASH:
|
5991
6918
|
case DOFETCH_HASH2:
|
@@ -6460,7 +7387,7 @@ stmt_fetch1(VALUE self, int bang)
|
|
6460
7387
|
const char *msg;
|
6461
7388
|
char *err;
|
6462
7389
|
#if (ODBCVER < 0x0300)
|
6463
|
-
|
7390
|
+
SQLROWSETSIZE nRows;
|
6464
7391
|
SQLUSMALLINT rowStat[1];
|
6465
7392
|
#endif
|
6466
7393
|
|
@@ -6473,10 +7400,10 @@ stmt_fetch1(VALUE self, int bang)
|
|
6473
7400
|
}
|
6474
7401
|
#if (ODBCVER < 0x0300)
|
6475
7402
|
msg = "SQLExtendedFetch(SQL_FETCH_NEXT)";
|
6476
|
-
ret =
|
7403
|
+
ret = SQLEXTENDEDFETCH(q->hstmt, SQL_FETCH_NEXT, 0, &nRows, rowStat);
|
6477
7404
|
#else
|
6478
7405
|
msg = "SQLFetchScroll(SQL_FETCH_NEXT)";
|
6479
|
-
ret =
|
7406
|
+
ret = SQLFETCHSCROLL(q->hstmt, SQL_FETCH_NEXT, 0);
|
6480
7407
|
#endif
|
6481
7408
|
if (ret == SQL_NO_DATA) {
|
6482
7409
|
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
|
@@ -6492,7 +7419,7 @@ usef:
|
|
6492
7419
|
/* Fallback to SQLFetch() when others not implemented */
|
6493
7420
|
msg = "SQLFetch";
|
6494
7421
|
q->usef = 1;
|
6495
|
-
ret =
|
7422
|
+
ret = SQLFETCH(q->hstmt);
|
6496
7423
|
if (ret == SQL_NO_DATA) {
|
6497
7424
|
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
|
6498
7425
|
return Qnil;
|
@@ -6532,7 +7459,7 @@ stmt_fetch_first1(VALUE self, int bang, int nopos)
|
|
6532
7459
|
const char *msg;
|
6533
7460
|
char *err;
|
6534
7461
|
#if (ODBCVER < 0x0300)
|
6535
|
-
|
7462
|
+
SQLROWSETSIZE nRows;
|
6536
7463
|
SQLUSMALLINT rowStat[1];
|
6537
7464
|
#endif
|
6538
7465
|
|
@@ -6545,10 +7472,10 @@ stmt_fetch_first1(VALUE self, int bang, int nopos)
|
|
6545
7472
|
}
|
6546
7473
|
#if (ODBCVER < 0x0300)
|
6547
7474
|
msg = "SQLExtendedFetch(SQL_FETCH_FIRST)";
|
6548
|
-
ret =
|
7475
|
+
ret = SQLEXTENDEDFETCH(q->hstmt, SQL_FETCH_FIRST, 0, &nRows, rowStat);
|
6549
7476
|
#else
|
6550
7477
|
msg = "SQLFetchScroll(SQL_FETCH_FIRST)";
|
6551
|
-
ret =
|
7478
|
+
ret = SQLFETCHSCROLL(q->hstmt, SQL_FETCH_FIRST, 0);
|
6552
7479
|
#endif
|
6553
7480
|
if (ret == SQL_NO_DATA) {
|
6554
7481
|
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
|
@@ -6583,7 +7510,7 @@ stmt_fetch_scroll1(int argc, VALUE *argv, VALUE self, int bang)
|
|
6583
7510
|
int idir, ioffs = 1;
|
6584
7511
|
char msg[128], *err;
|
6585
7512
|
#if (ODBCVER < 0x0300)
|
6586
|
-
|
7513
|
+
SQLROWSETSIZE nRows;
|
6587
7514
|
SQLUSMALLINT rowStat[1];
|
6588
7515
|
#endif
|
6589
7516
|
|
@@ -6598,11 +7525,11 @@ stmt_fetch_scroll1(int argc, VALUE *argv, VALUE self, int bang)
|
|
6598
7525
|
}
|
6599
7526
|
#if (ODBCVER < 0x0300)
|
6600
7527
|
sprintf(msg, "SQLExtendedFetch(%d)", idir);
|
6601
|
-
ret =
|
7528
|
+
ret = SQLEXTENDEDFETCH(q->hstmt, (SQLSMALLINT) idir, (SQLROWOFFSET) ioffs,
|
6602
7529
|
&nRows, rowStat);
|
6603
7530
|
#else
|
6604
7531
|
sprintf(msg, "SQLFetchScroll(%d)", idir);
|
6605
|
-
ret =
|
7532
|
+
ret = SQLFETCHSCROLL(q->hstmt, (SQLSMALLINT) idir, (SQLROWOFFSET) ioffs);
|
6606
7533
|
#endif
|
6607
7534
|
if (ret == SQL_NO_DATA) {
|
6608
7535
|
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
|
@@ -6703,7 +7630,7 @@ stmt_fetch_hash1(int argc, VALUE *argv, VALUE self, int bang)
|
|
6703
7630
|
const char *msg;
|
6704
7631
|
char *err;
|
6705
7632
|
#if (ODBCVER < 0x0300)
|
6706
|
-
|
7633
|
+
SQLROWSETSIZE nRows;
|
6707
7634
|
SQLUSMALLINT rowStat[1];
|
6708
7635
|
#endif
|
6709
7636
|
|
@@ -6716,10 +7643,10 @@ stmt_fetch_hash1(int argc, VALUE *argv, VALUE self, int bang)
|
|
6716
7643
|
}
|
6717
7644
|
#if (ODBCVER < 0x0300)
|
6718
7645
|
msg = "SQLExtendedFetch(SQL_FETCH_NEXT)";
|
6719
|
-
ret =
|
7646
|
+
ret = SQLEXTENDEDFETCH(q->hstmt, SQL_FETCH_NEXT, 0, &nRows, rowStat);
|
6720
7647
|
#else
|
6721
7648
|
msg = "SQLFetchScroll(SQL_FETCH_NEXT)";
|
6722
|
-
ret =
|
7649
|
+
ret = SQLFETCHSCROLL(q->hstmt, SQL_FETCH_NEXT, 0);
|
6723
7650
|
#endif
|
6724
7651
|
if (ret == SQL_NO_DATA) {
|
6725
7652
|
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
|
@@ -6735,7 +7662,7 @@ usef:
|
|
6735
7662
|
/* Fallback to SQLFetch() when others not implemented */
|
6736
7663
|
msg = "SQLFetch";
|
6737
7664
|
q->usef = 1;
|
6738
|
-
ret =
|
7665
|
+
ret = SQLFETCH(q->hstmt);
|
6739
7666
|
if (ret == SQL_NO_DATA) {
|
6740
7667
|
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
|
6741
7668
|
return Qnil;
|
@@ -6776,7 +7703,7 @@ stmt_fetch_first_hash1(int argc, VALUE *argv, VALUE self, int bang, int nopos)
|
|
6776
7703
|
const char *msg;
|
6777
7704
|
char *err;
|
6778
7705
|
#if (ODBCVER < 0x0300)
|
6779
|
-
|
7706
|
+
SQLROWSETSIZE nRows;
|
6780
7707
|
SQLUSMALLINT rowStat[1];
|
6781
7708
|
#endif
|
6782
7709
|
|
@@ -6789,10 +7716,10 @@ stmt_fetch_first_hash1(int argc, VALUE *argv, VALUE self, int bang, int nopos)
|
|
6789
7716
|
}
|
6790
7717
|
#if (ODBCVER < 0x0300)
|
6791
7718
|
msg = "SQLExtendedFetch(SQL_FETCH_FIRST)";
|
6792
|
-
ret =
|
7719
|
+
ret = SQLEXTENDEDFETCH(q->hstmt, SQL_FETCH_FIRST, 0, &nRows, rowStat);
|
6793
7720
|
#else
|
6794
7721
|
msg = "SQLFetchScroll(SQL_FETCH_FIRST)";
|
6795
|
-
ret =
|
7722
|
+
ret = SQLFETCHSCROLL(q->hstmt, SQL_FETCH_FIRST, 0);
|
6796
7723
|
#endif
|
6797
7724
|
if (ret == SQL_NO_DATA) {
|
6798
7725
|
(void) tracesql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret, msg);
|
@@ -6818,19 +7745,19 @@ stmt_each(VALUE self)
|
|
6818
7745
|
VALUE row, res = Qnil;
|
6819
7746
|
STMT *q;
|
6820
7747
|
#if (ODBCVER < 0x0300)
|
6821
|
-
|
7748
|
+
SQLROWSETSIZE nRows;
|
6822
7749
|
SQLUSMALLINT rowStat[1];
|
6823
7750
|
#endif
|
6824
7751
|
|
6825
7752
|
Data_Get_Struct(self, STMT, q);
|
6826
7753
|
#if (ODBCVER < 0x0300)
|
6827
7754
|
switch (callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
|
6828
|
-
|
7755
|
+
SQLEXTENDEDFETCH(q->hstmt, SQL_FETCH_FIRST, 0, &nRows,
|
6829
7756
|
rowStat),
|
6830
7757
|
"SQLExtendedFetch(SQL_FETCH_FIRST)"))
|
6831
7758
|
#else
|
6832
7759
|
switch (callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
|
6833
|
-
|
7760
|
+
SQLFETCHSCROLL(q->hstmt, SQL_FETCH_FIRST, 0),
|
6834
7761
|
"SQLFetchScroll(SQL_FETCH_FIRST)"))
|
6835
7762
|
#endif
|
6836
7763
|
{
|
@@ -6868,7 +7795,7 @@ stmt_each_hash(int argc, VALUE *argv, VALUE self)
|
|
6868
7795
|
STMT *q;
|
6869
7796
|
int mode = stmt_hash_mode(argc, argv, self);
|
6870
7797
|
#if (ODBCVER < 0x0300)
|
6871
|
-
|
7798
|
+
SQLROWSETSIZE nRows;
|
6872
7799
|
SQLUSMALLINT rowStat[1];
|
6873
7800
|
#endif
|
6874
7801
|
|
@@ -6884,12 +7811,12 @@ stmt_each_hash(int argc, VALUE *argv, VALUE self)
|
|
6884
7811
|
Data_Get_Struct(self, STMT, q);
|
6885
7812
|
#if (ODBCVER < 0x0300)
|
6886
7813
|
switch (callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
|
6887
|
-
|
7814
|
+
SQLEXTENDEDFETCH(q->hstmt, SQL_FETCH_FIRST, 0, &nRows,
|
6888
7815
|
rowStat),
|
6889
7816
|
"SQLExtendedFetch(SQL_FETCH_FIRST)"))
|
6890
7817
|
#else
|
6891
7818
|
switch (callsql(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt,
|
6892
|
-
|
7819
|
+
SQLFETCHSCROLL(q->hstmt, SQL_FETCH_FIRST, 0),
|
6893
7820
|
"SQLFetchScroll(SQL_FETCH_FIRST)"))
|
6894
7821
|
#endif
|
6895
7822
|
{
|
@@ -6955,6 +7882,7 @@ stmt_prep_int(int argc, VALUE *argv, VALUE self, int mode)
|
|
6955
7882
|
STMT *q = NULL;
|
6956
7883
|
VALUE sql, dbc, stmt;
|
6957
7884
|
SQLHSTMT hstmt;
|
7885
|
+
SQLRETURN ret;
|
6958
7886
|
#ifdef UNICODE
|
6959
7887
|
SQLWCHAR *ssql = NULL;
|
6960
7888
|
#else
|
@@ -7004,10 +7932,8 @@ stmt_prep_int(int argc, VALUE *argv, VALUE self, int mode)
|
|
7004
7932
|
ssql = (SQLCHAR *) csql;
|
7005
7933
|
#endif
|
7006
7934
|
if ((mode & MAKERES_EXECD)) {
|
7007
|
-
|
7008
|
-
|
7009
|
-
if (!succeeded_nodata(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
|
7010
|
-
(ret = SQLExecDirect(hstmt, ssql, SQL_NTS)),
|
7935
|
+
ret = SQLEXECDIRECT(hstmt, ssql, SQL_NTS);
|
7936
|
+
if (!succeeded_nodata(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt, ret,
|
7011
7937
|
&msg, "SQLExecDirect('%s')", csql)) {
|
7012
7938
|
goto sqlerr;
|
7013
7939
|
}
|
@@ -7020,22 +7946,24 @@ stmt_prep_int(int argc, VALUE *argv, VALUE self, int mode)
|
|
7020
7946
|
}
|
7021
7947
|
hstmt = SQL_NULL_HSTMT;
|
7022
7948
|
}
|
7023
|
-
} else
|
7024
|
-
|
7949
|
+
} else {
|
7950
|
+
ret = SQLPREPARE(hstmt, ssql, SQL_NTS);
|
7951
|
+
if (!succeeded(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt, ret,
|
7025
7952
|
&msg, "SQLPrepare('%s')", csql)) {
|
7026
7953
|
sqlerr:
|
7027
7954
|
#ifdef UNICODE
|
7028
|
-
|
7955
|
+
uc_free(ssql);
|
7029
7956
|
#endif
|
7030
|
-
|
7031
|
-
|
7032
|
-
|
7033
|
-
|
7034
|
-
|
7957
|
+
callsql(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt,
|
7958
|
+
SQLFreeStmt(hstmt, SQL_DROP), "SQLFreeStmt(SQL_DROP)");
|
7959
|
+
if (q != NULL) {
|
7960
|
+
q->hstmt = SQL_NULL_HSTMT;
|
7961
|
+
unlink_stmt(q);
|
7962
|
+
}
|
7963
|
+
rb_raise(Cerror, "%s", msg);
|
7964
|
+
} else {
|
7965
|
+
mode |= MAKERES_PREPARE;
|
7035
7966
|
}
|
7036
|
-
rb_raise(Cerror, "%s", msg);
|
7037
|
-
} else {
|
7038
|
-
mode |= MAKERES_PREPARE;
|
7039
7967
|
}
|
7040
7968
|
#ifdef UNICODE
|
7041
7969
|
uc_free(ssql);
|
@@ -7452,8 +8380,8 @@ stmt_exec_int(int argc, VALUE *argv, VALUE self, int mode)
|
|
7452
8380
|
goto error;
|
7453
8381
|
}
|
7454
8382
|
}
|
7455
|
-
|
7456
|
-
|
8383
|
+
ret = SQLEXECUTE(q->hstmt);
|
8384
|
+
if (!succeeded_nodata(SQL_NULL_HENV, SQL_NULL_HDBC, q->hstmt, ret,
|
7457
8385
|
&msg, "SQLExecute")) {
|
7458
8386
|
error:
|
7459
8387
|
#ifdef UNICODE
|
@@ -7512,7 +8440,7 @@ static VALUE
|
|
7512
8440
|
stmt_do(int argc, VALUE *argv, VALUE self)
|
7513
8441
|
{
|
7514
8442
|
VALUE stmt;
|
7515
|
-
|
8443
|
+
|
7516
8444
|
if (argc < 1) {
|
7517
8445
|
rb_raise(rb_eArgError, "wrong # of arguments");
|
7518
8446
|
}
|
@@ -7557,7 +8485,7 @@ stmt_ignorecase(int argc, VALUE *argv, VALUE self)
|
|
7557
8485
|
/*
|
7558
8486
|
*----------------------------------------------------------------------
|
7559
8487
|
*
|
7560
|
-
*
|
8488
|
+
* Create statement without implicit SQL prepare or execute.
|
7561
8489
|
*
|
7562
8490
|
*----------------------------------------------------------------------
|
7563
8491
|
*/
|
@@ -7580,7 +8508,7 @@ stmt_new(VALUE self)
|
|
7580
8508
|
/*
|
7581
8509
|
*----------------------------------------------------------------------
|
7582
8510
|
*
|
7583
|
-
*
|
8511
|
+
* Procedures with statements.
|
7584
8512
|
*
|
7585
8513
|
*----------------------------------------------------------------------
|
7586
8514
|
*/
|
@@ -7671,7 +8599,7 @@ stmt_procwrap(int argc, VALUE *argv, VALUE self)
|
|
7671
8599
|
/*
|
7672
8600
|
*----------------------------------------------------------------------
|
7673
8601
|
*
|
7674
|
-
*
|
8602
|
+
* Module functions.
|
7675
8603
|
*
|
7676
8604
|
*----------------------------------------------------------------------
|
7677
8605
|
*/
|
@@ -7854,7 +8782,7 @@ mod_trace(int argc, VALUE *argv, VALUE self)
|
|
7854
8782
|
/*
|
7855
8783
|
*----------------------------------------------------------------------
|
7856
8784
|
*
|
7857
|
-
*
|
8785
|
+
* Table of constants and intern'ed string mappings.
|
7858
8786
|
*
|
7859
8787
|
*----------------------------------------------------------------------
|
7860
8788
|
*/
|
@@ -7990,10 +8918,26 @@ static struct {
|
|
7990
8918
|
O_CONST2(SQL_OV_ODBC3, 3),
|
7991
8919
|
#endif
|
7992
8920
|
#ifdef SQL_ATTR_CONNECTION_POOLING
|
8921
|
+
#ifdef SQL_CP_OFF
|
7993
8922
|
O_CONST(SQL_CP_OFF),
|
8923
|
+
#else
|
8924
|
+
O_CONST2(SQL_CP_OFF, 0),
|
8925
|
+
#endif
|
8926
|
+
#ifdef SQL_CP_ONE_PER_DRIVER
|
7994
8927
|
O_CONST(SQL_CP_ONE_PER_DRIVER),
|
8928
|
+
#else
|
8929
|
+
O_CONST2(SQL_CP_ONE_PER_DRIVER, 1),
|
8930
|
+
#endif
|
8931
|
+
#ifdef SQL_CP_ONE_PER_HENV
|
7995
8932
|
O_CONST(SQL_CP_ONE_PER_HENV),
|
8933
|
+
#else
|
8934
|
+
O_CONST2(SQL_CP_ONE_PER_HENV, 2),
|
8935
|
+
#endif
|
8936
|
+
#ifdef SQL_CP_DEFAULT
|
7996
8937
|
O_CONST(SQL_CP_DEFAULT),
|
8938
|
+
#else
|
8939
|
+
O_CONST2(SQL_CP_DEFAULT, 0),
|
8940
|
+
#endif
|
7997
8941
|
#else
|
7998
8942
|
O_CONST2(SQL_CP_OFF, 0),
|
7999
8943
|
O_CONST2(SQL_CP_ONE_PER_DRIVER, 0),
|
@@ -8107,7 +9051,7 @@ static struct {
|
|
8107
9051
|
/*
|
8108
9052
|
*----------------------------------------------------------------------
|
8109
9053
|
*
|
8110
|
-
*
|
9054
|
+
* Module initializer.
|
8111
9055
|
*
|
8112
9056
|
*----------------------------------------------------------------------
|
8113
9057
|
*/
|
@@ -8128,7 +9072,7 @@ Init_odbc()
|
|
8128
9072
|
rb_cDate = rb_eval_string("Date");
|
8129
9073
|
|
8130
9074
|
if (rb_const_defined(rb_cObject, modid)) {
|
8131
|
-
v = rb_const_get(rb_cObject, modid);
|
9075
|
+
v = rb_const_get(rb_cObject, modid);
|
8132
9076
|
if (TYPE(v) != T_MODULE) {
|
8133
9077
|
rb_raise(rb_eTypeError, "%s already defined", modname);
|
8134
9078
|
}
|
@@ -8470,3 +9414,12 @@ Init_odbc()
|
|
8470
9414
|
}
|
8471
9415
|
#endif
|
8472
9416
|
}
|
9417
|
+
|
9418
|
+
/*
|
9419
|
+
* Local Variables:
|
9420
|
+
* mode: c
|
9421
|
+
* c-basic-offset: 4
|
9422
|
+
* fill-column: 78
|
9423
|
+
* tab-width: 8
|
9424
|
+
* End:
|
9425
|
+
*/
|