Class: ActiveRecord::ConnectionAdapters::IBM_DB2_LUW

Inherits:
IBM_DB2
  • Object
show all
Defined in:
lib/connection_adapters/ibm_db_adapter.rb

Instance Method Summary collapse

Instance Method Details

#constraints(table_name, name = nil) ⇒ Object

:nodoc



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/connection_adapters/ibm_db_adapter.rb', line 60

def constraints(table_name, name = nil) #:nodoc
      constraints = []  
      upcase_table_name = table_name.upcase  
      sql = %Q{
        select CST.tabschema, CST.constname, LOWER(CST.tabname) as tabname, CST.type, 
          LOWER(COL.colname) as colname, REF.constname as foreign_constraint_name, 
          LOWER(REF.tabname) as foreign_table_name, REF.refkeyname, 
          LOWER(REF.reftabname) as reftabname, REF.deleterule, 
          REF.fk_colnames as foreign_columns, REF.pk_colnames as referenced_columns 
        from 
          ((select * from SYSCAT.TABCONST where tabname='#{upcase_table_name}') as CST 
        inner join 
          (select colname, constname from SYSCAT.KEYCOLUSE 
          where tabname='#{upcase_table_name}') as COL 
          on (CST.constname=COL.constname)) 
        left outer join SYSCAT.REFERENCES REF 
          on (CST.constname=REF.refkeyname or CST.constname=REF.constname)
        }       
      
  results = IBM_DB::exec(@adapter.connection, sql)
  constraint_name_hash = {}
   
  # Note that column names in constraint objects are downcased in order to
  # be comparable with the column names produced by IBM_DBAdapter.columns  
  while row = IBM_DB::fetch_assoc(results)
      constraint_name = row['constname']
      foreign_constraint_name = row['foreign_constraint_name']
        column_name = row['colname']
        table_name = row['tabname']
        referenced_columns = row['referenced_columns'].downcase.split if row['referenced_columns']
        foreign_columns = row['foreign_columns'].downcase.split if row['foreign_columns']
  
        # Process constraints local to this table
      if !constraint_name_hash.has_key?(constraint_name)
        current_constraint = IBM_DBConstraint.new(row['tabschema'], constraint_name, row['type'], 
          table_name, column_name, row['refkeyname'], row['reftabname'], 
            referenced_columns, row['deleterule'])
        constraints << current_constraint
        constraint_name_hash[constraint_name] = current_constraint
      # This key is a composite
      else
        current_constraint = constraint_name_hash[constraint_name]
          current_constraint.column_names << column_name unless current_constraint.column_names.include?(column_name)
          referenced_columns.each do |column|
            current_constraint.referenced_column_names << column unless current_constraint.referenced_column_names.include?(column)
          end
      end
    
      # Process constraints that reference this table's local constraints
        if foreign_constraint_name
      if !constraint_name_hash.has_key?(foreign_constraint_name)
        current_foreign_constraint = IBM_DBConstraint.new(row['tabschema'], foreign_constraint_name, 
          IBM_DBConstraint::FOREIGN_KEY_TYPE,  row['foreign_table_name'], foreign_columns, 
constraint_name, table_name, column_name, row['deleterule'])
          constraints << current_foreign_constraint
          constraint_name_hash[foreign_constraint_name] = current_foreign_constraint
      # Composite FK 
      else
        current_foreign_constraint = constraint_name_hash[foreign_constraint_name]
            foreign_columns.each do |fc|
current_foreign_constraint.column_names << fc unless current_foreign_constraint.column_names.include?(fc)
            end
            referenced_columns.each do |rc|
current_foreign_constraint.referenced_column_names << rc unless current_foreign_constraint.referenced_column_names.include?(rc) 
        end
          end  
        end      
  end
  constraints
end