bring in missing files ... this isn't very clean, but :(

This commit is contained in:
Marc G. Fournier 1999-09-20 22:28:11 +00:00
parent 80751a72ee
commit 7737dfd35a
4 changed files with 285 additions and 110 deletions

View File

@ -6,7 +6,7 @@
# Copyright (c) 1994, Regents of the University of California
#
# IDENTIFICATION
# $Header: /cvsroot/pgsql/src/bin/pgaccess/Attic/Makefile,v 1.1 1998/12/18 17:54:42 momjian Exp $
# $Header: /cvsroot/pgsql/src/bin/pgaccess/Attic/Makefile,v 1.2 1999/09/20 22:28:11 scrappy Exp $
#
#-------------------------------------------------------------------------

View File

@ -22,7 +22,7 @@ PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
---------------------------------------------------------------------------
PGACCESS 0.96 9 March 1999
PGACCESS 0.98 29 August 1999
================================
I dedicate this program to my little daughters Ana-Maria and Emilia and to my
wife for their understanding. I hope they will forgive me for spending so many
@ -30,130 +30,45 @@ time far from them.
1.Why PgAccess ?
1. How to INSTALL ?
First of all because PostgreSQL lacks a graphical interface where you
can manage your tables, edit them, define queries, sequences and
functions.
You will need a Tcl/Tk package, at least Tcl 7.6 and Tk 4.2, recommended
Tcl/Tk 8.x
For Unix users, unpack the pgaccess-xxx.tar.gz archieve in you preferred
directory (usually /usr/local).
Check where your "wish" program is and modify (if needed) the file
/usr/local/pgaccess/pgaccess and set variables PGACCESS_HOME and
PATH_TO_WISH to the appropriate directories.
Include the /usr/local/pgaccess directory into your PATH or make a
symbolic link to it wherever you want (in PATH directories).
Example:
$ ln -s /usr/local/pgaccess/pgaccess /usr/bin/pgaccess
You will find also some documentation and FAQ in the doc directory.
2.How to INSTALL ?
You will need Tcl/Tk package, I am using now Tcl 7.6 and Tk 4.2.
PgAccess is running fine also on Tcl/Tk 8.0
Also, you will need the PostgreSQL to Tcl interface library, lined as a
Tcl/Tk 'load'-able module. It is called libpgtcl and the source is
located in the PostgreSQL directory /src/interfaces/libpgtcl.
Specifically, you will need a libpgtcl library that is 'load'-able from
Tcl/Tk. This is technically different from an ordinary PostgreSQL
loadable object file, because libpgtcl is a collection of object files.
Under Linux, this is called libpgtcl.so. You will find a pre-compiled
copy of it for Linux i386 systems at : http://www.flex.ro/pgaccess.
Just copy libpgtcl.so into your system library directory /usr/lib or
/lib and go for it.
Under Windows, copy libpgtcl.dll and libpq.dll into C:\WINDOWS\SYSTEM directory.
Make sure you have Tcl/Tk at least version 8.0.0 for Microsoft Windows 95 & NT.
PgAccess has been checked with Tcl/Tk 8.0.4 version on Windows95 and Windows98
platforms.
Tcl/Tk 8.0.4 for Windows95 & NT can be downloaded from
ftp://ftp.scriptics.com/pub/tcl/tcl8_0/tcl804.exe
It is 1833712 bytes long.
3.How to run it?
2. Usage
You run it with the command:
wish -f pgaccess.tcl [database]
pgaccess [database]
[database] is optional.
Another way of loading the PostgreSQL library is running it with pgwish.
It's a wish compiled with libpgtcl library so it could understand the
commands for working with PostgreSQL. For this, remove the line "load
libpgtcl.so" from the source. If your operating system has a different
library name or location, change the 'load libpgtcl.so' line in the
pgaccess.tcl file.
4.What does it now ?
3. Bug reporting
- Opens any database on a specified host at the specified port, username and password
- Perform vacuum command.
- Saves preferences in ~/.pgaccessrc file
Tables
- opening multiple tables for viewing, max n records (configurable)
- column resizing by dragging the vertical grid lines
- text will wrap in cells now
- dynamic row height when editing
- table layout saved for every table
- import/export to external files (SDF,CSV)
- filter capabilities ,enter filter like price>3.14
- sort order capabilities ,enter manually the sort field(s)
- editing in place, double click the text you want to change
- record deleting , point the record, press Del key
- adding new records ,save new row with right-button-click on table for the moment
- table generator assistant
- table renaming and deleting (dropping)
- table information retrieving : owner, field information, indexes
Queries
- define, edit and store "user defined queries"
- save view layout
- can store queries as views
- execution of queries with optional user input parameters ( select * from invoices where year=[parameter "Year of selection"] )
- viewing of select type queries result
- running action queries (insert, update, delete)
- visual query builder with drag & drop support, table aliasing
Sequences
- define
- inspect
- delete
Views
- defining them saving queries as views
- view them , with filtering and sorting capabilities
- design views
- delete them
Functions
- define , inspect , delete
Reports
- simple reports from a table (beta stage)
- change font,size and style of fields and labels
- load and save reports from the database
- table previews, sample postscript print
Forms
- open user defined forms
- form design module available
- query widget allowing access to a record set
Scripts
- define, modify and call user defined scripts
5.What it should do in the future ?
- sequence and function renaming
- more powerful report generator and viewer
- help on line
6. How you should report the errors?
First of all : operating system, PostgreSQL version,Tcl/Tk version.
A more detailed story of what have you done when error had occurred.
A more detailed story of what have you done when error occurred.
Tcl/Tk stops usually with a error message and there is a button there
"Stack Trace" and if you press it, you will see a detailed information
about the place where it stuck. Please send it to me.
about the procedure containing the error. Please send it to me.
Some information about table structure, no. of fields, records would
be also good.

