#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# This scripts migrates the pyyimt database to a mysql/sqlite database for spectrum.
#
# This script is derived from py-transport2spectrum and the pyyimt migration part
# was written by Christian Dröge <Christian@draugr.de>

import os.path
import sys
import shelve
import anydbm
import cPickle
import exceptions
try:
    from twisted.enterprise import adbapi
    from twisted.enterprise import util
except:
    print "python-twisted is not installed"

s = util.safe
from twisted.internet import reactor

def error(result):
    print 'SQL ERROR ' + unicode(result)

def start():
    if len(sys.argv) != 6 and len(sys.argv) != 7 and len(sys.argv) != 3 and len(sys.argv) != 4:
        print "Usage for MySQL: " + sys.argv[0] + " pyyimt_database database username password host [mysql_prefix]"
        print "Usage for SQLite: " + sys.argv[0] + " pyyimt_database database [prefix]"
        reactor.stop()
        return

    prefix = ""
    if len(sys.argv) == 7:
        prefix = sys.argv[6]
    elif len(sys.argv) == 4:
        prefix = sys.argv[3]
    if len(sys.argv) == 3 or len(sys.argv) == 4:
        if not os.path.exists(sys.argv[2]):
            print "Run Spectrum to create this DB file first and then run this script again with the DB file created by Spectrum."
            reactor.stop()
            return
        db = adbapi.ConnectionPool('sqlite3', sys.argv[2])
    else:
        db = adbapi.ConnectionPool('MySQLdb', db = sys.argv[2], user = sys.argv[3], passwd = sys.argv[4], host = sys.argv[5], cp_min=1, cp_max=1)

    if os.path.isfile(sys.argv[1]):
        yahoodb = shelve.open(sys.argv[1],flag="r")
    else:
        print "Error: The following pyyimt database does not exist: %s" % sys.argv[1]
        reactor.stop()
        return

    import_error = False

    for jid in yahoodb.keys():
        try:
            password = yahoodb[jid]['password']
            uin = yahoodb[jid]['username']
        except (cPickle.UnpicklingError, exceptions.ValueError):
            print "Error: Could not add %s, maybe a part of the pyyimt database is corrupt" % jid
            import_error = True
        else:
            print "Adding", jid
        
            if len(sys.argv) == 3 or len(sys.argv) == 4:
                db.runQuery('insert or ignore into ' + prefix + 'users (jid, uin, password, language) values ("%s", "%s", "%s", "en")'%(s(jid), s(uin),s(password))).addErrback(error)
            else:
                db.runQuery('insert ignore into ' + prefix + 'users (jid, uin, password, language) values ("%s", "%s", "%s", "en")'%(s(jid), s(uin),s(password))).addErrback(error)

    yahoodb.close()

    if import_error:
        print "Error: There were some errors, when importing the pyyimt database. Look for more \"Error:\" lines above, to see the details"
    reactor.stop()

reactor.callWhenRunning(start)
reactor.run()
