# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
import os
from .utilities import bash
from .cloudException import CloudRuntimeException
try:
    import mysql.connector as mysqldb
except ImportError:
    import pymysql as mysqldb

class Database(object):
    """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 connect(self):
        return mysqldb.connect(host=self.host,
                               user=self.username,
                               password=self.password,
                               database=self.db)

    def execute(self, statement):
        txn = None
        try:
            txn = self.connect()
            cursor = txn.cursor()
            cursor.execute(statement)
            cursor.close()
            txn.commit()
            if txn is not None:
                try:
                    txn.close()
                except:
                    pass
        except:
            raise CloudRuntimeException("Failed to execute: %s " % statement)
        finally:
            if txn is not None:
                try:
                    txn.close()
                except:
                    pass

    def testConnection(self):
        try:
            conn = self.connect()
            conn.ping()
            conn.close()
            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)
