ruby-oci8 2.2.7 → 2.2.11

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1fedff79278c31d88dee698417671fb84c334ad61d08595662fcef4c792742eb
4
+ data.tar.gz: 8af51646f9e6c4f96be8baaf15582b1e510f8655ed4c4f06cc45f0ab2599e8ea
5
+ SHA512:
6
+ metadata.gz: f3efe23976439e355436b273d28778a1658d01c1d0c57809e3d992600efc98d0455f44936b711026d7eb4dc9599dda6477367edb49823d125a4cc6d2ef3f2349
7
+ data.tar.gz: 9ff212eccdc0e737f648aaab32f4958e47f5c551823d6d9613b89cf8f5195561980f5cc5c0d34c7a88e591c045b601ff779cb5a7b562ca26c0efbaa532e198f2
data/ChangeLog CHANGED
@@ -1,3 +1,118 @@
1
+ 2020-12-30 Kubo Takehiro <kubo@jiubao.org>
2
+ * NEWS: Add changes between 2.2.8 and 2.2.9.
3
+ * lib/oci8/version.rb: Update to 2.2.9.
4
+ * mkpkg-win32.rb: remove unmaintained ruby versions from binary gems.
5
+
6
+ 2020-12-29 Kubo Takehiro <kubo@jiubao.org>
7
+ * ext/oci8/oraconf.rb: Support --with-instant-client-dir along with --with-instant-client-lib/include.
8
+ (GH-223)
9
+
10
+ 2020-12-29 Kubo Takehiro <kubo@jiubao.org>
11
+ * ext/oci8/hook_funcs.c: Fix hooking failure with truffleruby.
12
+ * test/test_break.rb: Fix to pass tests with truffleruby.
13
+
14
+ 2020-12-28 Kubo Takehiro <kubo@jiubao.org>
15
+ * mkpkg-win32.rb: Build binary gems for ruby 3.0 on Windows.
16
+
17
+ 2020-12-28 Kubo Takehiro <kubo@jiubao.org>
18
+ * ext/oci8/ocinumber.c: Suppress C compiler warning: enumeration value ‘RUBY_T_NONE’ not handled in switch
19
+
20
+ 2020-09-10 Kubo Takehiro <kubo@jiubao.org>
21
+ * ext/oci8/extconf.rb: Fix for TruffleRuby 20.2 or before.
22
+
23
+ 2020-09-08 Brandon Fish <brandon.j.fish@oracle.com>
24
+ * ext/oci8/extconf.rb, lib/oci8.rb: Handle truffleruby RUBY_ENGINE in case statements
25
+
26
+ 2020-01-11 Kubo Takehiro <kubo@jiubao.org>
27
+ * NEWS: Add changes between 2.2.7 and 2.2.8.
28
+ * lib/oci8/version.rb: Update to 2.2.8.
29
+
30
+ 2020-01-11 Kubo Takehiro <kubo@jiubao.org>
31
+ * ext/oci8/bind.c: Fix warning: comparison between signed and
32
+ unsigned integer expressions
33
+
34
+ 2020-01-11 Kubo Takehiro <kubo@jiubao.org>
35
+ * test/README.md: Update preparation SQL statements for running tests.
36
+
37
+ 2020-01-11 Kubo Takehiro <kubo@jiubao.org>
38
+ * test/test_break.rb: Check Oracle server OS where tests run
39
+ using dbms_utility.port_string. Tests in test_break.rb
40
+ failed on Windows.
41
+
42
+ 2020-01-07 Kubo Takehiro <kubo@jiubao.org>
43
+ * mkpkg-win32.rb: Workarounds for compilation using ruby 2.4 and 2.6 with
44
+ latest msys2 to avoid 'undefined reference to __chk_fail'
45
+
46
+ 2020-01-06 Kubo Takehiro <kubo@jiubao.org>
47
+ * ext/oci8/win32.c: Fix warnings caused by the change of rb_ensure()'s
48
+ arguments in ruby 2.7.
49
+
50
+ 2019-12-16 Kubo Takehiro <kubo@jiubao.org>
51
+ * test/test_datetime.rb: Remove "require 'scanf'" to run tests with Ruby 2.7.
52
+ The 'scanf' library was removed. https://bugs.ruby-lang.org/issues/16170
53
+
54
+ 2019-12-15 Kubo Takehiro <kubo@jiubao.org>
55
+ * ext/oci8/oradate.c: Fix bug of OraDate.now introduced 15 years ago.
56
+
57
+ 2019-12-15 Kubo Takehiro <kubo@jiubao.org>
58
+ * ext/oci8/attr.c, ext/oci8/oci8lib.c: Fix warnings caused by the
59
+ change of rb_ensure()'s arguments in ruby 2.7.
60
+
61
+ 2019-06-19 Kubo Takehiro <kubo@jiubao.org>
62
+ * Merge pull request #217 from nathanbwright/patch-1
63
+ Fix spelling in install-instant-client.md
64
+ (GH-217)
65
+
66
+ 2019-06-18 Nathan Wright <nathanbwright@users.noreply.github.com>
67
+ * docs/install-instant-client.md: Fix spelling in install-instant-client.md
68
+ (GH-217)
69
+
70
+ 2019-04-24 Kubo Takehiro <kubo@jiubao.org>
71
+ * Merge pull request #212 from tomasjura/master
72
+ Compilation fix for Windows ( and some small cleanups )
73
+ (GH-212)
74
+
75
+ 2019-04-23 Tomas Jura <tomas.jura1@gmail.com>
76
+ * ext/oci8/oci8.h: eliminate compiler warning
77
+ (GH-212)
78
+
79
+ 2019-04-20 Tomas Jura <tomas.jura1@gmail.com>
80
+ * ext/oci8/bind.c: compiler warning eliminated
81
+ (GH-212)
82
+
83
+ 2019-04-20 Tomas Jura <tomas.jura1@gmail.com>
84
+ * setup.rb: use splat operator instead dummy variables
85
+ (GH-212)
86
+
87
+ 2019-04-20 Tomas Jura <tomas.jura1@gmail.com>
88
+ * lib/oci8.rb: use fiddler instead obsolete Win32API
89
+ (GH-212)
90
+
91
+ 2019-04-20 Tomas Jura <tomas.jura1@gmail.com>
92
+ * ext/oci8/oraconf.rb: fix typo in windows compilation
93
+ (GH-212)
94
+
95
+ 2019-03-23 Kubo Takehiro <kubo@jiubao.org>
96
+ * Merge pull request #210 from dminuoso/allow-custom
97
+ (Nix) Allow for specifying include/library paths
98
+ (GH-210)
99
+
100
+ 2019-03-23 Victor Nawothnig <Victor.Nawothnig@gmail.com>
101
+ * ext/oci8/oraconf.rb: Fix missing support for full client
102
+ (GH-210)
103
+
104
+ 2019-03-22 Victor Nawothnig <Victor.Nawothnig@gmail.com>
105
+ * ext/oci8/oraconf.rb: fixup! Allow overriding library/include paths
106
+ (GH-210)
107
+
108
+ 2019-03-21 Victor Nawothnig <Victor.Nawothnig@gmail.com>
109
+ * setup.rb: Add documentation for new flags
110
+ (GH-210)
111
+
112
+ 2019-03-21 Victor Nawothnig <Victor.Nawothnig@gmail.com>
113
+ * ext/oci8/oraconf.rb: Allow overriding library/include paths
114
+ (GH-210)
115
+
1
116
  2019-01-06 Kubo Takehiro <kubo@jiubao.org>
