| 
      
      
      From: Sean C. <se...@ch...> - 2002-09-16 09:31:38
      
     | 
| I've got a pretty interesting problem in that I'm dynamically creating
a database using Ruby.  I've got something of a problem though with
the way that transactions are handled with the execute() methods in
that they always prepend BEGIN WORK; if you're outside of a
transaction.  There are a couple of workarounds for this, but none of
them elegant or correct, IMHO.
*) What I'm doing now:
   dbh.do('ABORT; #{sql}; COMMIT; BEGIN;')
   It's super ugly, but it works insofar as it keeps the database in
   sync with DBI.
*) A possible hack would be to add :in_transaction as an accessor:
   # make sure you're currently outside of a transaction
   dbh.in_transaction = true
   dbh.do(sql)
   dbh.in_transaction = false
*) Another option would be to create something parallel to #do, only
 have it skip the write-through transaction bits.
 dbh.do_exec(sql)
*) The most elegant and likely correct solution would be to add
 another options tunable that would let #do omit adding a 'BEGIN
 WORK;' to every command.
 dbh['AutoBegin'] = false
 dbh.do(sql)
 dbh.commit
I'm personally a fan of the last option as it'd give the developer
fine grained control over when a transaction should begin or end and
would let people execute administrative SQL commands that can't be
executed inside of a transaction (create/drop database, etc).  Anyone
else have an opinion on this?  -sc
-- 
Sean Chittenden
 |