#!/opt/tcl803/bin/sytcl
#
# package require Tclx
# package require Sybtcl
#
loadlibindex /opt/share/tcl/lib/ucodb/ucodb.tlib
set server KSUMMIT
set err [catch {set dbpipe1 [sybOpen metabase zorro SecretPassword $server]} res]
if $err {
puts stderr "OUCH can't get sybase pipe"
puts stderr "ERR $res"
exit 1
}
# typical diff output
#
# Index: Mask.dat
# ===================================================================
# RCS file: /home/cvssci/metabase/Mask.dat,v
# retrieving revision 1.23
# diff -r1.23 Mask.dat
# 1,2d0
# < 1926 GOH_TV Apr 1 2002 12:00AM 0
# < 1927 GOH_X Apr 1 2002 12:00AM 0
# 1028a1027,1030
# > 741 ndwfs13. 1183 Oct 29 2003 2:20PM 0 JP 0 0 0.0
# > 742 ndwfs14. 1184 Oct 29 2003 2:20PM 0 JQ 0 0 0.0
# > 744 ndwfs15. 1185 Oct 29 2003 2:20PM 0 JR 0 0 0.0
# > 740 q1013r15 1190 Oct 29 2003 2:20PM 0 JW 0 0 0.0
#
# the first set of lines are in the cvs repos but NOT in the local file. that's what we want.
# the last set of lines are in the extracted local file but NOT in the cvs repos
#
# get file
set infile [lindex $argv 0]
puts stderr "\n***---------DIFF2SQL compare WAIAHA w/CVS----------***"
puts stderr "***---------[clock format [clock seconds]]----------***"
#
set i 0
set cols ""
for_file line $infile {
if {[string first "RCS file" $line] == 0} {
set rfn [lindex $line 2]
set tbl [file rootname [file tail $rfn]]
set fqt metabase.dbo.$tbl
set sqt $fqt
set sqlcmd "set rowcount 1"
doSQL 1
set sqlcmd "select * from $fqt"
doSQL 1
set cols [sybCols 1]
set sqlcmd "set rowcount 0"
doSQL 1
set kf [lindex $cols 0]
continue
}
if {[cindex $line 0] != ">"} {continue}
set line [crange $line 2 end]
set cs $cols
set dl [split $line \t]
puts stderr "DL : $dl"
foreach v $dl {
set c [lvarpop cs]
keylset data($i) $c $v
}
incr i
}
#
# did we get any new data?
if {![info exists data]} {
# nope.
puts stderr "No new data here on waiaha. No Tcl. STOP."
set tbl [file rootname [file tail $infile]]
unlink Notify.$tbl.tcl
exec touch Notify.$tbl.tcl
exit 0
}
#
set outfile Notify.$tbl.tcl
set ofp [open $outfile w]
#
set Warnings ""
set c0 [lindex $cols 0]
set sqt $fqt
foreach i [lsort -integer [array names data]] {
puts stderr "Diff rec: cvs contains line different from local extract!"
if {$tbl == "Mask"} {
foreach k [keylkeys data($i)] {
set $k [keylget data($i) $k]
}
set strings [list shiptoDate MillDate MillQual millseq guiname]
foreach f $strings {
if {([set $f] == "NULL") || ([set $f] == "")} { set $f "" ; set val($f) NULL} else {set val($f) "'[set $f]'"}
}
foreach f $cols {
if {![lcontain $strings $f]} {
if {[set $f] == ""} { set $f 0 ; set val($f) NULL} else {set val($f) "[set $f]" }
}
}
set vl ""
# so far, masks milled here are MillId 1.
# the MillMasks code should really do this... this is experimental here.
set val(MillId) 1
foreach c $cols {
lappend vl $val($c)
}
# set sqlcmd "insert into $fqt values([set $kf],'$guiname',$shiptoPid,'$shiptoDate',$ToolDiam,$ToolAngl,$MillTemp,$NCagent,$MillId,$BluId,$millbyPId,'$MillDate','$MillQual',$maskExp,$uid,'$stamp','$millseq',$status,$shipid,$BMF)"
set sqlcmd "insert into $fqt values([join $vl ,])"
puts $ofp "set Change($fqt,[set $kf]) \"$sqlcmd\""
puts stderr "SQL: $sqlcmd"
# doSQL 1
} else {
# if rec exists it is an update and should be a MaskBlu record. only status should change
eval lassign \$line $cols
set strings [list shiptoDate MillDate MillQual millseq BluName BluCreat BluDate Date_Use guiname loc stamp]
foreach f $strings {
if {[info exists $f]} {
if {[set $f] == "NULL"} { set $f "" }
}
}
foreach f $cols {
if {![lcontain $strings $f]} {
# puts stderr "Is numeric $f ''? if so, set $f 0"
if {[set $f] == ""} { set $f 0 }
if {[keylget data($i) $f] == ""} {keylset data($i) $f 0}
}
}
if {$tbl != "MaskBlu"} {
lappend Warnings "WARNING got diff to existing record for table $tbl NOT MaskBlu"
lappend Warnings " not sure what to do about this! Abort this change."
lappend Warnings " new rec was $data($i)"
continue
}
set ns [keylget data($i) status ]
set kv [keylget data($i) $kf]
set sqlcmd "update $tbl set status = $ns where $kf = $kv"
puts stderr "SQL: $sqlcmd"
puts $ofp "set Change($fqt,$kv) \"$sqlcmd\""
# doSQL 1
}
}
close $ofp
# exec cvs commit $outfile
puts stderr "[join $Warnings \n]"
#