ruby-oci8 1.0.7-x86-mswin32-60 → 2.0.1-x86-mswin32-60

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 (58) hide show
  1. data/ChangeLog +1289 -383
  2. data/Makefile +48 -12
  3. data/NEWS +5 -419
  4. data/README +56 -385
  5. data/VERSION +1 -1
  6. data/dist-files +27 -27
  7. data/lib/.document +2 -0
  8. data/lib/dbd/OCI8.rb +2 -17
  9. data/lib/oci8.rb +48 -1622
  10. data/lib/oci8.rb.in +48 -1622
  11. data/lib/oci8/.document +5 -0
  12. data/lib/oci8/compat.rb +108 -0
  13. data/lib/oci8/datetime.rb +491 -0
  14. data/lib/oci8/encoding-init.rb +40 -0
  15. data/lib/oci8/encoding.yml +537 -0
  16. data/lib/oci8/metadata.rb +2077 -0
  17. data/lib/oci8/object.rb +548 -0
  18. data/lib/oci8/oci8.rb +798 -0
  19. data/lib/oci8/oracle_version.rb +144 -0
  20. data/lib/oci8lib_18.so +0 -0
  21. data/lib/oci8lib_191.so +0 -0
  22. data/metaconfig +3 -3
  23. data/ruby-oci8.gemspec +24 -15
  24. data/setup.rb +4 -4
  25. data/test/config.rb +64 -84
  26. data/test/test_all.rb +14 -21
  27. data/test/test_array_dml.rb +333 -0
  28. data/test/test_bind_raw.rb +18 -25
  29. data/test/test_bind_time.rb +78 -91
  30. data/test/test_break.rb +37 -35
  31. data/test/test_clob.rb +33 -89
  32. data/test/test_connstr.rb +5 -4
  33. data/test/test_datetime.rb +469 -0
  34. data/test/test_dbi.rb +99 -60
  35. data/test/test_dbi_clob.rb +3 -8
  36. data/test/test_metadata.rb +65 -51
  37. data/test/test_oci8.rb +151 -55
  38. data/test/test_oracle_version.rb +70 -0
  39. data/test/test_oradate.rb +76 -83
  40. data/test/test_oranumber.rb +405 -71
  41. data/test/test_rowid.rb +6 -11
  42. metadata +21 -25
  43. data/ext/oci8/oci8lib.so +0 -0
  44. data/ruby-oci8.spec +0 -62
  45. data/support/README +0 -4
  46. data/support/runit/assert.rb +0 -281
  47. data/support/runit/cui/testrunner.rb +0 -101
  48. data/support/runit/error.rb +0 -4
  49. data/support/runit/method_mappable.rb +0 -20
  50. data/support/runit/robserver.rb +0 -25
  51. data/support/runit/setuppable.rb +0 -15
  52. data/support/runit/teardownable.rb +0 -16
  53. data/support/runit/testcase.rb +0 -113
  54. data/support/runit/testfailure.rb +0 -25
  55. data/support/runit/testresult.rb +0 -121
  56. data/support/runit/testsuite.rb +0 -43
  57. data/support/runit/version.rb +0 -3
  58. data/test/test_describe.rb +0 -137
