ruby-staci 2.2.9

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.
Files changed (115) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +14 -0
  3. data/COPYING +30 -0
  4. data/COPYING_old +64 -0
  5. data/ChangeLog +3826 -0
  6. data/Makefile +92 -0
  7. data/NEWS +1194 -0
  8. data/README.md +66 -0
  9. data/dist-files +113 -0
  10. data/docs/bind-array-to-in_cond.md +38 -0
  11. data/docs/conflicts-local-connections-and-processes.md +98 -0
  12. data/docs/hanging-after-inactivity.md +63 -0
  13. data/docs/install-binary-package.md +44 -0
  14. data/docs/install-full-client.md +111 -0
  15. data/docs/install-instant-client.md +194 -0
  16. data/docs/install-on-osx.md +133 -0
  17. data/docs/ldap-auth-and-function-interposition.md +123 -0
  18. data/docs/number-type-mapping.md +79 -0
  19. data/docs/osx-install-dev-tools.png +0 -0
  20. data/docs/platform-specific-issues.md +164 -0
  21. data/docs/report-installation-issue.md +50 -0
  22. data/docs/timeout-parameters.md +94 -0
  23. data/ext/oci8/.document +18 -0
  24. data/ext/oci8/MANIFEST +18 -0
  25. data/ext/oci8/apiwrap.c.tmpl +178 -0
  26. data/ext/oci8/apiwrap.h.tmpl +61 -0
  27. data/ext/oci8/apiwrap.rb +96 -0
  28. data/ext/oci8/apiwrap.yml +1322 -0
  29. data/ext/oci8/attr.c +57 -0
  30. data/ext/oci8/bind.c +838 -0
  31. data/ext/oci8/connection_pool.c +216 -0
  32. data/ext/oci8/encoding.c +196 -0
  33. data/ext/oci8/env.c +139 -0
  34. data/ext/oci8/error.c +385 -0
  35. data/ext/oci8/extconf.rb +219 -0
  36. data/ext/oci8/hook_funcs.c +407 -0
  37. data/ext/oci8/lob.c +1278 -0
  38. data/ext/oci8/metadata.c +279 -0
  39. data/ext/oci8/object.c +919 -0
  40. data/ext/oci8/oci8.c +1058 -0
  41. data/ext/oci8/oci8.h +556 -0
  42. data/ext/oci8/oci8lib.c +704 -0
  43. data/ext/oci8/ocidatetime.c +506 -0
  44. data/ext/oci8/ocihandle.c +852 -0
  45. data/ext/oci8/ocinumber.c +1922 -0
  46. data/ext/oci8/oraconf.rb +1145 -0
  47. data/ext/oci8/oradate.c +670 -0
  48. data/ext/oci8/oranumber_util.c +352 -0
  49. data/ext/oci8/oranumber_util.h +24 -0
  50. data/ext/oci8/plthook.h +66 -0
  51. data/ext/oci8/plthook_elf.c +702 -0
  52. data/ext/oci8/plthook_osx.c +505 -0
  53. data/ext/oci8/plthook_win32.c +391 -0
  54. data/ext/oci8/post-config.rb +5 -0
  55. data/ext/oci8/stmt.c +448 -0
  56. data/ext/oci8/thread_util.c +81 -0
  57. data/ext/oci8/thread_util.h +18 -0
  58. data/ext/oci8/util.c +71 -0
  59. data/ext/oci8/win32.c +117 -0
  60. data/lib/.document +1 -0
  61. data/lib/dbd/STACI.rb +591 -0
  62. data/lib/oci8/.document +8 -0
  63. data/lib/oci8/bindtype.rb +333 -0
  64. data/lib/oci8/check_load_error.rb +146 -0
  65. data/lib/oci8/compat.rb +117 -0
  66. data/lib/oci8/connection_pool.rb +179 -0
  67. data/lib/oci8/cursor.rb +605 -0
  68. data/lib/oci8/datetime.rb +605 -0
  69. data/lib/oci8/encoding-init.rb +45 -0
  70. data/lib/oci8/encoding.yml +537 -0
  71. data/lib/oci8/metadata.rb +2148 -0
  72. data/lib/oci8/object.rb +641 -0
  73. data/lib/oci8/oci8.rb +756 -0
  74. data/lib/oci8/ocihandle.rb +591 -0
  75. data/lib/oci8/oracle_version.rb +153 -0
  76. data/lib/oci8/properties.rb +196 -0
  77. data/lib/oci8/version.rb +3 -0
  78. data/lib/ruby-staci.rb +1 -0
  79. data/lib/staci.rb +190 -0
  80. data/metaconfig +142 -0
  81. data/pre-distclean.rb +7 -0
  82. data/ruby-aci.gemspec +83 -0
  83. data/setup.rb +1342 -0
  84. data/test/README.md +37 -0
  85. data/test/config.rb +201 -0
  86. data/test/setup_test_object.sql +199 -0
  87. data/test/setup_test_package.sql +59 -0
  88. data/test/test_all.rb +56 -0
  89. data/test/test_appinfo.rb +62 -0
  90. data/test/test_array_dml.rb +333 -0
  91. data/test/test_bind_array.rb +70 -0
  92. data/test/test_bind_boolean.rb +99 -0
  93. data/test/test_bind_integer.rb +47 -0
  94. data/test/test_bind_raw.rb +45 -0
  95. data/test/test_bind_string.rb +105 -0
  96. data/test/test_bind_time.rb +177 -0
  97. data/test/test_break.rb +124 -0
  98. data/test/test_clob.rb +86 -0
  99. data/test/test_connection_pool.rb +124 -0
  100. data/test/test_connstr.rb +220 -0
  101. data/test/test_datetime.rb +585 -0
  102. data/test/test_dbi.rb +365 -0
  103. data/test/test_dbi_clob.rb +53 -0
  104. data/test/test_encoding.rb +103 -0
  105. data/test/test_error.rb +87 -0
  106. data/test/test_metadata.rb +2674 -0
  107. data/test/test_object.rb +546 -0
  108. data/test/test_oci8.rb +624 -0
  109. data/test/test_oracle_version.rb +68 -0
  110. data/test/test_oradate.rb +255 -0
  111. data/test/test_oranumber.rb +786 -0
  112. data/test/test_package_type.rb +981 -0
  113. data/test/test_properties.rb +17 -0
  114. data/test/test_rowid.rb +32 -0
  115. metadata +158 -0
