1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Much faster Oracle column reflection. References #2848.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2996 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
Jeremy Kemper 2005-11-13 07:24:50 +00:00
parent 077ae340e8
commit 068d9ef0ef
2 changed files with 24 additions and 16 deletions

View file

@ -1,5 +1,7 @@
*SVN*
* Much faster Oracle column reflection. #2848 [Michael Schoen <schoenm@earthlink.net>]
* Base.reset_sequence_name analogous to reset_table_name (mostly useful for testing). Base.define_attr_method allows nil values. [Jeremy Kemper]
* PostgreSQL: smarter sequence name defaults, stricter last_insert_id, warn on pk without sequence. [Jeremy Kemper]

View file

@ -316,23 +316,29 @@ begin
table_name = table_name.to_s.upcase
owner = table_name.include?('.') ? "'#{table_name.split('.').first}'" : "user"
table = "'#{table_name.split('.').last}'"
scope = (owner == "user" ? "user" : "all")
select_all(%Q{
select column_name, data_type, data_default, nullable,
case when data_type = 'NUMBER' then data_precision
when data_type = 'VARCHAR2' then data_length
else null end as length,
case when data_type = 'NUMBER' then data_scale
else null end as scale
from all_catalog cat, all_synonyms syn, all_tab_columns col
where cat.owner = #{owner}
and cat.table_name = #{table}
and syn.owner (+)= cat.owner
and syn.synonym_name (+)= cat.table_name
and col.owner = nvl(syn.table_owner, cat.owner)
and col.table_name = nvl(syn.table_name, cat.table_name)
}).map do |row|
row['data_default'].gsub!(/^'(.*)'\s*$/, '\1') if row['data_default']
table_cols = %Q{
select column_name, data_type, data_default, nullable,
case when data_type = 'NUMBER' then data_precision
when data_type = 'VARCHAR2' then data_length
else null end as length,
case when data_type = 'NUMBER' then data_scale
else null end as scale
from #{scope}_catalog cat, #{scope}_synonyms syn, all_tab_columns col
where cat.table_name = #{table}
and syn.synonym_name (+)= cat.table_name
and col.table_name = nvl(syn.table_name, cat.table_name)
and col.owner = nvl(syn.table_owner, #{(scope == "all" ? "cat.owner" : "user")}) }
if scope == "all"
table_cols << %Q{
and cat.owner = #{owner}
and syn.owner (+)= cat.owner }
end
select_all(table_cols).map do |row|
row['data_default'].gsub!(/^'(.*)'$/, '\1') if row['data_default']
OCIColumn.new(
oci_downcase(row['column_name']),
row['data_default'],