From: Vlad S. <ser...@us...> - 2006-07-23 01:22:51
|
Update of /cvsroot/naviserver/modules/nstk In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv19135 Modified Files: README nstk.tcl Log Message: Added nstk::db::foreach command to DB API Index: README =================================================================== RCS file: /cvsroot/naviserver/modules/nstk/README,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** README 10 Apr 2005 00:57:24 -0000 1.1.1.1 --- README 23 Jul 2006 01:22:47 -0000 1.2 *************** *** 1,3 **** ! Vlad Seryakov vl...@cr... --- 1,3 ---- ! Vlad Seryakov vl...@cr... *************** *** 6,14 **** ---------------------- ! To install nstk, enter make install ! To see the demo, restart the server and point your browser to http:://yourhostname/nstk/index.nstk --- 6,14 ---- ---------------------- ! To install nstk, enter make install ! To see the demo, restart the server and point your browser to http:://yourhostname/nstk/index.nstk *************** *** 35,39 **** For example: ! in .tcl file we have the following statement: --- 35,39 ---- For example: ! in .tcl file we have the following statement: *************** *** 55,64 **** Ex: index.adp ! <master src=master> <TABLE... content </TABLE> ! <slave> --- 55,64 ---- Ex: index.adp ! <master src=master> <TABLE... content </TABLE> ! <slave> *************** *** 68,72 **** Ex: master.adp ! <TABLE> <TR><TD> --- 68,72 ---- Ex: master.adp ! <TABLE> <TR><TD> *************** *** 78,86 **** </TR> </TABLE> ! <multirow> Repeat HTML code between ther tags for each row in the datasource. ! Datasource is list each row represented by array, rows are named as ds:1, ds:2, ds:3 ..., where ds is name of the datasource. nstk has special Tcl command to build datasources: nstk::multirow. --- 78,86 ---- </TR> </TABLE> ! <multirow> Repeat HTML code between ther tags for each row in the datasource. ! Datasource is list each row represented by array, rows are named as ds:1, ds:2, ds:3 ..., where ds is name of the datasource. nstk has special Tcl command to build datasources: nstk::multirow. *************** *** 93,97 **** nstk::multirow append ds "Bill Gates" "111 Liberty Sq" ! in .adp <TABLE BORDER=1 CELLSPACING=0> --- 93,97 ---- nstk::multirow append ds "Bill Gates" "111 Liberty Sq" ! in .adp <TABLE BORDER=1 CELLSPACING=0> *************** *** 105,114 **** <group> ! Repeat template chunk until the column name stays the same, it is used inside multirow tags only. This tag assumes that data is sorted by specified column. Ex: show items table, for each type, show all names in the separate column. ! <multirow name=item> <TR><TD>@item.type@</TD> --- 105,114 ---- <group> ! Repeat template chunk until the column name stays the same, it is used inside multirow tags only. This tag assumes that data is sorted by specified column. Ex: show items table, for each type, show all names in the separate column. ! <multirow name=item> <TR><TD>@item.type@</TD> *************** *** 127,131 **** Ex: ! <OL> <list name=list> --- 127,131 ---- Ex: ! <OL> <list name=list> *************** *** 157,166 **** <return> ! ! Return from current template, stop producing any output and return what is produced so far to the client ! Ex: ! <if @cmd@ eq show> Command: @cmd@ --- 157,166 ---- <return> ! ! Return from current template, stop producing any output and return what is produced so far to the client ! Ex: ! <if @cmd@ eq show> Command: @cmd@ *************** *** 175,179 **** Include and evaluate given template 'name'. This tag will be substituted by the output ! produced named template. All variables form the parent are accessable in the included page as well. --- 175,179 ---- Include and evaluate given template 'name'. This tag will be substituted by the output ! produced named template. All variables form the parent are accessable in the included page as well. *************** *** 191,217 **** nstk::config name ?default? ! returns value of the config parameter specified in the ns/server/${server}/module/nstk section ! nstk::true value ! returns 1 if value represent true symbol, one of the true, on, 1 enabled, yes, y, t ! nstk::nvl value ?default? ! returns given value or if it is empty specified default ! Ex: nstk::nvl $var -1 nstk::coalesce name ?default? ! returns value of the given variable if it exists and not empty, otherwise returns defualt value if specified ! Ex: nstk::coalesce var -1 --- 191,217 ---- nstk::config name ?default? ! returns value of the config parameter specified in the ns/server/${server}/module/nstk section ! nstk::true value ! returns 1 if value represent true symbol, one of the true, on, 1 enabled, yes, y, t ! nstk::nvl value ?default? ! returns given value or if it is empty specified default ! Ex: nstk::nvl $var -1 nstk::coalesce name ?default? ! returns value of the given variable if it exists and not empty, otherwise returns defualt value if specified ! Ex: nstk::coalesce var -1 *************** *** 248,278 **** nstk::cache cmd key args ! provide high level interface for caching key value pairs. ! Subcommands are: ! nstk::cache set key value ?timeout? ! assign key with given value, if timeout specified it defines number of seconds this key value will be in the cache ! nstk::cache get key ! returns value of the given key, if the item expired at that time or not found returns nothing ! nstk::cache flush pattern ! deletes all keys that match given pattern ! nstk::cache names pattern ! returns list with cache keys that match given apptern ! nstk::cache values pattern ! returns list with name value pairs for all matched items ! nstk::cache append key value ?timeout? nstk::cache lappend key value ?timeout? --- 248,278 ---- nstk::cache cmd key args ! provide high level interface for caching key value pairs. ! Subcommands are: ! nstk::cache set key value ?timeout? ! assign key with given value, if timeout specified it defines number of seconds this key value will be in the cache ! nstk::cache get key ! returns value of the given key, if the item expired at that time or not found returns nothing ! nstk::cache flush pattern ! deletes all keys that match given pattern ! nstk::cache names pattern ! returns list with cache keys that match given apptern ! nstk::cache values pattern ! returns list with name value pairs for all matched items ! nstk::cache append key value ?timeout? nstk::cache lappend key value ?timeout? *************** *** 280,286 **** appends/lappends value to the exiting key, if it does not exists, creates new cache item ! nstk::cache incr key ! same as Tcl incr command but for cache item, if does not exists, it is created with value 1 --- 280,286 ---- appends/lappends value to the exiting key, if it does not exists, creates new cache item ! nstk::cache incr key ! same as Tcl incr command but for cache item, if does not exists, it is created with value 1 *************** *** 288,356 **** nstk::multirow cmd name args ! create and manipulate datasources. Each datasource is a list of arrays where ! each array represents separate row in the table. This datasource is used by <multirow> tag in the .adp template. ! Subcommands are: ! nstk::multirow create name col1 col2 ... ! creates datasource name with given columns ! Ex: nstk::multirow create ds name address phone nstk::multirow drop name ! deletes datasource from the memory ! nstk::multirow append name val1 val2 ... ! appends row to the existing datasource ! Ex: nstk::multrow append ds John "1 MainSt" 7035550101 ! nstk::multirow name size ! returns number of rows in the datasource ! nstk::multirow update name index val1 val2 ... ! updates specified row in the datasource with new values ! Ex: nstk::multirow update ds 0 Peter "No address" 2029998765 ! nstk::multirow local name index ! creates local variables named as columns in the datasource and assignes with values form specified row ! Ex: nstk::multirow local ds 0 will create Tcl variables name with value Peter, address with value "No address" and phone with value 2029998765 ! nstk::multirow get name index column ! returns value fo the specified column from the specified row ! Ex: nstk::multirow get ds 0 name will return Peter ! nstk::multirow set name index col1 val1 col2 val2 ... ! updates specified datasource row with new values ! Ex: nstk::multirow set ds 0 name Yana phone 011798756432 nstk::db::multirow name sql ?-eval script? ?-db dbhandle? -level level? ! 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 array row will hold all column values for the current row in the eval script. ! if db is not specified, handle from database pool configured in the ns/server/${server}/module/nstk as database will be used. ! Ex: in .tcl set db [ns_db gethandle poolname] --- 288,356 ---- nstk::multirow cmd name args ! create and manipulate datasources. Each datasource is a list of arrays where ! each array represents separate row in the table. This datasource is used by <multirow> tag in the .adp template. ! Subcommands are: ! nstk::multirow create name col1 col2 ... ! creates datasource name with given columns ! Ex: nstk::multirow create ds name address phone nstk::multirow drop name ! deletes datasource from the memory ! nstk::multirow append name val1 val2 ... ! appends row to the existing datasource ! Ex: nstk::multrow append ds John "1 MainSt" 7035550101 ! nstk::multirow name size ! returns number of rows in the datasource ! nstk::multirow update name index val1 val2 ... ! updates specified row in the datasource with new values ! Ex: nstk::multirow update ds 0 Peter "No address" 2029998765 ! nstk::multirow local name index ! creates local variables named as columns in the datasource and assignes with values form specified row ! Ex: nstk::multirow local ds 0 will create Tcl variables name with value Peter, address with value "No address" and phone with value 2029998765 ! nstk::multirow get name index column ! returns value fo the specified column from the specified row ! Ex: nstk::multirow get ds 0 name will return Peter ! nstk::multirow set name index col1 val1 col2 val2 ... ! updates specified datasource row with new values ! Ex: nstk::multirow set ds 0 name Yana phone 011798756432 nstk::db::multirow name sql ?-eval script? ?-db dbhandle? -level level? ! 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 array row will hold all column values for the current row in the eval script. ! if db is not specified, handle from database pool configured in the ns/server/${server}/module/nstk as database will be used. ! Ex: in .tcl set db [ns_db gethandle poolname] *************** *** 360,371 **** in .adp ! <multirow name=people> <TD>@people.name@</TD><TD>@people.address@</TD> </multirow> ! nstk::db::handle { pool "" } { count 1 } ! Returns a database connection handle. Returns the same database handle for all subsequent calls until nstk::db::release is called. This allows --- 360,371 ---- in .adp ! <multirow name=people> <TD>@people.name@</TD><TD>@people.address@</TD> </multirow> ! nstk::db::handle { pool "" } { count 1 } ! Returns a database connection handle. Returns the same database handle for all subsequent calls until nstk::db::release is called. This allows *************** *** 375,384 **** nstk::db::release ! Releases a database handle previously requested with nstk::db::handle. ! ! nstk::db::value { sql ?-db db? -default value? ! Returns the first column of the result. If the query doesn't return a row, returns -default value --- 375,384 ---- nstk::db::release ! Releases a database handle previously requested with nstk::db::handle. ! ! nstk::db::value { sql ?-db db? -default value? ! Returns the first column of the result. If the query doesn't return a row, returns -default value *************** *** 388,392 **** nstk::db::list sql ?-db db? ! Returns the first column of each row and returns it as a Tcl list --- 388,392 ---- nstk::db::list sql ?-db db? ! Returns the first column of each row and returns it as a Tcl list *************** *** 395,412 **** nstk::db::multilist sql ?-db db? -plain? ! ! Returns a list of Tcl lists with each sublist containing the columns ! returned by the database; if no rows are returned by the database, returns the empty string ! if -plain specified, result will contain plain list with all columns from all rows Ex: set people [nstk::db::multilist "SELECT id,name FROM people"] ! ! nstk::db::multivalue sql ?-db db? ?-prefix prefix? ! ! Performs the SQL query $sql that returns 0 or 1 row, ! setting variables to column values. -prefix specifies additional name prefix to make column names different Returns -1 in case of error --- 395,412 ---- nstk::db::multilist sql ?-db db? -plain? ! ! Returns a list of Tcl lists with each sublist containing the columns ! returned by the database; if no rows are returned by the database, returns the empty string ! if -plain specified, result will contain plain list with all columns from all rows Ex: set people [nstk::db::multilist "SELECT id,name FROM people"] ! ! nstk::db::multivalue sql ?-db db? ?-prefix prefix? ! ! Performs the SQL query $sql that returns 0 or 1 row, ! setting variables to column values. -prefix specifies additional name prefix to make column names different Returns -1 in case of error *************** *** 416,417 **** --- 416,426 ---- } + nstk::db::foreach sql code args + + Performs the SQL query $sql, executing code once for each row with + variables set to column values. + Returns -1 on error or number of rows processed + + Ex: nstk::db::foreach "SELECT id,name FROM people" { + ns_log Notice $id = $name + } Index: nstk.tcl =================================================================== RCS file: /cvsroot/naviserver/modules/nstk/nstk.tcl,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** nstk.tcl 10 Apr 2005 00:57:24 -0000 1.1.1.1 --- nstk.tcl 23 Jul 2006 01:22:47 -0000 1.2 *************** *** 1,3 **** ! # Author: Vlad Seryakov vl...@cr... # August 2005 # --- 1,3 ---- ! # Author: Vlad Seryakov vl...@cr... # August 2005 # *************** *** 12,18 **** variable version "nstk version 1.0" ! variable cache_mutex [ns_mutex create nstk:cache] ! # Custom tags namespace eval tag {} --- 12,18 ---- variable version "nstk version 1.0" ! variable cache_mutex [ns_mutex create nstk:cache] ! # Custom tags namespace eval tag {} *************** *** 20,24 **** # Database API namespace eval db {} ! # Template processing namespace eval tmpl { --- 20,24 ---- # Database API namespace eval db {} ! # Template processing namespace eval tmpl { *************** *** 37,41 **** # the special section module/nstk of the current server proc nstk::config { name { default "" } { type "-exact" } } { ! set section "ns/server/[ns_info server]/module/nstk" return [eval ns_config $type $section $name $default] --- 37,41 ---- # the special section module/nstk of the current server proc nstk::config { name { default "" } { type "-exact" } } { ! set section "ns/server/[ns_info server]/module/nstk" return [eval ns_config $type $section $name $default] *************** *** 60,64 **** set level [expr [info level] - 1] upvar #$level $name:rowcount rowcount $name:columns columns ! switch -exact -- $op { create { --- 60,64 ---- set level [expr [info level] - 1] upvar #$level $name:rowcount rowcount $name:columns columns ! switch -exact -- $op { create { *************** *** 66,70 **** set columns $args } ! drop { if { [info exists columns] } { unset columns } --- 66,70 ---- set columns $args } ! drop { if { [info exists columns] } { unset columns } *************** *** 77,81 **** } } ! append { incr rowcount --- 77,81 ---- } } ! append { incr rowcount *************** *** 88,92 **** set row(rownum) $rowcount } ! update { upvar #$level $name:[lindex $args 0] row --- 88,92 ---- set row(rownum) $rowcount } ! update { upvar #$level $name:[lindex $args 0] row *************** *** 98,102 **** set row(rownum) $rowcount } ! local { upvar #$level $name:[lindex $args 0] row --- 98,102 ---- set row(rownum) $rowcount } ! local { upvar #$level $name:[lindex $args 0] row *************** *** 106,110 **** } } ! size { return $rowcount --- 106,110 ---- } } ! size { return $rowcount *************** *** 138,142 **** upvar 1 $name var ! if { [array exists var] || ([info exists var] && ![string equal $var {}]) } { return $var --- 138,142 ---- upvar 1 $name var ! if { [array exists var] || ([info exists var] && ![string equal $var {}]) } { return $var *************** *** 200,204 **** {-error ""} {-content_type "text/plain"} } $args ! if { $error != "" } { upvar $error errmsg --- 200,204 ---- {-error ""} {-content_type "text/plain"} } $args ! if { $error != "" } { upvar $error errmsg *************** *** 230,234 **** } else { # simple MIME envelope ! if { $content_type != "text/plain" } { lappend headers MIME-Version 1.0 Content-Type $content_type } --- 230,234 ---- } else { # simple MIME envelope ! if { $content_type != "text/plain" } { lappend headers MIME-Version 1.0 Content-Type $content_type } *************** *** 236,240 **** # Send the message without submitting into message queue set hdrs [ns_set new] ! foreach { name value } $headers { switch [set name [string tolower $name]] { cc - bcc { append $name $value, } --- 236,240 ---- # Send the message without submitting into message queue set hdrs [ns_set new] ! foreach { name value } $headers { switch [set name [string tolower $name]] { cc - bcc { append $name $value, } *************** *** 256,260 **** variable cache_mutex ! switch -exact $command { --- 256,260 ---- variable cache_mutex ! switch -exact $command { *************** *** 262,266 **** set rc 0 ns_mutex lock $cache_mutex ! catch { if { [nsv_exists __nstk_cache $key] } { set timeout [nsv_get __nstk_cache_timeout $key] --- 262,266 ---- set rc 0 ns_mutex lock $cache_mutex ! catch { if { [nsv_exists __nstk_cache $key] } { set timeout [nsv_get __nstk_cache_timeout $key] *************** *** 271,275 **** return $rc } ! get { set value [lindex $args 0] --- 271,275 ---- return $rc } ! get { set value [lindex $args 0] *************** *** 299,303 **** return $value } ! set { if { [set timeout [lindex $args 1]] != -1 } { --- 299,303 ---- return $value } ! set { if { [set timeout [lindex $args 1]] != -1 } { *************** *** 335,339 **** ns_mutex unlock $cache_mutex } ! unset { ns_mutex lock $cache_mutex --- 335,339 ---- ns_mutex unlock $cache_mutex } ! unset { ns_mutex lock $cache_mutex *************** *** 357,361 **** ns_mutex unlock $cache_mutex } ! names { set result [list] --- 357,361 ---- ns_mutex unlock $cache_mutex } ! names { set result [list] *************** *** 365,369 **** return $result } ! values { set result [list] --- 365,369 ---- return $result } ! values { set result [list] *************** *** 373,377 **** return $result } ! cleanup { # Remove all expired entries from the cache --- 373,377 ---- return $result } ! cleanup { # Remove all expired entries from the cache *************** *** 388,392 **** ns_mutex unlock $cache_mutex } ! default { error "nstk::cache: Invalid command: $command" --- 388,392 ---- ns_mutex unlock $cache_mutex } ! default { error "nstk::cache: Invalid command: $command" *************** *** 402,408 **** global __nstk_dbhandle ! ! if { [info exists __nstk_dbhandle] } { return $__nstk_dbhandle } ! if { $pool == "" } { set pool [::ossweb::config database nstk] } if { [catch { set __nstk_dbhandle [ns_db gethandle $pool $count] } errmsg] } { ns_log Error nstk::db::handle: $errmsg --- 402,412 ---- global __nstk_dbhandle ! ! if { [info exists __nstk_dbhandle] } { ! return $__nstk_dbhandle ! } ! if { $pool == "" } { ! set pool [::ossweb::config database nstk] ! } if { [catch { set __nstk_dbhandle [ns_db gethandle $pool $count] } errmsg] } { ns_log Error nstk::db::handle: $errmsg *************** *** 416,420 **** global __nstk_dbhandle ! if { [info exists __nstk_dbhandle] } { if { [ns_db connected $__nstk_dbhandle] } { --- 420,424 ---- global __nstk_dbhandle ! if { [info exists __nstk_dbhandle] } { if { [ns_db connected $__nstk_dbhandle] } { *************** *** 433,439 **** ns_parseargs { -db -level {-eval ""} } $args ! upvar #$level $name:rowcount rowcount ${name}:columns columns ! if { ![info exists level] } { set level [expr [info level]-1] --- 437,443 ---- ns_parseargs { -db -level {-eval ""} } $args ! upvar #$level $name:rowcount rowcount ${name}:columns columns ! if { ![info exists level] } { set level [expr [info level]-1] *************** *** 442,446 **** set db [nstk::db::handle] } ! set rowcount 0 if { [catch { set query [ns_db select $db $sql] } errmsg] } { --- 446,450 ---- set db [nstk::db::handle] } ! set rowcount 0 if { [catch { set query [ns_db select $db $sql] } errmsg] } { *************** *** 448,452 **** return -1 } ! while { [ns_db getrow $db $query] } { set size [ns_set size $query] --- 452,456 ---- return -1 } ! while { [ns_db getrow $db $query] } { set size [ns_set size $query] *************** *** 497,503 **** # -db existing database handle proc nstk::db::value { sql args } { ! ns_parseargs { -db -default } $args ! if { ![info exists db] } { set db [nstk::db::handle] --- 501,507 ---- # -db existing database handle proc nstk::db::value { sql args } { ! ns_parseargs { -db -default } $args ! if { ![info exists db] } { set db [nstk::db::handle] *************** *** 538,543 **** } ! # Returns a list of Tcl lists with each sublist containing the columns ! # returned by the database; if no rows are returned by the # database, returns the empty string # -db existing database handle --- 542,547 ---- } ! # Returns a list of Tcl lists with each sublist containing the columns ! # returned by the database; if no rows are returned by the # database, returns the empty string # -db existing database handle *************** *** 575,580 **** } ! # Performs the SQL query $sql that returns 0 or 1 row, ! # setting variables to column values. # -prefix specifies additional name prefix to make column names different # -db existing database handle --- 579,584 ---- } ! # Performs the SQL query $sql that returns 0 or 1 row, ! # setting variables to column values. # -prefix specifies additional name prefix to make column names different # -db existing database handle *************** *** 602,606 **** set name [ns_set key $query $i] set value [ns_set value $query $i] ! upvar #$level ${prefix}$name var set var $value incr i --- 606,610 ---- set name [ns_set key $query $i] set value [ns_set value $query $i] ! upvar #$level ${prefix}$name var set var $value incr i *************** *** 609,612 **** --- 613,660 ---- } + # Usage: nstk::db::foreach sql code args + # Performs the SQL query $sql, executing code once for each row with + # variables set to column values. + # Returns -1 on error or number of rows processed + proc nstk::db::foreach { sql code 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] + } + set rownum 0 + if [catch { set query [ns_db select $db $sql] } errmsg] { + ns_log Error nstk::db::foreach: $errmsg: $sql + return -1 + } + while { [ns_db getrow $db $query] } { + incr rownum + for { set i 0 } { $i < [ns_set size $query] } { incr i } { + set name [ns_set key $query $i] + upvar #$level $prefix$name var + set var [ns_set value $query $i] + } + set rc [catch { uplevel #$level $code } errmsg] + switch $rc { + 0 - + 4 {} + 2 - + 3 { + ns_db flush $db + break + } + default { + global errorInfo errorCode + error $errmsg $errorInfo $errorCode + } + } + } + return $rownum + } + # # nstk - NaviServer ToolKit *************** *** 621,625 **** set _url "[ns_info pageroot]/[::file rootname [ns_conn url]]" ! if { [catch { nstk::tmpl::init --- 669,673 ---- set _url "[ns_info pageroot]/[::file rootname [ns_conn url]]" ! if { [catch { nstk::tmpl::init *************** *** 628,632 **** } errmsg] } { ! # Signal to stop template processing, this error means the script # produced the output and returned it to the client if { $errmsg == [nstk::tmpl::stop 0] } { --- 676,680 ---- } errmsg] } { ! # Signal to stop template processing, this error means the script # produced the output and returned it to the client if { $errmsg == [nstk::tmpl::stop 0] } { *************** *** 668,672 **** # path absolute path to the next template to parse. proc nstk::tmpl::setfile { path } { ! variable tstack --- 716,720 ---- # path absolute path to the next template to parse. proc nstk::tmpl::setfile { path } { ! variable tstack *************** *** 719,723 **** variable blevel ! set level [nstk::tmpl::level] --- 767,771 ---- variable blevel ! set level [nstk::tmpl::level] *************** *** 767,771 **** # type - tcl or adp proc nstk::tmpl::cache { type path } { ! set level [nstk::tmpl::level] set mtime0 [info procs nstk_${type}_$path] --- 815,819 ---- # type - tcl or adp proc nstk::tmpl::cache { type path } { ! set level [nstk::tmpl::level] set mtime0 [info procs nstk_${type}_$path] *************** *** 773,777 **** # Verify file modification time if { $mtime0 == "" || [$mtime0 1] != $mtime1 } { ! if { [catch { set fd [open $path.$type] set code [read $fd] --- 821,825 ---- # Verify file modification time if { $mtime0 == "" || [$mtime0 1] != $mtime1 } { ! if { [catch { set fd [open $path.$type] set code [read $fd] *************** *** 809,813 **** nstk::tmpl::setfile $path # Execute Tcl code first ! if { [catch { while 1 { if { ![::file exists $path.tcl] } { break } --- 857,861 ---- nstk::tmpl::setfile $path # Execute Tcl code first ! if { [catch { while 1 { if { ![::file exists $path.tcl] } { break } *************** *** 852,856 **** if { [nstk::tmpl::file] == "" } { ns_log Error nstk::tmpl::evalfile template or script is not found: $path ! return "The requested URL was not found on this server: '[ns_quotehtml [ns_conn url]]'" } } --- 900,904 ---- if { [nstk::tmpl::file] == "" } { ns_log Error nstk::tmpl::evalfile template or script is not found: $path ! return "The requested URL was not found on this server: '[ns_quotehtml [ns_conn url]]'" } } *************** *** 960,964 **** # ! # NaviServer ToolKit # # Custom tags --- 1008,1012 ---- # ! # NaviServer ToolKit # # Custom tags *************** *** 1002,1006 **** default { set src [ns_set iget $params src] ! if { $src == "" } { set src index } } } --- 1050,1054 ---- default { set src [ns_set iget $params src] ! if { $src == "" } { set src index } } } *************** *** 1029,1033 **** set name [ns_set iget $params name] ! nstk::tmpl::code " for { set _row$name 1 } { \$_row$name <= \${$name:rowcount} } { incr _row$name } { --- 1077,1081 ---- set name [ns_set iget $params name] ! nstk::tmpl::code " for { set _row$name 1 } { \$_row$name <= \${$name:rowcount} } { incr _row$name } { |