blob: 973faf4e723a2f7360de56bc3a92216dc67b2eec [file] [log] [blame]
#
# Ajax query servelet: a pseudo database is built into the dictionary 'composers' with the
# purpose of emulating the role of a real data source.
# The script answers with 2 types of responses: a catalog of the record ids and a database
# entry matching a given rec_id. The script obviously misses the error handling and the
# likes. Just an example to see rivet sending xml data to a browser. The full Tcl, JavaScript
# and HTML code are available from http://people.apache.org/~mxmanghi/rivet-ajax.tar.gz
# This example requires Tcl8.5 or Tcl8.4 with package 'dict'
# (http://pascal.scheffers.net/software/tclDict-8.5.2.tar.gz)
#
# A pseudo database. rec_id matches a record in the db
set composers [dict create \
1 {first_name Claudio middle_name "" last_name Monteverdi \
lifespan 1567-1643 era Renaissance/Baroque} \
2 {first_name Johann middle_name Sebastian last_name Bach \
lifespan 1685-1750 era Baroque } \
3 {first_name Ludwig middle_name "" last_name "van Beethoven" \
lifespan 1770-1827 era Classical/Romantic} \
4 {first_name Wolfgang middle_name Amadeus last_name Mozart \
lifespan 1756-1791 era Classical } \
5 {first_name Robert middle_name "" last_name Schumann \
lifespan 1810-1856 era Romantic} ]
# we use the 'load' argument in order to determine the type of query
#
# load=catalog: we have to return a list of the names in the database
# load=composer&res_id=<id>: the script is supposed to return the record
# having <id> as record id
if {[::rivet::var exists load]} {
# the xml declaration is common to every message (error messages included)
set xml "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
switch [::rivet::var get load] {
catalog {
append xml "<catalog>\n"
foreach nm [dict keys $composers] {
set first_name [dict get $composers $nm first_name]
set middle_name [dict get $composers $nm middle_name]
set last_name [dict get $composers $nm last_name]
append xml " <composer key=\"$nm\">$first_name "
if {[string length [string trim $middle_name]] > 0} {
append xml "$middle_name "
}
append xml "$last_name</composer>\n"
}
append xml "</catalog>\n"
}
composer {
append xml "<composer>\n"
if {[::rivet::var exists rec_id]} {
set rec_id [::rivet::var get rec_id]
if {[dict exists $composers $rec_id]} {
foreach {k v} [dict get $composers $rec_id] {
append xml "<$k>$v</$k>\n"
}
}
}
append xml "</composer>\n"
}
}
# we have to tell the client this is an XML message. Failing to do so
# would result in an XMLResponse property set to null
::rivet::headers type "text/xml"
::rivet::headers add Content-Length [string length $xml]
puts $xml
}