136 lines
4.3 KiB
Tcl
136 lines
4.3 KiB
Tcl
# tdbcpostgres.tcl --
|
||
#
|
||
# Class definitions and Tcl-level methods for the tdbc::postgres bridge.
|
||
#
|
||
# Copyright (c) 2009 by Slawomir Cygan
|
||
#
|
||
# See the file "license.terms" for information on usage and redistribution
|
||
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||
#
|
||
#------------------------------------------------------------------------------
|
||
|
||
package require tdbc
|
||
|
||
::namespace eval ::tdbc::mypostgres {
|
||
|
||
namespace export connection datasources drivers
|
||
|
||
}
|
||
|
||
#------------------------------------------------------------------------------
|
||
#
|
||
# tdbc::postgres::connection --
|
||
#
|
||
# Class representing a connection to a Postgres database.
|
||
#
|
||
#-------------------------------------------------------------------------------
|
||
|
||
::oo::class create ::tdbc::postgres::connection {
|
||
|
||
superclass ::tdbc::connection
|
||
|
||
# The constructor is written in C. It takes alternating keywords
|
||
# and values pairs as its arguments. (See the manual page for the
|
||
# available options.)
|
||
|
||
# The 'statementCreate' method delegates to the constructor of the
|
||
# statement class
|
||
|
||
forward statementCreate ::tdbc::postgres::statement create
|
||
|
||
|
||
# The 'prepareCall' method gives a portable interface to prepare
|
||
# calls to stored procedures. It delegates to 'prepare' to do the
|
||
# actual work.
|
||
|
||
method preparecall {call} {
|
||
regexp {^[[:space:]]*(?:([A-Za-z_][A-Za-z_0-9]*)[[:space:]]*=)?(.*)} \
|
||
$call -> varName rest
|
||
if {$varName eq {}} {
|
||
my prepare \\{$rest\\}
|
||
} else {
|
||
my prepare \\{:$varName=$rest\\}
|
||
}
|
||
}
|
||
|
||
# The 'init', 'begintransaction', 'commit, 'rollback', 'tables'
|
||
# and 'columns' methods are implemented in C.
|
||
|
||
}
|
||
|
||
#------------------------------------------------------------------------------
|
||
#
|
||
# tdbc::postgres::statement --
|
||
#
|
||
# The class 'tdbc::postgres::statement' models one statement against a
|
||
# database accessed through a Postgres connection
|
||
#
|
||
#------------------------------------------------------------------------------
|
||
|
||
::oo::class create ::tdbc::postgres::statement {
|
||
|
||
superclass ::tdbc::statement
|
||
|
||
# The 'resultSetCreate' method forwards to the constructor of the
|
||
# result set.
|
||
|
||
forward resultSetCreate ::tdbc::postgres::resultset create
|
||
|
||
# Methods implemented in C:
|
||
#
|
||
# constructor connection SQLCode
|
||
# The constructor accepts the handle to the connection and the SQL code
|
||
# for the statement to prepare. It creates a subordinate namespace to
|
||
# hold the statement's active result sets, and then delegates to the
|
||
# 'init' method, written in C, to do the actual work of preparing the
|
||
# statement.
|
||
# params
|
||
# Returns descriptions of the parameters of a statement.
|
||
# paramtype paramname ?direction? type ?precision ?scale??
|
||
# Declares the type of a parameter in the statement
|
||
|
||
}
|
||
|
||
#------------------------------------------------------------------------------
|
||
#
|
||
# tdbc::postgres::resultset --
|
||
#
|
||
# The class 'tdbc::postgres::resultset' models the result set that is
|
||
# produced by executing a statement against a Postgres database.
|
||
#
|
||
#------------------------------------------------------------------------------
|
||
|
||
::oo::class create ::tdbc::postgres::resultset {
|
||
|
||
superclass ::tdbc::resultset
|
||
|
||
# The 'nextresults' method is stubbed out; tdbcpostgres does not
|
||
# allow a single call to return multiple results.
|
||
|
||
method nextresults {} {
|
||
while {[my nextdict rubbish]} {}
|
||
return 0
|
||
}
|
||
|
||
# Methods implemented in C include:
|
||
|
||
# constructor statement ?dictionary?
|
||
# -- Executes the statement against the database, optionally providing
|
||
# a dictionary of substituted parameters (default is to get params
|
||
# from variables in the caller's scope).
|
||
# columns
|
||
# -- Returns a list of the names of the columns in the result.
|
||
# nextdict
|
||
# -- Stores the next row of the result set in the given variable in
|
||
# the caller's scope as a dictionary whose keys are
|
||
# column names and whose values are column values, or else
|
||
# as a list of cells.
|
||
# nextlist
|
||
# -- Stores the next row of the result set in the given variable in
|
||
# the caller's scope as a list of cells.
|
||
# rowcount
|
||
# -- Returns a count of rows affected by the statement, or -1
|
||
# if the count of rows has not been determined.
|
||
|
||
}
|