diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2012-02-10 14:52:27 -0800 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2012-02-10 14:52:27 -0800 |
commit | fa6cda53ebc7fd186a91fd0983dc9ddf20e9d39a (patch) | |
tree | 392f138adb0902afd424ba8af4bb64d639f74a8a /activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb | |
parent | f7b915b50718c86d3644941cd0bbe7df08888a5b (diff) | |
download | rails-fa6cda53ebc7fd186a91fd0983dc9ddf20e9d39a.tar.gz rails-fa6cda53ebc7fd186a91fd0983dc9ddf20e9d39a.tar.bz2 rails-fa6cda53ebc7fd186a91fd0983dc9ddf20e9d39a.zip |
dynamically populate casting objects via the pg_type table
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index eccf3595aa..187d5651e6 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -383,6 +383,7 @@ module ActiveRecord raise "Your version of PostgreSQL (#{postgresql_version}) is too old, please upgrade!" end + initialize_type_map @local_tz = execute('SHOW TIME ZONE', 'SCHEMA').first["TimeZone"] end @@ -1188,6 +1189,22 @@ module ActiveRecord end private + def initialize_type_map + result = execute('SELECT oid, typname, typelem, typdelim FROM pg_type', 'SCHEMA') + leaves, nodes = result.partition { |row| row['typelem'] == '0' } + + # populate the leaf nodes + leaves.find_all { |row| OID.registered_type? row['typname'] }.each do |row| + OID::TYPE_MAP[row['oid'].to_i] = OID::NAMES[row['typname']] + end + + # populate composite types + nodes.find_all { |row| OID::TYPE_MAP.key? row['typelem'].to_i }.each do |row| + vector = OID::Vector.new row['typdelim'], OID::TYPE_MAP[row['typelem'].to_i] + OID::TYPE_MAP[row['oid'].to_i] = vector + end + end + FEATURE_NOT_SUPPORTED = "0A000" # :nodoc: def exec_no_cache(sql, binds) |