Tuesday, April 22, 2008

To make redhillonrails_core work on Oracle

To get the foreign keys. Implementation is your choice.

def foreign_keys(table_name, name = nil)

foreign_keys = []
p table_name
result = select_all(<<-SQL, name)
SELECT UNIQUE CONSTRAINTS.CONSTRAINT_NAME as constraint_name,
SINK.TABLE_NAME as from_table_name,
SINK.COLUMN_NAME as column_name,
SOURCE.TABLE_NAME as ref_table_name,
SOURCE.COLUMN_NAME as ref_col_name,
CONSTRAINTS.DELETE_RULE as del_rule,
CONSTRAINTS.DEFERRABLE as deferrable,
CONSTRAINTS.OWNER as owner,
SINK.OWNER as from_table_owner,
SOURCE.OWNER as ref_table_owner
FROM ALL_CONSTRAINTS CONSTRAINTS, ALL_CONS_COLUMNS SOURCE, ALL_CONS_COLUMNS SINK
WHERE CONSTRAINTS.R_CONSTRAINT_NAME=SOURCE.CONSTRAINT_NAME
AND CONSTRAINTS.CONSTRAINT_NAME=SINK.CONSTRAINT_NAME
AND CONSTRAINTS.OWNER=SINK.OWNER
AND CONSTRAINTS.OWNER = SOURCE.OWNER
AND CONSTRAINTS.TABLE_NAME=SINK.TABLE_NAME
AND SOURCE.POSITION=SINK.POSITION
AND CONSTRAINTS.TABLE_NAME = UPPER('#{table_name}')
SQL
result.each do |row|
p name = row['constraint_name']
p from_table_name = row['from_table_name']
p column_names = row['column_name']
p references_table_name = row['ref_table_name']
p references_column_names = row['ref_col_name']
p on_delete = on_delete.downcase.gsub(' ', '_').to_sym if ['CASCADE','SET NULL'].index(row['del_rule'])
foreign_keys << ForeignKeyDefinition.new
(name,

from_table_name,
column_names.split(','),
references_table_name,
references_column_names.split(','),

nil,on_delete,nil)
end
p foreign_keys.to_s
foreign_keys
# []
end

No comments: