Class ::nsmcp::DatabaseSession

::nsmcp::DatabaseSession[i] create ... \
           [ -handle:required handle:required ] \
           [ -inTransaction inTransaction ] \
           [ -templates templates ]

Defined in /usr/local/ns/tcl/nsmcp/lib/database.tcl

Class Relations

  • class: ::nx::Class[i]
  • superclass: ::nx::Object[i]
::nx::Class create ::nsmcp::DatabaseSession \
     -superclass ::nx::Object

Methods (to be applied on instances)

  • changes (scripted, public)

     <instance of nsmcp::DatabaseSession[i]> changes

    Testcases:
    No testcase defined.
    return [:scalar {SELECT changes()}]
  • close (scripted, public)

     <instance of nsmcp::DatabaseSession[i]> close

    Testcases:
    No testcase defined.
    :destroy
  • execute (scripted, public)

     <instance of nsmcp::DatabaseSession[i]> execute sql [ arrayName ] \
        [ script ]
    Parameters:
    sql (required)
    arrayName (optional)
    script (optional)

    Testcases:
    No testcase defined.
    set rows {}
    foreach template [:compile $sql] {
        set statement {}
        foreach {type value} $template {
            if {$type eq "literal"} {append statement $value} elseif {[uplevel 1 [list info exists $value]]} {
                append statement [:quote [uplevel 1 [list set $value]]]
            } else {append statement NULL}
        }
        if {[string trim $statement] eq ""} continue
        set kind [ns_db exec ${:handle} $statement]
        set command [string toupper [lindex [split [string trim $statement]] 0]]
        if {$command eq "BEGIN"} {set :inTransaction true}
        if {$command in {COMMIT ROLLBACK END}} {set :inTransaction false}
        if {$kind ne "NS_ROWS"} continue
        set row [ns_db bindrow ${:handle}]
        try {
            while {[ns_db getrow ${:handle} $row]} {
                set record {}; set keys {}
                for {set i 0} {$i<[ns_set size $row]} {incr i} {
                    set key [ns_set key $row $i]
                    dict set record $key [ns_set value $row $i]; lappend keys $key
                }
                if {$arrayName eq ""} {lappend rows $record} else {
                    upvar 1 $arrayName target
                    array unset target
                    dict for {key value} $record {set target($key) $value}
                    set target(*) $keys
                    set code [catch {uplevel 1 $script} value options]
                    if {$code==3} break
                    if {$code==4} continue
                    if {$code} {return -options $options $value}
                }
            }
        } finally {ns_db flush ${:handle}; ns_set free $row}
    }
    return $rows
  • quote (scripted, public)

     <instance of nsmcp::DatabaseSession[i]> quote value
    Parameters:
    value (required)

    Testcases:
    No testcase defined.
    if {[string first \x00 $value]>=0} {
        return "CAST(X'[binary encode hex [encoding convertto utf-8 $value]]' AS TEXT)"
    }
    return "'[string map [list ' ''] $value]'"
  • scalar (scripted, public)

     <instance of nsmcp::DatabaseSession[i]> scalar sql
    Parameters:
    sql (required)

    Testcases:
    No testcase defined.
    set rows [uplevel 1 [list [nsf::current object] execute $sql]]
    if {$rows eq ""} {return {}}
    return [lindex [dict values [lindex $rows 0]] 0]
  • transaction (scripted, public)

     <instance of nsmcp::DatabaseSession[i]> transaction script
    Parameters:
    script (required)

    Testcases:
    No testcase defined.
    :execute {BEGIN IMMEDIATE}
    try {
        set value [uplevel 1 $script]
        :execute COMMIT
        return $value
    } on error {message options} {
        catch {:execute ROLLBACK}
        return -options $options $message
    }