ruby-oci8 2.1.8 → 2.2.0.1

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.
@@ -0,0 +1,132 @@
1
+ # @title Install ruby-oci8 on OS X
2
+
3
+ This page explains the way to install ruby-oci8 os OS X.
4
+
5
+ Look at {file:docs/install-full-client.md}, {file:docs/install-instant-client.md}
6
+ or {file:docs/install-binary-package.md} for other platforms.
7
+
8
+ Install C compiler
9
+ ==================
10
+
11
+ You need to install the command line developer tools or the Xcode.
12
+ (The latter includes the former.)
13
+
14
+ Run `"cc --version"` in a terminal to check whether they are installed.
15
+
16
+ If the cc version is printed, the tools are installed.
17
+
18
+ If the follwoing dialog is displayed, click its Install button to
19
+ install the tools.
20
+ You have no need to install the Xcode to compile ruby-oci8.
21
+ It requires command line tools, not an IDE such as the Xcode.
22
+
23
+ ![dialog](osx-install-dev-tools.png)
24
+
25
+ If `"Agreeing to the Xcode/iOS license requires admin privileges,
26
+ please re-run as root via sudo."` is printed, you need to run
27
+ `"sudo cc --version"`, enter your password, look at the license
28
+ and type `"agree"`.
29
+
30
+ Install Oracle Instant Client Packages
31
+ ======================================
32
+
33
+ Download Oracle Instant Client Packages
34
+ --------------------------------
35
+
36
+ Download the following packages from [Oracle Technology Network][]
37
+
38
+ * Instant Client Package - Basic or Basic Lite
39
+ * Instant Client Package - SDK
40
+ * Instant Client Package - SQL*Plus (optionally)
41
+
42
+ Install Oracle Instant Client Packages via Homebrew
43
+ ---------------------------------------------------
44
+
45
+ To install `Oracle Instant Client Basic Lite` via [Homebrew][]
46
+
47
+ * Download two instant client packages: `Basic Lite` and `SDK` and put them
48
+ in `/Library/Caches/Homebrew` (if the environment variable `HOMEBREW_CACHE`
49
+ is not set and `$HOME/Library/Caches/Homebrew` doesn't exist.)
50
+ * Run the followining commands:
51
+
52
+ brew install InstantClientTap/instantclient/instantclient-basiclite
53
+ brew install InstantClientTap/instantclient/instantclient-sdk
54
+
55
+ To install `Oracle Instant Client Basic` via [Homebrew][]
56
+
57
+ * Download *three* instant client packages: `Basic`, `Basic Lite` and `SDK`
58
+ and put them in `/Library/Caches/Homebrew` (if the environment variable
59
+ `HOMEBREW_CACHE` is not set and `$HOME/Library/Caches/Homebrew` doesn't exist.)
60
+ * Run the followining commands:
61
+
62
+ brew install InstantClientTap/instantclient/instantclient-basic
63
+ brew install InstantClientTap/instantclient/instantclient-sdk
64
+
65
+ * Set the environment variable OCI_DIR while performing the following installation steps
66
+ if Homebrew is installed outside `/usr/local`.
67
+
68
+ export OCI_DIR=$(brew --prefix)/lib
69
+
70
+ Install Oracle Instant Client Manually
71
+ ---------------------
72
+
73
+ If you don't use [Homebrew][], do the following:
74
+
75
+ Unzip the packages as follows:
76
+
77
+ mkdir /opt
78
+ mkdir /opt/oracle
79
+ cd /opt/oracle
80
+
81
+ Copy downloaded files to /opt/oracle before running the following commands.
82
+
83
+ unzip instantclient-basic-macos.x64-11.2.0.4.0.zip
84
+ unzip instantclient-sdk-macos.x64-11.2.0.4.0.zip
85
+ unzip instantclient-sqlplus-macos.x64-11.2.0.4.0.zip
86
+
87
+ Make a symbolic link to link the library.
88
+
89
+ cd /opt/oracle/instantclient11_2
90
+ ln -s libclntsh.dylib.11.1 libclntsh.dylib
91
+
92
+ Fix the library install and identification names using [fix_oralib][] to make them work
93
+ without `DYLD_LIBRARY_PATH`.
94
+
95
+ cd /opt/oracle/instantclient11_2
96
+ curl -O https://raw.githubusercontent.com/kubo/fix_oralib_osx/master/fix_oralib.rb
97
+ ruby fix_oralib.rb
98
+
99
+ Set the environment variable OCI_DIR while performing the following installation steps.
100
+
101
+ export OCI_DIR=/opt/oracle/instantclient11_2
102
+
103
+ Installation
104
+ ============
105
+
106
+ If you get a problem in the following steps, look at {file:docs/report-installation-issue.md}.
107
+
108
+ gem package
109
+ -----------
110
+
111
+ Run the following command.
112
+
113
+ gem install ruby-oci8
114
+
115
+ tar.gz package
116
+ --------------
117
+
118
+ ### Download the source code
119
+
120
+ Download the latest tar.gz package from [download page][].
121
+
122
+ ### Run make and install
123
+
124
+ tar xvfz ruby-oci8-VERSION.tar.gz
125
+ cd ruby-oci8-VERSION
126
+ make
127
+ make install
128
+
129
+ [download page]: https://bintray.com/kubo/generic/ruby-oci8
130
+ [Homebrew]: http://brew.sh/
131
+ [fix_oralib]: https://github.com/kubo/fix_oralib_osx
132
+ [Oracle Technology Network]: http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html
@@ -1,13 +1,10 @@
1
1
  # @title Report Installation Issues
2
2
 
3
- Look at {file:docs/platform-specific-issues.md},
4
- [the issues page on github][github] and [the ruby-oci8 help forum on rubyforge][rubyforge]
5
- to check whether your issue is fixed or not.
3
+ Look at {file:docs/platform-specific-issues.md} and [the issues page on github][github] to check whether your issue is fixed or not.
6
4
 
7
5
  If it is a new one, post the following information to [github][].
8
6
 
9
7
  [github]: https://github.com/kubo/ruby-oci8/issues
10
- [rubyforge]: http://rubyforge.org/forum/forum.php?forum_id=1078
11
8
 
12
9
  * Messages printed out to the console
13
10
 
@@ -4,11 +4,7 @@
4
4
  %>
5
5
  #define API_WRAP_C 1
6
6
  #include "apiwrap.h"
7
- #ifdef NATIVE_THREAD_WITH_GVL
8
7
  #define BLOCKING_FUNCTION_EPILOGUE(svcctx) do { (svcctx)->executing_thread = Qnil; } while (0)
9
- #else
10
- #define BLOCKING_FUNCTION_EPILOGUE(svcctx) do { } while (0)
11
- #endif
12
8
 
13
9
  <%
14
10
  prev_name = ''
@@ -312,15 +312,6 @@ OCILobFileSetName:
312
312
  - CONST text *filename
313
313
  - ub2 f_length
314
314
 
315
- # round trip: 1
316
- OCILobGetLength_nb:
317
- :version: 800
318
- :args:
319
- - OCISvcCtx *svchp
320
- - OCIError *errhp
321
- - OCILobLocator *locp
322
- - ub4 *lenp
323
-
324
315
  # round trip: 0
325
316
  OCILobLocatorIsInit:
326
317
  :version: 800
@@ -330,48 +321,6 @@ OCILobLocatorIsInit:
330
321
  - CONST OCILobLocator *locp
331
322
  - boolean *is_initialized
332
323
 
333
- # round trip: 0 or 1
334
- OCILobRead_nb:
335
- :version: 800
336
- :args:
337
- - OCISvcCtx *svchp
338
- - OCIError *errhp
339
- - OCILobLocator *locp
340
- - ub4 *amtp
341
- - ub4 offset
342
- - dvoid *bufp
343
- - ub4 bufl
344
- - dvoid *ctxp
345
- - OCICallbackLobRead cbfp
346
- - ub2 csid
347
- - ub1 csfrm
348
-
349
- # round trip: 1
350
- OCILobTrim_nb:
351
- :version: 800
352
- :args:
353
- - OCISvcCtx *svchp
354
- - OCIError *errhp
355
- - OCILobLocator *locp
356
- - ub4 newlen
357
-
358
- # round trip: 0 or 1
359
- OCILobWrite_nb:
360
- :version: 800
361
- :args:
362
- - OCISvcCtx *svchp
363
- - OCIError *errhp
364
- - OCILobLocator *locp
365
- - ub4 *amtp
366
- - ub4 offset
367
- - dvoid *bufp
368
- - ub4 buflen
369
- - ub1 piece
370
- - dvoid *ctxp
371
- - OCICallbackLobWrite cbfp
372
- - ub2 csid
373
- - ub1 csfrm
374
-
375
324
  # round trip: 1
376
325
  OCILogoff:
377
326
  :version: 800
@@ -874,16 +823,6 @@ OCIStmtGetPieceInfo:
874
823
  - ub4 *idxp
875
824
  - ub1 *piecep
876
825
 
877
- OCIStmtPrepare:
878
- :version: 800
879
- :args:
880
- - OCIStmt *stmtp
881
- - OCIError *errhp
882
- - CONST text *stmt
883
- - ub4 stmt_len
884
- - ub4 language
885
- - ub4 mode
886
-
887
826
  OCIStmtSetPieceInfo:
888
827
  :version: 800
889
828
  :args:
@@ -1343,7 +1282,8 @@ OCINlsCharSetNameToId:
1343
1282
  - dvoid *envhp
1344
1283
  - const oratext *name
1345
1284
 
1346
- OCIStmtPrepare2_nb:
1285
+ # round trip: 0
1286
+ OCIStmtPrepare2:
1347
1287
  :version: 920
1348
1288
  :args:
1349
1289
  - OCISvcCtx *svchp
@@ -421,7 +421,5 @@ void Init_oci8_bind(VALUE klass)
421
421
  /* register primitive data types. */
422
422
  oci8_define_bind_class("String", &bind_string_data_type, bind_string_alloc);
423
423
  oci8_define_bind_class("RAW", &bind_raw_data_type, bind_raw_alloc);
424
- if (oracle_client_version >= ORAVER_10_1) {
425
- oci8_define_bind_class("BinaryDouble", &bind_binary_double_data_type, bind_binary_double_alloc);
426
- }
424
+ oci8_define_bind_class("BinaryDouble", &bind_binary_double_data_type, bind_binary_double_alloc);
427
425
  }
@@ -14,17 +14,7 @@
14
14
  /* NLS ratio, maximum number of bytes per one chracter */
15
15
  int oci8_nls_ratio = 1;
16
16
 
17
- /* Oracle charset id -> Oracle charset name */
18
- static VALUE csid2name;
19
-
20
- /* Oracle charset name -> Oracle charset id */
21
- static ID id_upcase;
22
- static VALUE csname2id;
23
- static VALUE oci8_charset_name2id(VALUE svc, VALUE name);
24
- #ifdef HAVE_TYPE_RB_ENCODING
25
17
  rb_encoding *oci8_encoding;
26
- #endif
27
-
28
18
 
29
19
  /*
30
20
  * call-seq:
@@ -33,72 +23,21 @@ rb_encoding *oci8_encoding;
33
23
  * Returns the Oracle character set name from the specified
34
24
  * character set ID if it is valid. Otherwise, +nil+ is returned.
35
25
  *
36
- * === Oracle 9iR2 client or upper
37
- *
38
- * It is done by using the mapping table stored in the client side.
39
- *
40
- * === Oracle 9iR1 client or lower
41
- *
42
- * It executes the following PL/SQL block internally to use
43
- * the mapping table stored in the server side.
44
- *
45
- * BEGIN
46
- * :name := nls_charset_name(:csid);
47
- * END;
48
- *
49
26
  * @param [Fixnum] charset_id Oracle character set id
50
27
  * @return [String] Oracle character set name or nil
51
- * @since 2.0.0
28
+ * @since 2.2.0
52
29
  */
53
- VALUE oci8_charset_id2name(VALUE svc, VALUE csid)
30
+ VALUE oci8_s_charset_id2name(VALUE klass, VALUE csid)
54
31
  {
55
- VALUE name = rb_hash_aref(csid2name, csid);
32
+ char buf[OCI_NLS_MAXBUFSZ];
33
+ sword rv;
56
34
 
57
- if (!NIL_P(name)) {
58
- return name;
59
- }
60
35
  Check_Type(csid, T_FIXNUM);
61
- if (have_OCINlsCharSetIdToName) {
62
- /* Oracle 9iR2 or upper */
63
- char buf[OCI_NLS_MAXBUFSZ];
64
- sword rv;
65
-
66
- rv = OCINlsCharSetIdToName(oci8_envhp, TO_ORATEXT(buf), sizeof(buf), (ub2)FIX2INT(csid));
67
- if (rv != OCI_SUCCESS) {
68
- return Qnil;
69
- }
70
- name = rb_usascii_str_new_cstr(buf);
71
- } else {
72
- /* Oracle 9iR1 or lower */
73
- oci8_exec_sql_var_t bind_vars[2];
74
- char buf[OCI_NLS_MAXBUFSZ];
75
- ub2 buflen = 0;
76
- int ival = FIX2INT(csid);
77
-
78
- /* :name */
79
- bind_vars[0].valuep = buf;
80
- bind_vars[0].value_sz = OCI_NLS_MAXBUFSZ;
81
- bind_vars[0].dty = SQLT_CHR;
82
- bind_vars[0].indp = NULL;
83
- bind_vars[0].alenp = &buflen;
84
- /* :csid */
85
- bind_vars[1].valuep = &ival;
86
- bind_vars[1].value_sz = sizeof(int);
87
- bind_vars[1].dty = SQLT_INT;
88
- bind_vars[1].indp = NULL;
89
- bind_vars[1].alenp = NULL;
90
-
91
- /* convert chaset id to charset name by querying Oracle server. */
92
- oci8_exec_sql(oci8_get_svcctx(svc), "BEGIN :name := nls_charset_name(:csid); END;", 0, NULL, 2, bind_vars, 1);
93
- if (buflen == 0) {
94
- return Qnil;
95
- }
96
- name = rb_usascii_str_new(buf, buflen);
36
+ rv = OCINlsCharSetIdToName(oci8_envhp, TO_ORATEXT(buf), sizeof(buf), (ub2)FIX2INT(csid));
37
+ if (rv != OCI_SUCCESS) {
38
+ return Qnil;
97
39
  }
98
- OBJ_FREEZE(name);
99
- rb_hash_aset(csid2name, csid, name);
100
- rb_hash_aset(csname2id, name, csid);
101
- return name;
40
+ return rb_usascii_str_new_cstr(buf);
102
41
  }
103
42
 
104
43
  /*
@@ -108,70 +47,19 @@ VALUE oci8_charset_id2name(VALUE svc, VALUE csid)
108
47
  * Returns the Oracle character set ID for the specified Oracle
109
48
  * character set name if it is valid. Othewise, +nil+ is returned.
110
49
  *
111
- * === Oracle 9iR2 client or upper
112
- *
113
- * It is done by using the mapping table stored in the client side.
114
- *
115
- * === Oracle 9iR1 client or lower
116
- *
117
- * It executes the following PL/SQL block internally to use
118
- * the mapping table stored in the server side.
119
- *
120
- * BEGIN
121
- * :csid := nls_charset_id(:name);
122
- * END;
123
- *
124
50
  * @param [String] charset_name Oracle character set name
125
51
  * @return [Fixnum] Oracle character set id or nil
126
- * @since 2.0.0
52
+ * @since 2.2.0
127
53
  */
128
- static VALUE oci8_charset_name2id(VALUE svc, VALUE name)
54
+ static VALUE oci8_s_charset_name2id(VALUE klass, VALUE name)
129
55
  {
130
- VALUE csid;
131
-
132
- name = rb_funcall(name, id_upcase, 0);
133
- csid = rb_hash_aref(csname2id, StringValue(name));
134
- if (!NIL_P(csid)) {
135
- return csid;
136
- }
137
- if (have_OCINlsCharSetNameToId) {
138
- /* Oracle 9iR2 or upper */
139
- ub2 rv;
140
-
141
- rv = OCINlsCharSetNameToId(oci8_envhp, RSTRING_ORATEXT(name));
142
- if (rv == 0) {
143
- return Qnil;
144
- }
145
- csid = INT2FIX(rv);
146
- } else {
147
- /* Oracle 9iR1 or lower */
148
- oci8_exec_sql_var_t bind_vars[2];
149
- int ival;
150
- sb2 ind = 0; /* null indicator */
56
+ ub2 rv;
151
57
 
152
- /* :csid */
153
- bind_vars[0].valuep = &ival;
154
- bind_vars[0].value_sz = sizeof(int);
155
- bind_vars[0].dty = SQLT_INT;
156
- bind_vars[0].indp = &ind;
157
- bind_vars[0].alenp = NULL;
158
- /* :name */
159
- bind_vars[1].valuep = RSTRING_PTR(name);
160
- bind_vars[1].value_sz = RSTRING_LEN(name);
161
- bind_vars[1].dty = SQLT_CHR;
162
- bind_vars[1].indp = NULL;
163
- bind_vars[1].alenp = NULL;
164
-
165
- /* convert chaset name to charset id by querying Oracle server. */
166
- oci8_exec_sql(oci8_get_svcctx(svc), "BEGIN :csid := nls_charset_id(:name); END;", 0, NULL, 2, bind_vars, 1);
167
- if (ind) {
168
- return Qnil;
169
- }
170
- csid = INT2FIX(ival);
58
+ rv = OCINlsCharSetNameToId(oci8_envhp, TO_ORATEXT(StringValueCStr(name)));
59
+ if (rv == 0) {
60
+ return Qnil;
171
61
  }
172
- rb_hash_aset(csid2name, csid, name);
173
- rb_hash_aset(csname2id, name, csid);
174
- return csid;
62
+ return INT2FIX(rv);
175
63
  }
176
64
 
177
65
  /*
@@ -192,33 +80,6 @@ static VALUE oci8_get_nls_ratio(VALUE klass)
192
80
  return INT2NUM(oci8_nls_ratio);
193
81
  }
194
82
 
195
- #ifndef HAVE_TYPE_RB_ENCODING
196
- /*
197
- * call-seq:
198
- * OCI8.nls_ratio = integer
199
- *
200
- * Sets NLS ratio, maximum number of bytes per one character of the
201
- * current NLS chracter set. It is initialized in 'oci8/encoding-init.rb'
202
- * when oci8 is required. You have no need to set it explicitly.
203
- *
204
- * @param [Fixnum] integer NLS ratio
205
- * @since 2.1.0
206
- * @private
207
- * @note ruby 1.8 only
208
- */
209
- static VALUE oci8_set_nls_ratio(VALUE klass, VALUE val)
210
- {
211
- int v = NUM2INT(val);
212
- if (v <= 0) {
213
- rb_raise(rb_eRangeError, "expected a positive integer but %d", v);
214
- }
215
- oci8_nls_ratio = v;
216
- return val;
217
- }
218
- #endif
219
-
220
- #ifdef HAVE_TYPE_RB_ENCODING
221
-
222
83
  /*
223
84
  * call-seq:
224
85
  * OCI8.encoding -> enc
@@ -280,7 +141,43 @@ static VALUE oci8_set_encoding(VALUE klass, VALUE encoding)
280
141
  }
281
142
  return encoding;
282
143
  }
283
- #endif
144
+
145
+ /*
146
+ * call-seq:
147
+ * charset_name2id(charset_name) -> charset_id
148
+ *
149
+ * Returns the Oracle character set ID for the specified Oracle
150
+ * character set name if it is valid. Othewise, +nil+ is returned.
151
+ *
152
+ * @param [String] charset_name Oracle character set name
153
+ * @return [Fixnum] Oracle character set id or nil
154
+ * @since 2.0.0
155
+ * @deprecated Use {OCI8.charset_name2id} instead.
156
+ */
157
+ static VALUE oci8_charset_name2id(VALUE svc, VALUE name)
158
+ {
159
+ rb_warning("Use OCI8.charset_name2id instead of OCI8#charset_name2id.");
160
+ return oci8_s_charset_name2id(Qnil, name);
161
+ }
162
+
163
+ /*
164
+ * call-seq:
165
+ * charset_id2name(charset_id) -> charset_name
166
+ *
167
+ * Returns the Oracle character set name from the specified
168
+ * character set ID if it is valid. Otherwise, +nil+ is returned.
169
+ *
170
+ * @param [Fixnum] charset_id Oracle character set id
171
+ * @return [String] Oracle character set name or nil
172
+ * @since 2.0.0
173
+ * @deprecated Use {OCI8.charset_id2name} instead.
174
+ */
175
+ static VALUE oci8_charset_id2name(VALUE svc, VALUE name)
176
+ {
177
+ rb_warning("Use OCI8.charset_id2name instead of OCI8#charset_id2name.");
178
+ return oci8_s_charset_id2name(Qnil, name);
179
+ }
180
+
284
181
 
285
182
  void Init_oci8_encoding(VALUE cOCI8)
286
183
  {
@@ -288,21 +185,12 @@ void Init_oci8_encoding(VALUE cOCI8)
288
185
  oci8_cOCIHandle = rb_define_class("OCIHandle", rb_cObject);
289
186
  cOCI8 = rb_define_class("OCI8", oci8_cOCIHandle);
290
187
  #endif
291
- csid2name = rb_hash_new();
292
- rb_global_variable(&csid2name);
293
-
294
- id_upcase = rb_intern("upcase");
295
- csname2id = rb_hash_new();
296
- rb_global_variable(&csname2id);
297
188
 
298
- rb_define_method(cOCI8, "charset_name2id", oci8_charset_name2id, 1);
299
- rb_define_method(cOCI8, "charset_id2name", oci8_charset_id2name, 1);
189
+ rb_define_singleton_method(cOCI8, "charset_name2id", oci8_s_charset_name2id, 1);
190
+ rb_define_singleton_method(cOCI8, "charset_id2name", oci8_s_charset_id2name, 1);
300
191
  rb_define_singleton_method(cOCI8, "nls_ratio", oci8_get_nls_ratio, 0);
301
- #ifndef HAVE_TYPE_RB_ENCODING
302
- rb_define_singleton_method(cOCI8, "nls_ratio=", oci8_set_nls_ratio, 1);
303
- #endif
304
- #ifdef HAVE_TYPE_RB_ENCODING
305
192
  rb_define_singleton_method(cOCI8, "encoding", oci8_get_encoding, 0);
306
193
  rb_define_singleton_method(cOCI8, "encoding=", oci8_set_encoding, 1);
307
- #endif
194
+ rb_define_method(cOCI8, "charset_name2id", oci8_charset_name2id, 1);
195
+ rb_define_method(cOCI8, "charset_id2name", oci8_charset_id2name, 1);
308
196
  }