#! /usr/bin/env tclkit # split input starkits into header and metakit-data, submit as pieces source [file join [file dirname [info script]] util.tcl] proc submit {type path data go} { set md [md5c $data] set ams [amspath $md [string length $data] $go] if {![file exists $ams]} { puts " $ams $type [file tail $path] ([string length $data]b)" if {$go} { set cdata [vfs::zip -mode compress $data] if {[string length $cdata] < [string length $data]} { set data $cdata } set fd [open $ams w] fconfigure $fd -translation binary puts -nonewline $fd $data close $fd } } return $md } proc splitsk {path go} { if {![regexp {^(.*)-(\d+)-(\d+)$} [file tail $path] - f a b]} { puts "$path: input file should be of the form 'name-xxxxx-yyyyy'" } elseif {[catch { mkheader $path } start]} { puts "$path: $start" } else { set fd [open $path] fconfigure $fd -translation binary set head [read $fd $start] set tail [read $fd] close $fd set hmd5 [submit h $path $head $go] set tmd5 [submit t $path $tail $go] if {$go} { set vid [expr {(($a-10000)<<16)|($b-10000)}] #puts "$f - $vid - [string length $head] - [string length $tail]" mk::row append db.logs name $f vid $vid date [file mtime $path] \ hmd $hmd5 hsz [string length $head] \ tmd $tmd5 tsz [string length $tail] } } } set go 1 switch -- [lindex $argv 0] { "" { puts "Usage: splitter ?-n? starkit ..." exit } -n { set go 0 set argv [lrange $argv 1 end] } } if {$go} { mk::file open db info.mk mk::view layout db.logs {name vid:I date:I hmd:B hsz:I tmd:B tsz:I} } foreach sk $argv { splitsk $sk $go } if {$go} { mk::file close db }