diff --git a/doc/adapter_methods.txt b/doc/adapter_methods.txt index c5757a349f96bc0bf1106098f5b9e27927a8cc27..4d7792f209debb007a44df9f71f29a7891e33832 100644 --- a/doc/adapter_methods.txt +++ b/doc/adapter_methods.txt @@ -41,7 +41,7 @@ monetdb/database_statements.rb |- select_rows (*) |- execute (!) - OK |- exec_query (!) - OK Just without cache. We need to implement this later - |- exec_insert (!) + |- exec_insert (!) - OK |- exec_delete (!) |- truncate (!) |- exec_update (!) diff --git a/lib/active_record/connection_adapters/monetdb/database_statements.rb b/lib/active_record/connection_adapters/monetdb/database_statements.rb index f53c3a4b1ed69c8d2c803de1a6cdf216e95c939d..7e5233e47fc40ea378e633a5a1c24e802722d88b 100644 --- a/lib/active_record/connection_adapters/monetdb/database_statements.rb +++ b/lib/active_record/connection_adapters/monetdb/database_statements.rb @@ -27,7 +27,7 @@ module ActiveRecord # Executes +sql+ statement in the context of this connection using # +binds+ as the bind substitutes. +name+ is logged along with # the executed +sql+ statement. - def exec_query(sql, name = 'SQL', binds = []) # + def exec_query(sql, name = 'SQL', binds = []) execute_and_clear(sql, name, binds) do |result| types = {} fields = result.fields @@ -44,6 +44,17 @@ module ActiveRecord # +binds+ as the bind substitutes. +name+ is logged along with # the executed +sql+ statement. def exec_insert(sql, name, binds, pk = nil, sequence_name = nil) + val = exec_query(sql, name, binds) + if pk + unless sequence_name + table_ref = extract_table_ref_from_insert_sql(sql) + sequence_name = default_sequence_name(table_ref, pk) + return val unless sequence_name + end + exec_query("SELECT currval('#{sequence_name}')", 'SQL') + else + val + end end # Executes delete +sql+ statement in the context of this connection using diff --git a/lib/active_record/connection_adapters/monetdb_adapter.rb b/lib/active_record/connection_adapters/monetdb_adapter.rb index de1bd0211c00ac1b7722c539cc04e4501b5401fe..18137530ab2b769dc981f55fe48d10618e80d9f0 100644 --- a/lib/active_record/connection_adapters/monetdb_adapter.rb +++ b/lib/active_record/connection_adapters/monetdb_adapter.rb @@ -300,6 +300,10 @@ module ActiveRecord def native_database_types NATIVE_DATABASE_TYPES end + def extract_table_ref_from_insert_sql(sql) # :nodoc: + sql[/into\s+([^\(]*).*values\s*\(/im] + $1.strip if $1 + end end end end