aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2005-10-16 03:45:39 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2005-10-16 03:45:39 +0000
commit7117fdb8ceeb4d8cc18651a74ea52f1bed2b077c (patch)
tree20dff4d44de2dcd1401e8cf008ceca0f077d50d8 /activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
parent22b77daeee65aa80061f247a3b36404bacd7dff5 (diff)
downloadrails-7117fdb8ceeb4d8cc18651a74ea52f1bed2b077c.tar.gz
rails-7117fdb8ceeb4d8cc18651a74ea52f1bed2b077c.tar.bz2
rails-7117fdb8ceeb4d8cc18651a74ea52f1bed2b077c.zip
r3616@asus: jeremy | 2005-09-26 23:09:28 -0700
Ticket 2292 - Sequences, schemas, and fixtures r3917@asus: jeremy | 2005-10-15 10:43:24 -0700 fix pk assert r3918@asus: jeremy | 2005-10-15 10:46:52 -0700 rework query cache connection= override r3919@asus: jeremy | 2005-10-15 10:47:45 -0700 correct fixtures usage r3920@asus: jeremy | 2005-10-15 10:53:23 -0700 correct attr assignment r3921@asus: jeremy | 2005-10-15 12:59:10 -0700 sequences r3922@asus: jeremy | 2005-10-15 16:36:09 -0700 reset fixtures work with sequences r3951@asus: jeremy | 2005-10-15 23:23:12 -0700 cut down excess features r3952@asus: jeremy | 2005-10-15 23:40:30 -0700 don't test for PostgreSQL specifically git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2639 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb')
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb40
1 files changed, 36 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
index e7bedaee9e..203d390046 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
@@ -102,7 +102,7 @@ module ActiveRecord
def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
execute(sql, name)
table = sql.split(" ", 4)[2]
- id_value || last_insert_id(table, pk)
+ id_value || last_insert_id(table, sequence_name)
end
def query(sql, name = nil) #:nodoc:
@@ -198,6 +198,37 @@ module ActiveRecord
def schema_search_path #:nodoc:
@schema_search_path ||= query('SHOW search_path')[0][0]
end
+
+ def default_sequence_name(table_name, pk = 'id')
+ "#{table_name}_#{pk}_seq"
+ end
+
+ # Set the sequence to the max value of the table's pk.
+ def reset_pk_sequence!(table)
+ sequence, pk = sequence_and_pk_for(table)
+ if sequence and pk
+ select_value <<-end_sql, 'Reset sequence'
+ SELECT setval('#{sequence}', (SELECT COALESCE(MAX(#{pk})+(SELECT increment_by FROM #{sequence}), (SELECT min_value FROM #{sequence})) FROM #{table}), false)
+ end_sql
+ end
+ end
+
+ # Find a table's primary key and sequence.
+ def sequence_and_pk_for(table, column = nil)
+ execute(<<-end_sql, 'Find pk sequence')[0]
+ SELECT (name.nspname || '.' || seq.relname) AS sequence, attr.attname AS pk
+ FROM pg_class seq, pg_attribute attr, pg_depend dep, pg_namespace name, pg_constraint cons
+ WHERE seq.oid = dep.objid
+ AND seq.relnamespace = name.oid
+ AND attr.attrelid = dep.refobjid
+ AND attr.attnum = dep.refobjsubid
+ AND attr.attrelid = cons.conrelid
+ AND attr.attnum = cons.conkey[1]
+ AND cons.contype = 'p'
+ AND dep.refobjid = '#{table}'::regclass
+ end_sql
+ end
+
def rename_table(name, new_name)
execute "ALTER TABLE #{name} RENAME TO #{new_name}"
@@ -242,9 +273,10 @@ module ActiveRecord
private
BYTEA_COLUMN_TYPE_OID = 17
- def last_insert_id(table, column = nil)
- sequence_name = "#{table}_#{column || 'id'}_seq"
- @connection.exec("SELECT currval('#{sequence_name}')")[0][0].to_i
+ def last_insert_id(table, sequence_name)
+ if sequence_name
+ @connection.exec("SELECT currval('#{sequence_name}')")[0][0].to_i
+ end
end
def select(sql, name = nil)