metakit.tcl

Go to the documentation of this file.
00001 /*  -*- tcl -*-*/
00002 /*  Metakit backend for tie*/
00003 /* */
00004 /*  (C) 2005 Colin McCormack.*/
00005 /*  Taken from http://wiki.tcl.tk/13716, with permission.*/
00006 /* */
00007 /*  CMcC 20050303 - a backend for the tie tcllib package. Persists an*/
00008 /*                  array in a metakit database. In conjunction with the*/
00009 /*                  "remote" array backend, this might have similar*/
00010 /*                  functionality to Tequila.*/
00011 
00012 /*  Modified AK 2005-09-12*/
00013 
00014 package require Mk4tcl
00015 package require tie
00016 package require snit
00017 
00018 snit::type mktie {
00019     option -var    ""  ; /*  variable name in metakit*/
00020     option -vtype  S   ; /*  set the variable value type*/
00021     option -layout {}  ; /*  additional layout elements*/
00022 
00023     constructor {args} {
00024     $self configurelist $args
00025 
00026     if {$options(-var) eq ""} {
00027         /*  no variable name supplied - use the caller's name*/
00028         upvar 3 avar rv     ;/*  skip some snit nesting*/
00029         /* puts stderr "using $rv"*/
00030          options = (-var) $rv
00031     }
00032     /* puts stderr "$self - [array get options]"*/
00033      layout =  [concat [list name text:$options(-vtype)] $options(-layout)]
00034     mk::view layout tqs.$options(-var) $layout
00035     }
00036 
00037     /*  return a list containing the names of all keys found in the*/
00038     /*  metakit database.*/
00039 
00040     ret  names () {
00041     mk::loop c tqs.$options(-var) {
00042         lappend result [mk::get $c name]
00043     }
00044     }
00045 
00046     /*  return an integer number specifying the number of keys found in*/
00047     /*  the metakit database.*/
00048 
00049     ret  size () {
00050     return [mk::view size tqs.$options(-var)]
00051     }
00052 
00053     /*  return a dictionary containing the data found in the metakit*/
00054     /*  database.*/
00055 
00056     ret  get () {
00057     set dict [dict create]
00058     mk::loop c tqs.$options(-var) {
00059         set val [mk::get $c name text]
00060         #puts stderr "get $options(-var)(\#$c) - $val"
00061         dict set dict {*}$val
00062     }
00063     return $dict
00064     }
00065 
00066     /*  takes a dictionary and adds its contents to the metakit*/
00067 
00068     ret  set (type dict) {
00069     dict for {key value} $dict {
00070         $self setv $key $value
00071     }
00072     }
00073 
00074     /*  removes all elements whose keys match pattern*/
00075 
00076     ret  unset (type pattern) {
00077     set matches [mk::select tqs.$options(-var) -glob name $pattern]
00078     foreach n [lsort -integer -decreasing $matches] {
00079         mk::row delete tqs.$options(-var)!$n
00080     }
00081     }
00082 
00083     /*  save value under key*/
00084 
00085     ret  setv (type key , type value) {
00086     set n [mk::select tqs.$options(-var) name $key]
00087     if {[llength $n] == 0} {
00088         set n [mk::view size tqs.$options(-var)]
00089     } elseif {[mk::get tqs.$options(-var)!$n text] == $value} {
00090         return ; # no change, ignore
00091     }
00092     #puts stderr "set $options(-var)($key) to $value / $n"
00093     mk::set tqs.$options(-var)!$n name $key text $value
00094     }
00095 
00096     /*  remove the value under key*/
00097 
00098     ret  unsetv (type key) {
00099     set n [mk::select tqs.$options(-var) name $key]
00100     if {[llength $n] == 0} {
00101         error "can't unset \"$options(-var)($key)\": no such element in array"
00102         return
00103     }
00104     mk::row delete tqs.$options(-var)!$n
00105     }
00106 
00107     /*  return the value for key*/
00108 
00109     ret  getv (type key) {
00110     set n [mk::select tqs.$options(-var) name $key]
00111     if {[llength $n] == 0} {
00112         error "can't read \"$options(-var)($key)\": no such element in array"
00113         return
00114     }
00115     return [mk::get tqs.$options(-var)!$n text]
00116     }
00117 }
00118 
00119 mk::file open tqs tie.dat -nocommit
00120 ::tie::register ::mktie as metakit
00121 
00122 package provide mktie 1.0
00123 
00124 /*  ### ### ### ######### ######### #########*/
00125 
00126 if {[info script] eq $argv0} {
00127     un -nocomplain =  av
00128     array          av =  {}
00129 
00130     tie::tie av metakit
00131      av = (x) blah
00132     array  av =  {a 1 b 2 c 3 z 26}
00133     ::tie::untie av
00134 
00135     puts "second pass"
00136     un av = 
00137     array  av =  {}
00138     tie::tie av metakit
00139     puts [array size av]
00140     puts [array get av]
00141 }
00142 

Generated on 21 Sep 2010 for Gui by  doxygen 1.6.1