#!/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 /cluster/data/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"

