ruby-oci8 1.0.7 → 2.0.0

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 (89) hide show
  1. data/ChangeLog +1254 -390
  2. data/Makefile +10 -13
  3. data/README +56 -385
  4. data/VERSION +1 -1
  5. data/dist-files +26 -27
  6. data/ext/oci8/.document +1 -0
  7. data/ext/oci8/MANIFEST +0 -4
  8. data/ext/oci8/apiwrap.c.tmpl +172 -0
  9. data/ext/oci8/apiwrap.h.tmpl +61 -0
  10. data/ext/oci8/apiwrap.rb +91 -0
  11. data/ext/oci8/apiwrap.yml +1243 -0
  12. data/ext/oci8/attr.c +124 -384
  13. data/ext/oci8/bind.c +472 -164
  14. data/ext/oci8/encoding.c +196 -0
  15. data/ext/oci8/env.c +84 -253
  16. data/ext/oci8/error.c +196 -127
  17. data/ext/oci8/extconf.rb +82 -59
  18. data/ext/oci8/lob.c +710 -370
  19. data/ext/oci8/metadata.c +359 -0
  20. data/ext/oci8/object.c +622 -0
  21. data/ext/oci8/oci8.c +577 -161
  22. data/ext/oci8/oci8.h +354 -258
  23. data/ext/oci8/oci8lib.c +493 -0
  24. data/ext/oci8/ocidatetime.c +473 -0
  25. data/ext/oci8/ocinumber.c +1123 -24
  26. data/ext/oci8/oraconf.rb +72 -106
  27. data/ext/oci8/oradate.c +511 -321
  28. data/ext/oci8/stmt.c +752 -572
  29. data/ext/oci8/win32.c +131 -0
  30. data/ext/oci8/xmldb.c +383 -0
  31. data/lib/.document +2 -0
  32. data/lib/dbd/OCI8.rb +2 -17
  33. data/lib/oci8.rb.in +41 -1622
  34. data/lib/oci8/.document +5 -0
  35. data/lib/oci8/compat.rb +108 -0
  36. data/lib/oci8/datetime.rb +489 -0
  37. data/lib/oci8/encoding-init.rb +40 -0
  38. data/lib/oci8/encoding.yml +537 -0
  39. data/lib/oci8/metadata.rb +2077 -0
  40. data/lib/oci8/object.rb +548 -0
  41. data/lib/oci8/oci8.rb +773 -0
  42. data/lib/oci8/oracle_version.rb +144 -0
  43. data/metaconfig +3 -3
  44. data/ruby-oci8.gemspec +5 -5
  45. data/setup.rb +4 -4
  46. data/test/config.rb +64 -84
  47. data/test/test_all.rb +14 -21
  48. data/test/test_array_dml.rb +317 -0
  49. data/test/test_bind_raw.rb +18 -25
  50. data/test/test_bind_time.rb +78 -91
  51. data/test/test_break.rb +37 -35
  52. data/test/test_clob.rb +33 -89
  53. data/test/test_connstr.rb +5 -4
  54. data/test/test_datetime.rb +469 -0
  55. data/test/test_dbi.rb +99 -60
  56. data/test/test_dbi_clob.rb +3 -8
  57. data/test/test_metadata.rb +65 -51
  58. data/test/test_oci8.rb +151 -55
  59. data/test/test_oracle_version.rb +70 -0
  60. data/test/test_oradate.rb +76 -83
  61. data/test/test_oranumber.rb +405 -71
  62. data/test/test_rowid.rb +6 -11
  63. metadata +31 -32
  64. data/NEWS +0 -420
  65. data/ext/oci8/const.c +0 -165
  66. data/ext/oci8/define.c +0 -53
  67. data/ext/oci8/describe.c +0 -81
  68. data/ext/oci8/descriptor.c +0 -39
  69. data/ext/oci8/handle.c +0 -273
  70. data/ext/oci8/oranumber.c +0 -445
  71. data/ext/oci8/param.c +0 -37
  72. data/ext/oci8/server.c +0 -182
  73. data/ext/oci8/session.c +0 -99
  74. data/ext/oci8/svcctx.c +0 -238
  75. data/ruby-oci8.spec +0 -62
  76. data/support/README +0 -4
  77. data/support/runit/assert.rb +0 -281
  78. data/support/runit/cui/testrunner.rb +0 -101
  79. data/support/runit/error.rb +0 -4
  80. data/support/runit/method_mappable.rb +0 -20
  81. data/support/runit/robserver.rb +0 -25
  82. data/support/runit/setuppable.rb +0 -15
  83. data/support/runit/teardownable.rb +0 -16
  84. data/support/runit/testcase.rb +0 -113
  85. data/support/runit/testfailure.rb +0 -25
  86. data/support/runit/testresult.rb +0 -121
  87. data/support/runit/testsuite.rb +0 -43
  88. data/support/runit/version.rb +0 -3
  89. data/test/test_describe.rb +0 -137
