From: Vlad S. <ser...@us...> - 2006-07-23 01:58:44
|
Update of /cvsroot/naviserver/modules/nstk In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv821 Modified Files: README nstk.tcl Log Message: Added new DB API commands: begin,commit,rollback,rowcount Index: README =================================================================== RCS file: /cvsroot/naviserver/modules/nstk/README,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** README 23 Jul 2006 01:22:47 -0000 1.2 --- README 23 Jul 2006 01:58:41 -0000 1.3 *************** *** 379,383 **** ! nstk::db::value { sql ?-db db? -default value? Returns the first column of the result. --- 379,383 ---- ! nstk::db::value sql ?-db db? -default value? Returns the first column of the result. *************** *** 416,420 **** } ! nstk::db::foreach sql code args Performs the SQL query $sql, executing code once for each row with --- 416,420 ---- } ! nstk::db::foreach sql code ?-db? ?-prefix? Performs the SQL query $sql, executing code once for each row with *************** *** 425,426 **** --- 425,447 ---- ns_log Notice $id = $name } + + nstk::db::begin ?-db? + + Begins a database transaction, nested calls are allowed, actuall begin will happen + on the first call only, all subsequent calls will result in increasing transaction counter. + Returns 0 on success, -1 on error + + nstk::db::commit ?-db? + + Commits a database transaction. Nested calls are allowd, actual commit will + happend when the transaction counter will reach zero. + Returns 0 on success, -1 on error + + nstk::db::rollback { args } { + + Rollbacks a database transaction. + + nstk::db::rowcount ?-db? + + Returns number of rows affected by last INSERT,UPDATE or DELETE statement. + Index: nstk.tcl =================================================================== RCS file: /cvsroot/naviserver/modules/nstk/nstk.tcl,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** nstk.tcl 23 Jul 2006 01:22:47 -0000 1.2 --- nstk.tcl 23 Jul 2006 01:58:41 -0000 1.3 *************** *** 429,432 **** --- 429,531 ---- } + # Begins a database transaction, nested calls are allowed, actuall begin will happen + # on the first call only, all subsequent calls will result in increasing transaction counter. + # Returns 0 on success, -1 on error + proc nstk::db::begin { args } { + + global __nstk_dbtransaction + + ns_parseargs { -db } $args + + if { ![info exists db] } { + set db [nstk::db::handle] + } + if { ![info exists __nstk_dbtransaction] || $_nstk_dbtransaction < 0 } { + set __nstk_dbtransaction 0 + } + incr __nstk_dbtransaction + if { __nstk_dbtransaction == 1 } { + if { [catch { ns_db dml $db "BEGIN TRANSACTION" } errmsg] } { + ns_log Error nstk::db::begin: $errmsg + set __nstk_dbtransaction 0 + return -1 + } + } + return 0 + } + + # Commits a database transaction. Nested calls are allowd, actual commit will + # happend when the transaction counter will reach zero. + # Returns 0 on success, -1 on error + proc nstk::db::commit { args } { + + global __nstk_dbtransaction + + ns_parseargs { -db } $args + + if { ![info exists db] } { + set db [nstk::db::handle] + } + if { ![info exists __nstk_dbtransaction] || $_nstk_dbtransaction < 0 } { + set __nstk_dbtransaction 0 + } + incr __nstk_dbtransaction -1 + if { $trans == 0 } { + if { [catch { ns_db dml $db "COMMIT TRANSACTION" } errmsg] } { + ns_log Error nstk::db::commit: $errmsg + set __nstk_dbtransaction 0 + return -1 + } + } + return 0 + } + + # Rollbacks a database transaction. + proc nstk::db::rollback { args } { + + global __nstk_dbtransaction + + ns_parseargs { -db } $args + + if { ![info exists db] } { + set db [nstk::db::handle] + } + if { ![info exists __nstk_dbtransaction] || $_nstk_dbtransaction < 0 } { + set __nstk_dbtransaction 0 + } + if { $__nstk_dbtransaction > 0 } { + if { [catch { ns_db dml $db "ROLLBACK TRANSACTION" } errmsg] } { + ns_log Error nstk::db::rollback: $errmsg + set __nstk_dbtransaction 0 + return -1 + } + } + set __nstk_dbtransaction 0 + return 0 + } + + # Returns number of rows affected by last INSERT,UPDATE or DELETE statement. + proc nstk::db::rowcount { args } { + + ns_parseargs { -db } $args + + if { ![info exists db] } { + set db [nstk::db::handle] + } + + switch -glob [ns_db dbtype $db] { + PostgreSQL { + set count [ns_pg ntuples $db] + } + Sybase { + set count [::ossweb::db::value $db "SELECT @@rowcount"] + } + default { + error "Unsupported database driver: [ns_db dbtype $db]: [ns_db driver $db]" + } + } + return $count + } + # Execute database query and create multirow datasource name, each result row will create # separate multirow row. If eval si not empty, it will be executed for every row. Local *************** *** 657,660 **** --- 756,778 ---- } + # Executes SQL statement, returns 0 if successful + proc nstk::db::exec { sql args } { + + ns_parseargs { {-prefix ""} -db -level } {} $args + + if { ![info exists level] } { + set level [expr [info level] - 1] + } + if { ![info exists db] } { + set db [nstk::db::handle] + } + # Execute SQL statement + if [catch { ns_db exec $db $sql } errmsg] { + ns_log Error nstk::db::exec: $errmsg: $sql + return -1 + } + return 0 + } + # # nstk - NaviServer ToolKit |