wpg_select $CurrentDB "select c.relname,count(c.relname) from pg_class C, pg_rewrite R where (r.ev_class = C.oid) and (r.ev_type = '1') group by relname" rec {
if {$rec(count)!=0}{
set itsaview($rec(relname)) 1
}
}
if {! $PgAcVar(pref,systemtables)}{
wpg_select $CurrentDB "select relname from pg_class where (relname !~ '^pg_') and (relkind='r') order by relname" rec {
if {![regexp "^pga_" $rec(relname)]} then {
if {![info exists itsaview($rec(relname))]}{
lappend tlist $rec(relname)
}
}
}
} else {
wpg_select $CurrentDB "select relname from pg_class where (relkind='r') order by relname" rec {
if {![info exists itsaview($rec(relname))]}{
lappend tlist $rec(relname)
}
}
}
} gterrmsg]}{
showError $gterrmsg
}
return $tlist
}
proc {vacuum}{}{
global PgAcVar CurrentDB
if {$CurrentDB==""} return;
set PgAcVar(statusline,dbname)[format [intlmsg "vacuuming database %s ..."] $PgAcVar(currentdb,dbname)]
setCursor CLOCK
set pgres [wpg_exec $CurrentDB "vacuum;"]
catch {pg_result $pgres -clear}
setCursor DEFAULT
set PgAcVar(statusline,dbname) $PgAcVar(currentdb,dbname)
}
proc {getPgType}{oid}{
global CurrentDB
set temp "unknown"
wpg_select $CurrentDB "select typname from pg_type where oid=$oid" rec {
if {[catch {wm geometry .pgaw:FormDesign:draft $PgAcVar(fdvar,c_width)x$PgAcVar(fdvar,c_height)+$PgAcVar(fdvar,c_left)+$PgAcVar(fdvar,c_top)} errmsg] != 0}{
showError $errmsg
}
return
}
set c [list $PgAcVar(fdvar,c_left) $PgAcVar(fdvar,c_top)[expr $PgAcVar(fdvar,c_left)+$PgAcVar(fdvar,c_width)][expr $PgAcVar(fdvar,c_top)+$PgAcVar(fdvar,c_height)]]
set PgAcVar(fdobj,$i,coord)$c
.pgaw:FormDesign:draft.c delete o$i
design:draw_object $i
design:draw_hookers $i
}
proc {design:delete_object}{}{
global PgAcVar
set i $PgAcVar(fdvar,moveitemobj)
.pgaw:FormDesign:draft.c delete o$i
.pgaw:FormDesign:draft.c delete hook
set j [lsearch $PgAcVar(fdvar,objlist) $i]
set PgAcVar(fdvar,objlist)[lreplace $PgAcVar(fdvar,objlist) $j $j]
sql_exec noquiet "delete from pga_forms where formname='$PgAcVar(fdvar,formtitle)'"
regsub -all "'" $info "''" info
sql_exec noquiet "insert into pga_forms values ('$PgAcVar(fdvar,formtitle)','$info')"
Mainlib::cmd_Forms
set PgAcVar(fdvar,dirty) 0
return 1
}
proc {design:set_name}{}{
global PgAcVar
set i $PgAcVar(fdvar,moveitemobj)
foreach k $PgAcVar(fdvar,objlist){
if {($PgAcVar(fdobj,$k,name)==$PgAcVar(fdvar,c_name)) && ($i!=$k)}{
tk_messageBox -title [intlmsg Warning] -message [format [intlmsg "There is another object (a %s) with the same name.\nPlease change it!"] $PgAcVar(fdobj,$k,class)]
return
}
}
set PgAcVar(fdobj,$i,name) $PgAcVar(fdvar,c_name)
design:show_attributes $i
set PgAcVar(fdvar,dirty) 1
}
proc {design:set_text}{}{
global PgAcVar
design:draw_object $PgAcVar(fdvar,moveitemobj)
set PgAcVar(fdvar,dirty) 1
}
proc {design:createAttributesFrame}{i}{
global PgAcVar
# Check if attributes frame is already created for that item
if {[info exists PgAcVar(fdvar,attributeFrame)]}{
if {$PgAcVar(fdvar,attributeFrame) == $i} return
}
set PgAcVar(fdvar,attributeFrame)$i
# Delete old widgets from the frame
foreach wid [winfo children .pgaw:FormDesign:attributes.f]{
set PgAcVar(function,parameters)[join $PgAcVar(function,parameters) ,]
set PgAcVar(function,nametodrop)"$PgAcVar(function,name) ($PgAcVar(function,parameters))"
}
proc {save}{}{
global PgAcVar
if {$PgAcVar(function,name)==""}{
focus .pgaw:Function.fp.e1
showError [intlmsg "You must supply a name for this function!"]
} elseif {$PgAcVar(function,returns)==""}{
focus .pgaw:Function.fp.e3
showError [intlmsg "You must supply a return type!"]
} elseif {$PgAcVar(function,language)==""}{
focus .pgaw:Function.fp.e4
showError [intlmsg "You must supply the function language!"]
} else {
set funcbody [.pgaw:Function.fs.text1 get 1.0 end]
regsub -all "\n" $funcbody " " funcbody
if {$PgAcVar(function,nametodrop) != ""}{
if {! [sql_exec noquiet "drop function $PgAcVar(function,nametodrop)"]}{
return
}
}
if {[sql_exec noquiet "create function $PgAcVar(function,name) ($PgAcVar(function,parameters)) returns $PgAcVar(function,returns) as '$funcbody' language '$PgAcVar(function,language)'"]}{
wpg_select $CurrentDB "select reportname from pga_reports order by reportname" rec {
.pgaw:Main.lb insert end "$rec(reportname)"
}
}
setCursor DEFAULT
}
proc {cmd_Users}{}{
global CurrentDB
setCursor CLOCK
.pgaw:Main.lb delete 0 end
catch {
wpg_select $CurrentDB "select * from pg_user order by usename" rec {
.pgaw:Main.lb insert end $rec(usename)
}
}
setCursor DEFAULT
}
proc {cmd_Scripts}{}{
global CurrentDB
setCursor CLOCK
.pgaw:Main.lb delete 0 end
catch {
wpg_select $CurrentDB "select scriptname from pga_scripts order by scriptname" rec {
.pgaw:Main.lb insert end $rec(scriptname)
}
}
setCursor DEFAULT
}
proc {cmd_Sequences}{}{
global CurrentDB
setCursor CLOCK
.pgaw:Main.lb delete 0 end
catch {
wpg_select $CurrentDB "select relname from pg_class where (relname not like 'pg_%') and (relkind='S') order by relname" rec {
.pgaw:Main.lb insert end $rec(relname)
}
}
setCursor DEFAULT
}
proc {cmd_Tables}{}{
global CurrentDB
setCursor CLOCK
.pgaw:Main.lb delete 0 end
foreach tbl [Database::getTablesList]{.pgaw:Main.lb insert end $tbl}
setCursor DEFAULT
}
proc {cmd_Schema}{}{
global CurrentDB
.pgaw:Main.lb delete 0 end
catch {
wpg_select $CurrentDB "select schemaname from pga_schema order by schemaname" rec {
.pgaw:Main.lb insert end $rec(schemaname)
}
}
}
proc {cmd_Views}{}{
global CurrentDB
setCursor CLOCK
.pgaw:Main.lb delete 0 end
catch {
wpg_select $CurrentDB "select c.relname,count(c.relname) from pg_class C, pg_rewrite R where (relname !~ '^pg_') and (r.ev_class = C.oid) and (r.ev_type = '1') group by relname" rec {
if {$rec(count)!=0}{
set itsaview($rec(relname)) 1
}
}
wpg_select $CurrentDB "select relname from pg_class where (relname !~ '^pg_') and (relkind='r') and (relhasrules) order by relname" rec {
if {[info exists itsaview($rec(relname))]}{
.pgaw:Main.lb insert end $rec(relname)
}
}
}
setCursor DEFAULT
}
proc {delete_function}{objname}{
global CurrentDB
wpg_select $CurrentDB "select proargtypes,pronargs from pg_proc where proname='$objname'" rec {
set PgAcVar(function,parameters) $rec(proargtypes)
-borderwidth 1 -command {.pgaw:Preferences.fpl.flb.llb yview} -orient vert
frame $base.fb \
-height 75 -relief groove -width 125
button $base.fb.btnsave \
-command {if {$PgAcVar(pref,rows)>200}{
tk_messageBox -title [intlmsg Warning] -parent .pgaw:Preferences -message [intlmsg "A big number of rows displayed in table view will take a lot of memory!"]
}
Preferences::changeLanguage
Preferences::save
Window destroy .pgaw:Preferences
tk_messageBox -title [intlmsg Warning] -parent .pgaw:Main -message [intlmsg "Changed fonts may appear in the next working session!"]}\
.pgaw:QueryBuilder.saveAsView configure -state normal
}
proc {open}{queryname}{
global PgAcVar
if {! [loadQuery $queryname]} return;
if {$PgAcVar(query,type)=="S"} then {
set wn [Tables::getNewWindowName]
set PgAcVar(mw,$wn,query)[subst $PgAcVar(query,sqlcmd)]
set PgAcVar(mw,$wn,updatable) 0
set PgAcVar(mw,$wn,isaquery) 1
Tables::createWindow
wm title $wn "Query result: $PgAcVar(query,name)"
Tables::loadLayout $wn $PgAcVar(query,name)
Tables::selectRecords $wn $PgAcVar(mw,$wn,query)
} else {
set answ [tk_messageBox -title [intlmsg Warning] -type yesno -message "This query is an action query!\n\n[string range $qcmd 0 30] ...\n\nDo you want to execute it?"]
if {$answ}{
if {[sql_exec noquiet $qcmd]}{
tk_messageBox -title Information -message "Your query has been executed without error!"
}
}
}
}
proc {design}{queryname}{
global PgAcVar
if {! [loadQuery $queryname]} return;
Window show .pgaw:QueryBuilder
.pgaw:QueryBuilder.text1 delete 0.0 end
.pgaw:QueryBuilder.text1 insert end $PgAcVar(query,sqlcmd)
.pgaw:QueryBuilder.text2 delete 0.0 end
.pgaw:QueryBuilder.text2 insert end $PgAcVar(query,comments)
}
proc {loadQuery}{queryname}{
global PgAcVar CurrentDB
set PgAcVar(query,name)$queryname
if {[set pgres [wpg_exec $CurrentDB "select querycommand,querytype,querytables,querylinks,queryresults,querycomments,oid from pga_queries where queryname='$PgAcVar(query,name)'"]]==0} then {
set pgres [wpg_exec $CurrentDB "insert into pga_queries values ('$PgAcVar(query,name)','$qtype','$qcmd','$PgAcVar(query,tables)','$PgAcVar(query,links)','$PgAcVar(query,results)','$PgAcVar(query,comments)')"]
} else {
set pgres [wpg_exec $CurrentDB "update pga_queries set queryname='$PgAcVar(query,name)',querytype='$qtype',querycommand='$qcmd',querytables='$PgAcVar(query,tables)',querylinks='$PgAcVar(query,links)',queryresults='$PgAcVar(query,results)',querycomments='$PgAcVar(query,comments)' where oid=$PgAcVar(query,oid)"]
}
setCursor DEFAULT
if {$PgAcVar(pgsql,status)!="PGRES_COMMAND_OK"} then {
wpg_select $CurrentDB "select attnum,attname from pg_class,pg_attribute where (pg_class.relname='$PgAcVar(report,tablename)') and (pg_class.oid=pg_attribute.attrelid) and (attnum>0) order by attnum" rec {
.pgaw:ReportBuilder.lb insert end $rec(attname)
}
#setCursor DEFAULT
}
proc {hasTag}{id tg}{
if {[lsearch [.pgaw:ReportBuilder.c itemcget $id -tags] $tg]==-1} then {return 0 } else {return 1}
}
proc {init}{}{
global PgAcVar
set PgAcVar(report,xl_auto) 10
set PgAcVar(report,xf_auto) 10
set PgAcVar(report,regions){rpthdr pghdr detail pgfoo rptfoo}
set PgAcVar(report,y_rpthdr) 30
set PgAcVar(report,y_pghdr) 60
set PgAcVar(report,y_detail) 90
set PgAcVar(report,y_pgfoo) 120
set PgAcVar(report,y_rptfoo) 150
set PgAcVar(report,e_rpthdr)[intlmsg {Report header}]
set PgAcVar(report,e_pghdr)[intlmsg {Page header}]
set PgAcVar(report,e_detail)[intlmsg {Detail record}]
set PgAcVar(report,e_pgfoo)[intlmsg {Page footer}]
set PgAcVar(report,e_rptfoo)[intlmsg {Report footer}]
drawReportAreas
}
proc {loadReport}{}{
global PgAcVar CurrentDB
.pgaw:ReportBuilder.c delete all
wpg_select $CurrentDB "select * from pga_reports where reportname='$PgAcVar(report,reportname)'" rcd {
eval $rcd(reportbody)
}
getSourceFields
drawReportAreas
}
proc {preview}{}{
global PgAcVar CurrentDB
Window show .pgaw:ReportPreview
.pgaw:ReportPreview.fr.c delete all
set ol [.pgaw:ReportBuilder.c find withtag ro]
set fields {}
foreach objid $ol {
set tags [.pgaw:ReportBuilder.c itemcget $objid -tags]
if {[tk_messageBox -title [intlmsg Warning] -parent .pgaw:ReportBuilder -message [intlmsg "All report information will be deleted.\n\nProceed ?"] -type yesno -default no]=="yes"} then {
if {$PgAcVar(schema,newtablename)==$PgAcVar($tn)}{
showError [format [intlmsg "Table '%s' already in schema"] $PgAcVar($tn)]
return
}
}
set fldlist {}
setCursor CLOCK
wpg_select $CurrentDB "select attnum,attname,typname from pg_class,pg_attribute,pg_type where (pg_class.relname='$PgAcVar(schema,newtablename)') and (pg_class.oid=pg_attribute.attrelid) and (attnum>0) and (atttypid=pg_type.oid) order by attnum" rec {
lappend fldlist $rec(attname) $rec(typname)
}
setCursor DEFAULT
if {$fldlist==""}{
showError [format [intlmsg "Table '%s' not found!"] $PgAcVar(schema,newtablename)]
return
}
set PgAcVar(schema,tablename$PgAcVar(schema,ntables)) $PgAcVar(schema,newtablename)
set PgAcVar(schema,tablestruct$PgAcVar(schema,ntables)) $fldlist
set PgAcVar(schema,tablex$PgAcVar(schema,ntables)) $tabx
set PgAcVar(schema,tabley$PgAcVar(schema,ntables)) $taby
showError [intlmsg "You have to supply a name for this schema!"]
focus .pgaw:Schema.f.esn
} else {
setCursor CLOCK
set tables [Schema::getSchemaTabless]
if {$PgAcVar(schema,oid)==0} then {
set pgres [wpg_exec $CurrentDB "insert into pga_schema values ('$PgAcVar(schema,name)','$tables','$PgAcVar(schema,links)')"]
} else {
set pgres [wpg_exec $CurrentDB "update pga_schema set schemaname='$PgAcVar(schema,name)',schematables='$tables',schemalinks='$PgAcVar(schema,links)' where oid=$PgAcVar(schema,oid)"]
}
setCursor DEFAULT
if {$PgAcVar(pgsql,status)!="PGRES_COMMAND_OK"} then {
set PgAcVar(mw,$wn,query)"select oid,\"$tablename\".* from \"$tablename\""
set PgAcVar(mw,$wn,updatable) 1
set PgAcVar(mw,$wn,isaquery) 0
initVariables $wn
refreshRecords $wn
catch {wm title $wn "$tablename"}
}
proc {design}{tablename}{
global PgAcVar CurrentDB
if {$CurrentDB==""} return;
set PgAcVar(tblinfo,tablename)$tablename
refreshTableInformation
}
proc {refreshTableInformation}{}{
global PgAcVar CurrentDB
Window show .pgaw:TableInfo
wm title .pgaw:TableInfo "[intlmsg {Table information}] : $PgAcVar(tblinfo,tablename)"
.pgaw:TableInfo.f1.lb delete 0 end
.pgaw:TableInfo.f2.fl.ilb delete 0 end
.pgaw:TableInfo.f2.fr.lb delete 0 end
.pgaw:TableInfo.f3.plb delete 0 end
set PgAcVar(tblinfo,isunique){}
set PgAcVar(tblinfo,isclustered){}
set PgAcVar(tblinfo,indexfields){}
wpg_select $CurrentDB "select attnum,attname,typname,attlen,attnotnull,atttypmod,usename,usesysid,pg_class.oid,relpages,reltuples,relhaspkey,relhasrules,relacl from pg_class,pg_user,pg_attribute,pg_type where (pg_class.relname='$PgAcVar(tblinfo,tablename)') and (pg_class.oid=pg_attribute.attrelid) and (pg_class.relowner=pg_user.usesysid) and (pg_attribute.atttypid=pg_type.oid) order by attnum" rec {
set fsize $rec(attlen)
set fsize1 $rec(atttypmod)
set ftype $rec(typname)
if { $fsize=="-1" && $fsize1!="-1"}{
set fsize $rec(atttypmod)
incr fsize -4
}
if { $fsize1=="-1" && $fsize=="-1"}{
set fsize ""
}
if {$rec(attnotnull) == "t"}{
set notnull "NOT NULL"
} else {
set notnull {}
}
if {$rec(attnum)>0}{.pgaw:TableInfo.f1.lb insert end [format "%-33.33s %-14.14s %6.6s %-8.8s" $rec(attname) $ftype $fsize $notnull]}
set PgAcVar(tblinfo,owner) $rec(usename)
set PgAcVar(tblinfo,tableoid) $rec(oid)
set PgAcVar(tblinfo,ownerid) $rec(usesysid)
set PgAcVar(tblinfo,f$rec(attnum)) $rec(attname)
set PgAcVar(tblinfo,numtuples) $rec(reltuples)
set PgAcVar(tblinfo,numpages) $rec(relpages)
set PgAcVar(tblinfo,permissions) $rec(relacl)
if {$rec(relhaspkey)=="t"}{
set PgAcVar(tblinfo,hasprimarykey)[intlmsg Yes]
} else {
set PgAcVar(tblinfo,hasprimarykey)[intlmsg No]
}
if {$rec(relhasrules)=="t"}{
set PgAcVar(tblinfo,hasrules)[intlmsg Yes]
} else {
set PgAcVar(tblinfo,hasrules)[intlmsg No]
}
}
set PgAcVar(tblinfo,indexlist){}
wpg_select $CurrentDB "select oid,indexrelid from pg_index where (pg_class.relname='$PgAcVar(tblinfo,tablename)') and (pg_class.oid=pg_index.indrelid)" rec {
lappend PgAcVar(tblinfo,indexlist) $rec(oid)
wpg_select $CurrentDB "select relname from pg_class where oid=$rec(indexrelid)" rec1 {
.pgaw:TableInfo.f2.fl.ilb insert end $rec1(relname)
}
}
#
# showing permissions
set temp $PgAcVar(tblinfo,permissions)
regsub "^\{" $temp {} temp
regsub "\}$" $temp {} temp
regsub -all "\"" $temp {} temp
foreach token [split $temp ,]{
set oli [split $token =]
set uname [lindex $oli 0]
set rights [lindex $oli 1]
if {$uname == ""}{set uname PUBLIC}
set r_select " "
set r_update " "
set r_insert " "
set r_rule " "
if {[string first r $rights] != -1}{set r_select x}
if {[string first w $rights] != -1}{set r_update x}
if {[string first a $rights] != -1}{set r_insert x}
if {[string first R $rights] != -1}{set r_rule x}
#
# changing the format of the following line can affect the loadPermissions procedure
set PgAcVar(permission,select)[expr {"x"==[string range $line 34 34]}]
set PgAcVar(permission,update)[expr {"x"==[string range $line 46 46]}]
set PgAcVar(permission,insert)[expr {"x"==[string range $line 58 58]}]
set PgAcVar(permission,rule)[expr {"x"==[string range $line 70 70]}]
focus .pgaw:Permissions.f1.ename
}
proc {newPermissions}{}{
global PgAcVar
PgAcVar:clean permission,*
Window show .pgaw:Permissions
wm transient .pgaw:Permissions .pgaw:TableInfo
focus .pgaw:Permissions.f1.ename
}
proc {savePermissions}{}{
global PgAcVar
if {$PgAcVar(permission,username) == ""}{
showError [intlmsg "User without name?"]
return
}
sql_exec noquiet "revoke all on \"$PgAcVar(tblinfo,tablename)\" from $PgAcVar(permission,username)"
if {$PgAcVar(permission,select)}{
sql_exec noquiet "GRANT SELECT on \"$PgAcVar(tblinfo,tablename)\" to $PgAcVar(permission,username)"
}
if {$PgAcVar(permission,insert)}{
sql_exec noquiet "GRANT INSERT on \"$PgAcVar(tblinfo,tablename)\" to $PgAcVar(permission,username)"
}
if {$PgAcVar(permission,update)}{
sql_exec noquiet "GRANT UPDATE on \"$PgAcVar(tblinfo,tablename)\" to $PgAcVar(permission,username)"
}
if {$PgAcVar(permission,rule)}{
sql_exec noquiet "GRANT RULE on \"$PgAcVar(tblinfo,tablename)\" to $PgAcVar(permission,username)"
}
refreshTableInformation
}
proc {clusterIndex}{}{
global PgAcVar
set sel [.pgaw:TableInfo.f2.fl.ilb curselection]
if {$sel == ""}{
showError [intlmsg "You have to select an index!"]
return
}
bell
if {[tk_messageBox -title [intlmsg Warning] -parent .pgaw:TableInfo -message [format [intlmsg "You choose to cluster index\n\n %s \n\nAll other indices will be lost!\nProceed?"][.pgaw:TableInfo.f2.fl.ilb get $sel]] -type yesno -default no]=="no"}{return}
if {[sql_exec noquiet "cluster \"[.pgaw:TableInfo.f2.fl.ilb get $sel]\" on \"$PgAcVar(tblinfo,tablename)\""]}{
refreshTableInformation
}
}
proc {get_tag_info}{wn itemid prefix}{
set taglist [$wn.c itemcget $itemid -tags]
set i [lsearch -glob $taglist $prefix*]
set thetag [lindex $taglist $i]
return [string range $thetag 1 end]
}
proc {dragMove}{w x y}{
global PgAcVar
set dlo ""
catch { set dlo $PgAcVar(draglocation,obj)}
if {$dlo != ""}{
set dx [expr $x - $PgAcVar(draglocation,x)]
set dy [expr $y - $PgAcVar(draglocation,y)]
$w move $dlo $dx $dy
set PgAcVar(draglocation,x)$x
set PgAcVar(draglocation,y)$y
}
}
proc {dragStart}{wn w x y}{
global PgAcVar
PgAcVar:clean draglocation,*
set object [$w find closest $x $y]
if {[lsearch [$wn.c gettags $object] movable]==-1} return;
set PgAcVar(addindex,indexfields)[join $ifldslist ,]
Window show .pgaw:AddIndex
wm transient .pgaw:AddIndex .pgaw:TableInfo
}
proc {deleteIndex}{}{
global PgAcVar
set sel [.pgaw:TableInfo.f2.fl.ilb curselection]
if {$sel == ""}{
showError [intlmsg "You have to select an index!"]
return
}
if {[tk_messageBox -title [intlmsg Warning] -parent .pgaw:TableInfo -message [format [intlmsg "You choose to delete index\n\n %s \n\nProceed?"][.pgaw:TableInfo.f2.fl.ilb get $sel]] -type yesno -default no]=="no"}{return}
if {[sql_exec noquiet "drop index \"[.pgaw:TableInfo.f2.fl.ilb get $sel]\""]}{
refreshTableInformation
}
}
proc {createNewIndex}{}{
global PgAcVar
if {$PgAcVar(addindex,indexname)==""}{
showError [intlmsg "Index name cannot be null!"]
return
}
setCursor CLOCK
if {[sql_exec noquiet "CREATE $PgAcVar(addindex,unique) INDEX \"$PgAcVar(addindex,indexname)\" on \"$PgAcVar(tblinfo,tablename)\" ($PgAcVar(addindex,indexfields))"]}{
setCursor DEFAULT
Window destroy .pgaw:AddIndex
refreshTableInformation
}
setCursor DEFAULT
}
proc {showIndexInformation}{}{
global PgAcVar CurrentDB
set cs [.pgaw:TableInfo.f2.fl.ilb curselection]
if {$cs==""} return
set idxname [.pgaw:TableInfo.f2.fl.ilb get $cs]
wpg_select $CurrentDB "select pg_index.*,pg_class.oid from pg_index,pg_class where pg_class.relname='$idxname' and pg_class.oid=pg_index.indexrelid" rec {
if {$rec(indisunique)=="t"}{
set PgAcVar(tblinfo,isunique)[intlmsg Yes]
} else {
set PgAcVar(tblinfo,isunique)[intlmsg No]
}
if {$rec(indisclustered)=="t"}{
set PgAcVar(tblinfo,isclustered)[intlmsg Yes]
} else {
set PgAcVar(tblinfo,isclustered)[intlmsg No]
}
set PgAcVar(tblinfo,indexfields){}
.pgaw:TableInfo.f2.fr.lb delete 0 end
foreach field $rec(indkey){
if {$field!=0}{
# wpg_select $CurrentDB "select attname from pg_attribute where attrelid=$PgAcVar(tblinfo,tableoid) and attnum=$field" rec1 {
# set PgAcVar(tblinfo,indexfields)"$PgAcVar(tblinfo,indexfields) $rec1(attname)"
# }
set PgAcVar(tblinfo,indexfields)"$PgAcVar(tblinfo,indexfields) $PgAcVar(tblinfo,f$field)"
.pgaw:TableInfo.f2.fr.lb insert end $PgAcVar(tblinfo,f$field)
}
}
}
set PgAcVar(tblinfo,indexfields)[string trim $PgAcVar(tblinfo,indexfields)]
}
proc {addNewColumn}{}{
global PgAcVar
if {$PgAcVar(addfield,name)==""}{
showError [intlmsg "Empty field name ?"]
focus .pgaw:AddField.e1
return
}
if {$PgAcVar(addfield,type)==""}{
showError [intlmsg "No field type ?"]
focus .pgaw:AddField.e2
return
}
if {![sql_exec quiet "alter table \"$PgAcVar(tblinfo,tablename)\" add column \"$PgAcVar(addfield,name)\"$PgAcVar(addfield,type)"]}{
sql_exec quiet "update pga_layout set colnames=colnames || ' {$PgAcVar(addfield,name)}', colwidth=colwidth || ' 150',nrcols=nrcols+1 where tablename='$PgAcVar(tblinfo,tablename)'"
refreshTableInformation
}
proc {newtable:add_new_field}{}{
global PgAcVar
if {$PgAcVar(nt,fieldname)==""}{
showError [intlmsg "Enter a field name"]
focus .pgaw:NewTable.e2
return
}
if {$PgAcVar(nt,fldtype)==""}{
showError [intlmsg "The field type is not specified!"]
return
}
if {($PgAcVar(nt,fldtype)=="varchar")&&($PgAcVar(nt,fldsize)=="")}{
focus .pgaw:NewTable.e3
showError [intlmsg "You must specify field size!"]
return
}
if {$PgAcVar(nt,fldsize)==""} then {set sup ""} else {set sup "($PgAcVar(nt,fldsize))"}
if {[regexp $PgAcVar(nt,fldtype)"varchartextdatetime"]}{set supc "'"} else {set supc ""}
# Don't put the ' arround default value if it contains the now() function
if {([regexp $PgAcVar(nt,fldtype)"datetime"]) && ([regexp now $PgAcVar(nt,defaultval)])}{set supc ""}
# Clear the notnull attribute if field type is serial
if {$PgAcVar(nt,fldtype)=="serial"}{set PgAcVar(nt,notnull)" "}
if {$PgAcVar(nt,defaultval)==""} then {set sup2 ""} else {set sup2 " DEFAULT $supc$PgAcVar(nt,defaultval)$supc"}
# Checking for field name collision
set inspos end
for {set i 0}{$i<[.pgaw:NewTable.lb size]}{incr i}{
set linie [.pgaw:NewTable.lb get $i]
if {$PgAcVar(nt,fieldname)==[string trim [string range $linie 2 33]]}{
if {[tk_messageBox -title [intlmsg Warning] -parent .pgaw:NewTable -message [format [intlmsg "There is another field with the same name: '%s'!\n\nReplace it ?"] $PgAcVar(nt,fieldname)] -type yesno -default yes]=="no"} return
-borderwidth 1 -command {.pgaw:NewTable.lb yview} -orient vert
label $base.l93 \
-anchor w -borderwidth 0 -text [intlmsg {Table name}]
button $base.mvup \
-borderwidth 1 \
-command {if {[.pgaw:NewTable.lb size]>1}{
set i [.pgaw:NewTable.lb curselection]
if {($i!="")&&($i>0)}{
.pgaw:NewTable.lb insert [expr $i-1][.pgaw:NewTable.lb get $i]
.pgaw:NewTable.lb delete [expr $i+1]
.pgaw:NewTable.lb selection set [expr $i-1]
}
}}\
-text [intlmsg {Move up}]
button $base.mvdn \
-borderwidth 1 \
-command {if {[.pgaw:NewTable.lb size]>1}{
set i [.pgaw:NewTable.lb curselection]
if {($i!="")&&($i<[expr [.pgaw:NewTable.lb size]-1])}{
.pgaw:NewTable.lb insert [expr $i+2][.pgaw:NewTable.lb get $i]
.pgaw:NewTable.lb delete $i
.pgaw:NewTable.lb selection set [expr $i+1]
}
}}\
-text [intlmsg {Move down}]
button $base.button17 \
-borderwidth 1 \
-command {
if {[winfo exists .pgaw:NewTable.ddf]}{
destroy .pgaw:NewTable.ddf
} else {
create_drop_down .pgaw:NewTable 291 80 97
focus .pgaw:NewTable.ddf.sb
.pgaw:NewTable.ddf.lb insert end char varchar text int2 int4 serial float4 float8 money abstime date datetime interval reltime time timespan timestamp boolean box circle line lseg path point polygon
bind .pgaw:NewTable.ddf.lb <ButtonRelease-1> {
set i [.pgaw:NewTable.ddf.lb curselection]
if {$i!=""}{set PgAcVar(nt,fldtype)[.pgaw:NewTable.ddf.lb get $i]}
destroy .pgaw:NewTable.ddf
if {$i!=""}{
if {[lsearch {char varchar} $PgAcVar(nt,fldtype)]==-1}{
set PgAcVar(nt,fldsize){}
.pgaw:NewTable.e3 configure -state disabled
focus .pgaw:NewTable.e5
} else {
.pgaw:NewTable.e3 configure -state normal
focus .pgaw:NewTable.e3
}
}
break
}
}}\
-highlightthickness 0 -takefocus 0 -image dnarw
label $base.lco \
-borderwidth 0 -anchor w -text [intlmsg Constraint]
# The following array will hold all the local variables
variable vqb
proc {addNewTable}{{tabx 0}{taby 0}{alias -1}}{
global PgAcVar CurrentDB
variable vqb
if {$vqb(newtablename)==""} return
set fldlist {}
setCursor CLOCK
wpg_select $CurrentDB "select attnum,attname from pg_class,pg_attribute where (pg_class.relname='$vqb(newtablename)') and (pg_class.oid=pg_attribute.attrelid) and (attnum>0) order by attnum" rec {
lappend fldlist $rec(attname)
}
setCursor DEFAULT
if {$fldlist==""}{
showError [format [intlmsg "Table '%s' not found!"] $vqb(newtablename)]
return
}
if {$alias==-1}{
set tabnum $vqb(ntables)
} else {
regsub t $alias "" tabnum
}
set vqb(tablename$tabnum) $vqb(newtablename)
set vqb(tablestruct$tabnum) $fldlist
set vqb(tablealias$tabnum)"t$tabnum"
set vqb(ali_t$tabnum) $vqb(newtablename)
set vqb(tablex$tabnum) $tabx
set vqb(tabley$tabnum) $taby
incr vqb(ntables)
if {$vqb(ntables)==1}{
repaintAll
} else {
drawTable [expr $vqb(ntables)-1]
}
set vqb(newtablename){}
focus .pgaw:VisualQuery.fb.entt
}
proc {computeSQL}{}{
global PgAcVar
variable vqb
set sqlcmd "select "
#rjr 8Mar1999 added logical return state for results
for {set i 0}{$i<[llength $vqb(resfields)]}{incr i}{
if {[lindex $vqb(resreturn) $i]==[intlmsg Yes]}{
if {$sqlcmd!="select "}{set sqlcmd "$sqlcmd, "}
set sqlcmd "$sqlcmd[lindex $vqb(restables) $i].\"[lindex $vqb(resfields) $i]\""
}
}
set tables {}
for {set i 0}{$i<$vqb(ntables)}{incr i}{
set thename {}
catch {set thename $vqb(tablename$i)}
if {$thename!=""}{lappend tables "\"$vqb(tablename$i)\"$vqb(tablealias$i)"}