#!/bin/sh
#\
TCLLIBPATH=/cx4/release/$MACHINE.$PLATFORM/$PRODUCT/res/REX/lib
#\
TCL_LIBRARY=$TCLLIBPATH/tcl7.6
#\
TK_LIBRARY=$TCLLIBPATH/tk4.2
#\
ITCL_LIBRARY=$TCLLIBPATH/itcl2.2
#\
ITK_LIBRARY=$TCLLIBPATH/itk2.2
#\
export TCLLIBPATH
#\
export TCL_LIBRARY
#\
export TK_LIBRARY
#\
export ITCL_LIBRARY
#\
export ITK_LIBRARY
#\
exec msitkwish2.2 $0

proc setupGUI {} {
    global status env
    set status ""

    set path {. res/REX/images}
    if {[info exists env(C2DIR)]} {
	lappend path $env(C2DIR)/res/REX/images
    }

    wm title . "Reaction Explorer Database"
    wm geometry . +4+25

    label .status -textvariable status -width 30
    pack .status -side bottom -expand yes -fill x

    set logoFile [findFile $path logo.gif]
    if {$logoFile != ""} {
	set logo [image create photo -file $logoFile -format gif]
	label .logo -image $logo
	pack .logo -side left
    }

    frame .total
    frame .current
    pack .total .current -expand yes -fill x
    label .total.v -textvariable counter(totalConnections) -width 5
    label .current.v -textvariable counter(currentConnections) -width 5
    pack .total.v .current.v -side right
    label .total.l   -text "Total clients:"
    label .current.l -text "Current clients:"
    pack .total.l .current.l -side right

    button .exit -command shutdown -text Exit
    pack .exit 

}

proc saveAll {} {
    global status

    set status "saving databases..."

    foreach db [array names Database] {
	saveDB $db
    }

    set status ""
}

proc savePeriodically {{time 30}} {
    saveAll

    if {$time != ""} {
	after [expr $time*60*1000] savePeriodically $time
    }
}

proc shutdown {} {
    global Database counter

    saveAll

    if {$counter(currentConnections) != 0} {
	#
	# Do we really want to quit?
	#
	if {![winfo exists .md]} {
	    messagedialog .md -title "Stop RexDB server" \
		    -text "There are clients using the database. Really quit?" \
		    -bitmap questhead -modality application

	    .md hide Help
	    .md buttonconfigure OK -text Yes 
	    .md buttonconfigure Cancel -text No
	}
        .md center

	if {![.md activate]} {
	    return
	}
	destroy .md	
    }
    exit
}

proc createDB {name {filename ""}} {
    global Database

    if {[info exists Database($name)]} {
	error "Database $name is already open"
    }

    #
    # Create a new database
    #

    package require DemoDB
    DemoDB $name


    if {$filename == ""} {
	set Database($name) Databases/$name/DB
    } else {
	set Database($name) $filename
    }
}

proc openDB {name {filename ""}} {

    global Database

    #
    # Open an existing database
    #

    if {[info exists Database($name)]} {
	return
    }

    if {$filename == ""} {
	set filename Databases/$name/DB
    }

    package require Archive
    new FileArchive ar $filename read
    DemoDB $name

    $name deserialize $ar
    unset ar

    set Database($name) $filename
}

proc exists {name {filename ""}} {

    global Database

    #
    # Open an existing database
    #

    if {[info exists Database($name)]} {
	return 1
    }

    if {$filename == ""} {
	set filename Databases/$name.db
    }

    if {[glob -nocomplain $filename] == ""} {
	return 0
    }
    return 1
}

proc saveDB {name} {
    
    global status
    set status "saving $name"
    # 
    # Save the database to its file
    #

    global Database

    if {![info exists Database($name)]} {
	error "Database $name is not open"
    }

    set filename $Database($name)

    catch {file copy -force $filename ${filename}-}
    package require Archive
    new FileArchive ar $filename write
    $name serialize $ar
    unset ar

    set status ""
}

proc closeDB {name} {
    # 
    # Close the database
    #

    global Database

    if {![info exists Database($name)]} {
	error "Database $name is not open"
    }

    delete object $name
    unset Database($name)
}

set auto_path [linsert $auto_path 0 . res/REX/Packages]
if {[info exists env(C2DIR)]} {
    lappend path $env(C2DIR)/res/REX/Packages
}

set v [package require ClientHandler]
set v [package require DemoDB]
set v [package require Request_Manager]

new ClientHandler dbServer 8000 counter

setupGUI