@@ -0,0 +1,279 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * metadata.c
4
+ *
5
+ * Copyright (C) 2006-2016 Kubo Takehiro <kubo@jiubao.org>
6
+ *
7
+ * implement private methods of classes in STACI::Metadata module.
8
+ *
9
+ * public methods are implemented by oci8/metadata.rb.
10
+ */
11
+ #include "oci8.h"
12
+
13
+ static VALUE mOCI8Metadata;
14
+ static VALUE cOCI8MetadataBase;
15
+ static VALUE ptype_to_class;
16
+ static VALUE class_to_ptype;
17
+ static ID id_at_obj_link;
18
+
19
+ #define TO_METADATA(obj) ((oci8_metadata_t *)oci8_check_typeddata((obj), &oci8_metadata_base_data_type, 1))
20
+
21
+ typedef struct {
22
+ oci8_base_t base;
23
+ VALUE svc;
24
+ ub1 is_implicit;
25
+ } oci8_metadata_t;
26
+
27
+ static void oci8_metadata_mark(oci8_base_t *base)
28
+ {
29
+ oci8_metadata_t *md = (oci8_metadata_t *)base;
30
+ if (base->parent != NULL)
31
+ rb_gc_mark(base->parent->self);
32
+ rb_gc_mark(md->svc);
33
+ }
34
+
35
+ static void oci8_metadata_free(oci8_base_t *base)
36
+ {
37
+ base->type = 0; /* to prevent OCIDescriptorFree */
38
+ }
39
+
40
+ const oci8_handle_data_type_t oci8_metadata_base_data_type = {
41
+ {
42
+ "STACI::Metadata::Base",
43
+ {
44
+ (RUBY_DATA_FUNC)oci8_metadata_mark,
45
+ oci8_handle_cleanup,
46
+ oci8_handle_size,
47
+ },
48
+ &oci8_handle_data_type.rb_data_type, NULL,
49
+ #ifdef RUBY_TYPED_WB_PROTECTED
50
+ RUBY_TYPED_WB_PROTECTED,
51
+ #endif
52
+ },
53
+ oci8_metadata_free,
54
+ sizeof(oci8_metadata_t),
55
+ };
56
+
57
+ VALUE oci8_metadata_create(ACIParam *parmhp, VALUE svc, VALUE parent)
58
+ {
59
+ oci8_metadata_t *md;
60
+ oci8_base_t *p = oci8_check_typeddata(parent, &oci8_handle_data_type, 1);
61
+ ub1 ptype;
62
+ ub4 size;
63
+ VALUE klass;
64
+ VALUE obj;
65
+
66
+ chker2(ACIAttrGet(parmhp, ACI_DTYPE_PARAM, &ptype, &size, ACI_ATTR_PTYPE, oci8_errhp), p);
67
+ klass = rb_hash_aref(ptype_to_class, INT2FIX(ptype));
68
+ if (NIL_P(klass))
69
+ rb_raise(rb_eRuntimeError, "unknown parameter type %d", ptype);
70
+ obj = rb_obj_alloc(klass);
71
+ if (!RTEST(rb_obj_is_kind_of(obj, cOCI8MetadataBase))) {
72
+ rb_raise(rb_eRuntimeError, "invalid class in PTYPE_TO_CLASS");
73
+ }
74
+ md = TO_METADATA(obj);
75
+ md->base.type = ACI_DTYPE_PARAM;
76
+ md->base.hp.prm = parmhp;
77
+ RB_OBJ_WRITE(obj, &md->svc, svc);
78
+
79
+ if (p->type == ACI_HTYPE_STMT) {
80
+ md->is_implicit = 1;
81
+ } else {
82
+ md->is_implicit = 0;
83
+ }
84
+ oci8_link_to_parent(&md->base, p);
85
+ RB_OBJ_WRITTEN(obj, Qundef, p->self);
86
+ return obj;
87
+ }
88
+
89
+ static VALUE metadata_s_register_ptype(VALUE klass, VALUE ptype)
90
+ {
91
+ rb_hash_aset(ptype_to_class, ptype, klass);
92
+ rb_hash_aset(class_to_ptype, klass, ptype);
93
+ return Qnil;
94
+ }
95
+
96
+ /*
97
+ * call-seq:
98
+ * __param(attr_type) -> metadata information or nil
99
+ *
100
+ * Gets the value of the attribute specified by +attr_type+
101
+ * as an instance of an STACI::Metadata::Base's subclass.
102
+ *
103
+ * <b>Caution:</b> If the specified attr_type's datatype is not a
104
+ * metadata, it causes a segmentation fault.
105
+ */
106
+ static VALUE metadata_get_param(VALUE self, VALUE idx)
107
+ {
108
+ oci8_metadata_t *md = TO_METADATA(self);
109
+ oci8_svcctx_t *svcctx = oci8_get_svcctx(md->svc);
110
+ ACIParam *value;
111
+ ub4 size = sizeof(value);
112
+
113
+ Check_Type(idx, T_FIXNUM);
114
+ /* Is it remote call? */
115
+ chker2(ACIAttrGet_nb(svcctx, md->base.hp.ptr, md->base.type, &value, &size, FIX2INT(idx), oci8_errhp),
116
+ &svcctx->base);
117
+ if (size != sizeof(ACIParam *)) {
118
+ rb_raise(rb_eRuntimeError, "Invalid attribute size. expect %d, but %d", (sb4)sizeof(ACIParam *), size);
119
+ }
120
+ if (value == NULL) {
121
+ return Qnil;
122
+ }
123
+ return oci8_metadata_create(value, md->svc, self);
124
+ }
125
+
126
+ static VALUE metadata_get_param_at(VALUE self, VALUE idx)
127
+ {
128
+ oci8_metadata_t *md = TO_METADATA(self);
129
+ ACIParam *value;
130
+
131
+ chker2(ACIParamGet(md->base.hp.ptr, md->base.type, oci8_errhp, (dvoid *)&value, FIX2INT(idx)),
132
+ &md->base);
133
+ return oci8_metadata_create(value, md->svc, self);
134
+ }
135
+
136
+ static VALUE metadata_get_con(VALUE self)
137
+ {
138
+ oci8_metadata_t *md = TO_METADATA(self);
139
+ return md->svc;
140
+ }
141
+
142
+ static VALUE metadata_is_implicit_p(VALUE self)
143
+ {
144
+ oci8_metadata_t *md = TO_METADATA(self);
145
+ return md->is_implicit ? Qtrue : Qfalse;
146
+ }
147
+
148
+ VALUE oci8_do_describe(VALUE self, void *objptr, ub4 objlen, ub1 objtype, VALUE klass, VALUE check_public)
149
+ {
150
+ oci8_svcctx_t *svcctx = oci8_get_svcctx(self);
151
+ ACIParam *parmhp;
152
+ VALUE type;
153
+ VALUE obj;
154
+ oci8_base_t *desc;
155
+ int rv;
156
+
157
+ /* make a describe handle object */
158
+ obj = rb_obj_alloc(oci8_cOCIHandle);
159
+ desc = DATA_PTR(obj);
160
+ rv = ACIHandleAlloc(oci8_envhp, (dvoid *)&desc->hp.dschp, ACI_HTYPE_DESCRIBE, 0, 0);
161
+ if (rv != ACI_SUCCESS) {
162
+ oci8_env_raise(oci8_envhp, rv);
163
+ }
164
+ desc->type = ACI_HTYPE_DESCRIBE;
165
+
166
+ type = rb_hash_aref(class_to_ptype, klass);
167
+ if (RTEST(check_public)) {
168
+ sb4 val = -1;
169
+ /* size of OCI_ATTR_DESC_PUBLIC is undocumented. */
170
+ chker2(ACIAttrSet(desc->hp.dschp, ACI_HTYPE_DESCRIBE, &val, 0, ACI_ATTR_DESC_PUBLIC, oci8_errhp),
171
+ &svcctx->base);
172
+ }
173
+ chker2(ACIDescribeAny_nb(svcctx, svcctx->base.hp.svc, oci8_errhp, objptr, objlen,
174
+ objtype, ACI_DEFAULT, (ub1)FIX2INT(type), desc->hp.dschp),
175
+ &svcctx->base);
176
+ oci8_link_to_parent(desc, &svcctx->base);
177
+ chker2(ACIAttrGet(desc->hp.dschp, ACI_HTYPE_DESCRIBE, &parmhp, 0, ACI_ATTR_PARAM, oci8_errhp),
178
+ &svcctx->base);
179
+ return oci8_metadata_create(parmhp, self, obj);
180
+ }
181
+
182
+ /*
183
+ * call-seq:
184
+ * __describe(name, klass, check_public)
185
+ *
186
+ * @param [String] name object name
187
+ * @param [subclass of STACI::Metadata::Base] klass
188
+ * @param [Boolean] check_public +true+ to look up the object as a public synonym when
189
+ * the object does not exist in the current schema and
190
+ * the name includes no dots.
191
+ * @return [subclass of STACI::Metadata::Base]
192
+ *
193
+ * @private
194
+ */
195
+ static VALUE oci8_describe(VALUE self, VALUE name, VALUE klass, VALUE check_public)
196
+ {
197
+ char *str;
198
+ size_t idx, len;
199
+ VALUE metadata;
200
+ VALUE obj_link = Qnil;
201
+
202
+ OCI8SafeStringValue(name);
203
+ if (RSTRING_LEN(name) == 0) {
204
+ rb_raise(rb_eArgError, "empty string is set.");
205
+ }
206
+ str = RSTRING_PTR(name);
207
+ len = RSTRING_LEN(name);
208
+ for (idx = 0; idx < len; idx++) {
209
+ if (str[idx] == '@') {
210
+ obj_link = rb_enc_str_new(str + idx + 1, len - idx - 1, oci8_encoding);
211
+ break;
212
+ }
213
+ }
214
+ metadata = oci8_do_describe(self, str, len, ACI_OTYPE_NAME, klass, check_public);
215
+ rb_ivar_set(metadata, id_at_obj_link, obj_link);
216
+ return metadata;
217
+ }
218
+
219
+ static VALUE metadata_get_type_metadata(VALUE self, VALUE klass)
220
+ {
221
+ oci8_metadata_t *md = TO_METADATA(self);
222
+ oci8_svcctx_t *svcctx = oci8_get_svcctx(md->svc);
223
+ ACIRef *ref = NULL;
224
+
225
+ /* remote call */
226
+ chker2(ACIAttrGet_nb(svcctx, md->base.hp.ptr, md->base.type, &ref, NULL, ACI_ATTR_REF_TDO, oci8_errhp),
227
+ &svcctx->base);
228
+ return oci8_do_describe(md->svc, ref, 0, ACI_OTYPE_REF, klass, Qfalse);
229
+ }
230
+
231
+ static VALUE metadata_get_tdo_id(VALUE self)
232
+ {
233
+ oci8_metadata_t *md = TO_METADATA(self);
234
+ oci8_svcctx_t *svcctx = oci8_get_svcctx(md->svc);
235
+ ACIRef *tdo_ref = NULL;
236
+ void *tdo;
237
+
238
+ chker2(ACIAttrGet_nb(svcctx, md->base.hp.ptr, md->base.type, &tdo_ref, NULL, ACI_ATTR_REF_TDO, oci8_errhp),
239
+ &svcctx->base);
240
+ if (tdo_ref == NULL)
241
+ return Qnil;
242
+ chker2(ACIObjectPin_nb(svcctx, oci8_envhp, oci8_errhp, tdo_ref, 0, ACI_PIN_ANY, ACI_DURATION_SESSION, ACI_LOCK_NONE, &tdo),
243
+ &svcctx->base);
244
+ chker2(ACIObjectUnpin(oci8_envhp, oci8_errhp, tdo),
245
+ &svcctx->base);
246
+ #if SIZEOF_LONG == SIZEOF_VOIDP
247
+ return ((VALUE)tdo | (VALUE)1);
248
+ #else
249
+ return LL2NUM(((LONG_LONG)tdo) >>1);
250
+ #endif
251
+ }
252
+
253
+ static VALUE oci8_metadata_alloc(VALUE klass)
254
+ {
255
+ return oci8_allocate_typeddata(klass, &oci8_metadata_base_data_type);
256
+ }
257
+
258
+ void Init_oci8_metadata(VALUE cOCI8)
259
+ {
260
+ mOCI8Metadata = rb_define_module_under(cOCI8, "Metadata");
261
+ cOCI8MetadataBase = oci8_define_class_under(mOCI8Metadata, "Base", &oci8_metadata_base_data_type, oci8_metadata_alloc);
262
+ rb_global_variable(&ptype_to_class);
263
+ rb_global_variable(&class_to_ptype);
264
+ ptype_to_class = rb_hash_new();
265
+ class_to_ptype = rb_hash_new();
266
+ id_at_obj_link = rb_intern("@obj_link");
267
+
268
+ rb_define_singleton_method(cOCI8MetadataBase, "register_ptype", metadata_s_register_ptype, 1);
269
+ rb_define_private_method(cOCI8MetadataBase, "__param", metadata_get_param, 1);
270
+ rb_define_private_method(cOCI8MetadataBase, "__param_at", metadata_get_param_at, 1);
271
+ rb_define_private_method(cOCI8MetadataBase, "__con", metadata_get_con, 0);
272
+ rb_define_private_method(cOCI8MetadataBase, "__is_implicit?", metadata_is_implicit_p, 0);
273
+
274
+ rb_define_private_method(cOCI8, "__describe", oci8_describe, 3);
275
+ rb_define_private_method(cOCI8MetadataBase, "__type_metadata", metadata_get_type_metadata, 1);
276
+ rb_define_method(cOCI8MetadataBase, "tdo_id", metadata_get_tdo_id, 0);
277
+
278
+ rb_define_class_under(mOCI8Metadata, "Type", cOCI8MetadataBase);
279
+ }