Posted to tcl by AspiringTickler at Sun Oct 03 10:33:32 GMT 2021view pretty
proc withdb { var handler } { sqlite3 $var "db" $var timeout 10000 try { uplevel $handler } finally { $var close } } proc someImport {id} { withdb db { if [db eval { SELECT COUNT() FROM foo WHERE id = $id }] { puts [format "%s already exists" $id] return # the return here should return someImport (and does with return -level 2), but not without } db eval { INSERT OR IGNORE INTO foo(id) VALUES($id) } } }
Comments
Posted by AspiringTickler at Sun Oct 03 10:59:23 GMT 2021 [text] [code]
``` proc withdb { var handler } { sqlite3 $var "db" $var timeout 10000 tailcall try $handler finally [list $var close] } ``` Usage of tailcall and try was suggested by aspect1 and works exactly as I intended. This technique is also mentioned here: https://wiki.tcl-lang.org/page/try under the section "Use with [tailcall]"