ruby-oci8 2.2.9 → 2.2.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c25848b0ead77aa10db38b21ed417f2ed1c698aaf62c2b48b7674b6b3062e34
4
- data.tar.gz: 8729938e91275ed0b9c21c6d3812020efa2e1e5c6da8be7c94abd36fcf71d4ef
3
+ metadata.gz: 4ca16dcc5691bc79740b2b6e308315d013c3f482f991325f70a129a7cf34de0c
4
+ data.tar.gz: c953f017dab68ed7c2a3934ec29b7312c401516a04b44d32f53c83b0015988b9
5
5
  SHA512:
6
- metadata.gz: 07dab83e782e02de48aa1f0f1e89ed52e17a4393a29ab17ce1443b84529d0c0b8aa3fad6c2a787cdd20fde55d3a9e9458de9aca72128479612b5f067c8bac83e
7
- data.tar.gz: 63feed97f0d6aedff09e5a283cd5c65a25091bc16c77e36971b864695a1f5ec602b278aad8bc32fc91c79f92a8e5c30c3040ae35b69c6d1e59cbc29b5beb895e
6
+ metadata.gz: 3c54d89e2b858e9dcd874d3f9351c707443d1171154c1d9145f3ddd0931e3168809fc3e91ef1cbc1dca2e6b4e699e5eb2e5d05a7e320cfb0926359a71ff9b3d9
7
+ data.tar.gz: 611469d0047283c54b7110090bcd9e45a677c3afaba9f6b1c6c4efbaca8afd3092ee1b871d28149459fa82f52f12e36d71bae6cb99e37be0c5ecb148ae300ead
data/NEWS CHANGED
@@ -1,5 +1,20 @@
1
1
  # @markup markdown
2
2
 
3
+ 2.2.10 (2022-01-12)
4
+ ===================
5
+
6
+ - Use `File.exist?` instead of removed `File.exists?` in Ruby 3.2 (GH-242)
7
+
8
+ (contributed by Yasuo Honda)
9
+
10
+ - Support ruby 3.1 distributed by rubyinstaller.org
11
+
12
+ - Remove code for obsolete platforms
13
+ - Ruby compiled by Borland C++
14
+ - macOS released several years ago
15
+
16
+ - Detect arm64 macOS shared library in oraconf.rb in preparation for Instant Client for Apple Silicon release.
17
+
3
18
  2.2.9 (2020-12-30)
4
19
  ==================
5
20
 
data/README.md CHANGED
@@ -2,7 +2,7 @@ Ruby-oci8
2
2
  =========
3
3
 
