# # NeoScript - Server Side Programming based on Safe Tcl # # Copyright (C) 1997 NeoSoft, All Rights Reserved. See NeoWebScript LICENSE # files with this distribution for conditions on use and redistribution. # # Helpful routines for interfacing with Postgres. # # $Id: postgres.tcl,v 1.4 1997/09/25 20:49:47 kunkee Exp $ # # # Configuration directives for this version of postgres.tcl (intended for # Posgresql6.0, but might work for earlier versions. # # The following directives go in httpd.conf: # NeoWebServerConf HavePostgres 1 # There really is a postgres around somewhere # NeoWebServerConf PostgresLib /usr/local/pgsql/lib/libpgtcl.so.1 # Or wherever it is. If staticly bound, and Tcl_StaticPackage # is called correctly, you can use "" instead of the path. # NeoWebServerConf PostgresPkg Pgtcl # The name of the package to be loaded. The old version was "Pg", # and the new version is "Pgtcl". # NeoWebServerConf PostgresHost localhost # Optional: Use this directive if you want to specify a default host for # connections. Localhost is the default. # NeoWebServerConf PostgresPort 5432 # Optional: Use this directive if you want to specify a default port for # connections. 5432 is the default. # # To specify a directory which is to automatically have the pg_* commands # in access.conf: # NeoWebDirConf Postgres [Any | Yes] # "Any" means that any database name may be specified. Otherwise # pg_connect is replaced with an alias that forces the user's database # names to always be prefixed by the web page owner name. For example, # if user 'sam' owns the .html file executing "pg_connect mydb", the # database name is forced to become "sam__mydb". set sqllog [open $server(SERVER_ROOT)/logs/sql_log "WRONLY APPEND CREAT"] if [info exists NeoWebServerConf(PostgresPort)] { set env(PGPORT) $NeoWebServerConf(PostgresPort) } if [info exists NeoWebServerConf(PostgresHost)] { set env(PGHOST) $NeoWebServerConf(PostgresHost) } load $NeoWebServerConf(PostgresLib) $NeoWebServerConf(PostgresPkg) proc postgres_setup {safeInterp} { global NeoWebDirConf NeoWebServerConf if ![info exists NeoWebDirConf(Postgres)] return load $NeoWebServerConf(PostgresLib) $NeoWebServerConf(PostgresPkg) $safeInterp if {$NeoWebDirConf(Postgres) != "Any"} { $safeInterp alias pg_connect SAFE_pg_connect $safeInterp $safeInterp alias pg_createdb SAFE_pg_createdb $safeInterp alias pg_log pg_log $safeInterp eval { rename pg_exec __pg_exec proc pg_exec args { set start [clock seconds] set err [catch {eval __pg_exec $args} result] set duration [expr [clock seconds] - $start] if $err { global errorInfo return -code error -errorinfo $errorInfo $result } catch {pg_log "$duration $args"} return $result } } } } proc pg_log params { global sqllog webenv regsub {^/usr/ftp/(\./)?pub/users/[a-z]/} $webenv(SCRIPT_FILENAME) ~ path puts $sqllog "[clock format [clock seconds] -format "%D %T"] \ $webenv(REMOTE_ADDR) $params $path" flush $sqllog } proc SAFE_pg_connect {safeInterp {databaseName {}} args} { global webpageOwnerName NeoWebServerConf NeoWebDirConf setup_data_access if {[lempty $databaseName] || $databaseName == $webpageOwnerName} { set databaseName $webpageOwnerName } else { set databaseName ${webpageOwnerName}__${databaseName} } if [info exists NeoWebDirConf(PostgresArgs)] { array set options $NeoWebDirConf(PostgresArgs) } set options(-host) $NeoWebServerConf(PostgresHost) set options(-port) $NeoWebServerConf(PostgresPort) array set options $args if {$options(-host) == "localhost"} { set options(-host) $NeoWebServerConf(PostgresHost) set options(-port) $NeoWebServerConf(PostgresPort) } set pgp_handle [eval pg_connect $databaseName [array get options]] pg_log "pg_connect $databaseName" if {$NeoWebServerConf(PostgresPkg) == "Pgtcl"} { interp transfer {} $pgp_handle $safeInterp return $pgp_handle } else { return [pg_handle $safeInterp $pgp_handle] } } proc SAFE_pg_createdb {{databaseName {}}} { global webpageOwnerName setup_data_access if {[lempty $databaseName] || $databaseName == $webpageOwnerName} { set databaseName $webpageOwnerName } else { set databaseName ${webpageOwnerName}__${databaseName} } set sql_command "create database $databaseName;" set postgresFP [pg_connect template1] set result [pg_exec $postgresFP $sql_command] pg_disconnect $postgresFP pg_result $result -clear return }