bring in missing files ... this isn't very clean, but :(
This commit is contained in:
parent
80751a72ee
commit
7737dfd35a
@ -6,7 +6,7 @@
|
|||||||
# Copyright (c) 1994, Regents of the University of California
|
# Copyright (c) 1994, Regents of the University of California
|
||||||
#
|
#
|
||||||
# IDENTIFICATION
|
# 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 $
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -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
|
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
|
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
|
You will need a Tcl/Tk package, at least Tcl 7.6 and Tk 4.2, recommended
|
||||||
can manage your tables, edit them, define queries, sequences and
|
Tcl/Tk 8.x
|
||||||
functions.
|
|
||||||
|
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 ?
|
2. Usage
|
||||||
|
|
||||||
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?
|
|
||||||
|
|
||||||
You run it with the command:
|
You run it with the command:
|
||||||
|
|
||||||
wish -f pgaccess.tcl [database]
|
pgaccess [database]
|
||||||
|
|
||||||
[database] is optional.
|
[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.
|
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
|
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
|
"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
|
Some information about table structure, no. of fields, records would
|
||||||
be also good.
|
be also good.
|
||||||
|
|
||||||
|
250
src/bin/pgaccess/main.tcl
Normal file
250
src/bin/pgaccess/main.tcl
Normal 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
10
src/bin/pgaccess/pgaccess
Executable 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 "$@"
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user