4
4
  [![Gem Version](https://badge.fury.io/rb/ruby-oci8.svg)](http://badge.fury.io/rb/ruby-oci8)
5
- [![Build Status](https://travis-ci.com/kubo/ruby-oci8.svg?branch=master)](https://travis-ci.com/kubo/ruby-oci8)
5
+ [![Tests](https://github.com/kubo/ruby-oci8/actions/workflows/tests.yml/badge.svg)](https://github.com/kubo/ruby-oci8/actions/workflows/tests.yml)
6
6
 
7
7
  What is ruby-oci8
8
8
  -----------------
data/dist-files CHANGED
@@ -19,7 +19,6 @@ docs/install-instant-client.md
19
19
  docs/install-on-osx.md
20
20
  docs/ldap-auth-and-function-interposition.md
21
21
  docs/number-type-mapping.md
22
- docs/osx-install-dev-tools.png
23
22
  docs/platform-specific-issues.md
24
23
  docs/report-installation-issue.md
25
24
  docs/timeout-parameters.md
@@ -1,133 +1,46 @@
1
- # @title Install ruby-oci8 on OS X
1
+ # @title Install ruby-oci8 on macOS
2
2
 
3
- Install ruby-oci8 on OS X
3
+ Install ruby-oci8 on macOS
4
4
  =========================
5
5
 
6
- This page explains the way to install ruby-oci8 os OS X.
6
+ **Note: Ruby-oci8 doesn't run on Apple Silicon because Oracle instant client
7
+ for Apple Silicon has not been released yet.**
7
8
 
8
- Look at {file:docs/install-full-client.md}, {file:docs/install-instant-client.md}
9
- or {file:docs/install-binary-package.md} for other platforms.
10
-
11
- Install C compiler
12
- ------------------
13
-
14
- You need to install the command line developer tools or the Xcode.
15
- (The latter includes the former.)
16
-
17
- Run `"cc --version"` in a terminal to check whether they are installed.
18
-
19
- If the cc version is printed, the tools are installed.
20
-
21
- If the follwoing dialog is displayed, click its Install button to
22
- install the tools.
23
- You have no need to install the Xcode to compile ruby-oci8.
24
- It requires command line tools, not an IDE such as the Xcode.
25
-
26
- ![dialog](osx-install-dev-tools.png)
9
+ Prerequisite
10
+ ------------
27
11
 
28
- If `"Agreeing to the Xcode/iOS license requires admin privileges,
29
- please re-run as root via sudo."` is printed, you need to run
30
- `"sudo cc --version"`, enter your password, look at the license
31
- and type `"agree"`.
12
+ * Command line tools for Xcode or Xcode (by executing `xcode-select --install`) or [Xcode]
32
13
 
33
14
  Install Oracle Instant Client Packages
34
15
  --------------------------------------
35
16
 
36
- ### Download Oracle Instant Client Packages
37
-
38
- Download the following packages from [Oracle Technology Network][]
39
-
40
- * Instant Client Package - Basic (`instantclient-basic-macos.x64-12.1.0.2.0.zip`) or Basic Lite (`instantclient-basiclite-macos.x64-12.1.0.2.0.zip`)
41
- * Instant Client Package - SDK (`instantclient-sdk-macos.x64-12.1.0.2.0.zip`)
42
- * Instant Client Package - SQL*Plus (`instantclient-sqlplus-macos.x64-12.1.0.2.0.zip`) (optionally)
43
-
44
- ### Install Oracle Instant Client Packages via Homebrew
45
-
46
- To install `Oracle Instant Client Basic` via [Homebrew][]
47
-
48
- * Copy downloaded zip files to `/Library/Caches/Homebrew`
49
- (if the environment variable `HOMEBREW_CACHE`
50
- is not set and `$HOME/Library/Caches/Homebrew` doesn't exist.)
51
-
52
- * Run the followining commands:
53
-
54
- brew tap InstantClientTap/instantclient
55
- brew install instantclient-basic
56
- brew install instantclient-sdk
57
- brew install instantclient-sqlplus # (optionally)
58
-
59
- * Set the environment variable `OCI_DIR` while performing the following installation steps
60
- if Homebrew is installed outside `/usr/local`.
61
-
62
- export OCI_DIR=$(brew --prefix)/lib
63
-
64
- To install `Oracle Instant Client Basic Lite` via [Homebrew][]
65
-
66
- * Copy downloaded zip files to `/Library/Caches/Homebrew`
67
- (if the environment variable `HOMEBREW_CACHE`
68
- is not set and `$HOME/Library/Caches/Homebrew` doesn't exist.)
69
-
70
- * Run the followining commands:
71
-
72
- brew tap InstantClientTap/instantclient
73
- brew install instantclient-basiclite
74
- brew install instantclient-sdk
75
- brew install instantclient-sqlplus --with-basiclite # (optionally)
76
-
77
- * Set the environment variable `OCI_DIR` while performing the following installation steps
78
- if Homebrew is installed outside `/usr/local`.
79
-
80
- export OCI_DIR=$(brew --prefix)/lib
81
-
82
- ### Install Oracle Instant Client Manually
83
-
84
- If you don't use [Homebrew][], do the following:
85
-
86
- Unzip the packages as follows:
87
-
88
- mkdir -p /opt/oracle
89
- cd /opt/oracle
90
-
91
- Copy downloaded files to /opt/oracle before running the following commands.
92
-
93
- unzip instantclient-basic-macos.x64-12.1.0.2.0.zip
94
- unzip instantclient-sdk-macos.x64-12.1.0.2.0.zip
95
- unzip instantclient-sqlplus-macos.x64-12.1.0.2.0.zip
96
-
97
- Make a symbolic link to link the library.
98
-
99
- cd /opt/oracle/instantclient_12_1
100
- ln -s libclntsh.dylib.12.1 libclntsh.dylib
101
-
102
- Set the environment variable OCI_DIR while performing the following installation steps.
103
-
104
- export OCI_DIR=/opt/oracle/instantclient_12_1
105
-
106
- Installation
107
- ------------
108
-
109
- If you get a problem in the following steps, look at {file:docs/report-installation-issue.md}.
110
-
111
- ### gem package
112
-
113
- Run the following command.
17
+ If you have installed [Homebrew], use the following command:
114
18
 
115
- gem install ruby-oci8
19
+ ```shell
20
+ $ brew tap InstantClientTap/instantclient
21
+ $ brew install instantclient-basic # or instantclient-basiclite
22
+ $ brew install instantclient-sdk
23
+ $ brew install instantclient-sqlplus # (optionally)
24
+ ```
116
25
 
117
- ### tar.gz package
26
+ Otherwise, look at this [page][OTN] and set the environment variable
27
+ `OCI_DIR` to point the the directory where instant client is installed.
28
+ Ruby-oci8 installation script checks the directory.
118
29
 
119
- #### Download the source code
30
+ ```shell
31
+ export OCI_DIR=$HOME/Downloads/instantclient_19_8 # for example
32
+ ```
120
33
 
121
- Download the latest tar.gz package from [download page][].
34
+ Install ruby-oci8
35
+ -----------------
122
36
 
123
- #### Run make and install
37
+ Note that `/usr/bin/ruby` isn't available. You need to use [`rbenv`] or so.
124
38
 
125
- tar xvfz ruby-oci8-VERSION.tar.gz
126
- cd ruby-oci8-VERSION
127
- make
128
- make install
39
+ ```shell
40
+ $ gem install ruby-oci8
41
+ ```
129
42
 
130
- [download page]: https://bintray.com/kubo/generic/ruby-oci8
131
43
  [Homebrew]: http://brew.sh/
132
- [fix_oralib]: https://github.com/kubo/fix_oralib_osx
133
- [Oracle Technology Network]: http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html
44
+ [OTN]: https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html#ic_osx_inst
45
+ [Xcode]: https://apps.apple.com/us/app/xcode/id497799835
46
+ [`rbenv`]: https://github.com/rbenv/rbenv
@@ -4,7 +4,6 @@
4
4
  %>
5
5
  #define API_WRAP_C 1
6
6
  #include "apiwrap.h"
7
- #define BLOCKING_FUNCTION_EPILOGUE(svcctx) do { (svcctx)->executing_thread = Qnil; } while (0)
8
7
 
9
8
  <%
10
9
  prev_name = ''
@@ -59,11 +58,9 @@ static void *oci8_<%=f.name%>_cb(void *user_data)
59
58
  %> data->rv = <%=f.name%>(<%= f.args.collect do |a| 'data->' + a.name; end.join(', ') %>);
60
59
  <% end %>
61
60
  <% if f.ret == 'sword'
62
- %> BLOCKING_FUNCTION_EPILOGUE(data->svcctx);
63
- return (void*)(VALUE)data->rv;
61
+ %> return (void*)(VALUE)data->rv;
64
62
  <% else
65
- %> BLOCKING_FUNCTION_EPILOGUE(data->svcctx);
66
- return NULL;
63
+ %> return NULL;
67
64
  <% end %>
68
65
  }
69
66
  #else
data/ext/oci8/bind.c CHANGED
@@ -85,7 +85,7 @@ static void bind_string_set(oci8_bind_t *obind, void *data, void **null_structp,
85
85
  rb_raise(rb_eArgError, "too long String to set. (%ld for %d)", RSTRING_LEN(val), obs->bytelen);
86
86
  }
87
87
  memcpy(vstr->buf, RSTRING_PTR(val), RSTRING_LEN(val));
88
- vstr->size = RSTRING_LEN(val);
88
+ vstr->size = RSTRING_LENINT(val);
89
89
  }
90
90
 
91
91
  static void bind_string_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE param)
@@ -195,7 +195,7 @@ static void bind_raw_set(oci8_bind_t *obind, void *data, void **null_structp, VA
195
195
  rb_raise(rb_eArgError, "too long String to set. (%ld for %d)", RSTRING_LEN(val), obs->bytelen);
196
196
  }
197
197
  memcpy(vstr->buf, RSTRING_PTR(val), RSTRING_LEN(val));
198
- vstr->size = RSTRING_LEN(val);
198
+ vstr->size = RSTRING_LENINT(val);
199
199
  }
200
200
 
201
201
  static const oci8_bind_data_type_t bind_raw_data_type = {
@@ -470,7 +470,6 @@ static VALUE bind_long_get(oci8_bind_t *obind, void *data, void *null_struct)
470
470
  str = rb_str_conv_enc(str, oci8_encoding, enc);
471
471
  }
472
472
  }
473
- OBJ_TAINT(str);
474
473
  return str;
475
474
  }
476
475
 
@@ -701,7 +700,7 @@ static VALUE oci8_bind_set_data(VALUE self, VALUE val)
701
700
  ub4 idx;
702
701
  Check_Type(val, T_ARRAY);
703
702
 
704
- size = RARRAY_LEN(val);
703
+ size = RARRAY_LENINT(val);
705
704
  if (size > obind->maxar_sz) {
706
705
  rb_raise(rb_eRuntimeError, "over the max array size");
707
706
  }
@@ -144,13 +144,13 @@ static VALUE oci8_cpool_initialize(int argc, VALUE *argv, VALUE self)
144
144
  chker2(OCIConnectionPoolCreate(oci8_envhp, oci8_errhp, cpool->base.hp.poolhp,
145
145
  &pool_name, &pool_name_len,
146
146
  NIL_P(dbname) ? NULL : RSTRING_ORATEXT(dbname),
147
- NIL_P(dbname) ? 0 : RSTRING_LEN(dbname),
147
+ NIL_P(dbname) ? 0 : RSTRING_LENINT(dbname),
148
148
  FIX2UINT(conn_min), FIX2UINT(conn_max),
149
149
  FIX2UINT(conn_incr),
150
150
  NIL_P(username) ? NULL : RSTRING_ORATEXT(username),
151
- NIL_P(username) ? 0 : RSTRING_LEN(username),
151
+ NIL_P(username) ? 0 : RSTRING_LENINT(username),
152
152
  NIL_P(password) ? NULL : RSTRING_ORATEXT(password),
153
- NIL_P(password) ? 0 : RSTRING_LEN(password),
153
+ NIL_P(password) ? 0 : RSTRING_LENINT(password),
154
154
  OCI_DEFAULT),
155
155
  &cpool->base);
156
156
  RB_OBJ_WRITE(cpool->base.self, &cpool->pool_name, rb_str_new(TO_CHARPTR(pool_name), pool_name_len));
data/ext/oci8/lob.c CHANGED
@@ -719,7 +719,6 @@ read_more_data:
719
719
  default:
720
720
  v = rb_ary_join(v, Qnil);
721
721
  }
722
- OBJ_TAINT(v);
723
722
  if (lob->lobtype == OCI_TEMP_CLOB) {
724
723
  /* set encoding */
725
724
  rb_enc_associate(v, oci8_encoding);
@@ -766,10 +765,10 @@ static VALUE oci8_lob_write(VALUE self, VALUE data)
766
765
  RB_GC_GUARD(str);
767
766
  if (lob->lobtype == OCI_TEMP_CLOB) {
768
767
  lob->pos += char_amt;
769
- return UINT2NUM(char_amt);
768
+ return ULL2NUM(char_amt);
770
769
  } else {
771
770
  lob->pos += byte_amt;
772
- return UINT2NUM(byte_amt);
771
+ return ULL2NUM(byte_amt);
773
772
  }
774
773
  }
775
774
 
data/ext/oci8/metadata.c CHANGED
@@ -195,7 +195,7 @@ VALUE oci8_do_describe(VALUE self, void *objptr, ub4 objlen, ub1 objtype, VALUE
195
195
  static VALUE oci8_describe(VALUE self, VALUE name, VALUE klass, VALUE check_public)
196
196
  {
197
197
  char *str;
198
- size_t idx, len;
198
+ int idx, len;
199
199
  VALUE metadata;
200
200
  VALUE obj_link = Qnil;
201
201
 
@@ -204,7 +204,7 @@ static VALUE oci8_describe(VALUE self, VALUE name, VALUE klass, VALUE check_publ
204
204
  rb_raise(rb_eArgError, "empty string is set.");
205
205
  }
206
206
  str = RSTRING_PTR(name);
207
- len = RSTRING_LEN(name);
207
+ len = RSTRING_LENINT(name);
208
208
  for (idx = 0; idx < len; idx++) {
209
209
  if (str[idx] == '@') {
210
210
  obj_link = rb_enc_str_new(str + idx + 1, len - idx - 1, oci8_encoding);
data/ext/oci8/object.c CHANGED
@@ -485,7 +485,7 @@ static VALUE set_coll_element_func(set_coll_element_cb_data_t *cb_data)
485
485
 
486
486
  chkerr(OCICollSize(oci8_envhp, oci8_errhp, coll, &size));
487
487
  if (RARRAY_LEN(val) < size) {
488
- chkerr(OCICollTrim(oci8_envhp, oci8_errhp, size - RARRAY_LEN(val), coll));
488
+ chkerr(OCICollTrim(oci8_envhp, oci8_errhp, (sb4)(size - RARRAY_LEN(val)), coll));
489
489
  }
490
490
  for (idx = 0; idx < RARRAY_LEN(val); idx++) {
491
491
  switch (FIX2INT(datatype)) {
@@ -559,13 +559,13 @@ static void set_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *data
559
559
  case ATTR_STRING:
560
560
  OCI8StringValue(val);
561
561
  chkerr(OCIStringAssignText(oci8_envhp, oci8_errhp,
562
- RSTRING_ORATEXT(val), RSTRING_LEN(val),
562
+ RSTRING_ORATEXT(val), RSTRING_LENINT(val),
563
563
  (OCIString **)data));
564
564
  break;
565
565
  case ATTR_RAW:
566
566
  StringValue(val);
567
567
  chkerr(OCIRawAssignBytes(oci8_envhp, oci8_errhp,
568
- RSTRING_ORATEXT(val), RSTRING_LEN(val),
568
+ RSTRING_ORATEXT(val), RSTRING_LENINT(val),
569
569
  (OCIRaw **)data));
570
570
  break;
571
571
  case ATTR_OCINUMBER:
@@ -729,6 +729,8 @@ static VALUE bind_named_type_get(oci8_bind_t *obind, void *data, void *null_stru
729
729
  return bnt->obj[idx];
730
730
  }
731
731
 
732
+ NORETURN(static void bind_named_type_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val));
733
+
732
734
  static void bind_named_type_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
733
735
  {
734
736
  rb_raise(rb_eRuntimeError, "not supported");
data/ext/oci8/oci8.c CHANGED
@@ -556,7 +556,7 @@ static VALUE oci8_server_attach(VALUE self, VALUE dbname, VALUE attach_mode)
556
556
  /* attach to the server */
557
557
  chker2(OCIServerAttach_nb(svcctx, svcctx->srvhp, oci8_errhp,
558
558
  NIL_P(dbname) ? NULL : RSTRING_ORATEXT(dbname),
559
- NIL_P(dbname) ? 0 : RSTRING_LEN(dbname),
559
+ NIL_P(dbname) ? 0 : RSTRING_LENINT(dbname),
560
560
  mode),
561
561
  &svcctx->base);
562
562
  chker2(OCIAttrSet(svcctx->base.hp.ptr, OCI_HTYPE_SVCCTX,
@@ -864,7 +864,7 @@ static VALUE oci8_set_client_identifier(VALUE self, VALUE val)
864
864
  if (!NIL_P(val)) {
865
865
  OCI8SafeStringValue(val);
866
866
  ptr = RSTRING_PTR(val);
867
- size = RSTRING_LEN(val);
867
+ size = RSTRING_LENINT(val);
868
868
  } else {
869
869
  ptr = "";
870
870
  size = 0;
@@ -899,7 +899,7 @@ static VALUE oci8_set_module(VALUE self, VALUE val)
899
899
  if (!NIL_P(val)) {
900
900
  OCI8SafeStringValue(val);
901
901
  ptr = RSTRING_PTR(val);
902
- size = RSTRING_LEN(val);
902
+ size = RSTRING_LENINT(val);
903
903
  } else {
904
904
  ptr = "";
905
905
  size = 0;
@@ -933,7 +933,7 @@ static VALUE oci8_set_action(VALUE self, VALUE val)
933
933
  if (!NIL_P(val)) {
934
934
  OCI8SafeStringValue(val);
935
935
  ptr = RSTRING_PTR(val);
936
- size = RSTRING_LEN(val);
936
+ size = RSTRING_LENINT(val);
937
937
  } else {
938
938
  ptr = "";
939
939
  size = 0;
@@ -964,7 +964,7 @@ static VALUE oci8_set_client_info(VALUE self, VALUE val)
964
964
  if (!NIL_P(val)) {
965
965
  OCI8SafeStringValue(val);
966
966
  ptr = RSTRING_PTR(val);
967
- size = RSTRING_LEN(val);
967
+ size = RSTRING_LENINT(val);
968
968
  } else {
969
969
  ptr = "";
970
970
  size = 0;
data/ext/oci8/oci8lib.c CHANGED
@@ -71,7 +71,7 @@ static VALUE bind_base_alloc(VALUE klass)
71
71
  rb_raise(rb_eNameError, "private method `new' called for %s:Class", rb_class2name(klass));
72
72
  }
73
73
 
74
- #if defined(HAVE_PLTHOOK) && !defined(WIN32) && !defined(__CYGWIN__)
74
+ #if defined(HAVE_PLTHOOK) && !defined(WIN32) && !defined(__CYGWIN__) && !defined(TRUFFLERUBY)
75
75
  static const char *find_libclntsh(void *handle)
76
76
  {
77
77
  void *symaddr = dlsym(handle, "OCIEnvCreate");
@@ -226,7 +226,7 @@ Init_oci8lib()
226
226
  oracle_client_version = ORAVERNUM(major, minor, update, patch, port_update);
227
227
  }
228
228
  #endif
229
- #if defined(HAVE_PLTHOOK) && !defined(WIN32) && !defined(__CYGWIN__)
229
+ #if defined(HAVE_PLTHOOK) && !defined(WIN32) && !defined(__CYGWIN__) && !defined(TRUFFLERUBY)
230
230
  rebind_internal_symbols();
231
231
  #endif
232
232
 
@@ -461,6 +461,7 @@ sword oci8_call_without_gvl(oci8_svcctx_t *svcctx, void *(*func)(void *), void *
461
461
  parg.func = func;
462
462
  parg.data = data;
463
463
  rv = (sword)rb_protect(protected_call, (VALUE)&parg, &state);
464
+ RB_OBJ_WRITE(svcctx->base.self, &svcctx->executing_thread, Qnil);
464
465
  if (state) {
465
466
  rb_jump_tag(state);
466
467
  }
@@ -510,7 +511,7 @@ static VALUE exec_sql(VALUE varg)
510
511
  sword rv;
511
512
 
512
513
  chker2(OCIStmtPrepare2(arg->svcctx->base.hp.svc, &arg->stmtp, oci8_errhp,
513
- (text*)arg->sql_text, strlen(arg->sql_text), NULL, 0,
514
+ (text*)arg->sql_text, (ub4)strlen(arg->sql_text), NULL, 0,
514
515
  OCI_NTV_SYNTAX, OCI_DEFAULT),
515
516
  &arg->svcctx->base);
516
517
  for (pos = 0; pos < arg->num_define_vars; pos++) {
data/ext/oci8/ocihandle.c CHANGED
@@ -752,7 +752,7 @@ static VALUE attr_set_string(VALUE self, VALUE attr_type, VALUE val)
752
752
  Check_Type(attr_type, T_FIXNUM);
753
753
  OCI8SafeStringValue(val);
754
754
  /* set attribute */
755
- chker2(OCIAttrSet(base->hp.ptr, base->type, RSTRING_PTR(val), RSTRING_LEN(val), FIX2INT(attr_type), oci8_errhp), base);
755
+ chker2(OCIAttrSet(base->hp.ptr, base->type, RSTRING_PTR(val), RSTRING_LENINT(val), FIX2INT(attr_type), oci8_errhp), base);
756
756
  return self;
757
757
  }
758
758
 
@@ -776,7 +776,7 @@ static VALUE attr_set_binary(VALUE self, VALUE attr_type, VALUE val)
776
776
  Check_Type(attr_type, T_FIXNUM);
777
777
  SafeStringValue(val);
778
778
  /* set attribute */
779
- chker2(OCIAttrSet(base->hp.ptr, base->type, RSTRING_PTR(val), RSTRING_LEN(val), FIX2INT(attr_type), oci8_errhp), base);
779
+ chker2(OCIAttrSet(base->hp.ptr, base->type, RSTRING_PTR(val), RSTRING_LENINT(val), FIX2INT(attr_type), oci8_errhp), base);
780
780
  return self;
781
781
  }
782
782
 
data/ext/oci8/ocinumber.c CHANGED
@@ -154,7 +154,7 @@ static void set_oci_number_from_str(OCINumber *result, VALUE str, VALUE fmt, VAL
154
154
  StringValue(str);
155
155
  /* set from string. */
156
156
  if (NIL_P(fmt)) {
157
- int rv = oranumber_from_str(result, RSTRING_PTR(str), RSTRING_LEN(str));
157
+ int rv = oranumber_from_str(result, RSTRING_PTR(str), RSTRING_LENINT(str));
158
158
  if (rv == ORANUMBER_SUCCESS) {
159
159
  return; /* success */
160
160
  } else {
@@ -172,17 +172,17 @@ static void set_oci_number_from_str(OCINumber *result, VALUE str, VALUE fmt, VAL
172
172
  }
173
173
  StringValue(fmt);
174
174
  fmt_ptr = RSTRING_ORATEXT(fmt);
175
- fmt_len = RSTRING_LEN(fmt);
175
+ fmt_len = RSTRING_LENINT(fmt);
176
176
  if (NIL_P(nls_params)) {
177
177
  nls_params_ptr = NULL;
178
178
  nls_params_len = 0;
179
179
  } else {
180
180
  StringValue(nls_params);
181
181
  nls_params_ptr = RSTRING_ORATEXT(nls_params);
182
- nls_params_len = RSTRING_LEN(nls_params);
182
+ nls_params_len = RSTRING_LENINT(nls_params);
183
183
  }
184
184
  chkerr(OCINumberFromText(errhp,
185
- RSTRING_ORATEXT(str), RSTRING_LEN(str),
185
+ RSTRING_ORATEXT(str), RSTRING_LENINT(str),
186
186
  fmt_ptr, fmt_len, nls_params_ptr, nls_params_len,
187
187
  result));
188
188
  }
@@ -249,7 +249,7 @@ static int set_oci_number_from_num(OCINumber *result, VALUE num, int force, OCIE
249
249
  if (TYPE(ary[1]) != T_STRING) {
250
250
  goto is_not_big_decimal;
251
251
  }
252
- digits_len = RSTRING_LEN(ary[1]);
252
+ digits_len = RSTRING_LENINT(ary[1]);
253
253
  set_oci_number_from_str(&digits, ary[1], Qnil, Qnil, errhp);
254
254
  /* check base */
255
255
  if (TYPE(ary[2]) != T_FIXNUM || FIX2LONG(ary[2]) != 10) {
@@ -365,7 +365,7 @@ OCINumber *oci8_dbl_to_onum(OCINumber *result, double dbl, OCIError *errhp)
365
365
  sword rv;
366
366
 
367
367
  str = rb_obj_as_string(rb_float_new(dbl));
368
- rv = oranumber_from_str(result, RSTRING_PTR(str), RSTRING_LEN(str));
368
+ rv = oranumber_from_str(result, RSTRING_PTR(str), RSTRING_LENINT(str));
369
369
  if (rv != 0) {
370
370
  oci8_raise_by_msgno(rv, NULL);
371
371
  }
@@ -1309,14 +1309,14 @@ static VALUE onum_to_char(int argc, VALUE *argv, VALUE self)
1309
1309
  }
1310
1310
  StringValue(fmt);
1311
1311
  fmt_ptr = RSTRING_ORATEXT(fmt);
1312
- fmt_len = RSTRING_LEN(fmt);
1312
+ fmt_len = RSTRING_LENINT(fmt);
1313
1313
  if (NIL_P(nls_params)) {
1314
1314
  nls_params_ptr = NULL;
1315
1315
  nls_params_len = 0;
1316
1316
  } else {
1317
1317
  StringValue(nls_params);
1318
1318
  nls_params_ptr = RSTRING_ORATEXT(nls_params);
1319
- nls_params_len = RSTRING_LEN(nls_params);
1319
+ nls_params_len = RSTRING_LENINT(nls_params);
1320
1320
  }
1321
1321
  rv = OCINumberToText(errhp, _NUMBER(self),
1322
1322
  fmt_ptr, fmt_len, nls_params_ptr, nls_params_len,
@@ -1437,7 +1437,7 @@ static VALUE onum_to_d_real(OCINumber *num, OCIError *errhp)
1437
1437
  rb_require("bigdecimal");
1438
1438
  cBigDecimal = rb_const_get(rb_cObject, id_BigDecimal);
1439
1439
  }
1440
- chkerr(OCINumberToText(errhp, num, (const oratext *)fmt, strlen(fmt),
1440
+ chkerr(OCINumberToText(errhp, num, (const oratext *)fmt, (ub4)strlen(fmt),
1441
1441
  NULL, 0, &buf_size, TO_ORATEXT(buf)));
1442
1442
  return rb_funcall(rb_cObject, id_BigDecimal, 1, rb_usascii_str_new(buf, buf_size));
1443
1443
  }
data/ext/oci8/oraconf.rb CHANGED
@@ -4,7 +4,7 @@ require 'mkmf'
4
4
  # compatibility for ruby-1.9
5
5
  RbConfig = Config unless defined? RbConfig
6
6
 
7
- if RUBY_PLATFORM =~ /mswin32|mswin64|cygwin|mingw32|bccwin32/
7
+ if RUBY_PLATFORM =~ /mswin32|mswin64|cygwin|mingw/
8
8
  # Windows
9
9
  require 'win32/registry'
10
10
  module Registry
@@ -43,6 +43,10 @@ class MiniSOReader
43
43
  attr_reader :endian
44
44
  attr_reader :bits
45
45
 
46
+ MACH_O_CPU_TYPE_I386 = 7
47
+ MACH_O_CPU_TYPE_X86_64 = 7 + 0x01000000
48
+ MACH_O_CPU_TYPE_ARM64 = 12 + 0x01000000
49
+
46
50
  def initialize(filename)
47
51
  f = open(filename, 'rb')
48
52
  begin
@@ -56,9 +60,6 @@ class MiniSOReader
56
60
  when "\x02\x10"
57
61
  # HP-UX PA-RISC1.1
58
62
  read_parisc(f)
59
- when "\xfe\xed"
60
- # Big-endian Mach-O File
61
- read_mach_o_be(f)
62
63
  when "\xce\xfa"
63
64
  # 32-bit Little-endian Mach-O File
64
65
  read_mach_o_le(f, 32)
@@ -67,10 +68,10 @@ class MiniSOReader
67
68
  read_mach_o_le(f, 64)
68
69
  when "\xca\xfe"
69
70
  # Universal binary
70
- read_mach_o_unversal(f)
71
+ read_mach_o_universal(f)
71
72
  else
72
73
  # AIX and Tru64
73
- raise format("unknown file header: %02x %02x", file_header[0].to_i, file_header[1].to_i)
74
+ raise format("unknown file header: %02x %02x (%s)", file_header[0].ord, file_header[1].ord, filename)
74
75
  end
75
76
  ensure
76
77
  f.close
@@ -174,22 +175,6 @@ class MiniSOReader
174
175
  @cpu = :parisc
175
176
  end
176
177
 
177
- # Big-endian Mach-O File
178
- def read_mach_o_be(f)
179
- @file_format = :mach_o
180
- @endian = :big
181
- case f.read(2)
182
- when "\xfa\xce" # feedface
183
- @cpu = :ppc
184
- @bits = 32
185
- when "\xfa\xcf" # feedfacf
186
- @cpu = :ppc64
187
- @bits = 64
188
- else
189
- raise "unknown file format"
190
- end
191
- end
192
-
193
178
  def read_mach_o_le(f, bits)
194
179
  @file_format = :mach_o
195
180
  @endian = :little
@@ -199,12 +184,20 @@ class MiniSOReader
199
184
  @cpu = :i386
200
185
  @bits = 32
201
186
  when 64
202
- @cpu = :x86_64
187
+ cputype = f.read(4).unpack('V')[0]
188
+ case cputype
189
+ when MACH_O_CPU_TYPE_X86_64
190
+ @cpu = :x86_64
191
+ when MACH_O_CPU_TYPE_ARM64
192
+ @cpu = :arm64
193
+ else
194
+ raise "unknown mach-o cpu type: #{cputype}"
195
+ end
203
196
  @bits = 64
204
197
  end
205
198
  end
206
199
 
207
- def read_mach_o_unversal(f)
200
+ def read_mach_o_universal(f)
208
201
  raise 'unknown file format' if f.read(2) != "\xba\xbe" # cafebabe
209
202
  @file_format = :universal
210
203
  nfat_arch = f.read(4).unpack('N')[0]
@@ -213,21 +206,17 @@ class MiniSOReader
213
206
  @bits = []
214
207
  nfat_arch.times do
215
208
  case cputype = f.read(4).unpack('N')[0]
216
- when 7
209
+ when MACH_O_CPU_TYPE_I386
217
210
  @cpu << :i386
218
211
  @endian << :little
219
212
  @bits << 32
220
- when 7 + 0x01000000
213
+ when MACH_O_CPU_TYPE_X86_64
221
214
  @cpu << :x86_64
222
215
  @endian << :little
223
216
  @bits << 64
224
- when 18
225
- @cpu << :ppc
226
- @endian << :big
227
- @bits << 32
228
- when 18 + 0x01000000
229
- @cpu << :ppc64
230
- @endian << :big
217
+ when MACH_O_CPU_TYPE_ARM64
218
+ @cpu << :arm64
219
+ @endian << :little
231
220
  @bits << 64
232
221
  else
233
222
  raise "Unknown mach-o cputype: #{cputype}"
@@ -383,7 +372,7 @@ EOS
383
372
  is_32bit = size_of_pointer == 4
384
373
  is_big_endian = "\x01\x02".unpack('s')[0] == 0x0102
385
374
  case RUBY_PLATFORM
386
- when /mswin32|mswin64|cygwin|mingw32|bccwin32/
375
+ when /mswin32|mswin64|cygwin|mingw/
387
376
  oci_basename = 'oci'
388
377
  oci_glob_postfix = ''
389
378
  nls_data_basename = ['oraociei*', 'oraociicus*']
@@ -426,20 +415,13 @@ EOS
426
415
  end
427
416
  so_ext = 'sl'
428
417
  when /darwin/
429
- @@ld_envs = %w[DYLD_LIBRARY_PATH]
418
+ @@ld_envs = %w[OCI_DIR]
430
419
  so_ext = 'dylib'
431
420
  if is_32bit
432
- if is_big_endian
433
- this_cpu = :ppc # 32-bit big-endian
434
- else
435
- this_cpu = :i386 # 32-bit little-endian
436
- end
421
+ this_cpu = :i386 # 32-bit little-endian
437
422
  else
438
- if is_big_endian
439
- this_cpu = :ppc64 # 64-bit big-endian
440
- else
441
- this_cpu = :x86_64 # 64-bit little-endian
442
- end
423
+ require 'etc'
424
+ this_cpu = Etc.uname[:machine].to_sym
443
425
  end
444
426
  check_proc = Proc.new do |file|
445
427
  so = MiniSOReader.new(file)
@@ -513,49 +495,6 @@ EOS
513
495
  end
514
496
  end
515
497
  when /darwin/
516
- fallback_path = ENV['DYLD_FALLBACK_LIBRARY_PATH']
517
- if fallback_path.nil?
518
- puts " DYLD_FALLBACK_LIBRARY_PATH is not set."
519
- else
520
- puts " checking DYLD_FALLBACK_LIBRARY_PATH..."
521
- ld_path, file = check_lib_in_path(fallback_path, glob_name, check_proc)
522
- end
523
- if ld_path.nil?
524
- puts " checking OCI_DIR..."
525
- ld_path, file = check_lib_in_path(ENV['OCI_DIR'], glob_name, check_proc)
526
- if ld_path
527
- puts " checking dependent shared libraries in #{file}..."
528
- open("|otool -L #{file}") do |f|
529
- f.gets # discard the first line
530
- while line = f.gets
531
- line =~ /^\s+(\S+)/
532
- libname = $1
533
- case libname
534
- when /^@rpath\/libclntsh\.dylib/, /^@rpath\/libnnz\d\d\.dylib/, /^@loader_path\/libnnz\d\d\.dylib/
535
- # No need to check the real path.
536
- # The current instant client doesn't use @rpath or @loader_path.
537
- when /\/libclntsh\.dylib/, /\/libnnz\d\d.dylib/
538
- raise <<EOS unless File.exists?(libname)
539
- The output of "otool -L #{file}" is:
540
- | #{IO.readlines("|otool -L #{file}").join(' | ')}
541
- Ruby-oci8 doesn't work without DYLD_LIBRARY_PATH or DYLD_FALLBACK_LIBRARY_PATH
542
- because the dependent file "#{libname}" doesn't exist.
543
-
544
- If you need to use ruby-oci8 without DYLD_LIBRARY_PATH or DYLD_FALLBACK_LIBRARY_PATH,
545
- download "fix_oralib.rb" in https://github.com/kubo/fix_oralib_osx
546
- and execute it in the directory "#{File.dirname(file)}" as follows to fix the path.
547
-
548
- cd #{File.dirname(file)}
549
- curl -O https://raw.githubusercontent.com/kubo/fix_oralib_osx/master/fix_oralib.rb
550
- ruby fix_oralib.rb
551
-
552
- Note: DYLD_* environment variables are unavailable for security reasons on OS X 10.11 El Capitan.
553
- EOS
554
- end
555
- end
556
- end
557
- end
558
- end
559
498
  if ld_path.nil?
560
499
  fallback_path = ENV['DYLD_FALLBACK_LIBRARY_PATH']
561
500
  if fallback_path.nil?
@@ -566,17 +505,8 @@ EOS
566
505
  end
567
506
  if ld_path.nil?
568
507
  raise <<EOS
569
- Set the environment variable DYLD_LIBRARY_PATH, DYLD_FALLBACK_LIBRARY_PATH or
570
- OCI_DIR to point to the Instant client directory.
571
-
572
- If DYLD_LIBRARY_PATH or DYLD_FALLBACK_LIBRARY_PATH is set, the environment
573
- variable must be set at runtime also.
574
-
575
- If OCI_DIR is set, dependent shared library paths are checked. If the checking
576
- is passed, ruby-oci8 works without DYLD_LIBRARY_PATH or DYLD_FALLBACK_LIBRARY_PATH.
577
-
578
- Note: OCI_DIR should be absolute path.
579
- Note: DYLD_* environment variables are unavailable for security reasons on OS X 10.11 El Capitan.
508
+ Oracle instant client is not found.
509
+ You need to install Oracle instant client.
580
510
  EOS
581
511
  end
582
512
  end
@@ -600,8 +530,8 @@ EOS
600
530
  paths.split(File::PATH_SEPARATOR).each do |path|
601
531
  next if path.nil? or path == ''
602
532
  print " checking #{path}... "
603
- path.gsub!(/\\/, '/') if /mswin32|mswin64|cygwin|mingw32|bccwin32/ =~ RUBY_PLATFORM
604
- files = Dir.glob(File.join(path, glob_name))
533
+ path.gsub!(/\\/, '/') if /mswin32|mswin64|cygwin|mingw/ =~ RUBY_PLATFORM
534
+ files = Dir.glob(File.join(path, glob_name)).sort.reverse
605
535
  if files.empty?
606
536
  puts "no"
607
537
  next
@@ -675,20 +605,10 @@ EOS
675
605
  rubyhdrdir = RbConfig::CONFIG["rubyhdrdir"] || RbConfig::CONFIG['archdir']
676
606
  unless File.exist?(rubyhdrdir + '/ruby.h')
677
607
  puts "failed"
678
- if RUBY_PLATFORM =~ /darwin/ and File.exist?("#{RbConfig::CONFIG['archdir']}/../universal-darwin8.0/ruby.h")
679
- raise <<EOS
680
- #{RbConfig::CONFIG['archdir']}/ruby.h doesn't exist.
681
- Run the following commands to fix the problem.
682
-
683
- cd #{RbConfig::CONFIG['archdir']}
684
- sudo ln -s ../universal-darwin8.0/* ./
685
- EOS
686
- else
687
- raise <<EOS
608
+ raise <<EOS
688
609
  #{RbConfig::CONFIG['archdir']}/ruby.h doesn't exist.
689
610
  Install the ruby development library.
690
611
  EOS
691
- end
692
612
  end
693
613
  puts "ok"
694
614
  $stdout.flush
@@ -704,11 +624,11 @@ EOS
704
624
  end
705
625
  end
706
626
 
707
- if RUBY_PLATFORM =~ /mswin32|mswin64|cygwin|mingw32|bccwin32/ # when Windows
627
+ if RUBY_PLATFORM =~ /mswin32|mswin64|cygwin|mingw/ # when Windows
708
628
 
709
629
  def get_libs(lib_dir)
710
630
  case RUBY_PLATFORM
711
- when /cygwin|x64-mingw32/
631
+ when /cygwin/
712
632
  regex = ([nil].pack('P').size == 8) ? / T (OCI\w+)/ : / T _(OCI\w+)/
713
633
  oci_funcs = YAML.load(open(File.dirname(__FILE__) + '/apiwrap.yml')).keys.collect do |func|
714
634
  func =~ /_nb$/ ? $` : func
@@ -727,22 +647,6 @@ EOS
727
647
  system(command)
728
648
  puts("done")
729
649
  "-L. -lOCI"
730
- when /bccwin32/
731
- # replace '/' to '\\' because bcc linker misunderstands
732
- # 'C:/foo/bar/OCI.LIB' as unknown option.
733
- lib = "#{lib_dir}/BORLAND/OCI.LIB"
734
- return lib.tr('/', '\\') if File.exist?(lib)
735
- raise <<EOS
736
- #{lib} does not exist.
737
-
738
- Your Oracle may not support Borland C++.
739
- If you want to run this module, run the following command at your own risk.
740
- cd #{lib_dir.tr('/', '\\')}
741
- mkdir Borland
742
- cd Borland
743
- coff2omf ..\\MSVC\\OCI.LIB OCI.LIB
744
- EOS
745
- exit 1
746
650
  else
747
651
  "\"#{lib_dir}/MSVC/OCI.LIB\""
748
652
  end
@@ -786,7 +690,7 @@ class OraConfFC < OraConf
786
690
  use_lib32 = false
787
691
  end
788
692
 
789
- if RUBY_PLATFORM =~ /mswin32|mswin64|cygwin|mingw32|bccwin32/
693
+ if RUBY_PLATFORM =~ /mswin32|mswin64|cygwin|mingw/
790
694
  lib_dir = "#{@oracle_home}/oci/lib"
791
695
  elsif use_lib32
792
696
  lib_dir = "#{@oracle_home}/lib32"
@@ -805,7 +709,7 @@ class OraConfFC < OraConf
805
709
  print("Get the version of Oracle from SQL*Plus... ")
806
710
  STDOUT.flush
807
711
  version = nil
808
- dev_null = RUBY_PLATFORM =~ /mswin32|mswin64|mingw32|bccwin32/ ? "nul" : "/dev/null"
712
+ dev_null = RUBY_PLATFORM =~ /mswin32|mswin64|mingw/ ? "nul" : "/dev/null"
809
713
  if File.exist?("#{@oracle_home}/bin/plus80.exe")
810
714
  sqlplus = "plus80.exe"
811
715
  else
@@ -830,7 +734,7 @@ class OraConfFC < OraConf
830
734
  version
831
735
  end # get_version
832
736
 
833
- if RUBY_PLATFORM =~ /mswin32|mswin64|cygwin|mingw32|bccwin32/ # when Windows
737
+ if RUBY_PLATFORM =~ /mswin32|mswin64|cygwin|mingw/ # when Windows
834
738
 
835
739
  def is_valid_home?(oracle_home)
836
740
  return false if oracle_home.nil?
@@ -912,7 +816,7 @@ EOS
912
816
  unless File.exist?("#{@oracle_home}/OCI/INCLUDE/OCI.H")
913
817
  raise "'#{@oracle_home}/OCI/INCLUDE/OCI.H' does not exists. Please install 'Oracle Call Interface'."
914
818
  end
915
- if RUBY_PLATFORM =~ /cygwin|mingw32/
819
+ if RUBY_PLATFORM =~ /cygwin|mingw/
916
820
  " \"-I#{@oracle_home}/OCI/INCLUDE\" -D_int64=\"long long\""
917
821
  else
918
822
  " \"-I#{@oracle_home}/OCI/INCLUDE\""
@@ -996,7 +900,7 @@ class OraConfIC < OraConf
996
900
 
997
901
  # check lib_dir
998
902
  lib_dirs = lib_dir.split(File::PATH_SEPARATOR)
999
- if RUBY_PLATFORM =~ /mswin32|mswin64|cygwin|mingw32|bccwin32/ # when Windows
903
+ if RUBY_PLATFORM =~ /mswin32|mswin64|cygwin|mingw/ # when Windows
1000
904
  ocilib = lib_dirs.find do |dir|
1001
905
  File.exist?("#{dir}/sdk/lib/msvc/oci.lib")
1002
906
  end
@@ -1061,7 +965,7 @@ EOS
1061
965
  # check inc_dir
1062
966
  inc_dirs = inc_dir.split(File::PATH_SEPARATOR)
1063
967
  ociinc = inc_dirs.find do |dir|
1064
- File.exists?("#{dir}/oci.h")
968
+ File.exist?("#{dir}/oci.h")
1065
969
  end
1066
970
  unless ociinc
1067
971
  raise <<EOS
@@ -1074,7 +978,7 @@ EOS
1074
978
  else
1075
979
  @cflags = " -I#{ociinc}"
1076
980
  end
1077
- @cflags += " -D_int64=\"long long\"" if RUBY_PLATFORM =~ /cygwin|mingw32/
981
+ @cflags += " -D_int64=\"long long\"" if RUBY_PLATFORM =~ /cygwin|mingw/
1078
982
 
1079
983
  # check link
1080
984
  $CFLAGS += @cflags
@@ -1086,73 +990,10 @@ EOS
1086
990
  else
1087
991
  # 10.1.0 doesn't have OCI_MAJOR_VERSION and OCI_MINOR_VERSION in oci.h.
1088
992
  @version = "1010"
1089
- if RUBY_PLATFORM =~ /darwin/ and 1.size == 8 and `sw_vers -productVersion`.chomp == "10.7"
1090
- $stderr.print <<EOS
1091
- WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN!
1092
-
1093
- 64-bit Oracle instant client doesn't work on OS X Lion.
1094
- See: https://forums.oracle.com/forums/thread.jspa?threadID=2187558
1095
-
1096
- The compilation is continued because the issue may be fixed in future.
1097
-
1098
- WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN!
1099
- EOS
1100
- end
1101
993
  end
1102
994
  return
1103
995
  end
1104
996
 
1105
- if RUBY_PLATFORM =~ /darwin/
1106
- open('mkmf.log', 'r') do |f|
1107
- while line = f.gets
1108
- if line.include? '/libclntsh.dylib load command 8 unknown cmd field'
1109
- raise <<EOS
1110
- Intel mac instant client is for Mac OS X 10.5.
1111
- It doesn't work on Mac OS X 10.4 or before.
1112
-
1113
- You have three workarounds.
1114
- 1. Compile ruby as ppc binary and use it with ppc instant client.
1115
- 2. Use JRuby and JDBC
1116
- 3. Use a third-party ODBC driver and ruby-odbc.
1117
- EOS
1118
- # '
1119
- end
1120
-
1121
- case line
1122
- when /cputype \(\d+, architecture \w+\) does not match cputype \(\d+\) for specified -arch flag: (\w+)/
1123
- missing_arch = $1
1124
- when /Undefined symbols for architecture (\w+)/
1125
- missing_arch = $1
1126
- when /missing required architecture (\w+) in file/
1127
- missing_arch = $1
1128
- end
1129
-
1130
- if missing_arch
1131
- if [nil].pack('p').size == 8
1132
- my_arch = 'x86_64'
1133
- elsif "\x01\x02".unpack('s')[0] == 0x0201
1134
- my_arch = 'i386'
1135
- else
1136
- my_arch = 'ppc'
1137
- end
1138
- raise <<EOS
1139
- Could not compile with Oracle instant client.
1140
- You may need to set the environment variable RC_ARCHS or ARCHFLAGS as follows:
1141
-
1142
- RC_ARCHS=#{my_arch}
1143
- export RC_ARCHS
1144
- or
1145
- ARCHFLAGS='-arch #{my_arch}'
1146
- export RC_ARCHS
1147
-
1148
- If it does not fix the problem, delete all '-arch #{missing_arch}'
1149
- in '#{RbConfig::CONFIG['archdir']}/rbconfig.rb'.
1150
- EOS
1151
- end
1152
- end
1153
- end
1154
- end
1155
-
1156
997
  unless ld_path.nil?
1157
998
  raise <<EOS
1158
999
  Could not compile with Oracle instant client.
@@ -73,10 +73,10 @@ struct plthook {
73
73
  };
74
74
 
75
75
  static int plthook_open_real(plthook_t **plthook_out, const struct mach_header *mh);
76
- static unsigned int get_bind_addr(plthook_t *plthook, const uint8_t *base, uint32_t lazy_bind_off, uint32_t lazy_bind_size, struct segment_command_ **segments, int addrdiff);
76
+ static unsigned int get_bind_addr(plthook_t *plthook, const uint8_t *base, uint32_t lazy_bind_off, uint32_t lazy_bind_size, struct segment_command_ **segments, ptrdiff_t addrdiff);
77
77
 
78
78
  static void set_errmsg(const char *fmt, ...) __attribute__((__format__ (__printf__, 1, 2)));
79
- static void set_bind_addr(unsigned int *idx, plthook_t *plthook, const uint8_t *base, const char *sym_name, int seg_index, int seg_offset, struct segment_command_ **segments);
79
+ static void set_bind_addr(unsigned int *idx, plthook_t *plthook, const uint8_t *base, const char *sym_name, int seg_index, uint64_t seg_offset, struct segment_command_ **segments);
80
80
 
81
81
  static uint64_t uleb128(const uint8_t **p)
82
82
  {
@@ -148,7 +148,7 @@ int plthook_open_by_handle(plthook_t **plthook_out, void *hndl)
148
148
  RTLD_LAZY | RTLD_NOLOAD,
149
149
  RTLD_LAZY | RTLD_NOLOAD | RTLD_FIRST,
150
150
  };
151
- int flag_idx;
151
+ size_t flag_idx;
152
152
  #define NUM_FLAGS (sizeof(flags) / sizeof(flags[0]))
153
153
 
154
154
  if (hndl == NULL) {
@@ -196,8 +196,8 @@ static int plthook_open_real(plthook_t **plthook_out, const struct mach_header *
196
196
  struct segment_command_ *segments[NUM_SEGMENTS];
197
197
  int segment_idx = 0;
198
198
  unsigned int nbind;
199
- int addrdiff = 0;
200
- int i;
199
+ ptrdiff_t addrdiff = 0;
200
+ uint32_t i;
201
201
 
202
202
  memset(segments, 0, sizeof(segments));
203
203
  #ifdef __LP64__
@@ -320,14 +320,14 @@ static int plthook_open_real(plthook_t **plthook_out, const struct mach_header *
320
320
  return 0;
321
321
  }
322
322
 
323
- static unsigned int get_bind_addr(plthook_t *plthook, const uint8_t *base, uint32_t lazy_bind_off, uint32_t lazy_bind_size, struct segment_command_ **segments, int addrdiff)
323
+ static unsigned int get_bind_addr(plthook_t *plthook, const uint8_t *base, uint32_t lazy_bind_off, uint32_t lazy_bind_size, struct segment_command_ **segments, ptrdiff_t addrdiff)
324
324
  {
325
325
  const uint8_t *ptr = base + lazy_bind_off + addrdiff;
326
326
  const uint8_t *end = ptr + lazy_bind_size;
327
327
  const char *sym_name;
328
328
  int seg_index = 0;
329
329
  uint64_t seg_offset = 0;
330
- int count, skip;
330
+ uint64_t count, skip;
331
331
  unsigned int idx;
332
332
  DEBUG_BIND("get_bind_addr(%p, 0x%x, 0x%x", base, lazy_bind_off, lazy_bind_size);
333
333
  for (idx = 0; segments[idx] != NULL; idx++) {
@@ -341,7 +341,7 @@ static unsigned int get_bind_addr(plthook_t *plthook, const uint8_t *base, uint3
341
341
  uint8_t imm = *ptr & BIND_IMMEDIATE_MASK;
342
342
  uint64_t ulebval;
343
343
  int64_t slebval;
344
- int i;
344
+ uint64_t i;
345
345
 
346
346
  DEBUG_BIND("0x%02x: ", *ptr);
347
347
  ptr++;
@@ -410,10 +410,10 @@ static unsigned int get_bind_addr(plthook_t *plthook, const uint8_t *base, uint3
410
410
  return idx;
411
411
  }
412
412
 
413
- static void set_bind_addr(unsigned int *idx, plthook_t *plthook, const uint8_t *base, const char *sym_name, int seg_index, int seg_offset, struct segment_command_ **segments)
413
+ static void set_bind_addr(unsigned int *idx, plthook_t *plthook, const uint8_t *base, const char *sym_name, int seg_index, uint64_t seg_offset, struct segment_command_ **segments)
414
414
  {
415
415
  if (plthook != NULL) {
416
- uint32_t vmaddr = segments[seg_index]->vmaddr;
416
+ uint64_t vmaddr = segments[seg_index]->vmaddr;
417
417
  plthook->entries[*idx].name = sym_name;
418
418
  plthook->entries[*idx].addr = (void**)(base + vmaddr + seg_offset);
419
419
  }
data/ext/oci8/stmt.c CHANGED
@@ -78,7 +78,7 @@ static VALUE oci8_stmt_initialize(VALUE self, VALUE svc, VALUE sql)
78
78
  if (!NIL_P(sql)) {
79
79
  OCI8SafeStringValue(sql);
80
80
 
81
- rv = OCIStmtPrepare2(svcctx->base.hp.svc, &stmt->base.hp.stmt, oci8_errhp, RSTRING_ORATEXT(sql), RSTRING_LEN(sql), NULL, 0, OCI_NTV_SYNTAX, OCI_DEFAULT);
81
+ rv = OCIStmtPrepare2(svcctx->base.hp.svc, &stmt->base.hp.stmt, oci8_errhp, RSTRING_ORATEXT(sql), RSTRING_LENINT(sql), NULL, 0, OCI_NTV_SYNTAX, OCI_DEFAULT);
82
82
  if (IS_OCI_ERROR(rv)) {
83
83
  chker2(rv, &svcctx->base);
84
84
  }
@@ -178,10 +178,10 @@ static VALUE oci8_bind(VALUE self, VALUE vplaceholder, VALUE vbindobj)
178
178
  */
179
179
  VALUE symval = rb_sym2str(vplaceholder);
180
180
  const char *symname = RSTRING_PTR(symval);
181
- size_t len = RSTRING_LEN(symval);
181
+ ub4 len = RSTRING_LENINT(symval);
182
182
  #else
183
183
  const char *symname = rb_id2name(SYM2ID(vplaceholder));
184
- size_t len = strlen(symname);
184
+ ub4 len = (ub4)strlen(symname);
185
185
  #endif
186
186
  placeholder_ptr = ALLOCA_N(char, len + 1);
187
187
  placeholder_len = len + 1;
@@ -192,7 +192,7 @@ static VALUE oci8_bind(VALUE self, VALUE vplaceholder, VALUE vbindobj)
192
192
  } else {
193
193
  OCI8StringValue(vplaceholder);
194
194
  placeholder_ptr = RSTRING_PTR(vplaceholder);
195
- placeholder_len = RSTRING_LEN(vplaceholder);
195
+ placeholder_len = RSTRING_LENINT(vplaceholder);
196
196
  }
197
197
  obind = TO_BIND(vbindobj); /* 2 */
198
198
  if (obind->base.hp.bnd != NULL) {
data/lib/oci8/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class OCI8
2
- VERSION = "2.2.9"
2
+ VERSION = "2.2.10"
3
3
  end
data/lib/oci8.rb CHANGED
@@ -110,7 +110,7 @@ end
110
110
 
111
111
  begin
112
112
  require so_basename
113
- rescue LoadError, OCIError
113
+ rescue LoadError
114
114
  require 'oci8/check_load_error'
115
115
  OCI8::Util::check_load_error($!)
116
116
  raise
data/ruby-oci8.gemspec CHANGED
@@ -50,7 +50,7 @@ EOS
50
50
  # add map files to analyze a core (minidump) file.
51
51
  so_vers.each do |ver|
52
52
  map_file = 'ext/oci8/oci8lib_#{ver}.map'
53
- so_files << map_file if File.exists? map_file
53
+ so_files << map_file if File.exist? map_file
54
54
  end
55
55
 
56
56
  # least version in so_vers
data/test/test_break.rb CHANGED
@@ -99,6 +99,11 @@ class TestBreak < Minitest::Test
99
99
  def test_timeout
100
100
  @conn.non_blocking = true
101
101
  start_time = Time.now
102
+ if server_is_runing_on_windows?
103
+ end_time = start_time + 5
104
+ else
105
+ end_time = start_time + 1
106
+ end
102
107
 
103
108
  if defined? Rubinius and Rubinius::VERSION < "2.0"
104
109
  # Rubinius 1.2.4
@@ -112,12 +117,8 @@ class TestBreak < Minitest::Test
112
117
  @conn.exec("BEGIN DBMS_LOCK.SLEEP(5); END;")
113
118
  end
114
119
  end
115
- if server_is_runing_on_windows?
116
- end_time = start_time + 5
117
- else
118
- end_time = start_time + 1
119
- end
120
120
  assert_in_delta(Time.now, end_time, 1)
121
+ sleep(0.01) # for truffleruby. Is truffleruby too fast?
121
122
  @conn.exec("BEGIN NULL; END;")
122
123
  assert_in_delta(Time.now, end_time, 1)
123
124
  end
@@ -215,9 +215,15 @@ EOS
215
215
  end
216
216
 
217
217
  def test_yaml
218
+ # Use the permitted_classes keyword parameter if it is supported by YAML.load
219
+ keyword_params = if YAML.method(:load).parameters.any? { |key, value| value == :permitted_symbols }
220
+ {permitted_classes: [OraNumber]}
221
+ else
222
+ {}
223
+ end
218
224
  (LARGE_RANGE_VALUES + ['~', '-~']).each do |x|
219
225
  n = OraNumber.new(x)
220
- assert_equal(n, YAML.load(YAML.dump(n)))
226
+ assert_equal(n, YAML.load(YAML.dump(n), **keyword_params))
221
227
  end
222
228
  end
223
229
 
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-oci8
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.9
4
+ version: 2.2.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kubo Takehiro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-30 00:00:00.000000000 Z
11
+ date: 2022-01-12 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: 'ruby-oci8 is a ruby interface for Oracle using OCI8 API. It is available
14
14
  with Oracle 10g or later including Oracle Instant Client.
15
15
 
16
- '
16
+ '
17
17
  email: kubo@jiubao.org
18
18
  executables: []
19
19
  extensions:
@@ -38,7 +38,6 @@ files:
38
38
  - docs/install-on-osx.md
39
39
  - docs/ldap-auth-and-function-interposition.md
40
40
  - docs/number-type-mapping.md
41
- - docs/osx-install-dev-tools.png
42
41
  - docs/platform-specific-issues.md
43
42
  - docs/report-installation-issue.md
44
43
  - docs/timeout-parameters.md
@@ -153,8 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
152
  - !ruby/object:Gem::Version
154
153
  version: '0'
155
154
  requirements: []
156
- rubyforge_project:
157
- rubygems_version: 2.7.3
155
+ rubygems_version: 3.1.2
158
156
  signing_key:
159
157
  specification_version: 4
160
158
  summary: Ruby interface for Oracle using OCI8 API
Binary file