]> git.openstreetmap.org Git - rails.git/blob - config/initializers/postgresql_adapter.rb
Monkey patch rails to make system table query efficient
[rails.git] / config / initializers / postgresql_adapter.rb
1 module ActiveRecord
2   module ConnectionAdapters
3     class PostgreSQLAdapter
4       alias_method :old_pk_and_sequence_for, :pk_and_sequence_for
5
6       def pk_and_sequence_for(table)
7         result = query(<<-end_sql, 'PK and serial sequence')[0]
8           SELECT attr.attname, seq.relname
9           FROM pg_class      seq,
10                pg_attribute  attr,
11                pg_depend     dep,
12                pg_namespace  name,
13                pg_constraint cons
14           WHERE seq.oid           = dep.objid
15             AND seq.relkind       = 'S'
16             AND attr.attrelid     = dep.refobjid
17             AND attr.attnum       = dep.refobjsubid
18             AND attr.attrelid     = cons.conrelid
19             AND attr.attnum       = cons.conkey[1]
20             AND cons.contype      = 'p'
21             AND dep.classid       = '"pg_class"'::regclass
22             AND dep.refclassid    = '"pg_class"'::regclass
23             AND dep.refobjid      = '#{quote_table_name(table)}'::regclass
24         end_sql
25
26         if result.nil? or result.empty?
27           old_pk_and_sequence_for(table)
28         else
29           [result.first, result.last]
30         end
31       end
32     end
33   end
34 end