rivet/packages/dio/dio_Tdbc.tcl (167 lines of code) (raw):

# dio_Tdbc.tcl -- Tdbc compatibility layer # # Copyright 2000-2005 The Apache Software Foundation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # DIO compatibility layer with Tdbc # # $Id$ # package provide dio_Tdbc 0.1 namespace eval DIO { ::itcl::class Tdbc { inherit Database private variable dbhandle public variable interface "Tdbc" private common conncnt 0 public variable backend "" { if {$backend == "mysql"} { package require tdbc::mysql } elseif {$backend == "postgres"} { package require tdbc::postgres } elseif {$backend == "sqlite3"} { package require tdbc::sqlite3 } elseif {$backend == "odbc"} { package require tdbc::odbc } elseif {$backend == ""} { return -code error "DIO Tdbc needs a backend be specified" } else { return -code error "backend '$backend' not supported" } } # -- destructor # # constructor {args} { eval configure $args } { if {[catch {package require tdbc}]} { return -code error "No Tdbc package available" } eval configure $args if {[lempty $db]} { if {[lempty $user]} { set user $::env(USER) } set db $user } } destructor { close } # --close # # we take inspiration from the DIO_Mysql class for handling # the basic connection data public method close {} { if {![info exists dbhandle]} { return } catch { $dbhandle close } unset dbhandle } # -- open # # Opening a connection with this class means that the member # variable specifying the backend was properly set # public method open {} { if {$backend == ""} { return -code error "no backend set" } set command [::list ::tdbc::${backend}::connection create tdbc[incr conncnt]] if {![lempty $user]} { lappend command -user $user } if {![lempty $pass]} { lappend command -password $pass } if {![lempty $port]} { lappend command -port $port } if {![lempty $host]} { lappend command -host $host } if {![lempty $db]} { lappend command -database $db } if {[catch { set dbhandle [eval $command] } e]} { return -code error $e } return -code ok } # -- exec # # sql code central method. A statement object # is created from the sql string and then executed # public method exec {sql} { if {![info exists dbhandle]} { $this open } set sqlstat [$dbhandle prepare $sql] if {[catch {set res [$sqlstat execute]} err]} { set obj [result Tdbc -error 1 -errorinfo $err] } else { set obj [result Tdbc -resultid $res \ -sqlstatement $sqlstat \ -numrows [$res rowcount] \ -fields [::list [$res columns]]] } #$res nextlist cols #puts "rows: [$res rowcount]" #puts "cols: $cols" return $obj } # -- execute # # extended version of the standard DIO method exec that # makes room for an extra argument storing the dictionary # of variables to be substituted in the SQL statement # public method execute {sql {substitute_d ""}} { if {![info exists dbhandle]} { $this open } set sqlstat [$dbhandle prepare $sql] if {$substitute_d != ""} { set cmd [list $sqlstat execute $substitude_d] } else { set cmd [list $sqlstat execute] } if {[catch {set res [eval $cmd]} err} { set obj [result Tdbc -error 1 -errorinfo $err] } else { set obj [result Tdbc -resultid $res \ -numrows [$res rowcount] \ -fields [$res columns]] } $sqlstat close return $obj } # -- handle # # accessor to the internal connection handle. # public method handle {} { return $dbhandle } } # # -- Class TdbcResult # # Class wrapping a Tdbc resultset object and adapting it # to the DIO Results interface # ::itcl::class TdbcResult { inherit Result public variable sqlstatement constructor {args} { eval configure $args } destructor { catch {$sqlstatement close} } # -- nextrow # # Returns the list of values selected by a SQL command. # Values appear in the list with the same order of # the columns names returned by the 'columns' object command # public method nextrow {} { $resultid nextlist v return $v } } }