ruby-oci8 2.2.3 → 2.2.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/ChangeLog +427 -0
  3. data/NEWS +335 -42
  4. data/README.md +20 -9
  5. data/dist-files +9 -3
  6. data/docs/bind-array-to-in_cond.md +2 -2
  7. data/docs/conflicts-local-connections-and-processes.md +7 -4
  8. data/docs/hanging-after-inactivity.md +63 -0
  9. data/docs/install-binary-package.md +15 -11
  10. data/docs/install-full-client.md +18 -21
  11. data/docs/install-instant-client.md +45 -27
  12. data/docs/install-on-osx.md +31 -120
  13. data/docs/ldap-auth-and-function-interposition.md +123 -0
  14. data/docs/number-type-mapping.md +79 -0
  15. data/docs/platform-specific-issues.md +17 -50
  16. data/docs/report-installation-issue.md +3 -0
  17. data/docs/timeout-parameters.md +3 -0
  18. data/ext/oci8/apiwrap.c.tmpl +2 -5
  19. data/ext/oci8/apiwrap.rb +6 -1
  20. data/ext/oci8/apiwrap.yml +34 -22
  21. data/ext/oci8/attr.c +4 -2
  22. data/ext/oci8/bind.c +366 -6
  23. data/ext/oci8/connection_pool.c +3 -3
  24. data/ext/oci8/encoding.c +5 -5
  25. data/ext/oci8/env.c +8 -2
  26. data/ext/oci8/error.c +24 -16
  27. data/ext/oci8/extconf.rb +8 -4
  28. data/ext/oci8/hook_funcs.c +274 -61
  29. data/ext/oci8/lob.c +31 -75
  30. data/ext/oci8/metadata.c +2 -2
  31. data/ext/oci8/object.c +72 -27
  32. data/ext/oci8/oci8.c +45 -132
  33. data/ext/oci8/oci8.h +32 -88
  34. data/ext/oci8/oci8lib.c +178 -38
  35. data/ext/oci8/ocihandle.c +37 -37
  36. data/ext/oci8/ocinumber.c +23 -18
  37. data/ext/oci8/oraconf.rb +158 -339
  38. data/ext/oci8/oradate.c +19 -19
  39. data/ext/oci8/plthook.h +10 -0
  40. data/ext/oci8/plthook_elf.c +433 -268
  41. data/ext/oci8/plthook_osx.c +40 -9
  42. data/ext/oci8/plthook_win32.c +9 -0
  43. data/ext/oci8/stmt.c +52 -17
  44. data/ext/oci8/win32.c +4 -22
  45. data/lib/oci8/bindtype.rb +1 -15
  46. data/lib/oci8/check_load_error.rb +57 -10
  47. data/lib/oci8/cursor.rb +57 -25
  48. data/lib/oci8/metadata.rb +9 -1
  49. data/lib/oci8/object.rb +10 -0
  50. data/lib/oci8/oci8.rb +33 -28
  51. data/lib/oci8/oracle_version.rb +11 -1
  52. data/lib/oci8/properties.rb +22 -0
  53. data/lib/oci8/version.rb +1 -1
  54. data/lib/oci8.rb +48 -4
  55. data/lib/ruby-oci8.rb +0 -3
  56. data/pre-distclean.rb +1 -3
  57. data/ruby-oci8.gemspec +3 -8
  58. data/setup.rb +11 -2
  59. data/test/README.md +37 -0
  60. data/test/config.rb +1 -1
  61. data/test/setup_test_object.sql +21 -13
  62. data/test/setup_test_package.sql +59 -0
  63. data/test/test_all.rb +2 -0
  64. data/test/test_bind_boolean.rb +99 -0
  65. data/test/test_bind_integer.rb +47 -0
  66. data/test/test_break.rb +11 -9
  67. data/test/test_clob.rb +4 -16
  68. data/test/test_connstr.rb +29 -13
  69. data/test/test_datetime.rb +8 -3
  70. data/test/test_object.rb +27 -9
  71. data/test/test_oci8.rb +170 -46
  72. data/test/test_oranumber.rb +12 -6
  73. data/test/test_package_type.rb +15 -3
  74. data/test/test_properties.rb +17 -0
  75. metadata +40 -54
  76. data/docs/osx-install-dev-tools.png +0 -0
  77. data/test/README +0 -42
