rivet/packages/dio/dio_Oracle.tcl (208 lines of code) (raw):

# dio_Mysql.tcl -- Mysql backend. # Copyright 2006 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. # $Id: dio_Oracle.tcl 265421 2004-10-29 20:17:54Z karl $ package provide dio_Oracle 0.1 namespace eval DIO { ::itcl::class Oracle { inherit Database constructor {args} {eval configure $args} { if {[catch {package require Oratcl}]} { return -code error "No Oracle Tcl package available" } eval configure $args if {[::rivet::lempty $db]} { if {[::rivet::lempty $user]} { set user $::env(USER) } set db $user } } destructor { close } method open {} { set command "::oralogon" if {![::rivet::lempty $user]} { append command " $user" } if {![::rivet::lempty $pass]} { append command "/$pass" } if {![::rivet::lempty $host]} { append command "@$host" } if {![::rivet::lempty $port]} { append command -port $port } if {[catch $command error]} { return -code error $error } set conn $error if {![::rivet::lempty $db]} { # ??? mysqluse $conn $db } } method close {} { if {![info exists conn]} { return } catch {::oraclose $conn} unset conn } method exec {req} { if {![info exists conn]} { open } set _cur [::oraopen $conn] set cmd ::orasql set is_select 0 if {[::string tolower [lindex $req 0]] == "select"} { set cmd ::orasql set is_select 1 } set errorinfo "" #puts "ORA:$is_select:$req:<br>" if {[catch {$cmd $_cur $req} error]} { #puts "ORA:error:$error:<br>" set errorinfo $error catch {::oraclose $_cur} set obj [result $interface -error 1 -errorinfo [::list $error]] return $obj } if {[catch {::oracols $_cur name} fields]} { set fields "" } ::oracommit $conn set my_fields $fields set fields [::list] foreach field $my_fields { set field [::string tolower $field] lappend fields $field } set error [::oramsg $_cur rows] set res_cmd "result" lappend res_cmd $interface -resultid $_cur lappend res_cmd -numrows [::list $error] -fields [::list $fields] lappend res_cmd -fetch_first_row $is_select set obj [eval $res_cmd] if {!$is_select} { ::oraclose $_cur } return $obj } method lastkey {} { if {![info exists conn]} { return } return [mysqlinsertid $conn] } method quote {string} { regsub -all {'} $string {\'} string return $string } method sql_limit_syntax {limit {offset ""}} { # temporary return "" if {[::rivet::lempty $offset]} { return " LIMIT $limit" } return " LIMIT [expr $offset - 1],$limit" } method handle {} { if {![info exists conn]} { open } return $conn } method makeDBFieldValue {table_name field_name val {convert_to {}}} { if {[info exists specialFields(${table_name}@${field_name})]} { switch $specialFields(${table_name}@${field_name}) { DATE { set secs [clock scan $val] set my_val [clock format $secs -format {%Y-%m-%d}] return "to_date('$my_val', 'YYYY-MM-DD')" } DATETIME { set secs [clock scan $val] set my_val [clock format $secs -format {%Y-%m-%d %T}] return "to_date('$my_val', 'YYYY-MM-DD HH24:MI:SS')" } NOW { switch $convert_to { SECS { if {[::string compare $val "now"] == 0} { set secs [clock seconds] set my_val [clock format $secs -format {%Y%m%d%H%M%S}] return $my_val } else { return "($field_name - to_date('1970-01-01')) * 86400" #return "to_char($field_name, 'YYYYMMDDHH24MISS')" } } default { if {[::string compare $val "now"] == 0} { set secs [clock seconds] } else { set secs [clock scan $val] } set my_val [clock format $secs -format {%Y-%m-%d %T}] return "to_date('$my_val', 'YYYY-MM-DD HH24:MI:SS')" } } } default { # no special cod for that type!! return "'[quote $val]'" } } } else { return "'[quote $val]'" } } public variable db "" { if {[info exists conn]} { mysqluse $conn $db } } public variable interface "Oracle" private variable conn private variable _cur } ; ## ::itcl::class Mysql ::itcl::class OracleResult { inherit Result public variable fetch_first_row 0 private variable _data "" private variable _have_first_row 0 constructor {args} { eval configure $args if {$fetch_first_row} { if {[llength [nextrow]] == 0} { set _have_first_row 0 numrows 0 } else { set _have_first_row 1 numrows 1 } } set fetch_first_row 0 } destructor { if {[string length $resultid] > 0} { catch {::oraclose $resultid} } } method nextrow {} { if {[string length $resultid] == 0} { return [::list] } if {$_have_first_row} { set _have_first_row 0 return $_data } set ret [::orafetch $resultid -datavariable _data] switch $ret { 0 { return $_data } 1403 { ::oraclose $resultid set resultid "" return [::list] } default { # FIXME!! have to handle error here !! return [::list] } } } } ; ## ::itcl::class OracleResult }