Index: openacs-4/packages/acs-tcl/tcl/01-database-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/01-database-procs.tcl,v
diff -u -r1.1.2.28 -r1.1.2.29
--- openacs-4/packages/acs-tcl/tcl/01-database-procs.tcl 1 Mar 2021 09:26:46 -0000 1.1.2.28
+++ openacs-4/packages/acs-tcl/tcl/01-database-procs.tcl 3 Mar 2021 10:32:57 -0000 1.1.2.29
@@ -2348,19 +2348,29 @@
ad_proc -public db_transaction {{ -dbn ""} transaction_code args } {
Usage: db_transaction transaction_code [ on_error { error_code_block } ]
- Executes transaction_code with transactional semantics. This means that either all of the database commands
- within transaction_code are committed to the database or none of them are. Multiple db_transaction
s may be
- nested (end transaction is transparently ns_db dml'ed when the outermost transaction completes).
+ Executes transaction_code with transactional semantics. This
+ means that either all of the database commands within
+ transaction_code are committed to the database or none of them
+ are. Multiple db_transaction
s may be nested (end
+ transaction is transparently ns_db dml'ed when the outermost
+ transaction completes).
- To handle errors, use db_transaction {transaction_code} on_error {error_code_block}
. Any error generated in
- transaction_code
will be caught automatically and process control will transfer to error_code_block
- with a variable errmsg
set. The error_code block can then clean up after the error, such as presenting a usable
- error message to the user. Following the execution of error_code_block
the transaction will be aborted.
- If you want to explicitly abort the transaction, call db_abort_transaction
- from within the transaction_code block or the error_code block.
+ To handle errors, use db_transaction {transaction_code}
+ on_error {error_code_block}
. Any error generated in
+ transaction_code
will be caught automatically and
+ process control will transfer to error_code_block
+ with a variable errmsg
set. The error_code block can
+ then clean up after the error, such as presenting a usable error
+ message to the user. Following the execution of
+ error_code_block
the transaction will be aborted. If
+ you want to explicitly abort the transaction, call
+ db_abort_transaction
from within the transaction_code
+ block or the error_code block.
- Example 1:
- In this example, db_dml triggers an error, so control passes to the on_error block which prints a readable error.
+ Example 1:
In this example, db_dml triggers an error, so
+ control passes to the on_error block which prints a readable
+ error.
+
db_transaction { db_dml test "nonsense" @@ -2369,9 +2379,10 @@ }- Example 2:
db_transaction { db_dml test {insert into footest values(1)} @@ -2388,24 +2399,27 @@ set arg_c [llength $args] if { $arg_c != 0 && $arg_c != 2 } { - # Either this is a transaction with no error handling or there must be an on_error { code } block. + # Either this is a transaction with no error handling or there + # must be an on_error { code } block. error $syn_err } elseif { $arg_c == 2 } { # We think they're specifying an on_error block if {[lindex $args 0] ne "on_error" } { - # Unexpected: they put something besides on_error as a connector. + # Unexpected: they put something besides on_error as a + # connector. error $syn_err } else { # Success! We got an on_error code block. set on_error [lindex $args 1] } } - # Make the error message and database handle available to the on_error block. + # Make the error message and database handle available to the + # on_error block. upvar errmsg errmsg db_with_handle -dbn $dbn db { - # Preserve the handle, since db_with_handle kills it after executing - # this block. + # Preserve the handle, since db_with_handle kills it after + # executing this block. set dbh $db # Remember that there's a transaction happening on this handle. if { ![info exists db_state(transaction_level,$dbh)] } { @@ -2450,6 +2464,7 @@ if { $err_p || [db_abort_transaction_p -dbn $dbn]} { # An error was triggered or the transaction has been aborted. db_abort_transaction -dbn $dbn + if { [info exists on_error] && $on_error ne "" } { if {"postgresql" eq [db_type]} {