data/ext/oci8/object.c CHANGED
@@ -44,6 +44,8 @@ enum {
44
44
  ATTR_FLOAT,
45
45
  ATTR_INTEGER,
46
46
  ATTR_OCIDATE,
47
+ ATTR_TIMESTAMP,
48
+ ATTR_TIMESTAMP_TZ,
47
49
  ATTR_BINARY_DOUBLE,
48
50
  ATTR_BINARY_FLOAT,
49
51
  ATTR_NAMED_TYPE,
@@ -235,6 +237,10 @@ static VALUE get_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *dat
235
237
  return oci8_make_integer((OCINumber *)data, oci8_errhp);
236
238
  case ATTR_OCIDATE:
237
239
  return oci8_make_ocidate((OCIDate *)data);
240
+ case ATTR_TIMESTAMP:
241
+ return oci8_make_ocitimestamp(*(OCIDateTime**)data, FALSE);
242
+ case ATTR_TIMESTAMP_TZ:
243
+ return oci8_make_ocitimestamp(*(OCIDateTime**)data, TRUE);
238
244
  case ATTR_BINARY_DOUBLE:
239
245
  return rb_float_new(*(double*)data);
240
246
  case ATTR_BINARY_FLOAT:
@@ -413,6 +419,18 @@ static VALUE oci8_named_coll_set_coll_element(VALUE self, VALUE datatype, VALUE
413
419
  case ATTR_OCIDATE:
414
420
  cb_data.indp = &cb_data.ind;
415
421
  break;
422
+ case ATTR_TIMESTAMP:
423
+ chker2(OCIObjectNew(oci8_envhp, oci8_errhp, svcctx->hp.svc, OCI_TYPECODE_TIMESTAMP, NULL, NULL, OCI_DURATION_SESSION, TRUE, &cb_data.data.ptr),
424
+ svcctx);
425
+ chker2(OCIObjectGetInd(oci8_envhp, oci8_errhp, cb_data.data.ptr, (dvoid**)&cb_data.indp),
426
+ svcctx);
427
+ break;
428
+ case ATTR_TIMESTAMP_TZ:
429
+ chker2(OCIObjectNew(oci8_envhp, oci8_errhp, svcctx->hp.svc, OCI_TYPECODE_TIMESTAMP_TZ, NULL, NULL, OCI_DURATION_SESSION, TRUE, &cb_data.data.ptr),
430
+ svcctx);
431
+ chker2(OCIObjectGetInd(oci8_envhp, oci8_errhp, cb_data.data.ptr, (dvoid**)&cb_data.indp),
432
+ svcctx);
433
+ break;
416
434
  case ATTR_BINARY_DOUBLE:
417
435
  cb_data.data.dbl = 0.0;
418
436
  cb_data.indp = &cb_data.ind;
@@ -467,7 +485,7 @@ static VALUE set_coll_element_func(set_coll_element_cb_data_t *cb_data)
467
485
 
468
486
  chkerr(OCICollSize(oci8_envhp, oci8_errhp, coll, &size));
469
487
  if (RARRAY_LEN(val) < size) {
470
- chkerr(OCICollTrim(oci8_envhp, oci8_errhp, size - RARRAY_LEN(val), coll));
488
+ chkerr(OCICollTrim(oci8_envhp, oci8_errhp, (sb4)(size - RARRAY_LEN(val)), coll));
471
489
  }
472
490
  for (idx = 0; idx < RARRAY_LEN(val); idx++) {
473
491
  switch (FIX2INT(datatype)) {
@@ -507,6 +525,8 @@ static VALUE set_coll_element_ensure(set_coll_element_cb_data_t *cb_data)
507
525
  switch (FIX2INT(datatype)) {
508
526
  case ATTR_STRING:
509
527
  case ATTR_RAW:
528
+ case ATTR_TIMESTAMP:
529
+ case ATTR_TIMESTAMP_TZ:
510
530
  case ATTR_NAMED_TYPE:
511
531
  case ATTR_NAMED_COLLECTION:
512
532
  if (cb_data->data.ptr != NULL) {
@@ -539,13 +559,13 @@ static void set_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *data
539
559
  case ATTR_STRING:
540
560
  OCI8StringValue(val);
541
561
  chkerr(OCIStringAssignText(oci8_envhp, oci8_errhp,
542
- RSTRING_ORATEXT(val), RSTRING_LEN(val),
562
+ RSTRING_ORATEXT(val), RSTRING_LENINT(val),
543
563
  (OCIString **)data));
544
564
  break;
545
565
  case ATTR_RAW:
546
566
  StringValue(val);
547
567
  chkerr(OCIRawAssignBytes(oci8_envhp, oci8_errhp,
548
- RSTRING_ORATEXT(val), RSTRING_LEN(val),
568
+ RSTRING_ORATEXT(val), RSTRING_LENINT(val),
549
569
  (OCIRaw **)data));
550
570
  break;
551
571
  case ATTR_OCINUMBER:
@@ -558,6 +578,12 @@ static void set_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *data
558
578
  case ATTR_OCIDATE:
559
579
  oci8_set_ocidate((OCIDate*)data, val);
560
580
  break;
581
+ case ATTR_TIMESTAMP:
582
+ oci8_set_ocitimestamp_tz(*(OCIDateTime **)data, val, Qnil);
583
+ break;
584
+ case ATTR_TIMESTAMP_TZ:
585
+ oci8_set_ocitimestamp_tz(*(OCIDateTime **)data, val, Qnil);
586
+ break;
561
587
  case ATTR_BINARY_DOUBLE:
562
588
  *(double*)data = NUM2DBL(val);
563
589
  break;
@@ -654,45 +680,57 @@ static VALUE oci8_named_collection_alloc(VALUE klass)
654
680
  return oci8_allocate_typeddata(klass, &oci8_named_collection_data_type);
655
681
  }
656
682
 
683
+ typedef struct {
684
+ oci8_bind_t bind;
685
+ VALUE *obj;
686
+ } bind_named_type_t;
687
+
657
688
  static void bind_named_type_mark(oci8_base_t *base)
658
689
  {
659
- oci8_bind_t *obind = (oci8_bind_t *)base;
660
- oci8_hp_obj_t *oho = (oci8_hp_obj_t *)obind->valuep;
690
+ bind_named_type_t *bnt = (bind_named_type_t *)base;
661
691
 
662
- if (oho != NULL) {
692
+ if (bnt->obj != NULL) {
663
693
  ub4 idx = 0;
664
694
 
665
695
  do {
666
- rb_gc_mark(oho[idx].obj);
667
- } while (++idx < obind->maxar_sz);
696
+ rb_gc_mark(bnt->obj[idx]);
697
+ } while (++idx < bnt->bind.maxar_sz);
668
698
  }
669
- rb_gc_mark(obind->tdo);
699
+ rb_gc_mark(bnt->bind.tdo);
670
700
  }
671
701
 
672
702
  static void bind_named_type_free(oci8_base_t *base)
673
703
  {
674
- oci8_bind_t *obind = (oci8_bind_t *)base;
675
- oci8_hp_obj_t *oho = (oci8_hp_obj_t *)obind->valuep;
704
+ bind_named_type_t *bnt = (bind_named_type_t *)base;
705
+ void **hp = (void **)bnt->bind.valuep;
676
706
 
677
- if (oho != NULL) {
707
+ if (hp != NULL) {
678
708
  ub4 idx = 0;
679
709
 
680
710
  do {
681
- if (oho[idx].hp != NULL) {
682
- OCIObjectFree(oci8_envhp, oci8_errhp, oho[idx].hp, OCI_DEFAULT);
683
- oho[idx].hp = NULL;
711
+ if (hp[idx] != NULL) {
712
+ OCIObjectFree(oci8_envhp, oci8_errhp, hp[idx], OCI_DEFAULT);
713
+ hp[idx] = NULL;
684
714
  }
685
- } while (++idx < obind->maxar_sz);
715
+ } while (++idx < bnt->bind.maxar_sz);
716
+ }
717
+ if (bnt->obj != NULL) {
718
+ xfree(bnt->obj);
719
+ bnt->obj = NULL;
686
720
  }
687
721
  oci8_bind_free(base);
688
722
  }
689
723
 
690
724
  static VALUE bind_named_type_get(oci8_bind_t *obind, void *data, void *null_struct)
691
725
  {
692
- oci8_hp_obj_t *oho = (oci8_hp_obj_t *)data;
693
- return oho->obj;
726
+ bind_named_type_t *bnt = (bind_named_type_t *)obind;
727
+ ub4 idx = obind->curar_idx;
728
+
729
+ return bnt->obj[idx];
694
730
  }
695
731
 
732
+ NORETURN(static void bind_named_type_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val));
733
+
696
734
  static void bind_named_type_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
697
735
  {
698
736
  rb_raise(rb_eRuntimeError, "not supported");
@@ -700,10 +738,12 @@ static void bind_named_type_set(oci8_bind_t *obind, void *data, void **null_stru
700
738
 
701
739
  static void bind_named_type_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE length)
702
740
  {
741
+ bind_named_type_t *bnt = (bind_named_type_t *)obind;
703
742
  VALUE tdo_obj = length;
704
743
 
705
744
  obind->value_sz = sizeof(void*);
706
- obind->alloc_sz = sizeof(oci8_hp_obj_t);
745
+ obind->alloc_sz = sizeof(void*);
746
+ bnt->obj = xcalloc(sizeof(VALUE), obind->maxar_sz ? obind->maxar_sz : 1);
707
747
 
708
748
  CHECK_TDO(tdo_obj);
709
749
  RB_OBJ_WRITE(obind->base.self, &obind->tdo, tdo_obj);
@@ -711,7 +751,8 @@ static void bind_named_type_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE
711
751
 
712
752
  static void bind_named_type_init_elem(oci8_bind_t *obind, VALUE svc)
713
753
  {
714
- oci8_hp_obj_t *oho = (oci8_hp_obj_t *)obind->valuep;
754
+ bind_named_type_t *bnt = (bind_named_type_t *)obind;
755
+ void **hp = (void **)obind->valuep;
715
756
  oci8_base_t *tdo = DATA_PTR(obind->tdo);
716
757
  OCITypeCode tc = OCITypeTypeCode(oci8_envhp, oci8_errhp, tdo->hp.tdo);
717
758
  VALUE klass = Qnil;
@@ -729,14 +770,14 @@ static void bind_named_type_init_elem(oci8_bind_t *obind, VALUE svc)
729
770
  }
730
771
  svcctx = oci8_get_svcctx(svc);
731
772
  do {
732
- oho[idx].obj = rb_class_new_instance(0, NULL, klass);
733
- RB_OBJ_WRITTEN(obind->base.self, Qundef, oho[idx].obj);
734
- obj = DATA_PTR(oho[idx].obj);
735
- RB_OBJ_WRITE(oho[idx].obj, &obj->tdo, obind->tdo);
736
- obj->instancep = (char**)&oho[idx].hp;
773
+ bnt->obj[idx] = rb_class_new_instance(0, NULL, klass);
774
+ RB_OBJ_WRITTEN(obind->base.self, Qundef, bnt->obj[idx]);
775
+ obj = DATA_PTR(bnt->obj[idx]);
776
+ RB_OBJ_WRITE(bnt->obj[idx], &obj->tdo, obind->tdo);
777
+ obj->instancep = (char**)&hp[idx];
737
778
  obj->null_structp = (char**)&obind->u.null_structs[idx];
738
779
  oci8_link_to_parent(&obj->base, &obind->base);
739
- RB_OBJ_WRITTEN(oho[idx].obj, Qundef, obind->base.self);
780
+ RB_OBJ_WRITTEN(bnt->obj[idx], Qundef, obind->base.self);
740
781
 
741
782
  chker2(OCIObjectNew(oci8_envhp, oci8_errhp, svcctx->base.hp.svc, tc, tdo->hp.tdo, NULL, OCI_DURATION_SESSION, TRUE, (dvoid**)obj->instancep),
742
783
  &svcctx->base);
@@ -778,7 +819,7 @@ static const oci8_bind_data_type_t bind_named_type_data_type = {
778
819
  #endif
779
820
  },
780
821
  bind_named_type_free,
781
- sizeof(oci8_bind_t)
822
+ sizeof(bind_named_type_t)
782
823
  },
783
824
  bind_named_type_get,
784
825
  bind_named_type_set,
@@ -818,6 +859,10 @@ void Init_oci_object(VALUE cOCI8)
818
859
  /* @private */
819
860
  rb_define_const(cOCI8TDO, "ATTR_OCIDATE", INT2FIX(ATTR_OCIDATE));
820
861
  /* @private */
862
+ rb_define_const(cOCI8TDO, "ATTR_TIMESTAMP", INT2FIX(ATTR_TIMESTAMP));
863
+ /* @private */
864
+ rb_define_const(cOCI8TDO, "ATTR_TIMESTAMP_TZ", INT2FIX(ATTR_TIMESTAMP_TZ));
865
+ /* @private */
821
866
  rb_define_const(cOCI8TDO, "ATTR_BINARY_DOUBLE", INT2FIX(ATTR_BINARY_DOUBLE));
822
867
  /* @private */
823
868
  rb_define_const(cOCI8TDO, "ATTR_BINARY_FLOAT", INT2FIX(ATTR_BINARY_FLOAT));
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-2015 Kubo Takehiro <kubo@jiubao.org>
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 [Fixnum] key 1, 2 or 3
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 [Fixnum] key 1, 2 or 3
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
- if (!hook_functions_installed) {
336
- oci8_install_hook_functions();
337
- hook_functions_installed = 1;
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
- #else
340
- rb_raise(rb_eNotImpError, ":cancel_read_at_exit isn't implemented on this machine.");
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 [Fixnum] message_no Oracle error message number
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)
@@ -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 : RSTRING_LEN(dbname),
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 [Fixnum] cred
672
- * @param [Fixnum] mode
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
- * Gets the maximum length in bytes to fetch a LONG or LONG RAW
819
- * column. The default value is 65535.
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
- * Sets the maximum length in bytes to fetch a LONG or LONG RAW
840
- * column.
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
- chker2(OCIServerRelease(svcctx->base.hp.ptr, oci8_errhp, (text*)buf, sizeof(buf), (ub1)svcctx->base.type, &version), &svcctx->base);
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 = RSTRING_LEN(val);
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 = RSTRING_LEN(val);
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 = RSTRING_LEN(val);
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 = RSTRING_LEN(val);
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);