db_dml (public)
db_dml [ -dbn dbn ] [ -subst subst ] statement_name sql [ args... ]
Defined in packages/acs-tcl/tcl/01-database-procs.tcl
Do a DML statement.
args can be one of: -clobs, -blobs, -clob_files or -blob_files. See the db-api doc referenced below for more information.
- Switches:
- -dbn
(optional)- The database name to use. If empty_string, uses the default database.
- -subst
(defaults to"all"
) (optional)- Perform Tcl substitution in xql-files. Possible values: all, none, vars, commands
- Parameters:
- statement_name
sql
- See Also:
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- apm__test_info_file, db__transaction, db__transaction_bug_3440
Source code: ad_arg_parser { clobs blobs clob_files blob_files bind } $args set driverkey [db_driverkey $dbn] switch -- $driverkey { postgresql { set postgres_p 1 } oracle - nsodbc - default { set postgres_p 0 } } # Query Dispatcher (OpenACS - ben) set full_statement_name [db_qd_get_fullname $statement_name] # This "only one of..." check didn't exist in the PostgreSQL # version, but it shouldn't't hurt anything: --atp@piskorski.com, # 2003/04/08 06:19 EDT # Only one of clobs, blobs, clob_files, and blob_files is allowed. # Remember which one (if any) is provided: set lob_argc 0 set lob_argv [list] set command "dml" if { [info exists clobs] } { set command "clob_dml" set lob_argv $clobs incr lob_argc } if { [info exists blobs] } { set command "blob_dml" set lob_argv $blobs incr lob_argc } if { [info exists clob_files] } { set command "clob_dml_file" set lob_argv $clob_files incr lob_argc } if { [info exists blob_files] } { set command "blob_dml_file" set lob_argv $blob_files incr lob_argc } if { $lob_argc > 1 } { error "Only one of -clobs, -blobs, -clob_files, or -blob_files may be specified as an argument to db_dml" } if { ! $postgres_p } { # Oracle: db_with_handle -dbn $dbn db { if { $lob_argc == 1 } { # Bind :1, :2, ..., :n as LOBs (where n = [llength $lob_argv]) set bind_vars [list] for { set i 1 } { $i <= [llength $lob_argv] } { incr i } { lappend bind_vars $i } eval [list db_exec -subst $subst "${command}_bind" $db $full_statement_name $sql 2 $bind_vars] $lob_argv } else { eval [list db_exec -subst $subst $command $db $full_statement_name $sql] $lob_argv } } } elseif {$command eq "blob_dml_file"} { # PostgreSQL: db_with_handle -dbn $dbn db { # another ugly hack to avoid munging Tcl files. # __lob_id needs to be set inside of a query (.xql) file for this # to work. Say for example that you need to create a lob. In # Oracle, you would do something like: # db_dml update_photo "update foo set bar = empty_blob() # where bar = :bar # returning foo into :1" -blob_files [list $file] # for PostgreSQL we can do the equivalent by placing the following # in a query file: # update foo set bar = [set __lob_id [db_string get_id "select empty_lob()"]] # where bar = :bar # __lob_id acts as a flag that signals that blob_dml_file is # required, and it is also used to pass along the lob_id. It # is unsert afterwards to avoid name clashes with other invocations # of this routine. # (DanW - Openacs) db_exec -subst $subst dml $db $full_statement_name $sql if {[uplevel {info exists __lob_id}]} { ns_pg blob_dml_file $db [uplevel {set __lob_id}] $blob_files uplevel {unset __lob_id} } } } else { # PostgreSQL: db_with_handle -dbn $dbn db { db_exec -subst $subst dml $db $full_statement_name $sql } }XQL Not present: Generic, PostgreSQL, Oracle