2
117
  * NEWS: Add changes between 2.2.6.1 and 2.2.7.
3
118
  * lib/oci8/version.rb: Update to 2.2.7
data/NEWS CHANGED
@@ -1,5 +1,70 @@
1
1
  # @markup markdown
2
2
 
3
+ 2.2.11 (2022-02-22)
4
+ ===================
5
+
6
+ - Fix "No DLL is not foud to hook" when `OCI8.properties[:tcp_keepalive_time]` is set and Oracle client is 21c on Windows.
7
+
8
+ (reported at rsim/oracle-enhanced#2262)
9
+
10
+ - Fix "OCI8.properties[:tcp_keepalive_time] isn't available" error when ruby version is 3.1 on Windows.
11
+
12
+ 2.2.10 (2022-01-12)
13
+ ===================
14
+
15
+ - Use `File.exist?` instead of removed `File.exists?` in Ruby 3.2 (GH-242)
16
+
17
+ (contributed by Yasuo Honda)
18
+
19
+ - Support ruby 3.1 distributed by rubyinstaller.org
20
+
21
+ - Remove code for obsolete platforms
22
+ - Ruby compiled by Borland C++
23
+ - macOS released several years ago
24
+
25
+ - Detect arm64 macOS shared library in oraconf.rb in preparation for Instant Client for Apple Silicon release.
26
+
27
+ 2.2.9 (2020-12-30)
28
+ ==================
29
+
30
+ - Support [TruffleRuby](https://github.com/oracle/truffleruby). (GH-225)
31
+
32
+ (contributed by Brandon Fish)
33
+
34
+ - Remove extension libraries for unmaintained ruby versions from binary gems.
35
+
36
+ Fixed issue
37
+ -----------
38
+
39
+ - Allow --with-instant-client-dir along with --with-instant-client-lib/include. (GH-223)
40
+
41
+ (reported by Victor Nawothnig)
42
+
43
+ 2.2.8 (2020-01-11)
44
+ ==================
45
+
46
+ New features
47
+ ------------
48
+
49
+ * Add support to specify include and lib directories of Oracle library on installation. (GH-210)
50
+
51
+ The following three flags are added.
52
+
53
+ * --with-instant-client-dir
54
+ * --with-instant-client-include
55
+ * --with-instant-client-lib
56
+
57
+ Fixed issue
58
+ -----------
59
+
60
+ - Suppress warnings compiling oci8lib.so (GH-212 and others)
61
+
62
+ - Fix compilation and tests on Windows.
63
+
64
+ - Fix spelling in install-instant-client.md (GH-217)
65
+
66
+ - Use fiddler instead obsolete Win32API on Windows (GH-212)
67
+
3
68
  2.2.7 (2019-01-06)
4
69
  ==================
5
70
 
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.org/kubo/ruby-oci8.svg?branch=master)](https://travis-ci.org/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
@@ -18,7 +18,7 @@ Look at {file:docs/install-on-osx.md} for OS X.
18
18
  Install Oracle Instant Client Packages
19
19
  --------------------------------------
20
20
 
21
- ### Donwload Instant Client Packages
21
+ ### Download Instant Client Packages
22
22
 
23
23
  Download the following packages from [Oracle Technology Network](http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html).
24
24
 
@@ -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/attr.c CHANGED
@@ -15,8 +15,9 @@ typedef struct {
15
15
  OCIRowid *ridp;
16
16
  } rowid_arg_t;
17
17
 
18
- static VALUE get_rowid_attr(rowid_arg_t *arg)
18
+ static VALUE get_rowid_attr(VALUE varg)
19
19
  {
20
+ rowid_arg_t *arg = (rowid_arg_t *)varg;
20
21
  oci8_base_t *base = arg->base;
21
22
  ub4 attrtype = arg->attrtype;
22
23
  char buf[MAX_ROWID_LEN];
@@ -36,8 +37,9 @@ static VALUE get_rowid_attr(rowid_arg_t *arg)
36
37
  return rb_external_str_new_with_enc(buf, buflen, rb_usascii_encoding());
37
38
  }
38
39
 
39
- static VALUE rowid_ensure(rowid_arg_t *arg)
40
+ static VALUE rowid_ensure(VALUE varg)
40
41
  {
42
+ rowid_arg_t *arg = (rowid_arg_t *)varg;
41
43
  if (arg->ridp != NULL) {
42
44
  OCIDescriptorFree(arg->ridp, OCI_DTYPE_ROWID);
43
45
  }
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 = {
@@ -383,7 +383,7 @@ static sb4 in_bind_callback(void *ictxp, OCIBind *bindp, ub4 iter, ub4 index, vo
383
383
 
384
384
  if (cb->tail == &cb->head) {
385
385
  /* empty string */
386
- *bufpp = "";
386
+ *bufpp = (void *)"";
387
387
  *alenp = 0;
388
388
  *piecep = OCI_ONE_PIECE;
389
389
  } else {
@@ -470,14 +470,13 @@ 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
 
477
476
  static void bind_long_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
478
477
  {
479
478
  chunk_buf_t *cb = (chunk_buf_t *)data;
480
- long len;
479
+ ub4 len;
481
480
  const char *buf;
482
481
 
483
482
  if (IS_BIND_LONG(obind)) {
@@ -485,7 +484,7 @@ static void bind_long_set(oci8_bind_t *obind, void *data, void **null_structp, V
485
484
  } else {
486
485
  StringValue(val);
487
486
  }
488
- len = RSTRING_LEN(val);
487
+ len = (ub4)RSTRING_LEN(val);
489
488
  buf = RSTRING_PTR(val);
490
489
  cb->tail = &cb->head;
491
490
  while (1) {
@@ -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/extconf.rb CHANGED
@@ -72,7 +72,7 @@ $objs = ["oci8lib.o", "env.o", "error.o", "oci8.o", "ocihandle.o",
72
72
  "ocinumber.o", "ocidatetime.o", "object.o", "apiwrap.o",
73
73
  "encoding.o", "oranumber_util.o", "thread_util.o", "util.o"]
74
74
 
75
- if RUBY_PLATFORM =~ /mswin32|cygwin|mingw32|bccwin32/
75
+ if RUBY_PLATFORM =~ /mswin32|cygwin|mingw/
76
76
  $defs << "-DUSE_WIN32_C"
77
77
  $objs << "win32.o"
78
78
  end
@@ -139,6 +139,8 @@ when 'rbx'
139
139
  so_basename += 'rbx'
140
140
  when 'jruby'
141
141
  raise "Ruby-oci8 doesn't support jruby because its C extension support is in development in jruby 1.6 and deprecated in jruby 1.7."
142
+ when 'truffleruby'
143
+ so_basename += 'truffleruby'
142
144
  else
143
145
  raise 'unsupported ruby engine: ' + RUBY_ENGINE
144
146
  end
@@ -146,15 +148,16 @@ end
146
148
  print "checking for plthook... "
147
149
  STDOUT.flush
148
150
  case RUBY_PLATFORM
149
- when /mswin32|cygwin|mingw32|bccwin32/
151
+ when /mswin32|cygwin|mingw/
150
152
  plthook_src = "plthook_win32.c"
151
153
  when /darwin/
152
154
  plthook_src = "plthook_osx.c"
153
155
  else
154
156
  plthook_src = "plthook_elf.c"
155
157
  end
156
- if xsystem(cc_command("").gsub(CONFTEST_C, File.dirname(__FILE__) + "/" + plthook_src))
157
- File.delete(plthook_src.gsub(/\.c$/, '.' + RbConfig::CONFIG["OBJEXT"]))
158
+ FileUtils.copy(File.dirname(__FILE__) + "/" + plthook_src, CONFTEST_C)
159
+ if xsystem(cc_command(""))
160
+ FileUtils.rm_f("#{CONFTEST}.#{$OBJEXT}")
158
161
  puts plthook_src
159
162
  $objs << plthook_src.gsub(/\.c$/, '.o')
160
163
  $objs << "hook_funcs.o"
@@ -170,6 +170,38 @@ static int WSAAPI hook_WSARecv(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount
170
170
  return rv;
171
171
  }
172
172
 
173
+ static int is_target_dll(MODULEENTRY32 *me)
174
+ {
175
+ static const char *basenames[] = {
176
+ "orantcp", // ORACLE_HOME-based client
177
+ "oraociei", // instant client basic
178
+ "oraociicus", // instant client basic lite
179
+ NULL,
180
+ };
181
+ const char **basename = basenames;
182
+ while (*basename != NULL) {
183
+ if (strnicmp(me->szModule, *basename, strlen(*basename)) == 0) {
184
+ break;
185
+ }
186
+ basename++;
187
+ }
188
+ if (*basename == NULL) {
189
+ return 0;
190
+ }
191
+ // basename{zero_or_more_digits}.dll
192
+ const char *p = me->szModule + strlen(*basename);
193
+ while ('0' <= *p && *p <= '9') {
194
+ p++;
195
+ }
196
+ if (stricmp(p, ".dll") != 0) {
197
+ return 0;
198
+ }
199
+ if (GetProcAddress((HMODULE)me->modBaseAddr, "nttini") == NULL) {
200
+ return 0;
201
+ }
202
+ return 1;
203
+ }
204
+
173
205
  void oci8_install_hook_functions()
174
206
  {
175
207
  static int hook_functions_installed = 0;
@@ -217,22 +249,11 @@ void oci8_install_hook_functions()
217
249
  me.dwSize = sizeof(me);
218
250
  if (Module32First(hSnapshot, &me)) {
219
251
  do {
220
- const char *p = NULL;
221
- if (strnicmp(me.szModule, "orantcp", 7) == 0) { // ORACLE_HOME-based client
222
- p = me.szModule + 7;
223
- } else if (strnicmp(me.szModule, "oraociei", 8) == 0) { // instant client basic
224
- p = me.szModule + 8;
225
- } else if (strnicmp(me.szModule, "oraociicus", 10) == 0) { // instant client basic lite
226
- p = me.szModule + 10;
227
- }
228
- if (p != NULL && ('1' <= *p && *p <= '9') && ('0' <= *(p + 1) && *(p + 1) <= '9')
229
- && stricmp(p + 2, ".dll") == 0) {
230
- if (GetProcAddress((HMODULE)me.modBaseAddr, "nttini") != NULL) {
231
- module_found = TRUE;
232
- if (replace_functions(me.modBaseAddr, me.szExePath, tcp_functions) != 0) {
233
- CloseHandle(hSnapshot);
234
- rb_raise(rb_eRuntimeError, "Hook error: %s", hook_errmsg);
235
- }
252
+ if (is_target_dll(&me)) {
253
+ module_found = TRUE;
254
+ if (replace_functions(me.modBaseAddr, me.szExePath, tcp_functions) != 0) {
255
+ CloseHandle(hSnapshot);
256
+ rb_raise(rb_eRuntimeError, "Hook error: %s", hook_errmsg);
236
257
  }
237
258
  }
238
259
  } while (Module32Next(hSnapshot, &me));
@@ -298,13 +319,28 @@ static void *ocifunc_addr(void *dlsym_handle, const char **file)
298
319
  if (dladdr(addr, &dli) == 0) {
299
320
  return NULL;
300
321
  }
301
- if (strstr(dli.dli_fname, "/libclntsh." SO_EXT) == 0) {
322
+ if (strstr(dli.dli_fname, "/libclntsh." SO_EXT) == NULL) {
302
323
  return NULL;
303
324
  }
304
325
  *file = dli.dli_fname;
305
326
  return addr;
306
327
  }
307
328
 
329
+ #ifdef __linux__
330
+ #include <link.h>
331
+ static void *ocifunc_addr_linux(const char **file)
332
+ {
333
+ struct link_map *lm;
334
+ for (lm = _r_debug.r_map; lm != NULL; lm = lm->l_next) {
335
+ if (strstr(lm->l_name, "/libclntsh." SO_EXT) != NULL) {
336
+ *file = lm->l_name;
337
+ return (void*)lm->l_addr;
338
+ }
339
+ }
340
+ return NULL;
341
+ }
342
+ #endif
343
+
308
344
  void oci8_install_hook_functions(void)
309
345
  {
310
346
  static int hook_functions_installed = 0;
@@ -319,6 +355,11 @@ void oci8_install_hook_functions(void)
319
355
  /* OCI symbols may be hooked by LD_PRELOAD. */
320
356
  addr = ocifunc_addr(RTLD_NEXT, &file);
321
357
  }
358
+ #ifdef __linux__
359
+ if (addr == NULL) {
360
+ addr = ocifunc_addr_linux(&file);
361
+ }
362
+ #endif
322
363
  if (addr == NULL) {
323
364
  rb_raise(rb_eRuntimeError, "No shared library is found to hook.");
324
365
  }