+
+ if result.nil? or result.empty?
+ # If that fails, try parsing the primary key's default value.
+ # Support the 7.x and 8.0 nextval('foo'::text) as well as
+ # the 8.1+ nextval('foo'::regclass).
+ result = query(<<-end_sql, 'PK and custom sequence')[0]
+ SELECT attr.attname,
+ CASE
+ WHEN split_part(def.adsrc, '''', 2) ~ '.' THEN
+ substr(split_part(def.adsrc, '''', 2),
+ strpos(split_part(def.adsrc, '''', 2), '.')+1)
+ ELSE split_part(def.adsrc, '''', 2)
+ END
+ FROM pg_class t
+ JOIN pg_attribute attr ON (t.oid = attrelid)
+ JOIN pg_attrdef def ON (adrelid = attrelid AND adnum = attnum)
+ JOIN pg_constraint cons ON (conrelid = adrelid AND adnum = conkey[1])
+ WHERE t.oid = '#{quote_table_name(table)}'::regclass
+ AND cons.contype = 'p'
+ AND def.adsrc ~* 'nextval'
+ end_sql
+ end
+
+ # [primary_key, sequence]
+ [result.first, result.last]
+ rescue
+ nil
+ end
+
+ def initialize_type_map_with_enums
+ OID.alias_type "format_enum", "text"
+ OID.alias_type "gpx_visibility_enum", "text"
+ OID.alias_type "note_status_enum", "text"
+ OID.alias_type "note_event_enum", "text"
+ OID.alias_type "nwr_enum", "text"
+ OID.alias_type "user_role_enum", "text"
+ OID.alias_type "user_status_enum", "text"
+
+ initialize_type_map_without_enums
+ end
+
+ alias_method_chain :initialize_type_map, :enums
+ end
+
+ class PostgreSQLColumn
+ def simplified_type_with_enum(field_type)
+ case field_type
+ when /_enum$/
+ :string
+ else
+ simplified_type_without_enum(field_type)
+ end