#!/usr/bin/env tclsh # # updated the gbCdnaInfoMolColumn # set task cdnaMolCol set molTypeOld {enum('DNA','RNA','ds-RNA','ds-mRNA','ds-rRNA','mRNA','ms-DNA','ms-RNA','rRNA','scRNA','snRNA','snoRNA','ss-DNA','ss-RNA','ss-snoRNA','tRNA')} set molTypeNew {enum('DNA','RNA','ds-RNA','ds-mRNA','ds-rRNA','mRNA','ms-DNA','ms-RNA','rRNA','scRNA','snRNA','snoRNA','ss-DNA','ss-RNA','ss-snoRNA','tRNA','cRNA','ss-cRNA')} proc modifyDb {logFh db} { prLog $logFh "begin $db" set molTypeCur [getMolType $db] if {$molTypeCur == $::molTypeNew} { prLog $logFh "$db.gbCdnaInfo.mol already updated" } elseif {$molTypeCur == $::molTypeOld} { prLog $logFh "$db.gbCdnaInfo.mol needs updated" updateMolType $db } else { prLog $logFh "$db.gbCdnaInfo.mol unknown type" } prLog $logFh "end $db" } proc updateMolType {db} { callSql $db "ALTER TABLE gbCdnaInfo MODIFY mol $::molTypeNew NOT NULL" } proc getMolType {db} { foreach row [loadRows $db {describe gbCdnaInfo}] { if {[lindex $row 0] == {mol}} { return [lindex $row 1] } } error "can't find mol column in $db.gbCdnaInfo" } set logDir misc/$task.logs set host [exec hostname] if {$host == "hgwdev"} { cd /hive/data/outside/genbank } else { cd /genbank } switch $host { hgwdev { set dbFile etc/hgwdev.dbs } hgwbeta { set dbFile etc/hgwbeta.dbs } mgc { set dbFile etc/rr.dbs } default { set dbFile etc/rr.dbs } } proc loadDbs {dbFile} { set fh [open $dbFile] while {[gets $fh line] >= 0} { if {![string match "*\#*" $line]} { lappend dbs $line } } close $fh return $dbs } proc haveTable {db tbl} { return [expr {[llength [loadRows $db "show tables like \"$tbl\""]] > 0}] } proc callSql {db sql} { exec hgsql -N -e $sql $db } proc loadRows {db sql} { set rows {} foreach line [split [exec hgsql -N -e $sql $db] \n] { lappend rows [split $line \t] } return $rows } proc hasColumn {db tbl col} { foreach row [loadRows $db "describe $tbl"] { if {[lindex $row 0] == $col} { return 1 } } return 0 } proc prLog {logFh msg} { puts $logFh "[clock format [clock seconds]] $msg" } proc doModify {logFh dbFile} { set dbs [loadDbs $dbFile] foreach db $dbs { modifyDb $logFh $db } } catch {file mkdir $logDir} catch {file mkdir $logDir} set logFh [open $logDir/$host.log w] fconfigure $logFh -buffering line if {[catch { doModify $logFh $dbFile } msg]} { prLog $logFh "Error: $msg" exit 1 } prLog $logFh "Finished"