1# How to map a Tcl selection result back to a view 2# 3# Note: it'd be nice to have a "$view loop var { script ... }" in Mk4tcl 4 5if {[catch {package require Mk4tcl}] && 6 [catch {load ./Mk4tcl.so mk4tcl}] && 7 [catch {load ../builds/Mk4tcl.so mk4tcl}] && 8 [catch {load ./Mk4tcl_d.dll mk4tcl}] && 9 [catch {load ../builds/Mk4tcl_d.dll mk4tcl}]} { 10 error "cannot load Mk4tcl" 11} 12 13mk::file open db 14mk::view layout db.squares {x:I y:I} 15 16set count 50000 17mk::view size db.squares $count 18 19set t [clock seconds] 20 21mk::loop c db.squares { 22 set i [mk::cursor position c] 23 mk::set $c x $i y [expr {$i*$i}] 24} 25 26puts "init took [expr {[clock seconds] - $t}] seconds" 27 28puts "select timing: [time {set v [mk::select db.squares -regexp y 11111]}]" 29 30puts "results from select:" 31foreach i $v { 32 foreach {x y} [mk::get db.squares!$i x y] break 33 puts [format {%7i: %10d,%d} $i $x $y] 34} 35 36set v1 [mk::view new] 37foreach i $v { 38 $v1 insert end n:I $i 39} 40 41puts "contents of v1:" 42for {set i 0} {$i < [$v1 size]} {incr i} { 43 puts " [$v1 get $i n]" 44} 45 46set v2 [mk::view open db.squares] 47puts "the squares view is called '$v2' and contains [$v2 size] rows" 48 49set v3 [$v2 view map $v1] 50 51puts "mapped view:" 52for {set i 0} {$i < [$v3 size]} {incr i} { 53 foreach {x y} [$v3 get $i x y] break 54 puts [format {%7i: %10d,%d} $i $x $y] 55} 56 57$v3 close 58$v2 close 59$v1 close 60 61# The output on this script should be: 62# 63# init took 1 seconds 64# select timing: 443096 microseconds per iteration 65# results from select: 66# 10541: 10541,111112681 67# 33334: 33334,1111155556 68# 48310: 48310,-1961111196 69# contents of v1: 70# 10541 71# 33334 72# 48310 73# the squares view is called 'view1' and contains 100000 rows 74# mapped view: 75# 0: 10541,111112681 76# 1: 33334,1111155556 77# 2: 48310,-1961111196 78