ruby-oci8 2.2.0.2 → 2.2.12
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 +7 -0
- data/.yardopts +1 -6
- data/ChangeLog +600 -0
- data/NEWS +426 -35
- data/README.md +27 -9
- data/dist-files +13 -2
- data/docs/bind-array-to-in_cond.md +38 -0
- data/docs/conflicts-local-connections-and-processes.md +98 -0
- data/docs/hanging-after-inactivity.md +63 -0
- data/docs/install-binary-package.md +15 -11
- data/docs/install-full-client.md +18 -21
- data/docs/install-instant-client.md +45 -27
- data/docs/install-on-osx.md +31 -117
- data/docs/ldap-auth-and-function-interposition.md +123 -0
- data/docs/number-type-mapping.md +79 -0
- data/docs/platform-specific-issues.md +17 -50
- data/docs/report-installation-issue.md +11 -8
- data/docs/timeout-parameters.md +94 -0
- data/ext/oci8/apiwrap.c.tmpl +2 -5
- data/ext/oci8/apiwrap.rb +6 -1
- data/ext/oci8/apiwrap.yml +39 -143
- data/ext/oci8/attr.c +4 -2
- data/ext/oci8/bind.c +421 -9
- data/ext/oci8/connection_pool.c +3 -3
- data/ext/oci8/encoding.c +5 -5
- data/ext/oci8/env.c +8 -2
- data/ext/oci8/error.c +24 -16
- data/ext/oci8/extconf.rb +35 -63
- data/ext/oci8/hook_funcs.c +274 -61
- data/ext/oci8/lob.c +31 -75
- data/ext/oci8/metadata.c +8 -6
- data/ext/oci8/object.c +119 -29
- data/ext/oci8/oci8.c +46 -133
- data/ext/oci8/oci8.h +40 -123
- data/ext/oci8/oci8lib.c +178 -46
- data/ext/oci8/ocihandle.c +37 -37
- data/ext/oci8/ocinumber.c +24 -35
- data/ext/oci8/oraconf.rb +168 -337
- data/ext/oci8/oradate.c +19 -19
- data/ext/oci8/plthook.h +10 -0
- data/ext/oci8/plthook_elf.c +433 -268
- data/ext/oci8/plthook_osx.c +40 -9
- data/ext/oci8/plthook_win32.c +16 -1
- data/ext/oci8/stmt.c +52 -17
- data/ext/oci8/win32.c +4 -22
- data/lib/oci8/bindtype.rb +10 -17
- data/lib/oci8/check_load_error.rb +57 -10
- data/lib/oci8/compat.rb +5 -1
- data/lib/oci8/connection_pool.rb +74 -3
- data/lib/oci8/cursor.rb +70 -31
- data/lib/oci8/metadata.rb +9 -1
- data/lib/oci8/object.rb +14 -1
- data/lib/oci8/oci8.rb +184 -58
- data/lib/oci8/ocihandle.rb +0 -16
- data/lib/oci8/oracle_version.rb +11 -1
- data/lib/oci8/properties.rb +55 -0
- data/lib/oci8/version.rb +1 -1
- data/lib/oci8.rb +48 -4
- data/lib/ruby-oci8.rb +1 -0
- data/pre-distclean.rb +1 -3
- data/ruby-oci8.gemspec +4 -9
- data/setup.rb +11 -2
- data/test/README.md +37 -0
- data/test/config.rb +8 -1
- data/test/setup_test_object.sql +42 -14
- data/test/setup_test_package.sql +59 -0
- data/test/test_all.rb +4 -0
- data/test/test_bind_array.rb +70 -0
- data/test/test_bind_boolean.rb +99 -0
- data/test/test_bind_integer.rb +47 -0
- data/test/test_break.rb +11 -9
- data/test/test_clob.rb +5 -17
- data/test/test_connstr.rb +142 -0
- data/test/test_datetime.rb +8 -3
- data/test/test_metadata.rb +2 -1
- data/test/test_object.rb +99 -18
- data/test/test_oci8.rb +170 -46
- data/test/test_oranumber.rb +12 -6
- data/test/test_package_type.rb +17 -3
- data/test/test_properties.rb +17 -0
- metadata +45 -55
- data/docs/osx-install-dev-tools.png +0 -0
- data/test/README +0 -42
data/ext/oci8/oci8.c
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* oci8.c - part of ruby-oci8
|
4
4
|
*
|
5
|
-
* Copyright (C) 2002-
|
5
|
+
* Copyright (C) 2002-2019 Kubo Takehiro <kubo@jiubao.org>
|
6
6
|
*
|
7
7
|
*/
|
8
8
|
#include "oci8.h"
|
@@ -286,7 +286,7 @@ static VALUE oci8_s_oracle_client_vernum(VALUE klass)
|
|
286
286
|
/*
|
287
287
|
* @overload OCI8.__get_prop(key)
|
288
288
|
*
|
289
|
-
* @param [
|
289
|
+
* @param [Integer] key 1, 2 or 3
|
290
290
|
* @return [Object] depends on +key+.
|
291
291
|
* @private
|
292
292
|
*/
|
@@ -306,16 +306,13 @@ static VALUE oci8_s_get_prop(VALUE klass, VALUE key)
|
|
306
306
|
/*
|
307
307
|
* @overload OCI8.__set_prop(key, value)
|
308
308
|
*
|
309
|
-
* @param [
|
309
|
+
* @param [Integer] key 1, 2 or 3
|
310
310
|
* @param [Object] value depends on +key+.
|
311
311
|
*
|
312
312
|
* @private
|
313
313
|
*/
|
314
314
|
static VALUE oci8_s_set_prop(VALUE klass, VALUE key, VALUE val)
|
315
315
|
{
|
316
|
-
#ifdef HAVE_PLTHOOK
|
317
|
-
static int hook_functions_installed = 0;
|
318
|
-
#endif
|
319
316
|
switch (NUM2INT(key)) {
|
320
317
|
case 1:
|
321
318
|
oci8_float_conversion_type_is_ruby = RTEST(val) ? 1 : 0;
|
@@ -331,13 +328,21 @@ static VALUE oci8_s_set_prop(VALUE klass, VALUE key, VALUE val)
|
|
331
328
|
oci8_env_mode = NUM2UINT(val);
|
332
329
|
break;
|
333
330
|
case 3:
|
331
|
+
if (oci8_cancel_read_at_exit == -1) {
|
332
|
+
rb_raise(rb_eNotImpError, "OCI8.properties[:cancel_read_at_exit] isn't available.");
|
333
|
+
}
|
334
334
|
#ifdef HAVE_PLTHOOK
|
335
|
-
|
336
|
-
|
337
|
-
|
335
|
+
oci8_install_hook_functions();
|
336
|
+
oci8_cancel_read_at_exit = RTEST(val) ? 1 : 0;
|
337
|
+
#endif
|
338
|
+
break;
|
339
|
+
case 4:
|
340
|
+
if (oci8_tcp_keepalive_time == -1) {
|
341
|
+
rb_raise(rb_eNotImpError, "OCI8.properties[:tcp_keepalive_time] isn't available.");
|
338
342
|
}
|
339
|
-
#
|
340
|
-
|
343
|
+
#ifdef HAVE_PLTHOOK
|
344
|
+
oci8_install_hook_functions();
|
345
|
+
oci8_tcp_keepalive_time = NIL_P(val) ? 0 : NUM2INT(val);
|
341
346
|
#endif
|
342
347
|
break;
|
343
348
|
default:
|
@@ -359,7 +364,7 @@ static VALUE oci8_s_set_prop(VALUE klass, VALUE key, VALUE val)
|
|
359
364
|
* # When NLS_LANG is FRENCH_FRANCE.AL32UTF8
|
360
365
|
* OCI8.error_message(1) # => "ORA-00001: violation de contrainte unique (%s.%s)"
|
361
366
|
*
|
362
|
-
* @param [
|
367
|
+
* @param [Integer] message_no Oracle error message number
|
363
368
|
* @return [String] Oracle error message
|
364
369
|
*/
|
365
370
|
static VALUE oci8_s_error_message(VALUE klass, VALUE msgid)
|
@@ -372,8 +377,8 @@ void oci8_do_parse_connect_string(VALUE conn_str, VALUE *user, VALUE *pass, VALU
|
|
372
377
|
{
|
373
378
|
static VALUE re = Qnil;
|
374
379
|
if (NIL_P(re)) {
|
375
|
-
re = rb_eval_string(CONN_STR_REGEX);
|
376
380
|
rb_global_variable(&re);
|
381
|
+
re = rb_eval_string(CONN_STR_REGEX);
|
377
382
|
}
|
378
383
|
OCI8SafeStringValue(conn_str);
|
379
384
|
if (RTEST(rb_reg_match(re, conn_str))) {
|
@@ -419,49 +424,6 @@ static VALUE oci8_parse_connect_string(VALUE self, VALUE conn_str)
|
|
419
424
|
return rb_ary_new3(4, user, pass, dbname, mode);
|
420
425
|
}
|
421
426
|
|
422
|
-
/*
|
423
|
-
* Logoff strategy for sessions connected by OCILogon.
|
424
|
-
*/
|
425
|
-
typedef struct {
|
426
|
-
OCISvcCtx *svchp;
|
427
|
-
OCISession *usrhp;
|
428
|
-
OCIServer *srvhp;
|
429
|
-
} simple_logoff_arg_t;
|
430
|
-
|
431
|
-
static void *simple_logoff_prepare(oci8_svcctx_t *svcctx)
|
432
|
-
{
|
433
|
-
simple_logoff_arg_t *sla = xmalloc(sizeof(simple_logoff_arg_t));
|
434
|
-
sla->svchp = svcctx->base.hp.svc;
|
435
|
-
sla->usrhp = svcctx->usrhp;
|
436
|
-
sla->srvhp = svcctx->srvhp;
|
437
|
-
svcctx->usrhp = NULL;
|
438
|
-
svcctx->srvhp = NULL;
|
439
|
-
return sla;
|
440
|
-
}
|
441
|
-
|
442
|
-
static void *simple_logoff_execute(void *arg)
|
443
|
-
{
|
444
|
-
simple_logoff_arg_t *sla = (simple_logoff_arg_t *)arg;
|
445
|
-
OCIError *errhp = oci8_errhp;
|
446
|
-
boolean txn = TRUE;
|
447
|
-
sword rv;
|
448
|
-
|
449
|
-
if (oracle_client_version >= ORAVER_12_1) {
|
450
|
-
OCIAttrGet(sla->usrhp, OCI_HTYPE_SESSION, &txn, NULL, OCI_ATTR_TRANSACTION_IN_PROGRESS, errhp);
|
451
|
-
}
|
452
|
-
if (txn) {
|
453
|
-
OCITransRollback(sla->svchp, errhp, OCI_DEFAULT);
|
454
|
-
}
|
455
|
-
rv = OCILogoff(sla->svchp, errhp);
|
456
|
-
xfree(sla);
|
457
|
-
return (void*)(VALUE)rv;
|
458
|
-
}
|
459
|
-
|
460
|
-
static const oci8_logoff_strategy_t simple_logoff = {
|
461
|
-
simple_logoff_prepare,
|
462
|
-
simple_logoff_execute,
|
463
|
-
};
|
464
|
-
|
465
427
|
/*
|
466
428
|
* Logoff strategy for sessions connected by OCIServerAttach and OCISessionBegin.
|
467
429
|
*/
|
@@ -526,61 +488,6 @@ static const oci8_logoff_strategy_t complex_logoff = {
|
|
526
488
|
complex_logoff_execute,
|
527
489
|
};
|
528
490
|
|
529
|
-
/*
|
530
|
-
* @overload logon2(username, password, dbname, mode)
|
531
|
-
*
|
532
|
-
* Creates a simple logon session by the OCI function OCILogon2().
|
533
|
-
*
|
534
|
-
* @param [String] username
|
535
|
-
* @param [String] password
|
536
|
-
* @param [String] dbname
|
537
|
-
* @param [Integer] mode
|
538
|
-
* @private
|
539
|
-
*/
|
540
|
-
static VALUE oci8_logon2(VALUE self, VALUE username, VALUE password, VALUE dbname, VALUE mode)
|
541
|
-
{
|
542
|
-
oci8_svcctx_t *svcctx = oci8_get_svcctx(self);
|
543
|
-
ub4 logon2_mode;
|
544
|
-
|
545
|
-
if (svcctx->logoff_strategy != NULL) {
|
546
|
-
rb_raise(rb_eRuntimeError, "Could not reuse the session.");
|
547
|
-
}
|
548
|
-
|
549
|
-
/* check arugmnets */
|
550
|
-
OCI8SafeStringValue(username);
|
551
|
-
OCI8SafeStringValue(password);
|
552
|
-
if (!NIL_P(dbname)) {
|
553
|
-
OCI8SafeStringValue(dbname);
|
554
|
-
}
|
555
|
-
logon2_mode = NUM2UINT(mode);
|
556
|
-
|
557
|
-
/* logon */
|
558
|
-
svcctx->base.type = OCI_HTYPE_SVCCTX;
|
559
|
-
chker2(OCILogon2_nb(svcctx, oci8_envhp, oci8_errhp, &svcctx->base.hp.svc,
|
560
|
-
RSTRING_ORATEXT(username), RSTRING_LEN(username),
|
561
|
-
RSTRING_ORATEXT(password), RSTRING_LEN(password),
|
562
|
-
NIL_P(dbname) ? NULL : RSTRING_ORATEXT(dbname),
|
563
|
-
NIL_P(dbname) ? 0 : RSTRING_LEN(dbname), logon2_mode),
|
564
|
-
&svcctx->base);
|
565
|
-
svcctx->logoff_strategy = &simple_logoff;
|
566
|
-
|
567
|
-
if (logon2_mode & OCI_LOGON2_CPOOL) {
|
568
|
-
svcctx->state |= OCI8_STATE_CPOOL;
|
569
|
-
}
|
570
|
-
|
571
|
-
/* setup the session handle */
|
572
|
-
chker2(OCIAttrGet(svcctx->base.hp.ptr, OCI_HTYPE_SVCCTX, &svcctx->usrhp, 0, OCI_ATTR_SESSION, oci8_errhp),
|
573
|
-
&svcctx->base);
|
574
|
-
copy_session_handle(svcctx);
|
575
|
-
|
576
|
-
/* setup the server handle */
|
577
|
-
chker2(OCIAttrGet(svcctx->base.hp.ptr, OCI_HTYPE_SVCCTX, &svcctx->srvhp, 0, OCI_ATTR_SERVER, oci8_errhp),
|
578
|
-
&svcctx->base);
|
579
|
-
copy_server_handle(svcctx);
|
580
|
-
|
581
|
-
return Qnil;
|
582
|
-
}
|
583
|
-
|
584
491
|
/*
|
585
492
|
* @overload allocate_handles()
|
586
493
|
*
|
@@ -649,7 +556,7 @@ static VALUE oci8_server_attach(VALUE self, VALUE dbname, VALUE attach_mode)
|
|
649
556
|
/* attach to the server */
|
650
557
|
chker2(OCIServerAttach_nb(svcctx, svcctx->srvhp, oci8_errhp,
|
651
558
|
NIL_P(dbname) ? NULL : RSTRING_ORATEXT(dbname),
|
652
|
-
NIL_P(dbname) ? 0 :
|
559
|
+
NIL_P(dbname) ? 0 : RSTRING_LENINT(dbname),
|
653
560
|
mode),
|
654
561
|
&svcctx->base);
|
655
562
|
chker2(OCIAttrSet(svcctx->base.hp.ptr, OCI_HTYPE_SVCCTX,
|
@@ -668,13 +575,15 @@ static VALUE oci8_server_attach(VALUE self, VALUE dbname, VALUE attach_mode)
|
|
668
575
|
*
|
669
576
|
* Begins the session by the OCI function OCISessionBegin().
|
670
577
|
*
|
671
|
-
* @param [
|
672
|
-
* @param [
|
578
|
+
* @param [Integer] cred
|
579
|
+
* @param [Integer] mode
|
673
580
|
* @private
|
674
581
|
*/
|
675
582
|
static VALUE oci8_session_begin(VALUE self, VALUE cred, VALUE mode)
|
676
583
|
{
|
677
584
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(self);
|
585
|
+
char buf[100];
|
586
|
+
ub4 version;
|
678
587
|
|
679
588
|
if (svcctx->logoff_strategy != &complex_logoff) {
|
680
589
|
rb_raise(rb_eRuntimeError, "Use this method only for the service context handle created by OCI8#server_handle().");
|
@@ -697,6 +606,16 @@ static VALUE oci8_session_begin(VALUE self, VALUE cred, VALUE mode)
|
|
697
606
|
oci8_errhp),
|
698
607
|
&svcctx->base);
|
699
608
|
svcctx->state |= OCI8_STATE_SESSION_BEGIN_WAS_CALLED;
|
609
|
+
if (have_OCIServerRelease2) {
|
610
|
+
chker2(OCIServerRelease2(svcctx->base.hp.ptr, oci8_errhp, (text*)buf,
|
611
|
+
sizeof(buf), (ub1)svcctx->base.type, &version, OCI_DEFAULT),
|
612
|
+
&svcctx->base);
|
613
|
+
} else {
|
614
|
+
chker2(OCIServerRelease(svcctx->base.hp.ptr, oci8_errhp, (text*)buf,
|
615
|
+
sizeof(buf), (ub1)svcctx->base.type, &version),
|
616
|
+
&svcctx->base);
|
617
|
+
}
|
618
|
+
svcctx->server_version = version;
|
700
619
|
return Qnil;
|
701
620
|
}
|
702
621
|
|
@@ -815,14 +734,9 @@ static VALUE oci8_set_autocommit(VALUE self, VALUE val)
|
|
815
734
|
/*
|
816
735
|
* @overload long_read_len
|
817
736
|
*
|
818
|
-
*
|
819
|
-
*
|
820
|
-
*
|
821
|
-
* If the actual data length is longer than long_read_len,
|
822
|
-
* the fetched valud is truncated and the value of {OCI8#last_error}
|
823
|
-
* become {OCISuccessWithInfo} whose message is "ORA-01406: fetched column value was truncated".
|
824
|
-
*
|
825
|
-
* Note: long_read_len is also used for maximum length of XMLTYPE data type.
|
737
|
+
* @deprecated This has no effect since ruby-oci8 2.2.7.
|
738
|
+
* LONG, LONG RAW and XMLTYPE columns are fetched up to 4 gigabytes
|
739
|
+
* without this parameter.
|
826
740
|
*
|
827
741
|
* @return [Integer]
|
828
742
|
* @see #long_read_len=
|
@@ -830,14 +744,16 @@ static VALUE oci8_set_autocommit(VALUE self, VALUE val)
|
|
830
744
|
static VALUE oci8_long_read_len(VALUE self)
|
831
745
|
{
|
832
746
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(self);
|
747
|
+
rb_warning("OCI8.long_read_len has no effect since ruby-oci8 2.2.7");
|
833
748
|
return svcctx->long_read_len;
|
834
749
|
}
|
835
750
|
|
836
751
|
/*
|
837
752
|
* @overload long_read_len=(length)
|
838
753
|
*
|
839
|
-
*
|
840
|
-
*
|
754
|
+
* @deprecated This has no effect since ruby-oci8 2.2.7.
|
755
|
+
* LONG, LONG RAW and XMLTYPE columns are fetched up to 4 gigabytes
|
756
|
+
* without this parameter.
|
841
757
|
*
|
842
758
|
* @param [Integer] length
|
843
759
|
* @see #long_read_len
|
@@ -847,6 +763,7 @@ static VALUE oci8_set_long_read_len(VALUE self, VALUE val)
|
|
847
763
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(self);
|
848
764
|
Check_Type(val, T_FIXNUM);
|
849
765
|
RB_OBJ_WRITE(self, &svcctx->long_read_len, val);
|
766
|
+
rb_warning("OCI8.long_read_len= has no effect since ruby-oci8 2.2.7");
|
850
767
|
return val;
|
851
768
|
}
|
852
769
|
|
@@ -889,11 +806,8 @@ static VALUE oci8_break(VALUE self)
|
|
889
806
|
static VALUE oci8_oracle_server_vernum(VALUE self)
|
890
807
|
{
|
891
808
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(self);
|
892
|
-
char buf[100];
|
893
|
-
ub4 version;
|
894
809
|
|
895
|
-
|
896
|
-
return UINT2NUM(version);
|
810
|
+
return UINT2NUM(svcctx->server_version);
|
897
811
|
}
|
898
812
|
|
899
813
|
/*
|
@@ -950,7 +864,7 @@ static VALUE oci8_set_client_identifier(VALUE self, VALUE val)
|
|
950
864
|
if (!NIL_P(val)) {
|
951
865
|
OCI8SafeStringValue(val);
|
952
866
|
ptr = RSTRING_PTR(val);
|
953
|
-
size =
|
867
|
+
size = RSTRING_LENINT(val);
|
954
868
|
} else {
|
955
869
|
ptr = "";
|
956
870
|
size = 0;
|
@@ -985,7 +899,7 @@ static VALUE oci8_set_module(VALUE self, VALUE val)
|
|
985
899
|
if (!NIL_P(val)) {
|
986
900
|
OCI8SafeStringValue(val);
|
987
901
|
ptr = RSTRING_PTR(val);
|
988
|
-
size =
|
902
|
+
size = RSTRING_LENINT(val);
|
989
903
|
} else {
|
990
904
|
ptr = "";
|
991
905
|
size = 0;
|
@@ -1019,7 +933,7 @@ static VALUE oci8_set_action(VALUE self, VALUE val)
|
|
1019
933
|
if (!NIL_P(val)) {
|
1020
934
|
OCI8SafeStringValue(val);
|
1021
935
|
ptr = RSTRING_PTR(val);
|
1022
|
-
size =
|
936
|
+
size = RSTRING_LENINT(val);
|
1023
937
|
} else {
|
1024
938
|
ptr = "";
|
1025
939
|
size = 0;
|
@@ -1050,7 +964,7 @@ static VALUE oci8_set_client_info(VALUE self, VALUE val)
|
|
1050
964
|
if (!NIL_P(val)) {
|
1051
965
|
OCI8SafeStringValue(val);
|
1052
966
|
ptr = RSTRING_PTR(val);
|
1053
|
-
size =
|
967
|
+
size = RSTRING_LENINT(val);
|
1054
968
|
} else {
|
1055
969
|
ptr = "";
|
1056
970
|
size = 0;
|
@@ -1102,7 +1016,6 @@ void Init_oci8(VALUE *out)
|
|
1102
1016
|
rb_define_singleton_method_nodoc(cOCI8, "__set_prop", oci8_s_set_prop, 2);
|
1103
1017
|
rb_define_singleton_method(cOCI8, "error_message", oci8_s_error_message, 1);
|
1104
1018
|
rb_define_private_method(cOCI8, "parse_connect_string", oci8_parse_connect_string, 1);
|
1105
|
-
rb_define_private_method(cOCI8, "logon2", oci8_logon2, 4);
|
1106
1019
|
rb_define_private_method(cOCI8, "allocate_handles", oci8_allocate_handles, 0);
|
1107
1020
|
rb_define_private_method(cOCI8, "server_attach", oci8_server_attach, 2);
|
1108
1021
|
rb_define_private_method(cOCI8, "session_begin", oci8_session_begin, 2);
|
data/ext/oci8/oci8.h
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* oci8.h - part of ruby-oci8
|
4
4
|
*
|
5
|
-
* Copyright (C) 2002-
|
5
|
+
* Copyright (C) 2002-2016 Kubo Takehiro <kubo@jiubao.org>
|
6
6
|
*/
|
7
7
|
#ifndef _RUBY_OCI_H_
|
8
8
|
#define _RUBY_OCI_H_ 1
|
@@ -21,8 +21,23 @@ extern "C"
|
|
21
21
|
}
|
22
22
|
#endif
|
23
23
|
|
24
|
+
/*
|
25
|
+
* Oracle version number format in 32-bit integer.
|
26
|
+
*
|
27
|
+
* Oracle 12c or earier Oracle 18c or later
|
28
|
+
*
|
29
|
+
* hexadecimal -> dotted version number hexadecimal -> dotted version number
|
30
|
+
* 0c102304 -> 12.1.2.3.4 12012034 -> 18.1.2.3.4
|
31
|
+
* ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
|
32
|
+
* 0c ------------' | | | | 2 bytes 12 ------------' | | | | 2 bytes
|
33
|
+
* 1 --------------' | | | 1 byte 01 -------------' | | | 2 bytes
|
34
|
+
* 02 --------------' | | 2 bytes 2 --------------' | | 1 byte
|
35
|
+
* 3 ---------------' | 1 byte 03 --------------' | 2 bytes
|
36
|
+
* 04 ---------------' 2 bytes 4 ---------------' 1 byte
|
37
|
+
*/
|
24
38
|
#define ORAVERNUM(major, minor, update, patch, port_update) \
|
25
|
-
(((major) << 24) | ((minor) <<
|
39
|
+
(((major) >= 18) ? (((major) << 24) | ((minor) << 16) | ((update) << 12) | ((patch) << 4) | (port_update)) \
|
40
|
+
: (((major) << 24) | ((minor) << 20) | ((update) << 12) | ((patch) << 8) | (port_update)))
|
26
41
|
|
27
42
|
#define ORAVER_8_0 ORAVERNUM(8, 0, 0, 0, 0)
|
28
43
|
#define ORAVER_8_1 ORAVERNUM(8, 1, 0, 0, 0)
|
@@ -32,6 +47,7 @@ extern "C"
|
|
32
47
|
#define ORAVER_10_2 ORAVERNUM(10, 2, 0, 0, 0)
|
33
48
|
#define ORAVER_11_1 ORAVERNUM(11, 1, 0, 0, 0)
|
34
49
|
#define ORAVER_12_1 ORAVERNUM(12, 1, 0, 0, 0)
|
50
|
+
#define ORAVER_18 ORAVERNUM(18, 0, 0, 0, 0)
|
35
51
|
|
36
52
|
#include "extconf.h"
|
37
53
|
#include <ruby/encoding.h>
|
@@ -58,38 +74,6 @@ typedef oraub8 ub8;
|
|
58
74
|
typedef orasb8 sb8;
|
59
75
|
#endif /* ORAXB8_DEFINED */
|
60
76
|
|
61
|
-
#ifndef HAVE_TYPE_ORATEXT
|
62
|
-
typedef unsigned char oratext;
|
63
|
-
#endif
|
64
|
-
#if !defined HAVE_TYPE_OCIDATETIME_ && !defined HAVE_TYPE_OCIDATETIMEP
|
65
|
-
typedef struct OCIDateTime OCIDateTime;
|
66
|
-
#endif
|
67
|
-
#if !defined HAVE_TYPE_OCIINTERVAL_ && !defined HAVE_TYPE_OCIINTERVALP
|
68
|
-
typedef struct OCIInterval OCIInterval;
|
69
|
-
#endif
|
70
|
-
#ifndef HAVE_TYPE_OCICALLBACKLOBREAD2
|
71
|
-
typedef sb4 (*OCICallbackLobRead2)(dvoid *ctxp, CONST dvoid *bufp, oraub8 len,
|
72
|
-
ub1 piece, dvoid **changed_bufpp,
|
73
|
-
oraub8 *changed_lenp);
|
74
|
-
#endif
|
75
|
-
#ifndef HAVE_TYPE_OCICALLBACKLOBWRITE2
|
76
|
-
typedef sb4 (*OCICallbackLobWrite2)(dvoid *ctxp, dvoid *bufp, oraub8 *lenp,
|
77
|
-
ub1 *piece, dvoid **changed_bufpp,
|
78
|
-
oraub8 *changed_lenp);
|
79
|
-
#endif
|
80
|
-
#if !defined HAVE_TYPE_OCIADMIN_ && !defined HAVE_TYPE_OCIADMINP
|
81
|
-
typedef struct OCIAdmin OCIAdmin;
|
82
|
-
#endif
|
83
|
-
#if !defined HAVE_TYPE_OCIAUTHINFO_ && !defined HAVE_TYPE_OCIAUTHINFOP
|
84
|
-
typedef struct OCIAuthInfo OCIAuthInfo;
|
85
|
-
#endif
|
86
|
-
#if !defined HAVE_TYPE_OCIMSG_ && !defined HAVE_TYPE_OCIMSGP
|
87
|
-
typedef struct OCIMsg OCIMsg;
|
88
|
-
#endif
|
89
|
-
#if !defined HAVE_TYPE_OCICPOOL_ && !defined HAVE_TYPE_OCICPOOLP
|
90
|
-
typedef struct OCICPool OCICPool;
|
91
|
-
#endif
|
92
|
-
|
93
77
|
#if defined RBX_CAPI_RUBY_H
|
94
78
|
/* rubinius 2.0 */
|
95
79
|
#ifndef HAVE_RB_ENC_STR_BUF_CAT
|
@@ -105,76 +89,9 @@ typedef struct OCICPool OCICPool;
|
|
105
89
|
#endif
|
106
90
|
#endif
|
107
91
|
|
108
|
-
/*
|
109
|
-
* Use TypedData on ruby 1.9.3 and later.
|
110
|
-
*/
|
111
|
-
#ifndef HAVE_RB_DATA_TYPE_T_FUNCTION
|
112
|
-
|
113
|
-
/*
|
114
|
-
* Don't use TypedData even though ruby 1.9.2 has it because the
|
115
|
-
* definitions are slightly different from ruby 1.9.3 and later.
|
116
|
-
*/
|
117
|
-
#define rb_data_type_t oci8_data_type_t
|
118
|
-
#undef TypedData_Make_Struct
|
119
|
-
#undef TypedData_Wrap_Struct
|
120
|
-
#undef TypedData_Get_Struct
|
121
|
-
#undef RTYPEDDATA_DATA
|
122
|
-
#undef RUBY_DEFAULT_FREE
|
123
|
-
|
124
|
-
/*
|
125
|
-
* To pass compilation on ruby 1.9.2 and earlier.
|
126
|
-
*/
|
127
|
-
typedef struct oci8_data_type_struct rb_data_type_t;
|
128
|
-
struct oci8_data_type_struct {
|
129
|
-
const char *wrap_struct_name;
|
130
|
-
struct {
|
131
|
-
void (*dmark)(void*);
|
132
|
-
void (*dfree)(void*);
|
133
|
-
size_t (*dsize)(const void *);
|
134
|
-
} function;
|
135
|
-
const rb_data_type_t *parent;
|
136
|
-
void *data;
|
137
|
-
};
|
138
|
-
#define TypedData_Make_Struct(klass, type, data_type, sval) \
|
139
|
-
Data_Make_Struct((klass), type, (data_type)->function.dmark, (data_type)->function.dfree, (sval))
|
140
|
-
#define TypedData_Wrap_Struct(klass, data_type, sval) \
|
141
|
-
Data_Wrap_Struct((klass), (data_type)->function.dmark, (data_type)->function.dfree, (sval))
|
142
|
-
#define TypedData_Get_Struct(obj, type, data_type, sval) \
|
143
|
-
Data_Get_Struct((obj), type, (sval))
|
144
|
-
#define RTYPEDDATA_DATA(obj) DATA_PTR(obj)
|
145
|
-
#define RUBY_DEFAULT_FREE xfree
|
146
|
-
#endif
|
147
|
-
|
148
|
-
/* a new function in ruby 1.9.3.
|
149
|
-
* define a compatible macro for ruby 1.9.2 or lower.
|
150
|
-
*/
|
151
|
-
#ifndef HAVE_RB_CLASS_SUPERCLASS
|
152
|
-
#ifdef RCLASS_SUPER
|
153
|
-
#define rb_class_superclass(cls) RCLASS_SUPER(cls)
|
154
|
-
#else
|
155
|
-
#define rb_class_superclass(cls) (RCLASS(cls)->super)
|
156
|
-
#endif
|
157
|
-
#endif
|
158
|
-
|
159
|
-
/* new macros in ruby 2.1.0
|
160
|
-
*/
|
161
|
-
#ifndef RARRAY_AREF
|
162
|
-
#define RARRAY_AREF(a, i) (RARRAY_PTR(a)[i])
|
163
|
-
#endif
|
164
|
-
#ifndef RARRAY_CONST_PTR
|
165
|
-
#define RARRAY_CONST_PTR(a) RARRAY_PTR(a)
|
166
|
-
#endif
|
167
|
-
#ifndef RB_OBJ_WRITE
|
168
|
-
#define RB_OBJ_WRITE(a, slot, b) do {*(slot) = (b);} while (0)
|
169
|
-
#endif
|
170
|
-
#ifndef RB_OBJ_WRITTEN
|
171
|
-
#define RB_OBJ_WRITTEN(a, oldv, b) do {(void)oldv;} while (0)
|
172
|
-
#endif
|
173
|
-
|
174
92
|
/* macros depends on the compiler.
|
175
93
|
* LIKELY(x) hint for the compiler that 'x' is 1(TRUE) in many cases.
|
176
94
|
* UNLIKELY(x) hint for the compiler that 'x' is 0(FALSE) in many cases.
|
177
|
-
* ALWAYS_INLINE forcely inline the function.
|
178
95
|
*/
|
179
96
|
#if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
|
180
97
|
/* gcc version >= 2.96 */
|
@@ -185,14 +102,6 @@ struct oci8_data_type_struct {
|
|
185
102
|
#define LIKELY(x) (x)
|
186
103
|
#define UNLIKELY(x) (x)
|
187
104
|
#endif
|
188
|
-
#if defined(__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
|
189
|
-
/* gcc version >= 3.1 */
|
190
|
-
#define ALWAYS_INLINE inline __attribute__((always_inline))
|
191
|
-
#endif
|
192
|
-
#ifdef _MSC_VER
|
193
|
-
/* microsoft c */
|
194
|
-
#define ALWAYS_INLINE __forceinline
|
195
|
-
#endif
|
196
105
|
|
197
106
|
/* macros to access thread-local storage.
|
198
107
|
*
|
@@ -218,27 +127,24 @@ struct oci8_data_type_struct {
|
|
218
127
|
/* utility macros
|
219
128
|
*/
|
220
129
|
#define IS_OCI_ERROR(v) (((v) != OCI_SUCCESS) && ((v) != OCI_SUCCESS_WITH_INFO))
|
221
|
-
#ifdef ALWAYS_INLINE
|
222
130
|
#define TO_ORATEXT to_oratext
|
223
131
|
#define TO_CONST_ORATEXT to_const_oratext
|
224
132
|
#define TO_CHARPTR to_charptr
|
225
|
-
static
|
133
|
+
ALWAYS_INLINE(static OraText *to_oratext(char *c));
|
134
|
+
static inline OraText *to_oratext(char *c)
|
226
135
|
{
|
227
136
|
return (OraText*)c;
|
228
137
|
}
|
229
|
-
static
|
138
|
+
ALWAYS_INLINE(static const OraText *to_const_oratext(const char *c));
|
139
|
+
static inline const OraText *to_const_oratext(const char *c)
|
230
140
|
{
|
231
141
|
return (const OraText*)c;
|
232
142
|
}
|
233
|
-
static
|
143
|
+
ALWAYS_INLINE(static char *to_charptr(OraText *c));
|
144
|
+
static inline char *to_charptr(OraText *c)
|
234
145
|
{
|
235
146
|
return (char*)c;
|
236
147
|
}
|
237
|
-
#else
|
238
|
-
#define TO_ORATEXT(c) ((OraText*)(c))
|
239
|
-
#define TO_CONST_ORATEXT(c) ((const OraText*)(c))
|
240
|
-
#define TO_CHARPTR(c) ((char*)(c))
|
241
|
-
#endif
|
242
148
|
#define RSTRING_ORATEXT(obj) TO_ORATEXT(RSTRING_PTR(obj))
|
243
149
|
#define rb_str_new2_ora(str) rb_str_new2(TO_CHARPTR(str))
|
244
150
|
|
@@ -344,6 +250,7 @@ typedef struct oci8_svcctx {
|
|
344
250
|
const oci8_logoff_strategy_t *logoff_strategy;
|
345
251
|
OCISession *usrhp;
|
346
252
|
OCIServer *srvhp;
|
253
|
+
ub4 server_version;
|
347
254
|
rb_pid_t pid;
|
348
255
|
unsigned char state;
|
349
256
|
char is_autocommit;
|
@@ -368,7 +275,8 @@ typedef struct {
|
|
368
275
|
} oci8_exec_sql_var_t;
|
369
276
|
|
370
277
|
#define oci8_raise(err, status, stmt) oci8_do_raise(err, status, stmt, __FILE__, __LINE__)
|
371
|
-
#define oci8_env_raise(
|
278
|
+
#define oci8_env_raise(env, status) oci8_do_env_raise(env, status, 0, __FILE__, __LINE__)
|
279
|
+
#define oci8_env_free_and_raise(env, status) oci8_do_env_raise(env, status, 1, __FILE__, __LINE__)
|
372
280
|
#define oci8_raise_init_error() oci8_do_raise_init_error(__FILE__, __LINE__)
|
373
281
|
#define oci8_raise_by_msgno(msgno, default_msg) oci8_do_raise_by_msgno(msgno, default_msg, __FILE__, __LINE__)
|
374
282
|
|
@@ -392,7 +300,7 @@ OCIEnv *oci8_make_envhp(void);
|
|
392
300
|
extern oci8_tls_key_t oci8_tls_key; /* native thread key */
|
393
301
|
OCIError *oci8_make_errhp(void);
|
394
302
|
|
395
|
-
static inline OCIError *oci8_get_errhp()
|
303
|
+
static inline OCIError *oci8_get_errhp(void)
|
396
304
|
{
|
397
305
|
OCIError *errhp = (OCIError *)oci8_tls_get(oci8_tls_key);
|
398
306
|
return LIKELY(errhp != NULL) ? errhp : oci8_make_errhp();
|
@@ -434,7 +342,8 @@ void *oci8_check_typeddata(VALUE obj, const oci8_handle_data_type_t *data_type,
|
|
434
342
|
extern VALUE eOCIException;
|
435
343
|
extern VALUE eOCIBreak;
|
436
344
|
void Init_oci8_error(void);
|
437
|
-
NORETURN(void
|
345
|
+
NORETURN(void oci8_do_raise(OCIError *errhp, sword status, OCIStmt *stmthp, const char *file, int line));
|
346
|
+
NORETURN(void oci8_do_env_raise(OCIEnv *envhp, sword status, int free_envhp, const char *file, int line));
|
438
347
|
NORETURN(void oci8_do_raise_init_error(const char *file, int line));
|
439
348
|
sb4 oci8_get_error_code(OCIError *errhp);
|
440
349
|
VALUE oci8_get_error_message(ub4 msgno, const char *default_msg);
|
@@ -474,6 +383,7 @@ void Init_oci8_bind(VALUE cOCI8BindTypeBase);
|
|
474
383
|
|
475
384
|
/* metadata.c */
|
476
385
|
extern const oci8_handle_data_type_t oci8_metadata_base_data_type;
|
386
|
+
VALUE oci8_do_describe(VALUE self, void *objptr, ub4 objlen, ub1 objtype, VALUE klass, VALUE check_public);
|
477
387
|
void Init_oci8_metadata(VALUE cOCI8);
|
478
388
|
VALUE oci8_metadata_create(OCIParam *parmhp, VALUE svc, VALUE parent);
|
479
389
|
|
@@ -515,8 +425,8 @@ OCINumber *oci8_dbl_to_onum(OCINumber *result, double dbl, OCIError *errhp);
|
|
515
425
|
void Init_oci_datetime(void);
|
516
426
|
VALUE oci8_make_ocidate(OCIDate *od);
|
517
427
|
OCIDate *oci8_set_ocidate(OCIDate *od, VALUE val);
|
518
|
-
VALUE
|
519
|
-
OCIDateTime *
|
428
|
+
VALUE oci8_make_ocitimestamp(OCIDateTime *dttm, boolean have_tz);
|
429
|
+
OCIDateTime *oci8_set_ocitimestamp_tz(OCIDateTime *dttm, VALUE val, VALUE svc);
|
520
430
|
VALUE oci8_make_interval_ym(OCIInterval *s);
|
521
431
|
VALUE oci8_make_interval_ds(OCIInterval *s);
|
522
432
|
|
@@ -541,6 +451,13 @@ void Init_oci8_win32(VALUE cOCI8);
|
|
541
451
|
/* hook_funcs.c */
|
542
452
|
void oci8_install_hook_functions(void);
|
543
453
|
void oci8_shutdown_sockets(void);
|
454
|
+
#ifdef HAVE_PLTHOOK
|
455
|
+
extern int oci8_cancel_read_at_exit;
|
456
|
+
extern int oci8_tcp_keepalive_time;
|
457
|
+
#else
|
458
|
+
#define oci8_cancel_read_at_exit (-1)
|
459
|
+
#define oci8_tcp_keepalive_time (-1)
|
460
|
+
#endif
|
544
461
|
|
545
462
|
#define OCI8StringValue(v) do { \
|
546
463
|
StringValue(v); \
|