ruby-oci8 2.1.8 → 2.2.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
  }