ruby-oci8-master 2.0.7

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