@@ -0,0 +1,2077 @@
1
+ # Implement OCI8::Metadata.
2
+ # See {'Describing Schema Metadata' in Oracle Call Interface Programmer's Guide}
3
+ # [http://download-west.oracle.com/docs/cd/B19306_01/appdev.102/b14250/oci06des.htm]
4
+
5
+ #
6
+ class OCI8
7
+
8
+ # :stopdoc:
9
+
10
+ # Attribute Types in oci.h
11
+ OCI_ATTR_DATA_SIZE = 1 # maximum size of the data
12
+ OCI_ATTR_DATA_TYPE = 2 # the SQL type of the column/argument
13
+ OCI_ATTR_NAME = 4 # the name of the column/argument
14
+ OCI_ATTR_PRECISION = 5 # precision if number type
15
+ OCI_ATTR_SCALE = 6 # scale if number type
16
+ OCI_ATTR_IS_NULL = 7 # is it null ?
17
+ OCI_ATTR_TYPE_NAME = 8 # name of the named data type or a package name
18
+ OCI_ATTR_SCHEMA_NAME = 9 # the schema name
19
+ OCI_ATTR_SUB_NAME = 10 # type name if package private type
20
+ OCI_ATTR_POSITION = 11 # relative position
21
+ OCI_ATTR_PDSCL = 16 # packed decimal scale
22
+ OCI_ATTR_FSPRECISION = OCI_ATTR_PDSCL # fs prec for datetime data types
23
+ OCI_ATTR_PDPRC = 17 # packed decimal format
24
+ OCI_ATTR_LFPRECISION = OCI_ATTR_PDPRC # fs prec for datetime data types
25
+ OCI_ATTR_CHARSET_ID = 31 # Character Set ID
26
+ OCI_ATTR_CHARSET_FORM = 32 # Character Set Form
27
+ OCI_ATTR_NUM_COLS = 102 # number of columns
28
+ OCI_ATTR_LIST_COLUMNS = 103 # parameter of the column list
29
+ OCI_ATTR_RDBA = 104 # DBA of the segment header
30
+ OCI_ATTR_CLUSTERED = 105 # whether the table is clustered
31
+ OCI_ATTR_PARTITIONED = 106 # whether the table is partitioned
32
+ OCI_ATTR_INDEX_ONLY = 107 # whether the table is index only
33
+ OCI_ATTR_LIST_ARGUMENTS = 108 # parameter of the argument list
34
+ OCI_ATTR_LIST_SUBPROGRAMS = 109 # parameter of the subprogram list
35
+ OCI_ATTR_REF_TDO = 110 # REF to the type descriptor
36
+ OCI_ATTR_LINK = 111 # the database link name
37
+ OCI_ATTR_MIN = 112 # minimum value
38
+ OCI_ATTR_MAX = 113 # maximum value
39
+ OCI_ATTR_INCR = 114 # increment value
40
+ OCI_ATTR_CACHE = 115 # number of sequence numbers cached
41
+ OCI_ATTR_ORDER = 116 # whether the sequence is ordered
42
+ OCI_ATTR_HW_MARK = 117 # high-water mark
43
+ OCI_ATTR_TYPE_SCHEMA = 118 # type's schema name
44
+ OCI_ATTR_TIMESTAMP = 119 # timestamp of the object
45
+ OCI_ATTR_NUM_PARAMS = 121 # number of parameters
46
+ OCI_ATTR_OBJID = 122 # object id for a table or view
47
+ OCI_ATTR_OVERLOAD_ID = 125 # overload ID for funcs and procs
48
+ OCI_ATTR_TABLESPACE = 126 # table name space
49
+ OCI_ATTR_LTYPE = 128 # list type
50
+ OCI_ATTR_IS_TEMPORARY = 130 # whether table is temporary
51
+ OCI_ATTR_IS_TYPED = 131 # whether table is typed
52
+ OCI_ATTR_DURATION = 132 # duration of temporary table
53
+ OCI_ATTR_IS_INVOKER_RIGHTS = 133 # is invoker rights
54
+ OCI_ATTR_OBJ_NAME = 134 # top level schema obj name
55
+ OCI_ATTR_OBJ_SCHEMA = 135 # schema name
56
+ OCI_ATTR_OBJ_ID = 136 # top level schema object id
57
+ # OCI_ATTR_OVERLOAD = 210 # is this position overloaded
58
+ OCI_ATTR_LEVEL = 211 # level for structured types
59
+ OCI_ATTR_HAS_DEFAULT = 212 # has a default value
60
+ OCI_ATTR_IOMODE = 213 # in, out inout
61
+ OCI_ATTR_RADIX = 214 # returns a radix
62
+ # OCI_ATTR_NUM_ARGS = 215 # total number of arguments
63
+ OCI_ATTR_TYPECODE = 216 # object or collection
64
+ OCI_ATTR_COLLECTION_TYPECODE = 217 # varray or nested table
65
+ OCI_ATTR_VERSION = 218 # user assigned version
66
+ OCI_ATTR_IS_INCOMPLETE_TYPE = 219 # is this an incomplete type
67
+ OCI_ATTR_IS_SYSTEM_TYPE = 220 # a system type
68
+ OCI_ATTR_IS_PREDEFINED_TYPE = 221 # a predefined type
69
+ OCI_ATTR_IS_TRANSIENT_TYPE = 222 # a transient type
70
+ OCI_ATTR_IS_SYSTEM_GENERATED_TYPE = 223 # system generated type
71
+ OCI_ATTR_HAS_NESTED_TABLE = 224 # contains nested table attr
72
+ OCI_ATTR_HAS_LOB = 225 # has a lob attribute
73
+ OCI_ATTR_HAS_FILE = 226 # has a file attribute
74
+ OCI_ATTR_COLLECTION_ELEMENT = 227 # has a collection attribute
75
+ OCI_ATTR_NUM_TYPE_ATTRS = 228 # number of attribute types
76
+ OCI_ATTR_LIST_TYPE_ATTRS = 229 # list of type attributes
77
+ OCI_ATTR_NUM_TYPE_METHODS = 230 # number of type methods
78
+ OCI_ATTR_LIST_TYPE_METHODS = 231 # list of type methods
79
+ OCI_ATTR_MAP_METHOD = 232 # map method of type
80
+ OCI_ATTR_ORDER_METHOD = 233 # order method of type
81
+ OCI_ATTR_NUM_ELEMS = 234 # number of elements
82
+ OCI_ATTR_ENCAPSULATION = 235 # encapsulation level
83
+ OCI_ATTR_IS_SELFISH = 236 # method selfish
84
+ # OCI_ATTR_IS_VIRTUAL = 237 # virtual
85
+ # OCI_ATTR_IS_INLINE = 238 # inline
86
+ # OCI_ATTR_IS_CONSTANT = 239 # constant
87
+ OCI_ATTR_HAS_RESULT = 240 # has result
88
+ OCI_ATTR_IS_CONSTRUCTOR = 241 # constructor
89
+ OCI_ATTR_IS_DESTRUCTOR = 242 # destructor
90
+ # OCI_ATTR_IS_OPERATOR = 243 # operator
91
+ OCI_ATTR_IS_MAP = 244 # a map method
92
+ OCI_ATTR_IS_ORDER = 245 # order method
93
+ OCI_ATTR_IS_RNDS = 246 # read no data state method
94
+ OCI_ATTR_IS_RNPS = 247 # read no process state
95
+ OCI_ATTR_IS_WNDS = 248 # write no data state method
96
+ OCI_ATTR_IS_WNPS = 249 # write no process state
97
+ OCI_ATTR_IS_SUBTYPE = 258
98
+ OCI_ATTR_SUPERTYPE_SCHEMA_NAME = 259
99
+ OCI_ATTR_SUPERTYPE_NAME = 260
100
+ OCI_ATTR_LIST_OBJECTS = 261 # list of objects in schema
101
+ OCI_ATTR_NCHARSET_ID = 262 # char set id
102
+ OCI_ATTR_LIST_SCHEMAS = 263 # list of schemas
103
+ OCI_ATTR_MAX_PROC_LEN = 264 # max procedure length
104
+ OCI_ATTR_MAX_COLUMN_LEN = 265 # max column name length
105
+ OCI_ATTR_CURSOR_COMMIT_BEHAVIOR = 266 # cursor commit behavior
106
+ OCI_ATTR_MAX_CATALOG_NAMELEN = 267 # catalog namelength
107
+ OCI_ATTR_CATALOG_LOCATION = 268 # catalog location
108
+ OCI_ATTR_SAVEPOINT_SUPPORT = 269 # savepoint support
109
+ OCI_ATTR_NOWAIT_SUPPORT = 270 # nowait support
110
+ OCI_ATTR_AUTOCOMMIT_DDL = 271 # autocommit DDL
111
+ OCI_ATTR_LOCKING_MODE = 272 # locking mode
112
+ # OCI_ATTR_CLIENT_IDENTIFIER = 278 # value of client id to set
113
+ OCI_ATTR_IS_FINAL_TYPE = 279 # is final type ?
114
+ OCI_ATTR_IS_INSTANTIABLE_TYPE = 280 # is instantiable type ?
115
+ OCI_ATTR_IS_FINAL_METHOD = 281 # is final method ?
116
+ OCI_ATTR_IS_INSTANTIABLE_METHOD = 282 # is instantiable method ?
117
+ OCI_ATTR_IS_OVERRIDING_METHOD = 283 # is overriding method ?
118
+ # OCI_ATTR_DESC_SYNBASE = 284 # Describe the base object
119
+ OCI_ATTR_CHAR_USED = 285 # char length semantics
120
+ OCI_ATTR_CHAR_SIZE = 286 # char length
121
+ OCI_ATTR_CONDITION = 342 # rule condition
122
+ OCI_ATTR_COMMENT = 343 # comment
123
+ OCI_ATTR_VALUE = 344 # Anydata value
124
+ OCI_ATTR_EVAL_CONTEXT_OWNER = 345 # eval context owner
125
+ OCI_ATTR_EVAL_CONTEXT_NAME = 346 # eval context name
126
+ OCI_ATTR_EVALUATION_FUNCTION = 347 # eval function name
127
+ OCI_ATTR_VAR_TYPE = 348 # variable type
128
+ OCI_ATTR_VAR_VALUE_FUNCTION = 349 # variable value function
129
+ OCI_ATTR_VAR_METHOD_FUNCTION = 350 # variable method function
130
+ # OCI_ATTR_ACTION_CONTEXT = 351 # action context
131
+ OCI_ATTR_LIST_TABLE_ALIASES = 352 # list of table aliases
132
+ OCI_ATTR_LIST_VARIABLE_TYPES = 353 # list of variable types
133
+ OCI_ATTR_TABLE_NAME = 356 # table name
134
+
135
+ # OCI Parameter Types
136
+ OCI_PTYPE_UNK = 0 # unknown
137
+ OCI_PTYPE_TABLE = 1 # table
138
+ OCI_PTYPE_VIEW = 2 # view
139
+ OCI_PTYPE_PROC = 3 # procedure
140
+ OCI_PTYPE_FUNC = 4 # function
141
+ OCI_PTYPE_PKG = 5 # package
142
+ OCI_PTYPE_TYPE = 6 # user-defined type
143
+ OCI_PTYPE_SYN = 7 # synonym
144
+ OCI_PTYPE_SEQ = 8 # sequence
145
+ OCI_PTYPE_COL = 9 # column
146
+ OCI_PTYPE_ARG = 10 # argument
147
+ OCI_PTYPE_LIST = 11 # list
148
+ OCI_PTYPE_TYPE_ATTR = 12 # user-defined type's attribute
149
+ OCI_PTYPE_TYPE_COLL = 13 # collection type's element
150
+ OCI_PTYPE_TYPE_METHOD = 14 # user-defined type's method
151
+ OCI_PTYPE_TYPE_ARG = 15 # user-defined type method's arg
152
+ OCI_PTYPE_TYPE_RESULT = 16 # user-defined type method's result
153
+ OCI_PTYPE_SCHEMA = 17 # schema
154
+ OCI_PTYPE_DATABASE = 18 # database
155
+ OCI_PTYPE_RULE = 19 # rule
156
+ OCI_PTYPE_RULE_SET = 20 # rule set
157
+ OCI_PTYPE_EVALUATION_CONTEXT = 21 # evaluation context
158
+ OCI_PTYPE_TABLE_ALIAS = 22 # table alias
159
+ OCI_PTYPE_VARIABLE_TYPE = 23 # variable type
160
+ OCI_PTYPE_NAME_VALUE = 24 # name value pair
161
+
162
+ # OCI List Types
163
+ OCI_LTYPE_UNK = 0 # unknown
164
+ OCI_LTYPE_COLUMN = 1 # column list
165
+ OCI_LTYPE_ARG_PROC = 2 # procedure argument list
166
+ OCI_LTYPE_ARG_FUNC = 3 # function argument list
167
+ OCI_LTYPE_SUBPRG = 4 # subprogram list
168
+ OCI_LTYPE_TYPE_ATTR = 5 # type attribute
169
+ OCI_LTYPE_TYPE_METHOD = 6 # type method
170
+ OCI_LTYPE_TYPE_ARG_PROC = 7 # type method w/o result argument list
171
+ OCI_LTYPE_TYPE_ARG_FUNC = 8 # type method w/result argument list
172
+ OCI_LTYPE_SCH_OBJ = 9 # schema object list
173
+ OCI_LTYPE_DB_SCH = 10 # database schema list
174
+ OCI_LTYPE_TYPE_SUBTYPE = 11 # subtype list
175
+ OCI_LTYPE_TABLE_ALIAS = 12 # table alias list
176
+ OCI_LTYPE_VARIABLE_TYPE = 13 # variable type list
177
+ OCI_LTYPE_NAME_VALUE = 14 # name value list
178
+
179
+ # OBJECT Duration in oro.h
180
+ OCI_DURATION_INVALID = 0xFFFF
181
+ OCI_DURATION_BEGIN = 10
182
+ OCI_DURATION_NULL = OCI_DURATION_BEGIN - 1
183
+ OCI_DURATION_DEFAULT = OCI_DURATION_BEGIN - 2
184
+ OCI_DURATION_USER_CALLBACK = OCI_DURATION_BEGIN - 3
185
+ OCI_DURATION_NEXT = OCI_DURATION_BEGIN - 4
186
+ OCI_DURATION_SESSION = OCI_DURATION_BEGIN
187
+ OCI_DURATION_TRANS = OCI_DURATION_BEGIN + 1
188
+ OCI_DURATION_CALL = OCI_DURATION_BEGIN + 2
189
+ OCI_DURATION_STATEMENT = OCI_DURATION_BEGIN + 3
190
+ OCI_DURATION_CALLOUT = OCI_DURATION_BEGIN + 4
191
+
192
+ # :startdoc:
193
+
194
+ # = OCI8 can describe database object's metadata.
195
+ # [user objects]
196
+ # OCI8#describe_any(object_name)
197
+ # [table or view]
198
+ # OCI8#describe_table(table_name, table_only = false)
199
+ # [view]
200
+ # OCI8#describe_view(view_name)
201
+ # [procedure]
202
+ # OCI8#describe_procedure(procedure_name)
203
+ # [function]
204
+ # OCI8#describe_function(function_name)
205
+ # [package]
206
+ # OCI8#describe_package(package_name)
207
+ # [type]
208
+ # OCI8#describe_type(type_name)
209
+ # [synonym]
210
+ # OCI8#describe_synonym(synonym_name, check_public_also = false)
211
+ # [sequence]
212
+ # OCI8#describe_sequence(sequence_name)
213
+ # [schema]
214
+ # OCI8#describe_schema(schema_name)
215
+ # [database]
216
+ # OCI8#describe_database(database_name)
217
+ #
218
+ # The name can be supplied as 'OBJECT_NAME' or 'SCHEMA_NAME.OBJECT_NAME'.
219
+ # For example: 'emp', 'scott.emp'.
220
+ #
221
+ # = Retrieving Column Datatypes for a Table
222
+ #
223
+ # conn = OCI8.new('ruby', 'oci8')
224
+ # table = conn.describe_table('EMPLOYEES')
225
+ # table.columns.each do |col|
226
+ # if col.char_used
227
+ # col_width = col.char_size
228
+ # else
229
+ # col_width = col.data_size
230
+ # end
231
+ # end
232
+ module Metadata
233
+ # Abstract super class for Metadata classes.
234
+ class Base
235
+ # Table 6-1 Attributes Belonging to All Parameters
236
+
237
+ # don't use this. The number of parameters
238
+ def num_params
239
+ __ub2(OCI_ATTR_NUM_PARAMS)
240
+ end
241
+ private :num_params
242
+
243
+ # object or schema ID
244
+ def obj_id
245
+ __ub4(OCI_ATTR_OBJ_ID)
246
+ end
247
+
248
+ # database name or object name in a schema
249
+ def obj_name
250
+ __text(OCI_ATTR_OBJ_NAME)
251
+ end
252
+
253
+ # schema name where the object is located
254
+ def obj_schema
255
+ __text(OCI_ATTR_OBJ_SCHEMA)
256
+ end
257
+
258
+ # The timestamp of the object
259
+ def timestamp
260
+ __oradate(OCI_ATTR_TIMESTAMP)
261
+ end
262
+
263
+ def inspect # :nodoc:
264
+ "#<#{self.class.name}:(#{obj_id}) #{obj_schema}.#{obj_name}>"
265
+ end
266
+ private
267
+
268
+ def __boolean(idx)
269
+ __ub1(idx) == 0 ? false : true
270
+ end
271
+ alias __word __sb4
272
+ def __anydata(idx); raise NotImplementedError; end
273
+
274
+ # SQLT values to name
275
+ DATA_TYPE_MAP = {} # :nodoc:
276
+
277
+ # SQLT_CHR
278
+ DATA_TYPE_MAP[1] = [:varchar2,
279
+ Proc.new do |p|
280
+ if p.charset_form == :nchar
281
+ "NVARCHAR2(#{p.char_size})"
282
+ elsif p.char_used?
283
+ "VARCHAR2(#{p.char_size} CHAR)"
284
+ else
285
+ "VARCHAR2(#{p.data_size})"
286
+ end
287
+ end]
288
+ # SQLT_NUM
289
+ DATA_TYPE_MAP[2] = [:number,
290
+ Proc.new do |p|
291
+ begin
292
+ case p.scale
293
+ when -127
294
+ case p.precision
295
+ when 0
296
+ "NUMBER"
297
+ when 126
298
+ "FLOAT"
299
+ else
300
+ "FLOAT(#{p.precision})"
301
+ end
302
+ when 0
303
+ case p.precision
304
+ when 0
305
+ "NUMBER"
306
+ else
307
+ "NUMBER(#{p.precision})"
308
+ end
309
+ else
310
+ "NUMBER(#{p.precision},#{p.scale})"
311
+ end
312
+ rescue OCIError
313
+ "NUMBER"
314
+ end
315
+ end]
316
+ # SQLT_LNG
317
+ DATA_TYPE_MAP[8] = [:long, "LONG"]
318
+ # SQLT_DAT
319
+ DATA_TYPE_MAP[12] = [:date, "DATE"]
320
+ # SQLT_BIN
321
+ DATA_TYPE_MAP[23] = [:raw,
322
+ Proc.new do |p|
323
+ "RAW(#{p.data_size})"
324
+ end]
325
+ # SQLT_LBI
326
+ DATA_TYPE_MAP[24] = [:long_raw, "LONG RAW"]
327
+ # SQLT_AFC
328
+ DATA_TYPE_MAP[96] = [:char,
329
+ Proc.new do |p|
330
+ if p.charset_form == :nchar
331
+ "NCHAR(#{p.char_size})"
332
+ elsif p.char_used?
333
+ "CHAR(#{p.char_size} CHAR)"
334
+ else
335
+ "CHAR(#{p.data_size})"
336
+ end
337
+ end]
338
+ # SQLT_IBFLOAT
339
+ DATA_TYPE_MAP[100] = [:binary_float, "BINARY_FLOAT"]
340
+ # SQLT_IBDOUBLE
341
+ DATA_TYPE_MAP[101] = [:binary_double, "BINARY_DOUBLE"]
342
+ # SQLT_RDD
343
+ DATA_TYPE_MAP[104] = [:rowid, "ROWID"]
344
+ # SQLT_NTY
345
+ DATA_TYPE_MAP[108] = [:named_type,
346
+ Proc.new do |p|
347
+ "#{p.schema_name}.#{p.type_name}"
348
+ end]
349
+ # SQLT_REF
350
+ DATA_TYPE_MAP[110] = [:ref,
351
+ Proc.new do |p|
352
+ "#{p.schema_name}.#{p.type_name}"
353
+ end]
354
+ # SQLT_CLOB
355
+ DATA_TYPE_MAP[112] = [:clob,
356
+ Proc.new do |p|
357
+ if p.charset_form == :nchar
358
+ "NCLOB"
359
+ else
360
+ "CLOB"
361
+ end
362
+ end]
363
+ # SQLT_BLOB
364
+ DATA_TYPE_MAP[113] = [:blob, "BLOB"]
365
+ # SQLT_BFILE
366
+ DATA_TYPE_MAP[114] = [:bfile, "BFILE"]
367
+ # SQLT_RSET
368
+ DATA_TYPE_MAP[116] = [:cursor, "CURSOR"]
369
+ # SQLT_TIMESTAMP
370
+ DATA_TYPE_MAP[187] = [:timestamp,
371
+ Proc.new do |p|
372
+ fsprecision = p.fsprecision
373
+ if fsprecision == 6
374
+ "TIMESTAMP"
375
+ else
376
+ "TIMESTAMP(#{fsprecision})"
377
+ end
378
+ end]
379
+ # SQLT_TIMESTAMP_TZ
380
+ DATA_TYPE_MAP[188] = [:timestamp_tz,
381
+ Proc.new do |p|
382
+ fsprecision = p.fsprecision
383
+ if fsprecision == 6
384
+ "TIMESTAMP WITH TIME ZONE"
385
+ else
386
+ "TIMESTAMP(#{fsprecision}) WITH TIME ZONE"
387
+ end
388
+ end]
389
+ # SQLT_INTERVAL_YM
390
+ DATA_TYPE_MAP[189] = [:interval_ym,
391
+ Proc.new do |p|
392
+ lfprecision = p.lfprecision
393
+ if lfprecision == 2
394
+ "INTERVAL YEAR TO MONTH"
395
+ else
396
+ "INTERVAL YEAR(#{lfprecision}) TO MONTH"
397
+ end
398
+ end]
399
+ # SQLT_INTERVAL_DS
400
+ DATA_TYPE_MAP[190] = [:interval_ds,
401
+ Proc.new do |p|
402
+ lfprecision = p.lfprecision
403
+ fsprecision = p.fsprecision
404
+ if lfprecision == 2 && fsprecision == 6
405
+ "INTERVAL DAY TO SECOND"
406
+ else
407
+ "INTERVAL DAY(#{lfprecision}) TO SECOND(#{fsprecision})"
408
+ end
409
+ end]
410
+ # SQLT_TIMESTAMP_LTZ
411
+ DATA_TYPE_MAP[232] = [:timestamp_ltz,
412
+ Proc.new do |p|
413
+ fsprecision = p.fsprecision
414
+ if fsprecision == 6
415
+ "TIMESTAMP WITH LOCAL TIME ZONE"
416
+ else
417
+ "TIMESTAMP(#{fsprecision}) WITH LOCAL TIME ZONE"
418
+ end
419
+ end]
420
+
421
+ def __data_type
422
+ return @data_type if defined? @data_type
423
+ entry = DATA_TYPE_MAP[__ub2(OCI_ATTR_DATA_TYPE)]
424
+ type = entry.nil? ? __ub2(OCI_ATTR_DATA_TYPE) : entry[0]
425
+ type = type.call(self) if type.is_a? Proc
426
+ @data_type = type
427
+ end
428
+
429
+ def __duration
430
+ case __ub2(OCI_ATTR_DURATION)
431
+ when OCI_DURATION_SESSION
432
+ :session
433
+ when OCI_DURATION_TRANS
434
+ :transaction
435
+ when OCI_DURATION_NULL
436
+ nil
437
+ end
438
+ end
439
+
440
+ def __charset_form
441
+ case __ub1(OCI_ATTR_CHARSET_FORM)
442
+ when 1; :implicit # for CHAR, VARCHAR2, CLOB w/o a specified set
443
+ when 2; :nchar # for NCHAR, NCHAR VARYING, NCLOB
444
+ when 3; :explicit # for CHAR, etc, with "CHARACTER SET ..." syntax
445
+ when 4; :flexible # for PL/SQL "flexible" parameters
446
+ when 5; :lit_null # for typecheck of NULL and empty_clob() lits
447
+ end
448
+ end
449
+
450
+ def __type_string
451
+ entry = DATA_TYPE_MAP[__ub2(OCI_ATTR_DATA_TYPE)]
452
+ type = entry.nil? ? "unknown(#{__ub2(OCI_ATTR_DATA_TYPE)})" : entry[1]
453
+ type = type.call(self) if type.is_a? Proc
454
+ if respond_to?(:nullable?) && !nullable?
455
+ type + " NOT NULL"
456
+ else
457
+ type
458
+ end
459
+ end
460
+
461
+ def __typecode(idx)
462
+ case __ub2(idx)
463
+ when 110; :ref # OCI_TYPECODE_REF
464
+ when 12; :date # OCI_TYPECODE_DATE
465
+ when 27; :signed8 # OCI_TYPECODE_SIGNED8
466
+ when 28; :signed16 # OCI_TYPECODE_SIGNED16
467
+ when 29; :signed32 # OCI_TYPECODE_SIGNED32
468
+ when 21; :real # OCI_TYPECODE_REAL
469
+ when 22; :double # OCI_TYPECODE_DOUBLE
470
+ when 100; :binary_float # OCI_TYPECODE_BFLOAT
471
+ when 101; :binary_double # OCI_TYPECODE_BDOUBLE
472
+ when 4; :float # OCI_TYPECODE_FLOAT
473
+ when 2; :number # OCI_TYPECODE_NUMBER
474
+ when 7; :decimal # OCI_TYPECODE_DECIMAL
475
+ when 23; :unsigned8 # OCI_TYPECODE_UNSIGNED8
476
+ when 25; :unsigned16 # OCI_TYPECODE_UNSIGNED16
477
+ when 26; :unsigned32 # OCI_TYPECODE_UNSIGNED32
478
+ when 245; :octet # OCI_TYPECODE_OCTET
479
+ when 246; :smallint # OCI_TYPECODE_SMALLINT
480
+ when 3; :integer # OCI_TYPECODE_INTEGER
481
+ when 95; :raw # OCI_TYPECODE_RAW
482
+ when 32; :ptr # OCI_TYPECODE_PTR
483
+ when 9; :varchar2 # OCI_TYPECODE_VARCHAR2
484
+ when 96; :char # OCI_TYPECODE_CHAR
485
+ when 1; :varchar # OCI_TYPECODE_VARCHAR
486
+ when 105; :mlslabel # OCI_TYPECODE_MLSLABEL
487
+ when 247; :varray # OCI_TYPECODE_VARRAY
488
+ when 248; :table # OCI_TYPECODE_TABLE
489
+ when 108; :named_type # OCI_TYPECODE_OBJECT
490
+ when 58; :opaque # OCI_TYPECODE_OPAQUE
491
+ when 122; :named_collection # OCI_TYPECODE_NAMEDCOLLECTION
492
+ when 113; :blob # OCI_TYPECODE_BLOB
493
+ when 114; :bfile # OCI_TYPECODE_BFILE
494
+ when 112; :clob # OCI_TYPECODE_CLOB
495
+ when 115; :cfile # OCI_TYPECODE_CFILE
496
+ when 185; :time # OCI_TYPECODE_TIME
497
+ when 186; :time_tz # OCI_TYPECODE_TIME_TZ
498
+ when 187; :timestamp # OCI_TYPECODE_TIMESTAMP
499
+ when 188; :timestamp_tz # OCI_TYPECODE_TIMESTAMP_TZ
500
+ when 232; :timestamp_ltz # OCI_TYPECODE_TIMESTAMP_LTZ
501
+ when 189; :interval_ym # OCI_TYPECODE_INTERVAL_YM
502
+ when 190; :interval_ds # OCI_TYPECODE_INTERVAL_DS
503
+ when 104; :urowid # OCI_TYPECODE_UROWID
504
+ #when 228; :otmfirst # OCI_TYPECODE_OTMFIRST
505
+ #when 320; :otmlast # OCI_TYPECODE_OTMLAST
506
+ #when 228; :sysfirst # OCI_TYPECODE_SYSFIRST
507
+ #when 235; :syslast # OCI_TYPECODE_SYSLAST
508
+ when 266; :pls_integer # OCI_TYPECODE_PLS_INTEGER
509
+ end
510
+ end
511
+ end
512
+
513
+ # metadata for a object which cannot be classified into other
514
+ # metadata classes.
515
+ #
516
+ # This is returned by:
517
+ # * OCI8::Metadata::Schema#all_objects
518
+ class Unknown < Base
519
+ register_ptype OCI_PTYPE_UNK
520
+ end
521
+
522
+ # Metadata for a table.
523
+ #
524
+ # This is returned by:
525
+ # * OCI8#describe_any(name)
526
+ # * OCI8#describe_table(name)
527
+ # * OCI8::Metadata::Schema#all_objects
528
+ # * OCI8::Metadata::Schema#objects
529
+ #
530
+ # See also:
531
+ # * OCI8::Metadata::Base#obj_name
532
+ # * OCI8::Metadata::Base#obj_schema
533
+ class Table < Base
534
+ register_ptype OCI_PTYPE_TABLE
535
+
536
+ ## Table 6-2 Attributes Belonging to Tables or Views
537
+
538
+ # number of columns
539
+ def num_cols
540
+ __ub2(OCI_ATTR_NUM_COLS)
541
+ end
542
+
543
+ # column list
544
+ def list_columns
545
+ __param(OCI_ATTR_LIST_COLUMNS)
546
+ end
547
+ private :list_columns
548
+
549
+ # to type metadata if possible
550
+ def type_metadata
551
+ __type_metadata(OCI8::Metadata::Type)
552
+ end
553
+
554
+ # indicates the table is temporary.
555
+ def is_temporary?
556
+ __boolean(OCI_ATTR_IS_TEMPORARY)
557
+ end
558
+
559
+ # indicates the table is typed.
560
+ def is_typed?
561
+ __boolean(OCI_ATTR_IS_TYPED)
562
+ end
563
+
564
+ # Duration of a temporary table. Values can be <tt>:session</tt> or
565
+ # <tt>:transaction</tt>. nil if not a temporary table.
566
+ def duration
567
+ __duration
568
+ end
569
+
570
+ ## Table 6-3 Attributes Specific to Tables
571
+
572
+ # data block address of the segment header. (How to use this?)
573
+ def dba
574
+ __ub4(OCI_ATTR_RDBA)
575
+ end
576
+
577
+ # tablespace the table resides in. (How to use this?)
578
+ def tablespace
579
+ __word(OCI_ATTR_TABLESPACE)
580
+ end
581
+
582
+ # indicates the table is clustered.
583
+ def clustered?
584
+ __boolean(OCI_ATTR_CLUSTERED)
585
+ end
586
+
587
+ # indicates the table is partitioned.
588
+ def partitioned?
589
+ __boolean(OCI_ATTR_PARTITIONED)
590
+ end
591
+
592
+ # indicates the table is index-only.
593
+ def index_only?
594
+ __boolean(OCI_ATTR_INDEX_ONLY)
595
+ end
596
+
597
+ # array of Column objects in a table.
598
+ def columns
599
+ @columns ||= list_columns.to_a
600
+ end
601
+ end
602
+
603
+ # Metadata for a view.
604
+ #
605
+ # This is returned by:
606
+ # * OCI8#describe_any(name)
607
+ # * OCI8#describe_table(name, true)
608
+ # * OCI8#describe_view(name)
609
+ # * OCI8::Metadata::Schema#all_objects
610
+ # * OCI8::Metadata::Schema#objects
611
+ #
612
+ # See also:
613
+ # * OCI8::Metadata::Base#obj_name
614
+ # * OCI8::Metadata::Base#obj_schema
615
+ class View < Base
616
+ register_ptype OCI_PTYPE_VIEW
617
+
618
+ ## Table 6-2 Attributes Belonging to Tables or Views
619
+
620
+ # number of columns
621
+ def num_cols
622
+ __ub2(OCI_ATTR_NUM_COLS)
623
+ end
624
+
625
+ # column list
626
+ def list_columns
627
+ __param(OCI_ATTR_LIST_COLUMNS)
628
+ end
629
+ private :list_columns
630
+
631
+ # to type metadata if possible
632
+ def type_metadata
633
+ __type_metadata(OCI8::Metadata::Type)
634
+ end
635
+
636
+ # indicates the table is temporary.
637
+ def is_temporary?
638
+ __boolean(OCI_ATTR_IS_TEMPORARY)
639
+ end
640
+
641
+ # indicates the table is typed.
642
+ def is_typed?
643
+ __boolean(OCI_ATTR_IS_TYPED)
644
+ end
645
+
646
+ # Duration of a temporary table. Values can be <tt>:session</tt> or
647
+ # <tt>:transaction</tt>. nil if not a temporary table.
648
+ def duration
649
+ __duration
650
+ end
651
+
652
+ # array of Column objects in a table.
653
+ def columns
654
+ @columns ||= list_columns.to_a
655
+ end
656
+ end
657
+
658
+ # Abstract super class of Procedure and Function.
659
+ #
660
+ #--
661
+ # How can I know whether FUNCTION or PROCEDURE?
662
+ #++
663
+ class ProcBase < Base
664
+ ## Table 6-4 Attribute Belonging to Procedures or Functions
665
+
666
+ # Argument list
667
+ def list_arguments
668
+ __param(OCI_ATTR_LIST_ARGUMENTS)
669
+ end
670
+ private :list_arguments
671
+
672
+ # indicates the procedure or function has invoker's rights
673
+ def is_invoker_rights?
674
+ __boolean(OCI_ATTR_IS_INVOKER_RIGHTS)
675
+ end
676
+
677
+ ## Table 6-5 Attributes Specific to Package Subprograms
678
+
679
+ # name of the procedure or function.
680
+ #
681
+ # available only for a Package subprogram.
682
+ def name
683
+ __text(OCI_ATTR_NAME)
684
+ end
685
+
686
+ # overloading ID number (relevant in case the procedure or
687
+ # function is part of a package and is overloaded). Values
688
+ # returned may be different from direct query of a PL/SQL
689
+ # function or procedure. (What this means?)
690
+ #
691
+ # available only for a Package subprogram.
692
+ def overload_id
693
+ __ub2(OCI_ATTR_OVERLOAD_ID)
694
+ end
695
+
696
+ # array of Argument objects.
697
+ #
698
+ # The first element is the return type in case of Function.
699
+ def arguments
700
+ @arguments ||= list_arguments.to_a
701
+ end
702
+
703
+ def inspect # :nodoc:
704
+ "#<#{self.class.name}: #{name}>"
705
+ end
706
+ end
707
+
708
+ # Metadata for a procedure.
709
+ #
710
+ # This is returned by:
711
+ # * OCI8#describe_any(name)
712
+ # * OCI8#describe_procedure(name)
713
+ # * OCI8::Metadata::Schema#all_objects
714
+ # * OCI8::Metadata::Schema#objects
715
+ # * OCI8::Metadata::Package#subprograms
716
+ #
717
+ # See ProcBase's methods.
718
+ class Procedure < ProcBase
719
+ register_ptype OCI_PTYPE_PROC
720
+ end
721
+
722
+ # Metadata for a function.
723
+ #
724
+ # This is returned by:
725
+ # * OCI8#describe_any(name)
726
+ # * OCI8#describe_function(name)
727
+ # * OCI8::Metadata::Schema#all_objects
728
+ # * OCI8::Metadata::Schema#objects
729
+ # * OCI8::Metadata::Package#subprograms
730
+ #
731
+ # See ProcBase's methods.
732
+ class Function < ProcBase
733
+ register_ptype OCI_PTYPE_FUNC
734
+ end
735
+
736
+ # Metadata for a package.
737
+ #
738
+ # This is returned by:
739
+ # * OCI8#describe_any(name)
740
+ # * OCI8#describe_package(name)
741
+ # * OCI8::Metadata::Schema#all_objects
742
+ # * OCI8::Metadata::Schema#objects
743
+ class Package < Base
744
+ register_ptype OCI_PTYPE_PKG
745
+
746
+ ## Table 6-6 Attributes Belonging to Packages
747
+
748
+ # subprogram list
749
+ def list_subprograms
750
+ __param(OCI_ATTR_LIST_SUBPROGRAMS)
751
+ end
752
+ private :list_subprograms
753
+
754
+ # is the package invoker's rights?
755
+ def is_invoker_rights?
756
+ __boolean(OCI_ATTR_IS_INVOKER_RIGHTS)
757
+ end
758
+
759
+ # array of Procedure or Function objects.
760
+ def subprograms
761
+ @subprograms ||= list_subprograms.to_a
762
+ end
763
+ end
764
+
765
+ # Metadata for a type.
766
+ #
767
+ # This is returned by:
768
+ # * OCI8#describe_any(name)
769
+ # * OCI8#describe_type(name)
770
+ # * OCI8::Metadata::Schema#all_objects
771
+ # * OCI8::Metadata::Schema#objects
772
+ class Type < Base
773
+ register_ptype OCI_PTYPE_TYPE
774
+
775
+ ## Table 6-7 Attributes Belonging to Types
776
+
777
+ # to type metadata if possible
778
+ def type_metadata
779
+ self
780
+ end
781
+
782
+ # typecode. :object or :named_collection
783
+ def typecode
784
+ __typecode(OCI_ATTR_TYPECODE)
785
+ end
786
+
787
+ # typecode of collection if type is collection. nil if otherwise.
788
+ def collection_typecode
789
+ __typecode(OCI_ATTR_COLLECTION_TYPECODE) if typecode == :named_collection
790
+ end
791
+
792
+ # indicates this is an incomplete type
793
+ def is_incomplete_type?
794
+ __boolean(OCI_ATTR_IS_INCOMPLETE_TYPE)
795
+ end
796
+
797
+ # indicates this is a system type
798
+ def is_system_type?
799
+ __boolean(OCI_ATTR_IS_SYSTEM_TYPE)
800
+ end
801
+
802
+ # indicates this is a predefined type
803
+ def is_predefined_type?
804
+ __boolean(OCI_ATTR_IS_PREDEFINED_TYPE)
805
+ end
806
+
807
+ # indicates this is a transient type
808
+ def is_transient_type?
809
+ __boolean(OCI_ATTR_IS_TRANSIENT_TYPE)
810
+ end
811
+
812
+ # indicates this is a system-generated type
813
+ def is_system_generated_type?
814
+ __boolean(OCI_ATTR_IS_SYSTEM_GENERATED_TYPE)
815
+ end
816
+
817
+ # indicates this type contains a nested table attribute.
818
+ def has_nested_table?
819
+ __boolean(OCI_ATTR_HAS_NESTED_TABLE)
820
+ end
821
+
822
+ # indicates this type contains a LOB attribute
823
+ def has_lob?
824
+ __boolean(OCI_ATTR_HAS_LOB)
825
+ end
826
+
827
+ # indicates this type contains a BFILE attribute
828
+ def has_file?
829
+ __boolean(OCI_ATTR_HAS_FILE)
830
+ end
831
+
832
+ # returns OCI8::Metadata::Collection if type is collection. nil if otherwise.
833
+ def collection_element
834
+ __param(OCI_ATTR_COLLECTION_ELEMENT) if typecode == :named_collection
835
+ end
836
+
837
+ # number of type attributes
838
+ def num_type_attrs
839
+ __ub2(OCI_ATTR_NUM_TYPE_ATTRS)
840
+ end
841
+
842
+ # list of type attributes
843
+ def list_type_attrs
844
+ __param(OCI_ATTR_LIST_TYPE_ATTRS)
845
+ end
846
+ private :list_type_attrs
847
+
848
+ # number of type methods
849
+ def num_type_methods
850
+ __ub2(OCI_ATTR_NUM_TYPE_METHODS)
851
+ end
852
+
853
+ # list of type methods
854
+ def list_type_methods
855
+ __param(OCI_ATTR_LIST_TYPE_METHODS)
856
+ end
857
+ private :list_type_methods
858
+
859
+ # map method of type
860
+ def map_method
861
+ __param(OCI_ATTR_MAP_METHOD)
862
+ end
863
+
864
+ # order method of type
865
+ def order_method
866
+ __param(OCI_ATTR_ORDER_METHOD)
867
+ end
868
+
869
+ # indicates the type has invoker's rights
870
+ def is_invoker_rights?
871
+ __boolean(OCI_ATTR_IS_INVOKER_RIGHTS)
872
+ end
873
+
874
+ # type name
875
+ def name
876
+ __text(OCI_ATTR_NAME)
877
+ end
878
+
879
+ # schema name where the type has been created
880
+ def schema_name
881
+ __text(OCI_ATTR_SCHEMA_NAME)
882
+ end
883
+
884
+ # indicates this is a final type
885
+ def is_final_type?
886
+ __boolean(OCI_ATTR_IS_FINAL_TYPE)
887
+ end
888
+
889
+ # indicates this is an instantiable type
890
+ def is_instantiable_type?
891
+ __boolean(OCI_ATTR_IS_INSTANTIABLE_TYPE)
892
+ end
893
+
894
+ # indicates this is a subtype
895
+ def is_subtype?
896
+ __boolean(OCI_ATTR_IS_SUBTYPE)
897
+ end
898
+
899
+ # supertype's schema name
900
+ def supertype_schema_name
901
+ __text(OCI_ATTR_SUPERTYPE_SCHEMA_NAME) if is_subtype?
902
+ end
903
+
904
+ # supertype's name
905
+ def supertype_name
906
+ __text(OCI_ATTR_SUPERTYPE_NAME) if is_subtype?
907
+ end
908
+
909
+ # array of TypeAttr objects.
910
+ def type_attrs
911
+ @type_attrs ||= list_type_attrs.to_a
912
+ end
913
+
914
+ # array of TypeMethod objects.
915
+ def type_methods
916
+ @type_methods ||= list_type_methods.to_a
917
+ end
918
+
919
+ def inspect # :nodoc:
920
+ "#<#{self.class.name}:(#{obj_id}) #{schema_name}.#{name}>"
921
+ end
922
+ end
923
+
924
+ # Metadata for a type attribute.
925
+ #
926
+ # This is returned by:
927
+ # * OCI8::Metadata::Type#type_attrs
928
+ class TypeAttr < Base
929
+ register_ptype OCI_PTYPE_TYPE_ATTR
930
+
931
+ ## Table 6-8 Attributes Belonging to Type Attributes
932
+
933
+ # The maximum size of the type attribute. This length is
934
+ # returned in bytes and not characters for strings and raws. It
935
+ # returns 22 for NUMBERs.
936
+ def data_size
937
+ __ub2_nc(OCI_ATTR_DATA_SIZE)
938
+ end
939
+
940
+ # typecode
941
+ def typecode
942
+ __typecode(OCI_ATTR_TYPECODE)
943
+ end
944
+
945
+ # the datatype of the type
946
+ def data_type
947
+ __data_type
948
+ end
949
+
950
+ # the type attribute name
951
+ def name
952
+ __text(OCI_ATTR_NAME)
953
+ end
954
+
955
+ # The precision of numeric type attributes. If the precision is
956
+ # nonzero and scale is -127, then it is a FLOAT, else it is a
957
+ # NUMBER(precision, scale). For the case when precision is 0,
958
+ # NUMBER(precision, scale) can be represented simply as NUMBER.
959
+ def precision
960
+ __is_implicit? ? __sb2(OCI_ATTR_PRECISION) : __ub1(OCI_ATTR_PRECISION)
961
+ end
962
+
963
+ # The scale of numeric type attributes. If the precision is
964
+ # nonzero and scale is -127, then it is a FLOAT, else it is a
965
+ # NUMBER(precision, scale). For the case when precision is 0,
966
+ # NUMBER(precision, scale) can be represented simply as NUMBER.
967
+ def scale
968
+ __sb1(OCI_ATTR_SCALE)
969
+ end
970
+
971
+ # A string which is the type name. The returned value will
972
+ # contain the type name if the datatype is <tt>:named_type</tt>
973
+ # or <tt>:ref</tt>. If the datatype is <tt>:named_type</tt>, the
974
+ # name of the named datatype's type is returned. If the datatype
975
+ # is <tt>:ref</tt>, the type name of the named datatype pointed
976
+ # to by the REF is returned.
977
+ def type_name
978
+ __text(OCI_ATTR_TYPE_NAME)
979
+ end
980
+
981
+ # schema name where the type has been created.
982
+ def schema_name
983
+ __text(OCI_ATTR_SCHEMA_NAME)
984
+ end
985
+
986
+ # to type metadata if possible
987
+ def type_metadata
988
+ __type_metadata(OCI8::Metadata::Type)
989
+ end
990
+
991
+ # character set id if the type attribute is of a string/character type.
992
+ def charset_id
993
+ __ub2(OCI_ATTR_CHARSET_ID)
994
+ end
995
+
996
+ # character set form, if the type attribute is of a string/character type.
997
+ def charset_form
998
+ __charset_form
999
+ end
1000
+
1001
+ if OCI8.oracle_client_version >= ORAVER_9_0
1002
+ # The fractional seconds precision of a datetime or interval.
1003
+ #
1004
+ # (unavailable on Oracle 8.1 or lower)
1005
+ def fsprecision
1006
+ __ub1(OCI_ATTR_FSPRECISION)
1007
+ end
1008
+
1009
+ # The leading field precision of an interval
1010
+ #
1011
+ # (unavailable on Oracle 8.1 or lower)
1012
+ def lfprecision
1013
+ __ub1(OCI_ATTR_LFPRECISION)
1014
+ end
1015
+ end
1016
+
1017
+ # character set name if the type attribute is of a string/character type.
1018
+ def charset_name
1019
+ __charset_name(charset_id)
1020
+ end
1021
+
1022
+ def inspect # :nodoc:
1023
+ "#<#{self.class.name}: #{name} #{__type_string}>"
1024
+ end
1025
+ end
1026
+
1027
+ # Metadata for a type method.
1028
+ #
1029
+ # This is returned by:
1030
+ # * OCI8::Metadata::Type#type_methods
1031
+ # * OCI8::Metadata::Type#map_method
1032
+ # * OCI8::Metadata::Type#order_method
1033
+ #
1034
+ #--
1035
+ # How can I know whether FUNCTION or PROCEDURE?
1036
+ #++
1037
+ class TypeMethod < Base
1038
+ register_ptype OCI_PTYPE_TYPE_METHOD
1039
+
1040
+ ## Table 6-9 Attributes Belonging to Type Methods
1041
+
1042
+ # Name of method (procedure or function)
1043
+ def name
1044
+ __text(OCI_ATTR_NAME)
1045
+ end
1046
+
1047
+ # encapsulation level of the method. Values are <tt>:public</tt>
1048
+ # or <tt>:private</tt>.
1049
+ def encapsulation
1050
+ case __ub4(OCI_ATTR_ENCAPSULATION)
1051
+ when 0; :private
1052
+ when 1; :public
1053
+ end
1054
+ end
1055
+
1056
+ # argument list
1057
+ def list_arguments
1058
+ __param(OCI_ATTR_LIST_ARGUMENTS)
1059
+ end
1060
+ private :list_arguments
1061
+
1062
+ # indicates method is has rsult
1063
+ def has_result?
1064
+ __boolean(OCI_ATTR_HAS_RESULT)
1065
+ end
1066
+
1067
+ # indicates method is a constructor
1068
+ def is_constructor?
1069
+ __boolean(OCI_ATTR_IS_CONSTRUCTOR)
1070
+ end
1071
+
1072
+ # indicates method is a destructor
1073
+ def is_destructor?
1074
+ __boolean(OCI_ATTR_IS_DESTRUCTOR)
1075
+ end
1076
+
1077
+ # indicates method is an operator
1078
+ def is_operator?
1079
+ __boolean(OCI_ATTR_IS_OPERATOR)
1080
+ end
1081
+
1082
+ # indicates method is selfish
1083
+ def is_selfish?
1084
+ __boolean(OCI_ATTR_IS_SELFISH)
1085
+ end
1086
+
1087
+ # indicates method is a map method
1088
+ def is_map?
1089
+ __boolean(OCI_ATTR_IS_MAP)
1090
+ end
1091
+
1092
+ # Indicates method is an order method
1093
+ def is_order?
1094
+ __boolean(OCI_ATTR_IS_ORDER)
1095
+ end
1096
+
1097
+ # indicates "Read No Data State"(does not query database tables) is set.
1098
+ def is_rnds?
1099
+ __boolean(OCI_ATTR_IS_RNDS)
1100
+ end
1101
+
1102
+ # Indicates "Read No Package State"(does not reference the values of packaged variables) is set.
1103
+ def is_rnps?
1104
+ __boolean(OCI_ATTR_IS_RNPS)
1105
+ end
1106
+
1107
+ # indicates "Write No Data State"(does not modify tables) is set.
1108
+ def is_wnds?
1109
+ __boolean(OCI_ATTR_IS_WNDS)
1110
+ end
1111
+
1112
+ # indicates "Write No Package State"(does not change the values of packaged variables) is set.
1113
+ def is_wnps?
1114
+ __boolean(OCI_ATTR_IS_WNPS)
1115
+ end
1116
+
1117
+ # indicates this is a final method
1118
+ def is_final_method?
1119
+ __boolean(OCI_ATTR_IS_FINAL_METHOD)
1120
+ end
1121
+
1122
+ # indicates this is an instantiable method
1123
+ def is_instantiable_method?
1124
+ __boolean(OCI_ATTR_IS_INSTANTIABLE_METHOD)
1125
+ end
1126
+
1127
+ # indicates this is an overriding method
1128
+ def is_overriding_method?
1129
+ __boolean(OCI_ATTR_IS_OVERRIDING_METHOD)
1130
+ end
1131
+
1132
+ # array of TypeArgument objects.
1133
+ #
1134
+ # The first element is the return type in case of Function.
1135
+ def arguments
1136
+ @arguments ||= list_arguments.to_a
1137
+ end
1138
+
1139
+ def inspect # :nodoc:
1140
+ "#<#{self.class.name}: #{name}>"
1141
+ end
1142
+ end
1143
+
1144
+ # Metadata for a collection.
1145
+ #
1146
+ # This is returned by:
1147
+ # * OCI8::Metadata::Type.collection_element
1148
+ class Collection < Base
1149
+ register_ptype OCI_PTYPE_TYPE_COLL
1150
+
1151
+ ## Table 6-10 Attributes Belonging to Collection Types
1152
+
1153
+ # The maximum size of the type attribute. This length is
1154
+ # returned in bytes and not characters for strings and raws. It
1155
+ # returns 22 for NUMBERs.
1156
+ def data_size
1157
+ __ub2_nc(OCI_ATTR_DATA_SIZE)
1158
+ end
1159
+
1160
+ # typecode
1161
+ def typecode
1162
+ __typecode(OCI_ATTR_TYPECODE)
1163
+ end
1164
+
1165
+ # the datatype of the type
1166
+ def data_type
1167
+ __data_type
1168
+ end
1169
+
1170
+ # the number of elements in an array. It is only valid for
1171
+ # collections that are arrays.
1172
+ def num_elems
1173
+ __ub4(OCI_ATTR_NUM_ELEMS)
1174
+ end
1175
+
1176
+ # The precision of numeric type attributes. If the precision is
1177
+ # nonzero and scale is -127, then it is a FLOAT, else it is a
1178
+ # NUMBER(precision, scale). For the case when precision is 0,
1179
+ # NUMBER(precision, scale) can be represented simply as NUMBER.
1180
+ def precision
1181
+ __is_implicit? ? __sb2(OCI_ATTR_PRECISION) : __ub1(OCI_ATTR_PRECISION)
1182
+ end
1183
+
1184
+ # The scale of numeric type attributes. If the precision is
1185
+ # nonzero and scale is -127, then it is a FLOAT, else it is a
1186
+ # NUMBER(precision, scale). For the case when precision is 0,
1187
+ # NUMBER(precision, scale) can be represented simply as NUMBER.
1188
+ def scale
1189
+ __sb1(OCI_ATTR_SCALE)
1190
+ end
1191
+
1192
+ # A string which is the type name. The returned value will
1193
+ # contain the type name if the datatype is <tt>:named_type</tt> or <tt>:ref</tt>.
1194
+ # If the datatype is <tt>:named_type</tt>, the name of the named datatype's
1195
+ # type is returned. If the datatype is <tt>:ref</tt>, the type name
1196
+ # of the named datatype pointed to by the REF is returned.
1197
+ def type_name
1198
+ __text(OCI_ATTR_TYPE_NAME)
1199
+ end
1200
+
1201
+ # schema name where the type has been created.
1202
+ def schema_name
1203
+ __text(OCI_ATTR_SCHEMA_NAME)
1204
+ end
1205
+
1206
+ # to type metadata if possible
1207
+ def type_metadata
1208
+ __type_metadata(OCI8::Metadata::Type)
1209
+ end
1210
+
1211
+ # character set id if the type attribute is of a string/character type.
1212
+ def charset_id
1213
+ __ub2(OCI_ATTR_CHARSET_ID)
1214
+ end
1215
+
1216
+ # character set form, if the type attribute is of a string/character type.
1217
+ def charset_form
1218
+ __charset_form
1219
+ end
1220
+
1221
+ # character set name if the type attribute is of a string/character type.
1222
+ def charset_name
1223
+ __charset_name(charset_id)
1224
+ end
1225
+
1226
+ def inspect # :nodoc:
1227
+ "#<#{self.class.name}: #{__type_string}>"
1228
+ end
1229
+ end
1230
+
1231
+ # Metadata for a synonym.
1232
+ #
1233
+ # This is returned by:
1234
+ # * OCI8#describe_any(name)
1235
+ # * OCI8#describe_synonym(name)
1236
+ # * OCI8::Metadata::Schema#all_objects
1237
+ # * OCI8::Metadata::Schema#objects
1238
+ class Synonym < Base
1239
+ register_ptype OCI_PTYPE_SYN
1240
+
1241
+ ## Table 6-11 Attributes Belonging to Synonyms
1242
+
1243
+ # object id
1244
+ def objid
1245
+ @objid ||= __ub4(OCI_ATTR_OBJID)
1246
+ end
1247
+
1248
+ # schema name of the synonym translation
1249
+ def schema_name
1250
+ @schema_name ||= __text(OCI_ATTR_SCHEMA_NAME)
1251
+ end
1252
+
1253
+ # object name of the synonym translation
1254
+ def name
1255
+ @name ||= __text(OCI_ATTR_NAME)
1256
+ end
1257
+
1258
+ # database link name of the synonym translation or nil
1259
+ def link
1260
+ @link ||= __text(OCI_ATTR_LINK)
1261
+ @link.size == 0 ? nil : @link
1262
+ end
1263
+
1264
+ # full-qualified synonym translation name with schema, object and database link name.
1265
+ def translated_name
1266
+ if link.nil?
1267
+ schema_name + '.' + name
1268
+ else
1269
+ schema_name + '.' + name + '@' + link
1270
+ end
1271
+ end
1272
+
1273
+ def inspect # :nodoc:
1274
+ "#<#{self.class.name}:(#{obj_id}) #{obj_schema}.#{obj_name}>"
1275
+ end
1276
+ end
1277
+
1278
+ # Metadata for a sequence.
1279
+ #
1280
+ # This is returned by:
1281
+ # * OCI8#describe_any(name)
1282
+ # * OCI8#describe_sequence(name)
1283
+ # * OCI8::Metadata::Schema#all_objects
1284
+ # * OCI8::Metadata::Schema#objects
1285
+ class Sequence < Base
1286
+ register_ptype OCI_PTYPE_SEQ
1287
+
1288
+ ## Table 6-12 Attributes Belonging to Sequences
1289
+
1290
+ # object id
1291
+ def objid
1292
+ __ub4(OCI_ATTR_OBJID)
1293
+ end
1294
+
1295
+ # minimum value
1296
+ def min
1297
+ __oraint(OCI_ATTR_MIN)
1298
+ end
1299
+
1300
+ # maximum value
1301
+ def max
1302
+ __oraint(OCI_ATTR_MAX)
1303
+ end
1304
+
1305
+ # increment
1306
+ def incr
1307
+ __oraint(OCI_ATTR_INCR)
1308
+ end
1309
+
1310
+ # number of sequence numbers cached; zero if the sequence is not a cached sequence.
1311
+ def cache
1312
+ __oraint(OCI_ATTR_CACHE)
1313
+ end
1314
+
1315
+ # whether the sequence is ordered
1316
+ def order?
1317
+ __boolean(OCI_ATTR_ORDER)
1318
+ end
1319
+
1320
+ # high-water mark
1321
+ def hw_mark
1322
+ __oraint(OCI_ATTR_HW_MARK)
1323
+ end
1324
+ end
1325
+
1326
+ # Metadata for a sequence.
1327
+ #
1328
+ # This is returned by:
1329
+ # * OCI8::Metadata::Table#columns
1330
+ class Column < Base
1331
+ register_ptype OCI_PTYPE_COL
1332
+
1333
+ ## Table 6-13 Attributes Belonging to Columns of Tables or Views
1334
+
1335
+ if OCI8.oracle_client_version >= ORAVER_9_0
1336
+ # returns the type of length semantics of the column.
1337
+ # [<tt>:byte</tt>] byte-length semantics
1338
+ # [<tt>:char</tt>] character-length semantics.
1339
+ #
1340
+ # (unavailable on Oracle 8.1 or lower)
1341
+ def char_used?
1342
+ __ub4(OCI_ATTR_CHAR_USED) != 0
1343
+ end
1344
+
1345
+ # returns the column character length which is the number of
1346
+ # characters allowed in the column. It is the counterpart of
1347
+ # OCI8::Metadata::Column#data_size which gets the byte length.
1348
+ def char_size
1349
+ __ub2(OCI_ATTR_CHAR_SIZE)
1350
+ end
1351
+ else
1352
+ def char_used?
1353
+ false
1354
+ end
1355
+
1356
+ def char_size
1357
+ data_size
1358
+ end
1359
+ end
1360
+
1361
+ # The maximum size of the column. This length is
1362
+ # returned in bytes and not characters for strings and raws.
1363
+ # This returns character length multiplied by NLS ratio for
1364
+ # character-length semantics columns when using Oracle 9i
1365
+ # or upper.
1366
+ def data_size
1367
+ __ub2_nc(OCI_ATTR_DATA_SIZE)
1368
+ end
1369
+
1370
+ # the datatype of the column.
1371
+ def data_type
1372
+ __data_type
1373
+ end
1374
+
1375
+ # column name
1376
+ def name
1377
+ __text(OCI_ATTR_NAME)
1378
+ end
1379
+
1380
+ # The precision of numeric columns. If the precision is nonzero
1381
+ # and scale is -127, then it is a FLOAT, else it is a
1382
+ # NUMBER(precision, scale). For the case when precision is 0,
1383
+ # NUMBER(precision, scale) can be represented simply as NUMBER.
1384
+ def precision
1385
+ __is_implicit? ? __sb2(OCI_ATTR_PRECISION) : __ub1(OCI_ATTR_PRECISION)
1386
+ end
1387
+
1388
+ # The scale of numeric columns. If the precision is nonzero and
1389
+ # scale is -127, then it is a FLOAT, else it is a
1390
+ # NUMBER(precision, scale). For the case when precision is 0,
1391
+ # NUMBER(precision, scale) can be represented simply as NUMBER.
1392
+ def scale
1393
+ __sb1(OCI_ATTR_SCALE)
1394
+ end
1395
+
1396
+ # Returns 0 if null values are not permitted for the column
1397
+ def nullable?
1398
+ __boolean(OCI_ATTR_IS_NULL)
1399
+ end
1400
+
1401
+ # Returns a string which is the type name. The returned value
1402
+ # will contain the type name if the datatype is <tt>:named_type</tt> or
1403
+ # <tt>:ref</tt>. If the datatype is <tt>:named_type</tt>, the name of the named
1404
+ # datatype's type is returned. If the datatype is <tt>:ref</tt>, the
1405
+ # type name of the named datatype pointed to by the REF is
1406
+ # returned
1407
+ def type_name
1408
+ rv = __text(OCI_ATTR_TYPE_NAME)
1409
+ rv.length == 0 ? nil : rv
1410
+ end
1411
+
1412
+ # Returns a string with the schema name under which the type has been created
1413
+ def schema_name
1414
+ rv = __text(OCI_ATTR_SCHEMA_NAME)
1415
+ rv.length == 0 ? nil : rv
1416
+ end
1417
+
1418
+ # to type metadata if possible
1419
+ def type_metadata
1420
+ case __ub2(OCI_ATTR_DATA_TYPE)
1421
+ when 108, 110 # named_type or ref
1422
+ __type_metadata(OCI8::Metadata::Type)
1423
+ else
1424
+ nil
1425
+ end
1426
+ end
1427
+
1428
+ # The character set id, if the column is of a string/character type
1429
+ def charset_id
1430
+ __ub2(OCI_ATTR_CHARSET_ID)
1431
+ end
1432
+
1433
+ # The character set form, if the column is of a string/character type
1434
+ def charset_form
1435
+ __charset_form
1436
+ end
1437
+
1438
+ ## Table 6-8 Attributes Belonging to Type Attributes
1439
+ ## But Column also have these.
1440
+
1441
+ if OCI8.oracle_client_version >= ORAVER_9_0
1442
+ # The fractional seconds precision of a datetime or interval.
1443
+ #
1444
+ # (unavailable on Oracle 8.1 or lower)
1445
+ def fsprecision
1446
+ __ub1(OCI_ATTR_FSPRECISION)
1447
+ end
1448
+
1449
+ # The leading field precision of an interval
1450
+ #
1451
+ # (unavailable on Oracle 8.1 or lower)
1452
+ def lfprecision
1453
+ __ub1(OCI_ATTR_LFPRECISION)
1454
+ end
1455
+ end
1456
+
1457
+ # The character set name, if the column is of a string/character type
1458
+ def charset_name
1459
+ __charset_name(charset_id)
1460
+ end
1461
+
1462
+ def type_string
1463
+ __type_string
1464
+ end
1465
+
1466
+ def to_s
1467
+ %Q{"#{name}" #{__type_string}}
1468
+ end
1469
+
1470
+ def inspect # :nodoc:
1471
+ "#<#{self.class.name}: #{name} #{__type_string}>"
1472
+ end
1473
+ end
1474
+
1475
+ # Abstract super class of Argument, TypeArgument and TypeResult.
1476
+ class ArgBase < Base
1477
+ ## Table 6-14 Attributes Belonging to Arguments/Results
1478
+
1479
+ # the argument name
1480
+ def name
1481
+ __text(OCI_ATTR_NAME)
1482
+ end
1483
+
1484
+ # the position of the argument in the argument list.
1485
+ def position
1486
+ __ub2(OCI_ATTR_POSITION)
1487
+ end
1488
+
1489
+ # typecode
1490
+ def typecode
1491
+ __typecode(OCI_ATTR_TYPECODE)
1492
+ end
1493
+
1494
+ # the datatype of the argument
1495
+ def data_type
1496
+ __data_type
1497
+ end
1498
+
1499
+ # The size of the datatype of the argument. This length is
1500
+ # returned in bytes and not characters for strings and raws. It
1501
+ # returns 22 for NUMBERs.
1502
+ def data_size
1503
+ __ub2_nc(OCI_ATTR_DATA_SIZE)
1504
+ end
1505
+
1506
+ # The precision of numeric arguments. If the precision is
1507
+ # nonzero and scale is -127, then it is a FLOAT, else it is a
1508
+ # NUMBER(precision, scale). For the case when precision is 0,
1509
+ # NUMBER(precision, scale) can be represented simply as NUMBER.
1510
+ def precision
1511
+ __is_implicit? ? __sb2(OCI_ATTR_PRECISION) : __ub1(OCI_ATTR_PRECISION)
1512
+ end
1513
+
1514
+ # The scale of numeric arguments. If the precision is nonzero
1515
+ # and scale is -127, then it is a FLOAT, else it is a
1516
+ # NUMBER(precision, scale). For the case when precision is 0,
1517
+ # NUMBER(precision, scale) can be represented simply as NUMBER.
1518
+ def scale
1519
+ __sb1(OCI_ATTR_SCALE)
1520
+ end
1521
+
1522
+ # The datatype levels. This attribute always returns zero.
1523
+ def level
1524
+ __ub2(OCI_ATTR_LEVEL)
1525
+ end
1526
+
1527
+ # Indicates whether an argument has a default
1528
+ def has_default
1529
+ __ub1(OCI_ATTR_HAS_DEFAULT)
1530
+ end
1531
+
1532
+ # The list of arguments at the next level (when the argument is
1533
+ # of a record or table type).
1534
+ def list_arguments
1535
+ __param(OCI_ATTR_LIST_ARGUMENTS)
1536
+ end
1537
+ private :list_arguments
1538
+
1539
+ # Indicates the argument mode. Values are <tt>:in</tt>,
1540
+ # <tt>:out</tt> or <tt>:inout</tt>
1541
+ def iomode
1542
+ case __ub4(OCI_ATTR_IOMODE)
1543
+ when 0; :in
1544
+ when 1; :out
1545
+ when 2; :inout
1546
+ end
1547
+ end
1548
+
1549
+ # Returns a radix (if number type)
1550
+ def radix
1551
+ __ub1(OCI_ATTR_RADIX)
1552
+ end
1553
+
1554
+ # doesn't work.
1555
+ # def nullable?
1556
+ # __boolean(OCI_ATTR_IS_NULL)
1557
+ # end
1558
+
1559
+ # Returns a string which is the type name, or the package name
1560
+ # in the case of package local types. The returned value will
1561
+ # contain the type name if the datatype is <tt>:named_type</tt> or
1562
+ # <tt>:ref</tt>. If the datatype is <tt>:named_type</tt>, the name of the named
1563
+ # datatype's type is returned. If the datatype is <tt>:ref</tt>, the type
1564
+ # name of the named datatype pointed to by the REF is returned.
1565
+ def type_name
1566
+ __text(OCI_ATTR_TYPE_NAME)
1567
+ end
1568
+
1569
+ # For <tt>:named_type</tt> or <tt>:ref</tt>, returns a string with the schema name
1570
+ # under which the type was created, or under which the package
1571
+ # was created in the case of package local types
1572
+ def schema_name
1573
+ __text(OCI_ATTR_SCHEMA_NAME)
1574
+ end
1575
+
1576
+ # For <tt>:named_type</tt> or <tt>:ref</tt>, returns a string with the type name,
1577
+ # in the case of package local types
1578
+ def sub_name
1579
+ __text(OCI_ATTR_SUB_NAME)
1580
+ end
1581
+
1582
+ # For <tt>:named_type</tt> or <tt>:ref</tt>, returns a string with the database
1583
+ # link name of the database on which the type exists. This can
1584
+ # happen only in the case of package local types, when the
1585
+ # package is remote.
1586
+ def link
1587
+ __text(OCI_ATTR_LINK)
1588
+ end
1589
+
1590
+ # to type metadata if possible
1591
+ def type_metadata
1592
+ __type_metadata(OCI8::Metadata::Type)
1593
+ end
1594
+
1595
+ # Returns the character set ID if the argument is of a
1596
+ # string/character type
1597
+ def charset_id
1598
+ __ub2(OCI_ATTR_CHARSET_ID)
1599
+ end
1600
+
1601
+ # Returns the character set form if the argument is of a
1602
+ # string/character type
1603
+ def charset_form
1604
+ __charset_form
1605
+ end
1606
+
1607
+ # Returns the character set name if the argument is of a
1608
+ # string/character type
1609
+ def charset_name
1610
+ __charset_name(charset_id)
1611
+ end
1612
+
1613
+ # The list of arguments at the next level (when the argument is
1614
+ # of a record or table type).
1615
+ def arguments
1616
+ @arguments ||= list_arguments.to_a
1617
+ end
1618
+
1619
+ def inspect # :nodoc:
1620
+ "#<#{self.class.name}: #{name} #{__type_string}>"
1621
+ end
1622
+ end
1623
+
1624
+ # Metadata for a argument.
1625
+ #
1626
+ # This is returned by:
1627
+ # * OCI8::Metadata::Procedure#arguments
1628
+ # * OCI8::Metadata::Function#arguments
1629
+ #
1630
+ # See ArgBase's methods.
1631
+ class Argument < ArgBase
1632
+ register_ptype OCI_PTYPE_ARG
1633
+ end
1634
+
1635
+ # Metadata for a argument.
1636
+ #
1637
+ # This is returned by:
1638
+ # * OCI8::Metadata::TypeMethod#arguments
1639
+ #
1640
+ # See ArgBase's methods.
1641
+ class TypeArgument < ArgBase
1642
+ register_ptype OCI_PTYPE_TYPE_ARG
1643
+ end
1644
+
1645
+ # Metadata for a argument.
1646
+ #
1647
+ # This is returned by: .... unknown.
1648
+ # What's method returns this value?
1649
+ #
1650
+ # See ArgBase's methods.
1651
+ class TypeResult < ArgBase
1652
+ register_ptype OCI_PTYPE_TYPE_RESULT
1653
+ end
1654
+
1655
+ # internal use only.
1656
+ class List < Base # :nodoc:
1657
+ register_ptype OCI_PTYPE_LIST
1658
+
1659
+ ## Table 6-15 List Attributes
1660
+
1661
+ if OCI8::oracle_client_version < OCI8::ORAVER_8_1
1662
+ def ltype
1663
+ raise "This feature is unavailable on Oracle 8.0"
1664
+ end
1665
+ else
1666
+ def ltype
1667
+ __ub2(OCI_ATTR_LTYPE)
1668
+ end
1669
+ end
1670
+
1671
+ # convert to array
1672
+ def to_a
1673
+ # Table 6-15 List Attributes
1674
+ case ltype
1675
+ when OCI_LTYPE_COLUMN; offset = 1
1676
+ when OCI_LTYPE_ARG_PROC; offset = 1
1677
+ when OCI_LTYPE_ARG_FUNC; offset = 0
1678
+ when OCI_LTYPE_SUBPRG; offset = 0
1679
+ when OCI_LTYPE_TYPE_ATTR; offset = 1
1680
+ when OCI_LTYPE_TYPE_METHOD; offset = 1
1681
+ when OCI_LTYPE_TYPE_ARG_PROC; offset = 0
1682
+ when OCI_LTYPE_TYPE_ARG_FUNC; offset = 1
1683
+ when OCI_LTYPE_SCH_OBJ; offset = 0
1684
+ when OCI_LTYPE_DB_SCH; offset = 0
1685
+ #when OCI_LTYPE_TYPE_SUBTYPE; offset = ?
1686
+ #when OCI_LTYPE_TABLE_ALIAS; offset = ?
1687
+ #when OCI_LTYPE_VARIABLE_TYPE; offset = ?
1688
+ #when OCI_LTYPE_NAME_VALUE; offset = ?
1689
+ else
1690
+ raise NotImplementedError, "unsupported list type #{list.ltype}"
1691
+ end
1692
+ ary = []
1693
+ 0.upto(num_params - 1) do |i|
1694
+ ary << __param_at(i + offset)
1695
+ end
1696
+ ary
1697
+ end
1698
+ end
1699
+
1700
+ # Metadata for a schema.
1701
+ #
1702
+ # This is returned by:
1703
+ # * OCI8#describe_schema(schema_name)
1704
+ # * OCI8::Metadata::Database#schemas
1705
+ class Schema < Base
1706
+ register_ptype OCI_PTYPE_SCHEMA
1707
+
1708
+ ## Table 6-16 Attributes Specific to Schemas
1709
+
1710
+ def list_objects
1711
+ __param(OCI_ATTR_LIST_OBJECTS)
1712
+ end
1713
+ private :list_objects
1714
+
1715
+ # array of objects in the schema.
1716
+ # This includes unusable objects.
1717
+ def all_objects
1718
+ unless @all_objects
1719
+ begin
1720
+ objs = list_objects
1721
+ rescue OCIError => exc
1722
+ if exc.code != -1
1723
+ raise
1724
+ end
1725
+ # describe again.
1726
+ objs = __con.describe_schema(obj_schema).list_objects
1727
+ end
1728
+ @all_objects = objs.to_a
1729
+ end
1730
+ @all_objects
1731
+ end
1732
+
1733
+ # array of objects in the schema.
1734
+ def objects
1735
+ unless @objects
1736
+ @objects = all_objects.dup.reject! do |obj|
1737
+ case obj
1738
+ when Unknown
1739
+ true
1740
+ when Synonym
1741
+ begin
1742
+ obj.objid
1743
+ false
1744
+ rescue OCIError
1745
+ true
1746
+ end
1747
+ else
1748
+ false
1749
+ end
1750
+ end
1751
+ end
1752
+ @objects
1753
+ end
1754
+
1755
+ def inspect # :nodoc:
1756
+ "#<#{self.class.name}:(#{obj_id}) #{obj_schema}>"
1757
+ end
1758
+ end
1759
+
1760
+ # Metadata for a database.
1761
+ #
1762
+ # This is returned by:
1763
+ # * OCI8#describe_database(database_name)
1764
+ class Database < Base
1765
+ register_ptype OCI_PTYPE_DATABASE
1766
+
1767
+ # Table 6-17 Attributes Specific to Databases
1768
+
1769
+ # database version
1770
+ def version
1771
+ __text(OCI_ATTR_VERSION)
1772
+ end
1773
+
1774
+ # database character set Id
1775
+ def charset_id
1776
+ __ub2(OCI_ATTR_CHARSET_ID)
1777
+ end
1778
+
1779
+ # database national language support character set Id
1780
+ def ncharset_id
1781
+ __ub2(OCI_ATTR_NCHARSET_ID)
1782
+ end
1783
+
1784
+ # List of schemas in the database
1785
+ def list_schemas
1786
+ __param(OCI_ATTR_LIST_SCHEMAS)
1787
+ end
1788
+ private :list_schemas
1789
+
1790
+ # Maximum length of a procedure name
1791
+ def max_proc_len
1792
+ __ub4(OCI_ATTR_MAX_PROC_LEN)
1793
+ end
1794
+
1795
+ # Maximum length of a column name
1796
+ def max_column_len
1797
+ __ub4(OCI_ATTR_MAX_COLUMN_LEN)
1798
+ end
1799
+
1800
+ # How a COMMIT operation affects cursors and prepared statements in
1801
+ # the database. Values are:
1802
+ # [<tt>:cusror_open</tt>] preserve cursor state as before the commit
1803
+ # operation
1804
+ # [<tt>:cursor_closed</tt>] cursors are closed on COMMIT, but the
1805
+ # application can still re-execute the
1806
+ # statement without re-preparing it
1807
+ def cursor_commit_behavior
1808
+ case __ub1(OCI_ATTR_CURSOR_COMMIT_BEHAVIOR)
1809
+ when 0; :cusror_open
1810
+ when 1; :cursor_closed
1811
+ end
1812
+ end
1813
+
1814
+ # Maximum length of a catalog (database) name
1815
+ def max_catalog_namelen
1816
+ __ub1(OCI_ATTR_MAX_CATALOG_NAMELEN)
1817
+ end
1818
+
1819
+ # Position of the catalog in a qualified table. Values are
1820
+ # <tt>:cl_start</tt> and <tt>:cl_end</tt>
1821
+ def catalog_location
1822
+ case __ub1(OCI_ATTR_CATALOG_LOCATION)
1823
+ when 0; :cl_start
1824
+ when 1; :cl_end
1825
+ end
1826
+ end
1827
+
1828
+ # Does database support savepoints? Values are
1829
+ # <tt>:sp_supported</tt> and <tt>:sp_unsupported</tt>
1830
+ def savepoint_support
1831
+ case __ub1(OCI_ATTR_SAVEPOINT_SUPPORT)
1832
+ when 0; :sp_supported
1833
+ when 1; :sp_unsupported
1834
+ end
1835
+ end
1836
+
1837
+ # Does database support the nowait clause? Values are
1838
+ # <tt>:nw_supported</tt> and <tt>:nw_unsupported</tt>
1839
+ def nowait_support
1840
+ case __ub1(OCI_ATTR_NOWAIT_SUPPORT)
1841
+ when 0; :nw_supported
1842
+ when 1; :nw_unsupported
1843
+ end
1844
+ end
1845
+
1846
+ # Is autocommit mode required for DDL statements? Values are
1847
+ # <tt>:ac_ddl</tt> and <tt>:no_ac_ddl</tt>
1848
+ def autocommit_ddl
1849
+ case __ub1(OCI_ATTR_AUTOCOMMIT_DDL)
1850
+ when 0; :ac_ddl
1851
+ when 1; :no_ac_ddl
1852
+ end
1853
+ end
1854
+
1855
+ # Locking mode for the database. Values are <tt>:lock_immediate</tt> and
1856
+ # <tt>:lock_delayed</tt>
1857
+ def locking_mode
1858
+ case __ub1(OCI_ATTR_LOCKING_MODE)
1859
+ when 0; :lock_immediate
1860
+ when 1; :lock_delayed
1861
+ end
1862
+ end
1863
+
1864
+ # database character set name
1865
+ def charset_name
1866
+ __charset_name(charset_id)
1867
+ end
1868
+
1869
+ # database national language support character set name
1870
+ def ncharset_name
1871
+ __charset_name(ncharset_id)
1872
+ end
1873
+
1874
+ # array of Schema objects in the database
1875
+ def schemas
1876
+ @schemas ||= list_schemas.to_a
1877
+ end
1878
+
1879
+ def inspect # :nodoc:
1880
+ "#<#{self.class.name}:(#{obj_id}) #{obj_name} #{version}>"
1881
+ end
1882
+ end
1883
+
1884
+ =begin
1885
+ class Rule < Base # :nodoc:
1886
+ register_ptype OCI_PTYPE_RULE
1887
+
1888
+ # Table 6-18 Attributes Specific to Rules
1889
+
1890
+ def condition
1891
+ __text(OCI_ATTR_CONDITION)
1892
+ end
1893
+
1894
+ def eval_context_owner
1895
+ __text(OCI_ATTR_EVAL_CONTEXT_OWNER)
1896
+ end
1897
+
1898
+ def eval_context_name
1899
+ __text(OCI_ATTR_EVAL_CONTEXT_NAME)
1900
+ end
1901
+
1902
+ def comment
1903
+ __text(OCI_ATTR_COMMENT)
1904
+ end
1905
+
1906
+ # def list_action_context
1907
+ # __param(???)
1908
+ # end
1909
+ end
1910
+
1911
+ class RuleSet < Base # :nodoc:
1912
+ register_ptype OCI_PTYPE_RULE_SET
1913
+
1914
+ # Table 6-19 Attributes Specific to Rule Sets
1915
+
1916
+ def eval_context_owner
1917
+ __text(OCI_ATTR_EVAL_CONTEXT_OWNER)
1918
+ end
1919
+
1920
+ def eval_context_name
1921
+ __text(OCI_ATTR_EVAL_CONTEXT_NAME)
1922
+ end
1923
+
1924
+ def comment
1925
+ __text(OCI_ATTR_COMMENT)
1926
+ end
1927
+
1928
+ # def list_rules
1929
+ # __param(???)
1930
+ # end
1931
+ end
1932
+
1933
+ class EvaluationContext < Base # :nodoc:
1934
+ register_ptype OCI_PTYPE_EVALUATION_CONTEXT
1935
+
1936
+ # Table 6-20 Attributes Specific to Evaluation Contexts
1937
+
1938
+ def evaluation_function
1939
+ __text(OCI_ATTR_EVALUATION_FUNCTION)
1940
+ end
1941
+
1942
+ def comment
1943
+ __text(OCI_ATTR_COMMENT)
1944
+ end
1945
+
1946
+ def list_table_aliases
1947
+ __param(OCI_ATTR_LIST_TABLE_ALIASES)
1948
+ end
1949
+
1950
+ def list_variable_types
1951
+ __param(OCI_ATTR_LIST_VARIABLE_TYPES)
1952
+ end
1953
+ end
1954
+
1955
+ class TableAlias < Base # :nodoc:
1956
+ register_ptype OCI_PTYPE_TABLE_ALIAS
1957
+
1958
+ # Table 6-21 Attributes Specific to Table Aliases
1959
+
1960
+ def name
1961
+ __text(OCI_ATTR_NAME)
1962
+ end
1963
+
1964
+ def table_name
1965
+ __text(OCI_ATTR_TABLE_NAME)
1966
+ end
1967
+ end
1968
+
1969
+ class VariableType < Base # :nodoc:
1970
+ register_ptype OCI_PTYPE_VARIABLE_TYPE
1971
+
1972
+ # Table 6-22 Attributes Specific to Variable Types
1973
+
1974
+ def name
1975
+ __text(OCI_ATTR_NAME)
1976
+ end
1977
+
1978
+ def var_type
1979
+ __text(OCI_ATTR_VAR_TYPE)
1980
+ end
1981
+
1982
+ def var_value_function
1983
+ __text(OCI_ATTR_VAR_VALUE_FUNCTION)
1984
+ end
1985
+
1986
+ def var_method_function
1987
+ __text(OCI_ATTR_VAR_METHOD_FUNCTION)
1988
+ end
1989
+ end
1990
+
1991
+ class NameValue < Base # :nodoc:
1992
+ register_ptype OCI_PTYPE_NAME_VALUE
1993
+
1994
+ # Table 6-23 Attributes Specific to Name Value Pair
1995
+
1996
+ def name
1997
+ __text(OCI_ATTR_NAME)
1998
+ end
1999
+
2000
+ # not implemented
2001
+ def value
2002
+ __anydata(OCI_ATTR_VALUE)
2003
+ end
2004
+ end
2005
+ =end
2006
+ end # OCI8::Metadata
2007
+
2008
+ # return a subclass of OCI8::Metadata::Base
2009
+ # which has information about _object_name_.
2010
+ # OCI8::Metadata::Table, OCI8::Metadata::View,
2011
+ # OCI8::Metadata::Procedure, OCI8::Metadata::Function,
2012
+ # OCI8::Metadata::Package, OCI8::Metadata::Type,
2013
+ # OCI8::Metadata::Synonym or OCI8::Metadata::Sequence
2014
+ def describe_any(object_name)
2015
+ __describe(object_name, OCI8::Metadata::Unknown, true)
2016
+ end
2017
+ # returns a OCI8::Metadata::Table or a OCI8::Metadata::View. If the
2018
+ # name is a current schema's synonym name or a public synonym name,
2019
+ # it returns a OCI8::Metadata::Table or a OCI8::Metadata::View which
2020
+ # the synonym refers.
2021
+ #
2022
+ # If the second argument is true, this returns a
2023
+ # OCI8::Metadata::Table in the current schema.
2024
+ def describe_table(table_name, table_only = false)
2025
+ if table_only
2026
+ # check my own tables only.
2027
+ __describe(table_name, OCI8::Metadata::Table, false)
2028
+ else
2029
+ # check tables, views, synonyms and public synonyms.
2030
+ metadata = __describe(table_name, OCI8::Metadata::Unknown, true)
2031
+ case metadata
2032
+ when OCI8::Metadata::Table, OCI8::Metadata::View
2033
+ metadata
2034
+ when OCI8::Metadata::Synonym
2035
+ describe_table(metadata.translated_name)
2036
+ else
2037
+ raise OCIError.new("ORA-04043: object #{table_name} does not exist", 4043)
2038
+ end
2039
+ end
2040
+ end
2041
+ # returns a OCI8::Metadata::View in the current schema.
2042
+ def describe_view(view_name)
2043
+ __describe(view_name, OCI8::Metadata::View, false)
2044
+ end
2045
+ # returns a OCI8::Metadata::Procedure in the current schema.
2046
+ def describe_procedure(procedure_name)
2047
+ __describe(procedure_name, OCI8::Metadata::Procedure, false)
2048
+ end
2049
+ # returns a OCI8::Metadata::Function in the current schema.
2050
+ def describe_function(function_name)
2051
+ __describe(function_name, OCI8::Metadata::Function, false)
2052
+ end
2053
+ # returns a OCI8::Metadata::Package in the current schema.
2054
+ def describe_package(package_name)
2055
+ __describe(package_name, OCI8::Metadata::Package, false)
2056
+ end
2057
+ # returns a OCI8::Metadata::Type in the current schema.
2058
+ def describe_type(type_name)
2059
+ __describe(type_name, OCI8::Metadata::Type, false)
2060
+ end
2061
+ # returns a OCI8::Metadata::Synonym in the current schema.
2062
+ def describe_synonym(synonym_name, check_public_also = true)
2063
+ __describe(synonym_name, OCI8::Metadata::Synonym, check_public_also)
2064
+ end
2065
+ # returns a OCI8::Metadata::Sequence in the current schema.
2066
+ def describe_sequence(sequence_name)
2067
+ __describe(sequence_name, OCI8::Metadata::Sequence, false)
2068
+ end
2069
+ # returns a OCI8::Metadata::Schema in the database.
2070
+ def describe_schema(schema_name)
2071
+ __describe(schema_name, OCI8::Metadata::Schema, false)
2072
+ end
2073
+ # returns a OCI8::Metadata::Database.
2074
+ def describe_database(database_name)
2075
+ __describe(database_name, OCI8::Metadata::Database, false)
2076
+ end
2077
+ end # OCI8