250
src/bin/pgaccess/main.tcl Normal file
View File

@ -0,0 +1,250 @@
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
image create bitmap dnarw -data {
#define down_arrow_width 15
#define down_arrow_height 15
static char down_arrow_bits[] = {
0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,
0x00,0x80,0xf8,0x8f,0xf0,0x87,0xe0,0x83,
0xc0,0x81,0x80,0x80,0x00,0x80,0x00,0x80,
0x00,0x80,0x00,0x80,0x00,0x80
}
}
proc {intlmsg} {msg} {
global PgAcVar Messages
if {$PgAcVar(pref,language)=="english"} { return $msg }
if { ! [array exists Messages] } { return $msg }
if { ! [info exists Messages($msg)] } { return $msg }
return $Messages($msg)
}
proc {PgAcVar:clean} {prefix} {
global PgAcVar
foreach key [array names PgAcVar $prefix] {
set PgAcVar($key) {}
unset PgAcVar($key)
}
}
proc {find_PGACCESS_HOME} {} {
global PgAcVar env
if {! [info exists env(PGACCESS_HOME)]} {
set home [file dirname [info script]]
switch [file pathtype $home] {
absolute {set env(PGACCESS_HOME) $home}
relative {set env(PGACCESS_HOME) [file join [pwd] $home]}
volumerelative {
set curdir [pwd]
cd $home
set env(PGACCESS_HOME) [file join [pwd] [file dirname [file join [lrange [file split $home] 1 end]]]]
cd $curdir
}
}
}
if {![file isdir $env(PGACCESS_HOME)]} {
set PgAcVar(PGACCESS_HOME) [pwd]
} else {
set PgAcVar(PGACCESS_HOME) $env(PGACCESS_HOME)
}
}
proc init {argc argv} {
global PgAcVar CurrentDB
find_PGACCESS_HOME
# Loading all defined namespaces
foreach module {mainlib database tables queries visualqb forms views functions reports scripts users sequences schema help preferences} {
source [file join $PgAcVar(PGACCESS_HOME) lib $module.tcl]
}
set PgAcVar(currentdb,host) localhost
set PgAcVar(currentdb,pgport) 5432
set CurrentDB {}
set PgAcVar(tablist) [list Tables Queries Views Sequences Functions Reports Forms Scripts Users Schema]
set PgAcVar(activetab) {}
set PgAcVar(query,tables) {}
set PgAcVar(query,links) {}
set PgAcVar(query,results) {}
set PgAcVar(mwcount) 0
Preferences::load
}
proc {wpg_exec} {db cmd} {
global PgAcVar
set PgAcVar(pgsql,cmd) "never executed"
set PgAcVar(pgsql,status) "no status yet"
set PgAcVar(pgsql,errmsg) "no error message yet"
if {[catch {
Mainlib::sqlw_display $cmd
set PgAcVar(pgsql,cmd) $cmd
set PgAcVar(pgsql,res) [pg_exec $db $cmd]
set PgAcVar(pgsql,status) [pg_result $PgAcVar(pgsql,res) -status]
set PgAcVar(pgsql,errmsg) [pg_result $PgAcVar(pgsql,res) -error]
} tclerrmsg]} {
showError [format [intlmsg "Tcl error executing pg_exec %s\n\n%s"] $cmd $tclerrmsg]
return 0
}
return $PgAcVar(pgsql,res)
}
proc {wpg_select} {args} {
Mainlib::sqlw_display "[lindex $args 1]"
uplevel pg_select $args
}
proc {create_drop_down} {base x y w} {
global PgAcVar
if {[winfo exists $base.ddf]} return;
frame $base.ddf -borderwidth 1 -height 75 -relief raised -width 55
listbox $base.ddf.lb -background #fefefe -foreground #000000 -selectbackground #c3c3c3 -borderwidth 1 -font $PgAcVar(pref,font_normal) -highlightthickness 0 -selectborderwidth 0 -yscrollcommand [subst {$base.ddf.sb set}]
scrollbar $base.ddf.sb -borderwidth 1 -command [subst {$base.ddf.lb yview}] -highlightthickness 0 -orient vert
place $base.ddf -x $x -y $y -width $w -height 185 -anchor nw -bordermode ignore
place $base.ddf.lb -x 1 -y 1 -width [expr $w-18] -height 182 -anchor nw -bordermode ignore
place $base.ddf.sb -x [expr $w-15] -y 1 -width 14 -height 183 -anchor nw -bordermode ignore
}
proc {setCursor} {{type NORMAL}} {
if {[lsearch -exact "CLOCK WAIT WATCH" [string toupper $type]] != -1} {
set type watch
} else {
set type left_ptr
}
foreach wn [winfo children .] {
catch {$wn configure -cursor $type}
}
update ; update idletasks
}
proc {parameter} {msg} {
global PgAcVar
Window show .pgaw:GetParameter
focus .pgaw:GetParameter.e1
set PgAcVar(getqueryparam,var) ""
set PgAcVar(getqueryparam,flag) 0
set PgAcVar(getqueryparam,msg) $msg
bind .pgaw:GetParameter <Destroy> "set PgAcVar(getqueryparam,flag) 1"
grab .pgaw:GetParameter
tkwait variable PgAcVar(getqueryparam,flag)
if {$PgAcVar(getqueryparam,result)} {
return $PgAcVar(getqueryparam,var)
} else {
return ""
}
}
proc {showError} {emsg} {
bell ; tk_messageBox -title [intlmsg Error] -icon error -message $emsg
}
proc {sql_exec} {how cmd} {
global PgAcVar CurrentDB
if {[set pgr [wpg_exec $CurrentDB $cmd]]==0} {
return 0
}
if {($PgAcVar(pgsql,status)=="PGRES_COMMAND_OK") || ($PgAcVar(pgsql,status)=="PGRES_TUPLES_OK")} {
pg_result $pgr -clear
return 1
}
if {$how != "quiet"} {
showError [format [intlmsg "Error executing query\n\n%s\n\nPostgreSQL error message:\n%s\nPostgreSQL status:%s"] $cmd $PgAcVar(pgsql,errmsg) $PgAcVar(pgsql,status)]
}
pg_result $pgr -clear
return 0
}
proc {main} {argc argv} {
global PgAcVar CurrentDB tcl_platform
load libpgtcl[info sharedlibextension]
catch {Mainlib::draw_tabs}
set PgAcVar(opendb,username) {}
set PgAcVar(opendb,password) {}
if {$argc>0} {
set PgAcVar(opendb,dbname) [lindex $argv 0]
set PgAcVar(opendb,host) localhost
set PgAcVar(opendb,pgport) 5432
Mainlib::open_database
} elseif {$PgAcVar(pref,autoload) && ($PgAcVar(pref,lastdb)!="")} {
set PgAcVar(opendb,dbname) $PgAcVar(pref,lastdb)
set PgAcVar(opendb,host) $PgAcVar(pref,lasthost)
set PgAcVar(opendb,pgport) $PgAcVar(pref,lastport)
catch {set PgAcVar(opendb,username) $PgAcVar(pref,lastusername)}
if {[set openmsg [Mainlib::open_database]]!=""} {
if {[regexp "no password supplied" $openmsg]} {
Window show .pgaw:OpenDB
focus .pgaw:OpenDB.f1.e5
wm transient .pgaw:OpenDB .pgaw:Main
}
}
}
wm protocol .pgaw:Main WM_DELETE_WINDOW {
catch {pg_disconnect $CurrentDB}
exit
}
}
proc {Window} {args} {
global vTcl
set cmd [lindex $args 0]
set name [lindex $args 1]
set newname [lindex $args 2]
set rest [lrange $args 3 end]
if {$name == "" || $cmd == ""} {return}
if {$newname == ""} {
set newname $name
}
set exists [winfo exists $newname]
switch $cmd {
show {
if {$exists == "1" && $name != "."} {wm deiconify $name; return}
if {[info procs vTclWindow(pre)$name] != ""} {
eval "vTclWindow(pre)$name $newname $rest"
}
if {[info procs vTclWindow$name] != ""} {
eval "vTclWindow$name $newname $rest"
}
if {[info procs vTclWindow(post)$name] != ""} {
eval "vTclWindow(post)$name $newname $rest"
}
}
hide { if $exists {wm withdraw $newname; return} }
iconify { if $exists {wm iconify $newname; return} }
destroy { if $exists {destroy $newname; return} }
}
}
proc vTclWindow. {base} {
if {$base == ""} {
set base .
}
wm focusmodel $base passive
wm geometry $base 1x1+0+0
wm maxsize $base 1009 738
wm minsize $base 1 1
wm overrideredirect $base 0
wm resizable $base 1 1
wm withdraw $base
wm title $base "vt.tcl"
}
init $argc $argv
Window show .
Window show .pgaw:Main
main $argc $argv

10
src/bin/pgaccess/pgaccess Executable file
View File

@ -0,0 +1,10 @@
#!/bin/sh
PATH_TO_WISH=/usr/bin/wish
PGACCESS_HOME=/usr/local/pgaccess
export PATH_TO_WISH
export PGACCESS_HOME
exec ${PATH_TO_WISH} ${PGACCESS_HOME}/main.tcl "$@"