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

# dio_Oracle.tcl -- Oracle (odbc) backend. # Copyright 2006-2024 The Apache Software Foundation # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you 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. package require DIO 1.2 package provide dio_Oracle 1.2 namespace eval DIO { ::itcl::class Oracle { inherit Database constructor {args} {eval configure -interface Oracle $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]} {:b 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 } 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 }