db_with_handle db code_blockWhat it does:
Places a usable database handle in $db and executes $code_block.Defined in: /web/philip/packages/acs-core/10-database-procs.tcl
Source code:
upvar $db dbh global ad_conn # Initialize bookkeeping variables. if { ![info exists ad_conn(db,handles)] } { set ad_conn(db,handles) [list] } if { ![info exists ad_conn(db,n_handles_used)] } { set ad_conn(db,n_handles_used) 0 } if { $ad_conn(db,n_handles_used) >= [llength $ad_conn(db,handles)] } { lappend ad_conn(db,handles) [ns_db gethandle [db_nth_pool_name $ad_conn(db,n_handles_used)]] } set dbh [lindex $ad_conn(db,handles) $ad_conn(db,n_handles_used)] set ad_conn(db,last_used) $dbh incr ad_conn(db,n_handles_used) set errno [catch [list uplevel $code_block] error] incr ad_conn(db,n_handles_used) -1 # This may have changed while the code_block was being evaluated. set ad_conn(db,last_used) $dbh # Unset dbh, so any subsequence use of this variable will bomb. unset dbh # This may seem a little weird, but it just says "do whatever $code_block did" - # propagates a TCL_RETURN, TCL_BREAK, TCL_CONTINUE, TCL_OK, or TCL_ERROR to # the caller. if { $errno == 0 || $errno == 2 } { # TCL_OK or TCL_RETURN return $error } elseif { $errno == 3 } { # TCL_BREAK break } elseif { $errno == 4 } { # TCL_CONTINUE continue } else { # TCL_ERROR or something funky global errorInfo error $error $errorInfo $errno }