Richard Suchenwirth - Tcl arrays can be used for implementing a simple database. Here is an "API" that wraps typical accesses, which I originally needed for Tclworld, but it's general enough to be factored out. Let's start with the
USAGE
Pretty abstract, but very concise - it's amazing how much functionality can be expressed with a keyword-less language (if you except the initial db), just controlled by the number of arguments. Examples:
db geo::info geo::info Hamburg pop 1234560 geo::info Hamburg it: Amburgo geo::info ;#=> Hamburg geo::info Hamburg ;#=> pop 1234560 it: Amburgo geo::info Hamburg pop ;#=> 1234560 proc db {database args} { upvar #0 $database db set key "" ;# in case args is empty foreach {- key item value} $args break set exists [info exists db($key)] set res {} switch [llength $args] { 0 { array set db {} ;# force to be an array interp alias {} $database {} db $database - set res $database } 1 {set res [array names db]} 2 {if {$key != ""} { if {$exists} {set res $db($key)} } else {array unset db} } 3 {if {$item != ""} { if {$exists} { set t $db($key) if {!([set pos [lsearch $t $item]]%2)} { set res [lindex $t [incr pos]] } } } elseif {$exists} {unset db($key)} } 4 { if {$exists} { if {!([set pos [lsearch $db($key) $item]]%2)} { if {$value != ""} { set db($key) [lreplace $db($key) [incr pos] $pos $value] } else {set db($key) [lreplace $db($key) $pos [incr pos]]} } elseif {$value != ""} { lappend db($key) $item $value } } elseif {$value != ""} {set db($key) [list $item $value]} set res $value ;# to be returned } default { if {[llength $args]%2} {error "non-paired item/value list"} foreach {item value} [lrange $args 2 end] { db $database - $key $item $value } } } set res } if {[file tail $argv]==[file tail [info script]]} { foreach test [split { db Test Test Hamburg pop 1234560 cn: Hanbao Test Hamburg it: Amburgo Test ;#=> Hamburg Test Hamburg ;#=> pop 1234560 it: Amburgo Test Hamburg pop ;#=> 1234560 } \n] { puts -nonewline "$test --> " puts [eval $test] } }
A little database GUI -Arts and crafts of Tcl-Tk programming