#!/usr/local/bin/wishx # pubs_pix # # Copyright 1992 Tom Poindexter. # # add/update images in pubs database, allow viewing with user defined viewer # uses extended tcl, tk, and sybtcl interface # # if you get failures on add or update, first check if you have insert # and update permissions; other possible failures are log segment full, # or no space in database to load new images. # # usage: pubs_pix # # define global names in use global sybmsg global uid global syb global server set uid [id user] set syb {} # added for sybtcl 1.2 - sybmsg(maxtext) is now needed for sybreadtext set sybmsg(maxtext) 2147483647 wm title . "Pubs Pix" wm iconname . "Pubs Pix" proc getSignOn {} { global uid global env wm geom . 300x300 frame .s message .s.m -justify center -text "Pubs Sign on" -aspect 2000 \ -font -*-helvetica-bold-o-*-*-20-*-*-*-*-*-*-* frame .s.i entry .s.i.uid -relief sunken -width 10 label .s.i.id -text " User Id" -anchor e frame .s.p entry .s.p.pw -relief sunken -width 10 \ -font -*-symbol-*-r-*--20-*-*-*-*-*-*-* label .s.p.p -text " Password" -anchor e frame .s.s entry .s.s.ser -relief sunken -width 10 label .s.s.s -text " Server" -anchor e message .s.err -text "" -justify center frame .s.b button .s.b.ok -text "Sign on" \ -command {tryConnect [.s.i.uid get] [.s.p.pw get] [.s.s.ser get]} button .s.b.can -text "Cancel" -command "destroy ." pack append . .s {top fill expand} pack append .s .s.m {top fillx pady 20} pack append .s .s.i {top pady 20 frame e} pack append .s.i .s.i.uid {right expand padx 20} .s.i.id {left} pack append .s .s.p {top pady 20 frame e} pack append .s.p .s.p.pw {right expand padx 20} .s.p.p {left} pack append .s .s.err {top fillx expand} pack append .s .s.b {bottom fillx } pack append .s.b .s.b.ok {left fillx expand} .s.b.can {left fillx expand} pack append .s .s.s {bottom pady 20 frame e} pack append .s.s .s.s.ser {right expand padx 20} .s.s.s {left} .s.i.uid insert 0 $uid if {[lsearch [array names env] DSQUERY] >= 0} { .s.s.ser insert 0 $env(DSQUERY) } else { .s.s.ser insert 0 SYBASE } focus .s.p.pw bind .s.i.uid "focus .s.p.pw" bind .s.p.pw ".s.b.ok invoke" bind .s.s.ser ".s.b.ok invoke" } # kick off the entire process getSignOn ############################################################################ # all procs follow ######################## # # tryConnect # # try a connection to the sybase server # proc tryConnect {id pw ser} { global sybmsg global syb global server set server $ser set retcode [catch {set syb [sybconnect $id $pw $ser]}] if $retcode==0 { destroy .s set retcode [catch {sybuse $syb pubs2} ] if $retcode==0 { createMain } else { echo "can't use pubs2 database in $ser. bye now." sybclose $syb exit } } else { .s.err configure -text $sybmsg(dberrstr) focus .s.p.pw } } ######################## # # createMain # # create the main window # proc createMain {} { global syb global sybmsg wm geom . 850x400 # create a top level frame frame .m -relief flat pack append . .m {top fill expand} # create a menu bar with some menu buttons frame .m.mb -relief raised -borderwidth 2 button .m.mb.add -text "Add Image" -command addImage -width 13 button .m.mb.up -text "Update Image" -command updateImage -width 13 button .m.mb.view -text "View Image" -command viewImage -width 13 button .m.mb.quit -text "Quit" -command "sybclose $syb; destroy ." -width 13 pack append .m .m.mb {top fillx} pack append .m.mb .m.mb.add {left} .m.mb.up {left} .m.mb.view {left} \ .m.mb.quit {left} # create a frame for entry boxes frame .m.e -relief flat label .m.e.l1 -text "Key:" -anchor e -width 4 entry .m.e.key -relief sunken -width 15 label .m.e.l2 -text "Image file:" -anchor e -width 9 entry .m.e.file -relief sunken -width 15 label .m.e.l3 -text "Type:" -anchor e -width 5 entry .m.e.type -relief sunken -width 15 label .m.e.l4 -text "View Cmd:" -anchor e -width 9 entry .m.e.cmd -relief sunken -width 25 pack append .m .m.e {top fillx} pack append .m.e .m.e.l1 {left} .m.e.key {left} .m.e.l2 {left} \ .m.e.file {left} .m.e.l3 {left} .m.e.type {left} \ .m.e.l4 {left} .m.e.cmd {left} message .m.m -aspect 3000 -relief raised -borderwidth 3 -text \ "Pubs Pix - Instructions\n\n\ Add Image - enter a Key, a File name, and Image Type; press Add\n\ Update Image - enter a Key, a File name, and Image Type; press Update\n\ View Image - enter a Key and Viewer Command; press View\n\n\ Double Click with button 1 on a list entry to\n\ populate Key, Type, and a default Viewer Command.\n\ Viewer Command must expect it's input on stdin." pack append .m .m.m {top fillx} # create a frame listing keys & types frame .m.o -relief raised pack append .m .m.o {top fill expand} label .m.o.l -text " Keys and Types " -relief raised -borderwidth 2 scrollbar .m.o.vert -relief sunken -command ".m.o.out yview" \ -orient vertical listbox .m.o.out -relief sunken \ -font -*-courier-*-r-*-*-14-*-*-*-*-*-*-* \ -yscroll ".m.o.vert set" -selectmode single bind .m.o.out \ "popKeyType \[selection get\] " pack append .m.o .m.o.l {top fillx} pack append .m.o .m.o.vert {right filly} pack append .m.o .m.o.out {left fill expand} # create a message at the bottom label .m.msg -text "" -width 40 -relief sunken \ -font -*-helvetica-bold-o-*-*-17-*-*-*-*-*-*-* pack append .m .m.msg {bottom fillx} .m.msg configure -text "At your service....." popKeys } ######################## # # setMsg # # set the text for the label at bottom of results window # proc setMsg {msg_text} { .m.msg configure -text $msg_text update } ######################## # # popKeyType # # populate the key and type entries # proc popKeyType {pick} { global syb global sybmsg set line [lindex $pick 0] set key [lindex $line 0] set type [lrange $pick 1 end] .m.e.key delete 0 end .m.e.key insert 0 $key .m.e.type delete 0 end .m.e.type insert 0 $type set viewer [switch -glob $type { {Sun*} {format " xv -"} {PICT*} {format " picttoppm | xv -"} {GIF} {format " xv -"} {TIF*} {format " xv -"} {Text} {format " more"} {default} {format " yourviewer"} }] .m.e.cmd delete 0 end .m.e.cmd insert 0 $viewer } ######################## # # popKeys # # populate the keys and types listbox # proc popKeys {} { global syb global sybmsg .m.o.out delete 0 end sybsql $syb "select au_id, format_type from au_pix order by au_id" set row [sybnext $syb] while {[string compare $sybmsg(nextrow) REG_ROW] == 0} { .m.o.out insert end "[lindex $row 0] [lindex $row 1] " set row [sybnext $syb] } } ######################## # # addImage # # add an image to the pubs au_pics # proc addImage {} { global syb global sybmsg set f [.m.e.file get] set key [.m.e.key get] set t [.m.e.type get] if {[string length $key] == 0} { setMsg "key must be entered" return } if {![file isfile $f]} { setMsg "File $f not found" return } sybsql $syb "select au_id from au_pix where au_id ='$key'" if {[string compare $sybmsg(nextrow) REG_ROW] == 0} { setMsg "Key $key already exists" return } # all's fine, add the image sybsql $syb "insert into au_pix(au_id,format_type) values('$key','$t')" sybsql $syb "update au_pix set pic = null where au_id = '$key'" sybsql $syb "select pic from au_pix where au_id = 'key'" set fsize [sybwritetext $syb au_pix.pic 1 $f] setMsg "$fsize bytes stored" popKeys } ######################## # # updateImage # # add and image to the pubs au_pics # proc updateImage {} { global syb global sybmsg set f [.m.e.file get] set key [.m.e.key get] set t [.m.e.type get] if {[string length $key] == 0} { setMsg "key must be entered" return } if {![file isfile $f]} { setMsg "File $f not found" return } sybsql $syb "update au_pix set format_type = '$t' where au_id ='$key'" sybsql $syb "select au_id from au_pix where au_id ='$key'" if {[string compare $sybmsg(nextrow) REG_ROW] != 0} { setMsg "Key $key not found" return } # all's fine, rewrite the image sybsql $syb "select pic from au_pix where au_id = '$key'" set fsize [sybwritetext $syb au_pix.pic 1 $f] setMsg "$fsize bytes stored" popKeys } ######################## # # viewImage # # extract and view an image # proc viewImage {} { global syb global sybmsg set key [.m.e.key get] set view [.m.e.cmd get] set tmp /tmp/[id user].[id process] sybsql $syb "select pic from au_pix where au_id = '$key'" set bytes [sybreadtext $syb $tmp] setMsg "$bytes selected from au_pix" system "cat $tmp | $view" unlink -nocomplain $tmp }