import MySQLdb
import os
from utilities import bash
from cloudException import CloudRuntimeException
import sys
class Database:
    """Database connection"""
    def __init__(self, username, password=None, host='localhost', port='3306', db="cloud"):
        self.host = host
        self.username = username
        self.password = password
        self.port = port
        self.db = db

    def execute(self, statement):
        txn = None
        try:
            if self.password is not None:
                txn = MySQLdb.Connect(host=self.host, user=self.username,
                                 passwd=self.password, db=self.db)
            else:
                txn = MySQLdb.Connect(host=self.host, user=self.username,
                                 db=self.db)
            cursor = txn.cursor()
            cursor.execute(statement)
            cursor.close()
            txn.commit()
            if txn is not None:
                try:
                    txn.close()
                except:
                    pass
        except:
            if txn is not None:
                try:
                    txn.close()
                except:
                    pass
            raise CloudRuntimeException("Failed to execute:%s"%statement)
        
    def testConnection(self):
        try:
            if self.password is not None:
                db = MySQLdb.Connect(host=self.host, user=self.username,
                                 passwd=self.password, db=self.db)
            else:
                db = MySQLdb.Connect(host=self.host, user=self.username,
                                  db=self.db)
            return True
        except:
            raise CloudRuntimeException("Failed to Connect to DB")
        
    def executeFromFile(self, file):
        if not os.path.exists(file):
            return False
        
        cmdLine = "mysql --host=" + self.host + " --port=" + str(self.port) + " --user=" + self.username
        if self.password is not None:
            cmdLine += " --password=" + self.password
        
        cmdLine += " < " + file
        
        try:
            bash(cmdLine)
        except:
            raise CloudRuntimeException("Failed to execute " + cmdLine)