@@ -1,165 +0,0 @@
1
- /*
2
- const.c - part of ruby-oci8
3
-
4
- Copyright (C) 2002-2006 KUBO Takehiro <kubo@jiubao.org>
5
-
6
- define constant values.
7
- */
8
- #include "oci8.h"
9
-
10
- ID oci8_id_code;
11
- ID oci8_id_define_array;
12
- ID oci8_id_bind_hash;
13
- ID oci8_id_message;
14
- ID oci8_id_new;
15
- ID oci8_id_parse_error_offset;
16
- ID oci8_id_server;
17
- ID oci8_id_session;
18
- ID oci8_id_sql;
19
-
20
- struct oci8_names {
21
- const char *name;
22
- VALUE value;
23
- };
24
- typedef struct oci8_names oci8_names_t;
25
- #define ENTRY(name) {#name, INT2FIX(name)}
26
-
27
- static oci8_names_t oci8_typecode[] = {
28
- ENTRY(OCI_TYPECODE_VARCHAR), /* 1(SQLT_CHR) */
29
- ENTRY(OCI_TYPECODE_NUMBER), /* 2(SQLT_NUM) */
30
- ENTRY(OCI_TYPECODE_DATE), /* 12(SQLT_DAT) */
31
- ENTRY(OCI_TYPECODE_UNSIGNED8), /* 23(SQLT_BIN) */
32
- ENTRY(OCI_TYPECODE_RAW), /* 95(SQLT_LVB) */
33
- ENTRY(OCI_TYPECODE_CHAR), /* 96(SQLT_AFC) */
34
- #ifdef OCI_TYPECODE_BDOUBLE
35
- ENTRY(OCI_TYPECODE_BDOUBLE), /* 101(SQLT_IBDOUBLE) */
36
- #endif
37
- ENTRY(OCI_TYPECODE_OBJECT), /* 108(SQLT_NTY) */
38
- ENTRY(OCI_TYPECODE_BLOB), /* 113(SQLT_BLOB) */
39
- ENTRY(OCI_TYPECODE_CLOB), /* 112(SQLT_CLOB) */
40
- ENTRY(OCI_TYPECODE_NAMEDCOLLECTION), /* 122(SQLT_NCO) */
41
- ENTRY(SQLT_RDD) /* 104 */
42
- };
43
- #define NUM_OF_OCI8_TYPECODE (sizeof(oci8_typecode) / sizeof(oci8_typecode[0]))
44
-
45
- static VALUE oci8_make_names(oci8_names_t *names, size_t size)
46
- {
47
- volatile VALUE ary;
48
- unsigned int i;
49
-
50
- ary = rb_ary_new();
51
- for (i = 0;i < size;i++)
52
- rb_ary_store(ary, FIX2INT(names[i].value), rb_str_new2(names[i].name));
53
- return ary;
54
- }
55
-
56
- void Init_oci8_const(void)
57
- {
58
- unsigned int i;
59
-
60
- oci8_id_code = rb_intern("code");
61
- oci8_id_define_array = rb_intern("define_array");
62
- oci8_id_bind_hash = rb_intern("bind_hash");
63
- oci8_id_message = rb_intern("message");
64
- oci8_id_new = rb_intern("new");
65
- oci8_id_parse_error_offset = rb_intern("parse_error_offset");
66
- oci8_id_server = rb_intern("server");
67
- oci8_id_session = rb_intern("session");
68
- oci8_id_sql = rb_intern("sql");
69
-
70
- rb_define_global_const("OCI_DEFAULT", INT2FIX(OCI_DEFAULT));
71
- rb_define_global_const("OCI_OBJECT", INT2FIX(OCI_OBJECT));
72
- rb_define_global_const("OCI_CRED_RDBMS", INT2FIX(OCI_CRED_RDBMS));
73
- rb_define_global_const("OCI_CRED_EXT", INT2FIX(OCI_CRED_EXT));
74
- rb_define_global_const("OCI_MIGRATE", INT2FIX(OCI_MIGRATE));
75
- rb_define_global_const("OCI_SYSDBA", INT2FIX(OCI_SYSDBA));
76
- rb_define_global_const("OCI_SYSOPER", INT2FIX(OCI_SYSOPER));
77
- rb_define_global_const("OCI_PRELIM_AUTH", INT2FIX(OCI_PRELIM_AUTH));
78
-
79
- /* OCIStmt#prepare */
80
- rb_define_global_const("OCI_NTV_SYNTAX", INT2FIX(OCI_NTV_SYNTAX));
81
- rb_define_global_const("OCI_V7_SYNTAX", INT2FIX(OCI_V7_SYNTAX));
82
- rb_define_global_const("OCI_V8_SYNTAX", INT2FIX(OCI_V8_SYNTAX));
83
-
84
- /* OCIStmt#execute */
85
- #ifdef OCI_BATCH_ERRORS
86
- rb_define_global_const("OCI_BATCH_ERRORS", INT2FIX(OCI_BATCH_ERRORS));
87
- #endif
88
- rb_define_global_const("OCI_COMMIT_ON_SUCCESS", INT2FIX(OCI_COMMIT_ON_SUCCESS));
89
- rb_define_global_const("OCI_DESCRIBE_ONLY", INT2FIX(OCI_DESCRIBE_ONLY));
90
- rb_define_global_const("OCI_EXACT_FETCH", INT2FIX(OCI_EXACT_FETCH));
91
- #ifdef OCI_PARSE_ONLY
92
- rb_define_global_const("OCI_PARSE_ONLY", INT2FIX(OCI_PARSE_ONLY));
93
- #endif
94
- #ifdef OCI_STMT_SCROLLABLE_READONLY
95
- rb_define_global_const("OCI_STMT_SCROLLABLE_READONLY", INT2FIX(OCI_STMT_SCROLLABLE_READONLY));
96
- #endif
97
-
98
- rb_define_global_const("OCI_AUTH", INT2FIX(OCI_AUTH));
99
- #ifdef OCI_SHARED
100
- rb_define_global_const("OCI_SHARED", INT2FIX(OCI_SHARED));
101
- #endif
102
- #ifdef OCI_CPOOL
103
- rb_define_global_const("OCI_CPOOL", INT2FIX(OCI_CPOOL));
104
- #endif
105
- #ifdef OCI_NO_SHARING
106
- rb_define_global_const("OCI_NO_SHARING", INT2FIX(OCI_NO_SHARING));
107
- #endif
108
-
109
- rb_define_global_const("OCI_FETCH_NEXT", INT2FIX(OCI_FETCH_NEXT));
110
-
111
- for (i = 0;i < oci8_attr_size;i++) {
112
- rb_define_global_const(oci8_attr_list[i].name, INT2FIX(i));
113
- }
114
-
115
- /* TYPE CODE */
116
- for (i = 0;i < NUM_OF_OCI8_TYPECODE;i++)
117
- rb_define_global_const(oci8_typecode[i].name, oci8_typecode[i].value);
118
- rb_define_global_const("OCI_TYPECODE_NAMES", oci8_make_names(oci8_typecode, NUM_OF_OCI8_TYPECODE));
119
-
120
- /* OCI Parameter Types */
121
- rb_define_global_const("OCI_PTYPE_UNK", INT2FIX(OCI_PTYPE_UNK));
122
- rb_define_global_const("OCI_PTYPE_TABLE", INT2FIX(OCI_PTYPE_TABLE));
123
- rb_define_global_const("OCI_PTYPE_VIEW", INT2FIX(OCI_PTYPE_VIEW));
124
- rb_define_global_const("OCI_PTYPE_PROC", INT2FIX(OCI_PTYPE_PROC));
125
- rb_define_global_const("OCI_PTYPE_FUNC", INT2FIX(OCI_PTYPE_FUNC));
126
- rb_define_global_const("OCI_PTYPE_PKG", INT2FIX(OCI_PTYPE_PKG));
127
- rb_define_global_const("OCI_PTYPE_TYPE", INT2FIX(OCI_PTYPE_TYPE));
128
- rb_define_global_const("OCI_PTYPE_SYN", INT2FIX(OCI_PTYPE_SYN));
129
- rb_define_global_const("OCI_PTYPE_SEQ", INT2FIX(OCI_PTYPE_SEQ));
130
- rb_define_global_const("OCI_PTYPE_COL", INT2FIX(OCI_PTYPE_COL));
131
- rb_define_global_const("OCI_PTYPE_ARG", INT2FIX(OCI_PTYPE_ARG));
132
- rb_define_global_const("OCI_PTYPE_LIST", INT2FIX(OCI_PTYPE_LIST));
133
- rb_define_global_const("OCI_PTYPE_TYPE_ATTR", INT2FIX(OCI_PTYPE_TYPE_ATTR));
134
- rb_define_global_const("OCI_PTYPE_TYPE_COLL", INT2FIX(OCI_PTYPE_TYPE_COLL));
135
- rb_define_global_const("OCI_PTYPE_TYPE_METHOD", INT2FIX(OCI_PTYPE_TYPE_METHOD));
136
- rb_define_global_const("OCI_PTYPE_TYPE_ARG", INT2FIX(OCI_PTYPE_TYPE_ARG));
137
- rb_define_global_const("OCI_PTYPE_TYPE_RESULT", INT2FIX(OCI_PTYPE_TYPE_RESULT));
138
- #ifdef OCI_PTYPE_SCHEMA
139
- rb_define_global_const("OCI_PTYPE_SCHEMA", INT2FIX(OCI_PTYPE_SCHEMA));
140
- #endif
141
- #ifdef OCI_PTYPE_DATABASE
142
- rb_define_global_const("OCI_PTYPE_DATABASE", INT2FIX(OCI_PTYPE_DATABASE));
143
- #endif
144
-
145
- /* Bind and Define Options */
146
- rb_define_global_const("OCI_DATA_AT_EXEC", INT2FIX(OCI_DATA_AT_EXEC));
147
- rb_define_global_const("OCI_DYNAMIC_FETCH", INT2FIX(OCI_DYNAMIC_FETCH));
148
-
149
- /* OCI Statement Types */
150
- rb_define_global_const("OCI_STMT_SELECT", INT2FIX(OCI_STMT_SELECT));
151
- rb_define_global_const("OCI_STMT_UPDATE", INT2FIX(OCI_STMT_UPDATE));
152
- rb_define_global_const("OCI_STMT_DELETE", INT2FIX(OCI_STMT_DELETE));
153
- rb_define_global_const("OCI_STMT_INSERT", INT2FIX(OCI_STMT_INSERT));
154
- rb_define_global_const("OCI_STMT_CREATE", INT2FIX(OCI_STMT_CREATE));
155
- rb_define_global_const("OCI_STMT_DROP", INT2FIX(OCI_STMT_DROP));
156
- rb_define_global_const("OCI_STMT_ALTER", INT2FIX(OCI_STMT_ALTER));
157
- rb_define_global_const("OCI_STMT_BEGIN", INT2FIX(OCI_STMT_BEGIN));
158
- rb_define_global_const("OCI_STMT_DECLARE", INT2FIX(OCI_STMT_DECLARE));
159
-
160
- /* Piece Definitions */
161
- rb_define_global_const("OCI_ONE_PIECE", INT2FIX(OCI_ONE_PIECE));
162
- rb_define_global_const("OCI_FIRST_PIECE", INT2FIX(OCI_FIRST_PIECE));
163
- rb_define_global_const("OCI_NEXT_PIECE", INT2FIX(OCI_NEXT_PIECE));
164
- rb_define_global_const("OCI_LAST_PIECE", INT2FIX(OCI_LAST_PIECE));
165
- }
@@ -1,53 +0,0 @@
1
- /*
2
- define.c - part of ruby-oci8
3
-
4
- Copyright (C) 2002 KUBO Takehiro <kubo@jiubao.org>
5
-
6
- =begin
7
- == OCIDefine
8
- The define handle, which is created by ((<OCIStmt#defineByPos>)).
9
-
10
- The fetched data of select statements is got via this handle.
11
-
12
- super class: ((<OCIHandle>))
13
-
14
- correspond native OCI datatype: ((|OCIDefine|))
15
- =end
16
- */
17
- #include "oci8.h"
18
-
19
- /*
20
- =begin
21
- --- OCIDefine#get()
22
- get the selected date.
23
-
24
- :return value
25
- fetched data. Its datatype is correspond to the 2nd argument of ((<OCIStmt#defineByPos>)).
26
-
27
- correspond native OCI function: nothing
28
- =end
29
- */
30
- static VALUE oci8_get_data(VALUE self)
31
- {
32
- oci8_bind_handle_t *defnhp;
33
- VALUE obj;
34
-
35
- Data_Get_Struct(self, oci8_bind_handle_t, defnhp);
36
- obj = oci8_get_value(defnhp);
37
- return obj;
38
- }
39
-
40
- static VALUE oci8_set_data(VALUE self, VALUE val)
41
- {
42
- oci8_bind_handle_t *hp;
43
-
44
- Data_Get_Struct(self, oci8_bind_handle_t, hp);
45
- oci8_set_value(hp, val);
46
- return self;
47
- }
48
-
49
- void Init_oci8_define(void)
50
- {
51
- rb_define_method(cOCIDefine, "get", oci8_get_data, 0);
52
- rb_define_method(cOCIDefine, "set", oci8_set_data, 1);
53
- }
@@ -1,81 +0,0 @@
1
- /*
2
- describe.c - part of ruby-oci8
3
-
4
- Copyright (C) 2002 KUBO Takehiro <kubo@jiubao.org>
5
-
6
- =begin
7
- == OCIDescribe
8
- The describe handle, which is used for the explicit describe.
9
-
10
- super class: ((<OCIHandle>))
11
-
12
- correspond native OCI datatype: ((|OCIDescribe|))
13
-
14
- For example:
15
- dsc = env.alloc(OCIDescribe)
16
- dsc.describeAny(svc, "EMP", OCI_PTYPE_TABLE)
17
- parm = dsc.attrGet(OCI_ATTR_PARAM)
18
- ...get various information from parm...
19
-
20
- TODO: more explanation and examples.
21
-
22
- =end
23
- */
24
- #include "oci8.h"
25
-
26
- /*
27
- =begin
28
- --- OCIDescribe#describeAny(svc, name, type)
29
- get various information of Oracle's schema objects: tables, views, synonyms,
30
- procedures, functions, packages, sequences, and types.
31
-
32
- :svc
33
- ((<service context handle|OCISvcCtx>)) in which the object to describe exists.
34
- :name
35
- name of object to describe.
36
- :type
37
- type of object to describe.
38
-
39
- * ((|OCI_PTYPE_TABLE|)), for tables
40
- * ((|OCI_PTYPE_VIEW|)), for views
41
- * ((|OCI_PTYPE_PROC|)), for procedures
42
- * ((|OCI_PTYPE_FUNC|)), for functions
43
- * ((|OCI_PTYPE_PKG|)), for packages
44
- * ((|OCI_PTYPE_TYPE|)), for types
45
- * ((|OCI_PTYPE_SYN|)), for synonyms
46
- * ((|OCI_PTYPE_SEQ|)), for sequences
47
- * ((|OCI_PTYPE_SCHEMA|)), for schemas
48
- * ((|OCI_PTYPE_DATABASE|)), for databases
49
- * ((|OCI_PTYPE_UNK|)), for unknown schema objects
50
-
51
- correspond native OCI function: ((|OCIDescribeAny|))
52
-
53
- ((*note*)): To use this method in Oracle 8.0.5 for Linux,
54
- call OCIEnv.create with OCI_OBJECT or segmentation fault occurs.
55
- This bug was fixed 8.0.6 or later.
56
- =end
57
- */
58
- static VALUE oci8_describe_any(VALUE self, VALUE vdsc, VALUE vname, VALUE vtype)
59
- {
60
- oci8_handle_t *h;
61
- oci8_handle_t *svch;
62
- oci8_string_t name;
63
- ub1 type;
64
- sword rv;
65
-
66
- Get_Handle(self, h); /* 0 */
67
- Check_Handle(vdsc, OCISvcCtx, svch); /* 1 */
68
- Get_String(vname, name); /* 2 */
69
- type = FIX2INT(vtype); /* 3 */
70
-
71
- rv = OCIDescribeAny(svch->hp, h->errhp, name.ptr, name.len, OCI_OTYPE_NAME, OCI_DEFAULT, type, h->hp);
72
- if (rv != OCI_SUCCESS) {
73
- oci8_raise(h->errhp, rv, NULL);
74
- }
75
- return self;
76
- }
77
-
78
- void Init_oci8_describe(void)
79
- {
80
- rb_define_method(cOCIDescribe, "describeAny", oci8_describe_any, 3);
81
- }
@@ -1,39 +0,0 @@
1
- /*
2
- descriptor.c - part of ruby-oci8
3
-
4
- Copyright (C) 2002 KUBO Takehiro <kubo@jiubao.org>
5
-
6
- =begin
7
- == OCIDescriptor
8
- The abstract class of OCI descriptors.
9
- =end
10
- */
11
- #include "oci8.h"
12
-
13
- /*
14
- =begin
15
- --- OCIDescriptor#attrGet(type)
16
- :type
17
- the type of attribute.
18
- :return value
19
- depends on argument ((|type|)).
20
-
21
- See also ((<Attributes of Handles and Descriptors>)).
22
- =end
23
- */
24
-
25
- /*
26
- =begin
27
- --- OCIDescriptor#free()
28
- explicitly free the OCI's data structure associated with this object.
29
- This call will not free ruby's object itself, which wrap the OCI's data structure.
30
- =end
31
- */
32
-
33
- void Init_oci8_descriptor(void)
34
- {
35
- rb_define_method(cOCIDescriptor, "attrGet", oci8_attr_get, 1);
36
- rb_define_method(cOCIDescriptor, "attrSet", oci8_attr_set, 2);
37
- rb_define_method(cOCIDescriptor, "free", oci8_handle_free, 0);
38
- rb_define_singleton_method(cOCIDescriptor, "new", oci8_s_new, 0);
39
- }
@@ -1,273 +0,0 @@
1
- /*
2
- handle.c - part of ruby-oci8
3
-
4
- Copyright (C) 2002-2006 KUBO Takehiro <kubo@jiubao.org>
5
-
6
- =begin
7
- == OCIHandle
8
- This is the abstract super class of OCI Handles.
9
- See ((<Class Hierarchy>)).
10
- =end
11
- */
12
- #include "oci8.h"
13
- #ifdef HAVE_UNISTD_H
14
- #include <unistd.h> /* getpid() */
15
- #endif
16
-
17
- #ifdef WIN32
18
- #ifndef getpid
19
- extern rb_pid_t rb_w32_getpid(void);
20
- #define getpid() rb_w32_getpid()
21
- #endif
22
- #endif
23
-
24
- static void oci8_handle_do_free(oci8_handle_t *h)
25
- {
26
- unsigned int i;
27
- if (h->type == 0) {
28
- return;
29
- }
30
- /* free its children recursively.*/
31
- for (i = 0;i < h->size;i++) {
32
- if (h->children[i] != NULL)
33
- oci8_handle_do_free(h->children[i]);
34
- }
35
- xfree(h->children);
36
- /* unlink from parent */
37
- oci8_unlink(h);
38
- /* do free */
39
- if (h->hp != NULL) {
40
- if (h->type >= OCI_DTYPE_FIRST)
41
- OCIDescriptorFree(h->hp, h->type);
42
- else
43
- OCIHandleFree(h->hp, h->type);
44
- }
45
- h->type = 0;
46
- return;
47
- }
48
-
49
- /*
50
- =begin
51
- --- OCIHandle#attrSet(type, value)
52
- :type
53
- the type of attribute to be set.
54
- See ((<Attributes of Handles and Descriptors>)).
55
- :value
56
- depends on ((|type|)).
57
-
58
- correspond native OCI function: ((|OCIAttrSet|))
59
- =end
60
- */
61
-
62
-
63
- /*
64
- =begin
65
- --- OCIHandle#attrGet(type)
66
- :type
67
- the type of attribute.
68
- See also ((<Attributes of Handles and Descriptors>)).
69
- :return value
70
- depends on ((|type|)).
71
-
72
- correspond native OCI function: ((|OCIAttrGet|))
73
- =end
74
- */
75
-
76
-
77
- /*
78
- =begin
79
- --- OCIHandle#free()
80
- explicitly free the OCI's data structure.
81
-
82
- correspond native OCI function: ((|OCIHandleFree|))
83
- =end
84
- */
85
- VALUE oci8_handle_free(VALUE self)
86
- {
87
- oci8_handle_t *h;
88
-
89
- Get_Handle(self, h);
90
- oci8_handle_do_free(h);
91
- return self;
92
- }
93
-
94
- void Init_oci8_handle(void)
95
- {
96
- rb_define_method(cOCIHandle, "free", oci8_handle_free, 0);
97
- rb_define_method(cOCIHandle, "attrSet", oci8_attr_set, 2);
98
- rb_define_method(cOCIHandle, "attrGet", oci8_attr_get, 1);
99
- rb_define_singleton_method(cOCIHandle, "new", oci8_s_new, 0);
100
- }
101
-
102
- void oci8_handle_cleanup(oci8_handle_t *h)
103
- {
104
- oci8_handle_do_free(h);
105
- xfree(h);
106
- }
107
-
108
- VALUE oci8_s_new(VALUE self)
109
- {
110
- rb_raise(rb_eNameError, "private method `new' called for %s:Class", rb_class2name(self));
111
- }
112
-
113
-
114
- static void oci8_handle_mark(oci8_handle_t *h)
115
- {
116
- oci8_bind_handle_t *bh;
117
- unsigned int i;
118
-
119
- switch (h->type) {
120
- case OCI_HTYPE_SVCCTX:
121
- for (i = 0;i < h->size;i++) {
122
- if (h->children[i] != NULL) {
123
- if (h->children[i]->type == OCI_HTYPE_SERVER || h->children[i]->type == OCI_HTYPE_SESSION) {
124
- rb_gc_mark(h->children[i]->self);
125
- }
126
- }
127
- }
128
- break;
129
- case OCI_HTYPE_STMT:
130
- for (i = 0;i < h->size;i++) {
131
- if (h->children[i] != NULL) {
132
- if (h->children[i]->type == OCI_HTYPE_BIND || h->children[i]->type == OCI_HTYPE_DEFINE) {
133
- rb_gc_mark(h->children[i]->self);
134
- }
135
- }
136
- }
137
- break;
138
- case OCI_HTYPE_DEFINE:
139
- case OCI_HTYPE_BIND:
140
- bh = (oci8_bind_handle_t *)h;
141
- if (bh->bind_type == BIND_HANDLE)
142
- rb_gc_mark(bh->value.handle.v);
143
- break;
144
- }
145
- if (h->parent != NULL) {
146
- rb_gc_mark(h->parent->self);
147
- }
148
- }
149
-
150
- oci8_handle_t *oci8_make_handle(ub4 type, dvoid *hp, OCIError *errhp, oci8_handle_t *parenth, sb4 value_sz)
151
- {
152
- VALUE obj;
153
- oci8_handle_t *h;
154
- oci8_bind_handle_t *bh;
155
-
156
- switch (type) {
157
- case OCI_HTYPE_ENV:
158
- obj = Data_Make_Struct(cOCIEnv, oci8_handle_t, oci8_handle_mark, oci8_handle_cleanup, h);
159
- break;
160
- case OCI_HTYPE_SVCCTX:
161
- obj = Data_Make_Struct(cOCISvcCtx, oci8_handle_t, oci8_handle_mark, oci8_handle_cleanup, h);
162
- h->u.svcctx.pid = getpid();
163
- break;
164
- case OCI_HTYPE_STMT:
165
- obj = Data_Make_Struct(cOCIStmt, oci8_handle_t, oci8_handle_mark, oci8_handle_cleanup, h);
166
- rb_ivar_set(obj, oci8_id_define_array, Qnil);
167
- rb_ivar_set(obj, oci8_id_bind_hash, Qnil);
168
- break;
169
- case OCI_HTYPE_SERVER:
170
- obj = Data_Make_Struct(cOCIServer, oci8_handle_t, oci8_handle_mark, oci8_handle_cleanup, h);
171
- break;
172
- case OCI_HTYPE_SESSION:
173
- obj = Data_Make_Struct(cOCISession, oci8_handle_t, oci8_handle_mark, oci8_handle_cleanup, h);
174
- break;
175
- case OCI_HTYPE_DESCRIBE:
176
- obj = Data_Make_Struct(cOCIDescribe, oci8_handle_t, oci8_handle_mark, oci8_handle_cleanup, h);
177
- break;
178
- case OCI_DTYPE_LOB:
179
- obj = Data_Make_Struct(cOCILobLocator, oci8_handle_t, oci8_handle_mark, oci8_handle_cleanup, h);
180
- #ifndef OCI8_USE_CALLBACK_LOB_READ
181
- h->u.lob_locator.char_width = 1;
182
- #endif
183
- break;
184
- case OCI_DTYPE_FILE:
185
- obj = Data_Make_Struct(cOCIFileLocator, oci8_handle_t, oci8_handle_mark, oci8_handle_cleanup, h);
186
- #ifndef OCI8_USE_CALLBACK_LOB_READ
187
- h->u.lob_locator.char_width = 1;
188
- #endif
189
- break;
190
- case OCI_DTYPE_ROWID:
191
- obj = Data_Make_Struct(cOCIRowid, oci8_handle_t, oci8_handle_mark, oci8_handle_cleanup, h);
192
- break;
193
- case OCI_DTYPE_PARAM:
194
- obj = Data_Make_Struct(cOCIParam, oci8_handle_t, oci8_handle_mark, oci8_handle_cleanup, h);
195
- h->u.param.is_implicit = 0;
196
- break;
197
- case OCI_HTYPE_BIND:
198
- bh = xmalloc(sizeof(oci8_bind_handle_t) - sizeof(bh->value) + value_sz);
199
- memset(bh, 0, sizeof(oci8_bind_handle_t) - sizeof(bh->value) + value_sz);
200
- obj = Data_Wrap_Struct(cOCIBind, oci8_handle_mark, oci8_handle_cleanup, bh);
201
- bh->bind_type = 0;
202
- bh->ind = -1;
203
- bh->rlen = value_sz;
204
- bh->value_sz = value_sz;
205
- h = (oci8_handle_t *)bh;
206
- break;
207
- case OCI_HTYPE_DEFINE:
208
- bh = xmalloc(sizeof(oci8_bind_handle_t) - sizeof(bh->value) + value_sz);
209
- memset(bh, 0, sizeof(oci8_bind_handle_t) - sizeof(bh->value) + value_sz);
210
- obj = Data_Wrap_Struct(cOCIDefine, oci8_handle_mark, oci8_handle_cleanup, bh);
211
- bh->bind_type = 0;
212
- bh->ind = -1;
213
- bh->rlen = value_sz;
214
- bh->value_sz = value_sz;
215
- h = (oci8_handle_t *)bh;
216
- break;
217
- default:
218
- rb_bug("unsupported type %d in oci8_make_handle()", type);
219
- }
220
- h->type = type;
221
- h->hp = hp;
222
- h->errhp = errhp;
223
- h->self = obj;
224
- h->parent = NULL;
225
- h->size = 0;
226
- h->children = NULL;
227
- oci8_link(parenth, h);
228
- return h;
229
- }
230
-
231
- #define CHILDREN_ARRAY_GROW_SIZE 16
232
-
233
- void oci8_link(oci8_handle_t *parent, oci8_handle_t *child)
234
- {
235
- unsigned int i;
236
- int new_size, n;
237
-
238
- if (parent == NULL)
239
- return;
240
- oci8_unlink(child);
241
- child->parent = parent;
242
-
243
- for (i = 0;i < parent->size;i++) {
244
- if (parent->children[i] == NULL) {
245
- parent->children[i] = child;
246
- return;
247
- }
248
- }
249
- new_size = parent->size + CHILDREN_ARRAY_GROW_SIZE;
250
- parent->children = xrealloc(parent->children, sizeof(oci8_handle_t *) * new_size);
251
- parent->children[parent->size] = child;
252
- for (n = parent->size + 1;n < new_size;n++) {
253
- parent->children[n] = NULL;
254
- }
255
- parent->size = new_size;
256
- return;
257
- }
258
-
259
- void oci8_unlink(oci8_handle_t *self)
260
- {
261
- oci8_handle_t *parent = self->parent;
262
- unsigned int i;
263
-
264
- if (self->parent == NULL)
265
- return;
266
- for (i = 0;i < parent->size;i++) {
267
- if (parent->children[i] == self) {
268
- parent->children[i] = NULL;
269
- self->parent = NULL;
270
- return;
271
- }
272
- }
273
- }