# $Header: /home/cvsroot/tcldb/wisql/Tlib/findData,v 1.6 1999/05/01 03:46:43 de Exp ${DB}findData,v 1.1.1.1 1996/10/12 02:26:26 de Exp $
# tcl procs saved on Tue Sep 05 09:32:52 PDT 1995

proc findData mode {

global dbpipe1 DB server base table Qtable pgHan moreRec

upvar #0 EZEcols cols
upvar #0 EZEcolatts colatts
upvar #0 EZEshows shows
upvar #0 EZEnrec nrec
upvar #0 EZEcci cci
upvar #0 EZEvform vf
upvar #0 EZEhform hf
upvar #0 EZEselsql selsql
upvar #0 EZEsort sort
upvar #0 EZEfwhere fwhere


	set ind 1


	set sqlcmd "select * from $Qtable"
	if {$DB == "PG"} {
	set sqlcmd "select oid,* from $Qtable"
	}

	set showc ""
	foreach c $cols {
		if {$shows($c)} {
			lappend showc $c
		}
	}

	if {($selsql != "") && ($selsql != "where ")} {

		append sqlcmd " $selsql"

	} else {

	set slist ""

	foreach c $cols {

	set cn [keylget colatts($c) name]
	set cs $shows($c)

	set spec($c,col) $cn

	if {$cs} {

	set entry [$hf.data.pic.win.$c.f get]

	if {$entry == ""} {
		set spec($c,cmp) ""
		continue
	}

	# make sure one space after a numeric operator
	foreach op {= < <= > >= !=} {
	  regsub ^$op $entry "$op " entry
	}
	set result [chkSel EZE $c $entry]

	set yesno [lindex $result 0]
	set sql [lindex $result 1]


	if {$yesno == "NO"} {
		$hf.data.pic.win.$c.f delete 0 end
		$hf.data.msg configure -text "$sql"
		return
	}

#	correct the user's sql if necessary

	$hf.data.pic.win.$c.f delete 0 end
	$hf.data.pic.win.$c.f insert 0 $sql

	set spec($c,cmp) $sql

#	and add it into the spec

	lappend slist $c

	} 

	}

	set first 1
	foreach c $slist {
		if {$spec($c,cmp) != ""} {
		if {$first} {
		append sqlcmd " where $spec($c,col) $spec($c,cmp)"
		set first 0
		} else {
		append sqlcmd " and $spec($c,col) $spec($c,cmp)"
		}
		}

	}
#			end of if selsql not blank
	}

	set oby ""
	if {[string trim $sort] != ""} {
		set oby "order by $sort"
	}
	if {$mode == "show"} {

		set sqlcmd "$sqlcmd $oby"
		set title "SQL(NOT)"
		mkAlert "$title" "\"$sqlcmd\"" "OK" l showsql

	} else {

  	$hf.data.msg configure -text "Executing SQL . . ."
	update

#	save the sql cmd
	set getcmd $sqlcmd
	set fwhere [lrange $getcmd [lsearch $getcmd where] end]
#	Peel off "select *" and substitute "select count(*)"
	set cntcmd [format "select count(*) %s" [lrange $sqlcmd 2 end]]

	set rc 0
	set sqlcmd $cntcmd
	set sqt $table

#	puts stderr "findData sql: $sqlcmd"
  	set res [queryDB $sqlcmd]
  	if {[lindex $res 0] == "ERROR"} {
    		$hf.data.msg configure -text "Error: $res"
    		return
  	} else {
		set cnt ""
		while {$cnt == ""} {
                set cnt [nextRec]
		}
		if {$cnt > 500} {
			$hf.data.msg configure -text "Too many records, getting 100 sample records out of $cnt requested"
			update
			set rc 100
		}
  	}

#	if we need to limit the rowcount, change it here
	if {$rc} {
	set sqlcmd "set rowcount $rc"
	set sqt NONE
        set res [queryDB $sqlcmd]
        if {[lindex $res 0] == "ERROR"} {
                echo "Serious problem here"
                echo "$sqlcmd"
                echo "$res"
                exit 1
        }
	}

	set sqlcmd "$getcmd $oby"

	set sqt $table
        set res [queryDB $sqlcmd]
	set colinfo [getCols]
	set flds [keylkeys colinfo]
        if {[lindex $res 0] == "ERROR"} {
    		$hf.data.msg configure -text "Error: $res"
    		return
  	} else {
    		$hf.data.msg configure -text "SQL finished, getting results"
  	}

	foreach c $showc {

#	clear out the data listbox and the new-data entry box
#	but leave the find box alone, the user might want it again
	$hf.data.pic.win.$c.d delete 0 end 
	$hf.data.pic.win.$c.e delete 0 end

	}

  	set i 0
  	while {1 == 1} {

	 	if {!$moreRec} {break}
                set row [nextRec]
		eval lassign \$row $flds
                if {[lindex $row 0] == "ERROR"} {
                        puts stderr "$row"
                        break
                }
		if {$row == ""} {
			break
		}
	
		foreach c $showc {
		set cn [keylget colatts($c) name]
		$hf.data.pic.win.$c.d insert end "[set $cn]"

		}
		incr i
#	Do this here in case we get a sybtcl error on sybnext
  	}
	set nrec $i

#	if we had to change the rowcount then change it back now

	if {$rc} {
        set sqlcmd "set rowcount 0"
	set sqt NONE
        set res [queryDB $sqlcmd]
        if {[lindex $res 0] == "ERROR"} {
                echo "Serious problem here"
                echo "$sqlcmd"
                echo "$res"
                exit 1
        }
        }      

	set cci 0

	set yv 0
	set cl 0

	set first [lindex $showc 0]
        $hf.data.pic.win.$first.d get $cci 

	foreach c $slist {
        	$hf.data.pic.win.$c.d yview $yv
	}

    	$hf.data.msg configure -text "Target data retrieved and displayed: $nrec records"
	vertPage

	}
}

