|
|
# 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. |
|
|
|
|
|
}
|
|
|
|