From 00b7194555ab20ec341fa36d784fbf859bd7a013 Mon Sep 17 00:00:00 2001 From: fpremoli Date: Thu, 28 Feb 2019 11:46:55 +0100 Subject: [PATCH 01/16] Modifica Multi Connection --- src/DatabaseLibrary/connection_manager.py | 117 +++++++++++++++++----- src/DatabaseLibrary/query.py | 61 ++++++----- 2 files changed, 126 insertions(+), 52 deletions(-) diff --git a/src/DatabaseLibrary/connection_manager.py b/src/DatabaseLibrary/connection_manager.py index dc949c3..28c5724 100644 --- a/src/DatabaseLibrary/connection_manager.py +++ b/src/DatabaseLibrary/connection_manager.py @@ -13,6 +13,8 @@ # limitations under the License. import importlib +from robot.libraries.BuiltIn import BuiltIn +from urllib.parse import urlparse try: import ConfigParser @@ -21,7 +23,6 @@ from robot.api import logger - class ConnectionManager(object): """ Connection Manager handles the connection & disconnection to the database. @@ -31,10 +32,68 @@ def __init__(self): """ Initializes _dbconnection to None. """ - self._dbconnection = None + + self._cache = robot.utils.ConnectionCache('No sessions created') + self.builtin = BuiltIn() + #self._dbconnection = None self.db_api_module_name = None - def connect_to_database(self, dbapiModuleName=None, dbName=None, dbUsername=None, dbPassword=None, dbHost=None, dbPort=None, dbCharset=None, dbConfigFile="./resources/db.cfg"): + def connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUsername=None, dbPassword=None, dbHost=None, dbPort=None, dbCharset=None, dbConfigFile="./resources/db.cfg"): + + logger.info('Creating Db Connection using : alias=%s, dbapiModuleName=%s, dbName=%s, \ + dbUsername=%s, dbPassword=%s, dbHost=%s, dbPort=%s, dbCharset=%s, \ + dbConfigFile=%s ' % (alias, dbapiModuleName, dbName, dbUsername, dbPassword, dbHost,dbPort, dbCharset, dbConfigFile)) + + config = ConfigParser.ConfigParser() + config.read([dbConfigFile]) + + dbapiModuleName = dbapiModuleName or config.get('default', 'dbapiModuleName') + dbName = dbName or config.get('default', 'dbName') + dbUsername = dbUsername or config.get('default', 'dbUsername') + dbPassword = dbPassword if dbPassword is not None else config.get('default', 'dbPassword') + dbHost = dbHost or config.get('default', 'dbHost') or 'localhost' + dbPort = int(dbPort or config.get('default', 'dbPort')) + + return self._connect_to_database( + alias, + dbapiModuleName, + dbName, + dbUsername, + dbPassword, + dbHost, + dbPort, + dbCharset, + dbConfigFile) + + def connect_by_url(self,alias,dbapiModuleName=None,url=None, dbCharset=None, dbConfigFile="./resources/db.cfg"): + + logger.info('Creating Db Connection using : alias=%s, url=%s, dbapiModuleName=%s, dbCharset=%s, dbConfigFile=%s ' % (alias, url, dbapiModuleName, dbCharset, dbConfigFile)) + + config = ConfigParser.ConfigParser() + config.read([dbConfigFile]) + + dataConnection = urlparse(url) + + dbapiModuleName = dbapiModuleName or config.get('default', 'dbapiModuleName') + dbName = dataConnection.path[1:] or config.get('default', 'dbName') + dbUsername = dataConnection.username or config.get('default', 'dbUsername') + dbPassword = dataConnection.password if dataConnection.password is not None else config.get('default', 'dbPassword') + dbHost = dataConnection.hostname or config.get('default', 'dbHost') or 'localhost' + dbPort = int(dataConnection.port or config.get('default', 'dbPort')) + + + return self._connect_to_database( + alias, + dbapiModuleName, + dbName, + dbUsername, + dbPassword, + dbHost, + dbPort, + dbCharset, + dbConfigFile) + + def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUsername=None, dbPassword=None, dbHost=None, dbPort=None, dbCharset=None, dbConfigFile="./resources/db.cfg"): """ Loads the DB API 2.0 module given `dbapiModuleName` then uses it to connect to the database using `dbName`, `dbUsername`, and `dbPassword`. @@ -75,15 +134,7 @@ def connect_to_database(self, dbapiModuleName=None, dbName=None, dbUsername=None | Connect To Database | psycopg2 | my_db_test | """ - config = ConfigParser.ConfigParser() - config.read([dbConfigFile]) - dbapiModuleName = dbapiModuleName or config.get('default', 'dbapiModuleName') - dbName = dbName or config.get('default', 'dbName') - dbUsername = dbUsername or config.get('default', 'dbUsername') - dbPassword = dbPassword if dbPassword is not None else config.get('default', 'dbPassword') - dbHost = dbHost or config.get('default', 'dbHost') or 'localhost' - dbPort = int(dbPort or config.get('default', 'dbPort')) if dbapiModuleName == "excel" or dbapiModuleName == "excelrw": self.db_api_module_name = "pyodbc" @@ -94,43 +145,52 @@ def connect_to_database(self, dbapiModuleName=None, dbName=None, dbUsername=None if dbapiModuleName in ["MySQLdb", "pymysql"]: dbPort = dbPort or 3306 logger.info('Connecting using : %s.connect(db=%s, user=%s, passwd=%s, host=%s, port=%s, charset=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort, dbCharset)) - self._dbconnection = db_api_2.connect(db=dbName, user=dbUsername, passwd=dbPassword, host=dbHost, port=dbPort, charset=dbCharset) + dbconnection = db_api_2.connect(db=dbName, user=dbUsername, passwd=dbPassword, host=dbHost, port=dbPort, charset=dbCharset) elif dbapiModuleName in ["psycopg2"]: dbPort = dbPort or 5432 logger.info('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort)) - self._dbconnection = db_api_2.connect(database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) + dbconnection = db_api_2.connect(database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) elif dbapiModuleName in ["pyodbc", "pypyodbc"]: dbPort = dbPort or 1433 logger.info('Connecting using : %s.connect(DRIVER={SQL Server};SERVER=%s,%s;DATABASE=%s;UID=%s;PWD=%s)' % (dbapiModuleName, dbHost, dbPort, dbName, dbUsername, dbPassword)) - self._dbconnection = db_api_2.connect('DRIVER={SQL Server};SERVER=%s,%s;DATABASE=%s;UID=%s;PWD=%s' % (dbHost, dbPort, dbName, dbUsername, dbPassword)) + dbconnection = db_api_2.connect('DRIVER={SQL Server};SERVER=%s,%s;DATABASE=%s;UID=%s;PWD=%s' % (dbHost, dbPort, dbName, dbUsername, dbPassword)) elif dbapiModuleName in ["excel"]: logger.info( 'Connecting using : %s.connect(DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=1;Extended Properties="Excel 8.0;HDR=YES";)' % ( dbapiModuleName, dbName)) - self._dbconnection = db_api_2.connect( + dbconnection = db_api_2.connect( 'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=1;Extended Properties="Excel 8.0;HDR=YES";)' % ( dbName), autocommit=True) elif dbapiModuleName in ["excelrw"]: logger.info( 'Connecting using : %s.connect(DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=0;Extended Properties="Excel 8.0;HDR=YES";)' % ( dbapiModuleName, dbName)) - self._dbconnection = db_api_2.connect( + dbconnection = db_api_2.connect( 'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=0;Extended Properties="Excel 8.0;HDR=YES";)' % ( dbName), autocommit=True) elif dbapiModuleName in ["ibm_db", "ibm_db_dbi"]: dbPort = dbPort or 50000 logger.info('Connecting using : %s.connect(DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;) ' % (dbapiModuleName, dbName, dbHost, dbPort, dbUsername, dbPassword)) - self._dbconnection = db_api_2.connect('DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;' % (dbName, dbHost, dbPort, dbUsername, dbPassword), '', '') + dbconnection = db_api_2.connect('DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;' % (dbName, dbHost, dbPort, dbUsername, dbPassword), '', '') elif dbapiModuleName in ["cx_Oracle"]: dbPort = dbPort or 1521 oracle_dsn = db_api_2.makedsn(host=dbHost, port=dbPort, service_name=dbName) logger.info('Connecting using: %s.connect(user=%s, password=%s, dsn=%s) ' % (dbapiModuleName, dbUsername, dbPassword, oracle_dsn)) - self._dbconnection = db_api_2.connect(user=dbUsername, password=dbPassword, dsn=oracle_dsn) + dbconnection = db_api_2.connect(user=dbUsername, password=dbPassword, dsn=oracle_dsn) else: logger.info('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort)) - self._dbconnection = db_api_2.connect(database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) + dbconnection = db_api_2.connect(database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) + + + self._cache.register(dbconnection, alias=alias) + + def connect_to_database_using_custom_params(self, alias, dbapiModuleName=None, db_connect_string=''): + + logger.info('Creating Db Connection using : alias=%s, dbapiModuleName=%s, db_connect_string=%s' % (alias, dbapiModuleName, db_connect_string)) - def connect_to_database_using_custom_params(self, dbapiModuleName=None, db_connect_string=''): + return self._connect_to_database_using_custom_params(alias, dbapiModuleName, db_connect_string) + + def _connect_to_database_using_custom_params(self, alias, dbapiModuleName=None, db_connect_string=''): """ Loads the DB API 2.0 module given `dbapiModuleName` then uses it to connect to the database using the map string `db_custom_param_string`. @@ -148,9 +208,11 @@ def connect_to_database_using_custom_params(self, dbapiModuleName=None, db_conne self.db_api_module_name = dbapiModuleName logger.info('Executing : Connect To Database Using Custom Params : %s.connect(%s) ' % (dbapiModuleName, db_connect_string)) - self._dbconnection = eval(db_connect_string) + dbconnection = eval(db_connect_string) + + self._cache.register(dbconnection, alias=alias) - def disconnect_from_database(self): + def disconnect_from_database(self,alias): """ Disconnects from the database. @@ -158,9 +220,11 @@ def disconnect_from_database(self): | Disconnect From Database | # disconnects from current connection to the database | """ logger.info('Executing : Disconnect From Database') - self._dbconnection.close() + connection = self._cache.switch(alias) + connection.close() - def set_auto_commit(self, autoCommit=True): + + def set_auto_commit(self, alias,autoCommit=True): """ Turn the autocommit on the database connection ON or OFF. @@ -177,4 +241,7 @@ def set_auto_commit(self, autoCommit=True): | Set Auto Commit | False """ logger.info('Executing : Set Auto Commit') - self._dbconnection.autocommit = autoCommit + connection = self._cache.switch(alias) + connection.autocommit = autoCommit + #self._cache.register(connection, alias=alias) + diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index 13c269c..e2368ca 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -21,7 +21,7 @@ class Query(object): Query handles all the querying done by the Database Library. """ - def query(self, selectStatement, sansTran=False, returnAsDict=False): + def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): """ Uses the input `selectStatement` to query for the values that will be returned as a list of tuples. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -57,7 +57,8 @@ def query(self, selectStatement, sansTran=False, returnAsDict=False): """ cur = None try: - cur = self._dbconnection.cursor() + connection = self._cache.switch(alias) + cur = connection.cursor() logger.info('Executing : Query | %s ' % selectStatement) self.__execute_sql(cur, selectStatement) allRows = cur.fetchall() @@ -77,9 +78,9 @@ def query(self, selectStatement, sansTran=False, returnAsDict=False): finally: if cur: if not sansTran: - self._dbconnection.rollback() + connection.rollback() - def row_count(self, selectStatement, sansTran=False): + def row_count(self,alias, selectStatement, sansTran=False): """ Uses the input `selectStatement` to query the database and returns the number of rows from the query. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -108,7 +109,8 @@ def row_count(self, selectStatement, sansTran=False): """ cur = None try: - cur = self._dbconnection.cursor() + connection = self._cache.switch(alias) + cur = connection.cursor() logger.info('Executing : Row Count | %s ' % selectStatement) self.__execute_sql(cur, selectStatement) data = cur.fetchall() @@ -120,9 +122,9 @@ def row_count(self, selectStatement, sansTran=False): finally: if cur: if not sansTran: - self._dbconnection.rollback() + connection.rollback() - def description(self, selectStatement, sansTran=False): + def description(self,alias, selectStatement, sansTran=False): """ Uses the input `selectStatement` to query a table in the db which will be used to determine the description. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -145,7 +147,8 @@ def description(self, selectStatement, sansTran=False): """ cur = None try: - cur = self._dbconnection.cursor() + connection = self._cache.switch(alias) + cur = connection.cursor() logger.info('Executing : Description | %s ' % selectStatement) self.__execute_sql(cur, selectStatement) description = list(cur.description) @@ -156,9 +159,9 @@ def description(self, selectStatement, sansTran=False): finally: if cur: if not sansTran: - self._dbconnection.rollback() + connection.rollback() - def delete_all_rows_from_table(self, tableName, sansTran=False): + def delete_all_rows_from_table(self,alias, tableName, sansTran=False): """ Delete all the rows within a given table. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -180,21 +183,22 @@ def delete_all_rows_from_table(self, tableName, sansTran=False): cur = None selectStatement = ("DELETE FROM %s;" % tableName) try: - cur = self._dbconnection.cursor() + connection = self._cache.switch(alias) + cur = connection.cursor() logger.info('Executing : Delete All Rows From Table | %s ' % selectStatement) result = self.__execute_sql(cur, selectStatement) if result is not None: if not sansTran: - self._dbconnection.commit() + connection.commit() return result if not sansTran: - self._dbconnection.commit() + connection.commit() finally: if cur: if not sansTran: - self._dbconnection.rollback() + connection.rollback() - def execute_sql_script(self, sqlScriptFileName, sansTran=False): + def execute_sql_script(self,alias, sqlScriptFileName, sansTran=False): """ Executes the content of the `sqlScriptFileName` as SQL commands and returns number of rows affected. Useful for setting the database to @@ -255,7 +259,8 @@ def execute_sql_script(self, sqlScriptFileName, sansTran=False): cur = None result = 0 try: - cur = self._dbconnection.cursor() + connection = self._cache.switch(alias) + cur = connection.cursor() logger.info('Executing : Execute SQL Script | %s ' % sqlScriptFileName) sqlStatement = '' for line in sqlScriptFile: @@ -287,14 +292,14 @@ def execute_sql_script(self, sqlScriptFileName, sansTran=False): result = self.__execute_sql(cur, sqlStatement) if not sansTran: - self._dbconnection.commit() + connection.commit() finally: if cur: if not sansTran: - self._dbconnection.rollback() + connection.rollback() return result - def execute_sql_string(self, sqlString, sansTran=False): + def execute_sql_string(self,alias, sqlString, sansTran=False): """ Executes the sqlString as SQL commands and returns number of rows affected. Useful to pass arguments to your sql. Set optional input @@ -315,18 +320,19 @@ def execute_sql_string(self, sqlString, sansTran=False): cur = None result = 0 try: - cur = self._dbconnection.cursor() + connection = self._cache.switch(alias) + cur = connection.cursor() logger.info('Executing : Execute SQL String | %s ' % sqlString) result = self.__execute_sql(cur, sqlString) if not sansTran: - self._dbconnection.commit() + connection.commit() finally: if cur: if not sansTran: - self._dbconnection.rollback() + connection.rollback() return result - def call_stored_procedure(self, spName, spParams=None, sansTran=False): + def call_stored_procedure(self,alias, spName, spParams=None, sansTran=False): """ Uses the inputs of `spName` and 'spParams' to call a stored procedure. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -353,10 +359,11 @@ def call_stored_procedure(self, spName, spParams=None, sansTran=False): spParams = [] cur = None try: + connection = self._cache.switch(alias) if self.db_api_module_name in ["cx_Oracle"]: - cur = self._dbconnection.cursor() + cur = connection.cursor() else: - cur = self._dbconnection.cursor(as_dict=False) + cur = connection.cursor(as_dict=False) PY3K = sys.version_info >= (3, 0) if not PY3K: spName = spName.encode('ascii', 'ignore') @@ -368,12 +375,12 @@ def call_stored_procedure(self, spName, spParams=None, sansTran=False): #logger.info ( ' %s ' % (row)) retVal.append(row) if not sansTran: - self._dbconnection.commit() + connection.commit() return retVal finally: if cur: if not sansTran: - self._dbconnection.rollback() + connection.rollback() def __execute_sql(self, cur, sqlStatement): return cur.execute(sqlStatement) From 7ce303d03431228bf55f0c275c8503ef9231f74f Mon Sep 17 00:00:00 2001 From: fpremoli Date: Thu, 14 Mar 2019 12:49:25 +0100 Subject: [PATCH 02/16] first try error handling --- src/DatabaseLibrary/connection_manager.py | 7 +++---- src/DatabaseLibrary/query.py | 2 ++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/DatabaseLibrary/connection_manager.py b/src/DatabaseLibrary/connection_manager.py index 28c5724..1f1dc1c 100644 --- a/src/DatabaseLibrary/connection_manager.py +++ b/src/DatabaseLibrary/connection_manager.py @@ -13,6 +13,7 @@ # limitations under the License. import importlib +import robot from robot.libraries.BuiltIn import BuiltIn from urllib.parse import urlparse @@ -33,7 +34,7 @@ def __init__(self): Initializes _dbconnection to None. """ - self._cache = robot.utils.ConnectionCache('No sessions created') + self._cache = robot.utils.ConnectionCache('No connection created') self.builtin = BuiltIn() #self._dbconnection = None self.db_api_module_name = None @@ -133,9 +134,7 @@ def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUserna | # uses explicit `dbapiModuleName` and `dbName` but uses the `dbUsername` and `dbPassword` in './resources/db.cfg' | | Connect To Database | psycopg2 | my_db_test | """ - - - + if dbapiModuleName == "excel" or dbapiModuleName == "excelrw": self.db_api_module_name = "pyodbc" db_api_2 = importlib.import_module("pyodbc") diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index e2368ca..5a4dd2a 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -75,6 +75,8 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): return mappedRows return allRows + except Exception as e: + self.builtin.fail("Query failed: %s",e) finally: if cur: if not sansTran: From 54b1e014528fec096e66e805e5da2ad7953520c3 Mon Sep 17 00:00:00 2001 From: fpremoli Date: Thu, 14 Mar 2019 14:35:34 +0100 Subject: [PATCH 03/16] error handling 2 --- src/DatabaseLibrary/query.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index 5a4dd2a..66f3c39 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -14,7 +14,8 @@ import sys from robot.api import logger - +import robot +from robot.libraries.BuiltIn import BuiltIn class Query(object): """ @@ -76,7 +77,7 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): return allRows except Exception as e: - self.builtin.fail("Query failed: %s",e) + logger.info('Query failed: %s' % str(e)) finally: if cur: if not sansTran: From 4938883aaa1c9308b1f950bf8c1fdce5bb2a8283 Mon Sep 17 00:00:00 2001 From: fpremoli Date: Thu, 14 Mar 2019 14:39:19 +0100 Subject: [PATCH 04/16] remove handling error --- src/DatabaseLibrary/query.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index 66f3c39..5290010 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -76,8 +76,6 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): return mappedRows return allRows - except Exception as e: - logger.info('Query failed: %s' % str(e)) finally: if cur: if not sansTran: From dc6ac3dd56cc3f3f174e37b6f6436451678d2ba4 Mon Sep 17 00:00:00 2001 From: fpremoli Date: Thu, 14 Mar 2019 15:05:15 +0100 Subject: [PATCH 05/16] handling error --- src/DatabaseLibrary/query.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index 5290010..a6fd5b5 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -76,6 +76,8 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): return mappedRows return allRows + except RuntimeError as Error: + logger.Error('Connessione %s chiusa' % alias) finally: if cur: if not sansTran: From 505e1a5236a1b9222477f96e9891bb93a7a9516f Mon Sep 17 00:00:00 2001 From: fpremoli Date: Thu, 14 Mar 2019 15:07:55 +0100 Subject: [PATCH 06/16] handling error --- src/DatabaseLibrary/query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index a6fd5b5..3c12978 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -77,7 +77,7 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): return allRows except RuntimeError as Error: - logger.Error('Connessione %s chiusa' % alias) + logger.error('Connessione %s chiusa' % alias) finally: if cur: if not sansTran: From 3f156e43842ccc17df473311b29346a4379b4ccd Mon Sep 17 00:00:00 2001 From: fpremoli Date: Thu, 14 Mar 2019 15:38:07 +0100 Subject: [PATCH 07/16] next handling --- src/DatabaseLibrary/query.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index 3c12978..e995def 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -76,8 +76,8 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): return mappedRows return allRows - except RuntimeError as Error: - logger.error('Connessione %s chiusa' % alias) + except InterfaceError as Error: + logger.error('Connection %s Already Close' % alias) finally: if cur: if not sansTran: From df4b71e78cd774a59f0d2cbc335836cf928dab57 Mon Sep 17 00:00:00 2001 From: fpremoli Date: Thu, 14 Mar 2019 16:13:06 +0100 Subject: [PATCH 08/16] Exception --- src/DatabaseLibrary/query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index e995def..45cd456 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -76,7 +76,7 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): return mappedRows return allRows - except InterfaceError as Error: + except Exception as Error: logger.error('Connection %s Already Close' % alias) finally: if cur: From fbbf2694eaad1b663a941759b60986e98462b1e1 Mon Sep 17 00:00:00 2001 From: fpremoli Date: Thu, 14 Mar 2019 16:25:45 +0100 Subject: [PATCH 09/16] remove all --- src/DatabaseLibrary/query.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index 45cd456..5290010 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -76,8 +76,6 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): return mappedRows return allRows - except Exception as Error: - logger.error('Connection %s Already Close' % alias) finally: if cur: if not sansTran: From 3623e51442fef997cf1e4d972cef745705d8ea04 Mon Sep 17 00:00:00 2001 From: fpremoli Date: Fri, 15 Mar 2019 11:17:28 +0100 Subject: [PATCH 10/16] change query e rowcount return e error handling --- src/DatabaseLibrary/query.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index 5290010..f53f6a0 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -68,17 +68,21 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): mappedRows = [] col_names = [c[0] for c in cur.description] + for rowIdx in range(len(allRows)): d = {} for colIdx in range(len(allRows[rowIdx])): d[col_names[colIdx]] = allRows[rowIdx][colIdx] mappedRows.append(d) - return mappedRows + return 'DONE',mappedRows - return allRows + return 'DONE',allRows + except Exception as Err: + logger.info('Error: %s' % Err) + return 'ERROR',None finally: if cur: - if not sansTran: + if not sansTran: connection.rollback() def row_count(self,alias, selectStatement, sansTran=False): @@ -118,8 +122,11 @@ def row_count(self,alias, selectStatement, sansTran=False): if self.db_api_module_name in ["sqlite3", "ibm_db", "ibm_db_dbi", "pyodbc"]: rowCount = len(data) else: - rowCount = cur.rowcount - return rowCount + rowCount = cur.rowcount + return 'DONE',rowCount + except Exception as Err: + logger.info('Error: %s' % Err) + return 'ERROR',None finally: if cur: if not sansTran: From fe644a23c5747c5ebff49b9f8bcca6eb44a2ddf0 Mon Sep 17 00:00:00 2001 From: fpremoli Date: Fri, 15 Mar 2019 16:53:32 +0100 Subject: [PATCH 11/16] error handling connect to db --- src/DatabaseLibrary/connection_manager.py | 106 ++++++++++++---------- 1 file changed, 57 insertions(+), 49 deletions(-) diff --git a/src/DatabaseLibrary/connection_manager.py b/src/DatabaseLibrary/connection_manager.py index 1f1dc1c..42743ca 100644 --- a/src/DatabaseLibrary/connection_manager.py +++ b/src/DatabaseLibrary/connection_manager.py @@ -15,6 +15,7 @@ import importlib import robot from robot.libraries.BuiltIn import BuiltIn +from robot.utils.asserts import fail from urllib.parse import urlparse try: @@ -35,7 +36,8 @@ def __init__(self): """ self._cache = robot.utils.ConnectionCache('No connection created') - self.builtin = BuiltIn() + self.builtin = BuiltIn() + #self._dbconnection = None self.db_api_module_name = None @@ -134,54 +136,60 @@ def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUserna | # uses explicit `dbapiModuleName` and `dbName` but uses the `dbUsername` and `dbPassword` in './resources/db.cfg' | | Connect To Database | psycopg2 | my_db_test | """ - - if dbapiModuleName == "excel" or dbapiModuleName == "excelrw": - self.db_api_module_name = "pyodbc" - db_api_2 = importlib.import_module("pyodbc") - else: - self.db_api_module_name = dbapiModuleName - db_api_2 = importlib.import_module(dbapiModuleName) - if dbapiModuleName in ["MySQLdb", "pymysql"]: - dbPort = dbPort or 3306 - logger.info('Connecting using : %s.connect(db=%s, user=%s, passwd=%s, host=%s, port=%s, charset=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort, dbCharset)) - dbconnection = db_api_2.connect(db=dbName, user=dbUsername, passwd=dbPassword, host=dbHost, port=dbPort, charset=dbCharset) - elif dbapiModuleName in ["psycopg2"]: - dbPort = dbPort or 5432 - logger.info('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort)) - dbconnection = db_api_2.connect(database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) - elif dbapiModuleName in ["pyodbc", "pypyodbc"]: - dbPort = dbPort or 1433 - logger.info('Connecting using : %s.connect(DRIVER={SQL Server};SERVER=%s,%s;DATABASE=%s;UID=%s;PWD=%s)' % (dbapiModuleName, dbHost, dbPort, dbName, dbUsername, dbPassword)) - dbconnection = db_api_2.connect('DRIVER={SQL Server};SERVER=%s,%s;DATABASE=%s;UID=%s;PWD=%s' % (dbHost, dbPort, dbName, dbUsername, dbPassword)) - elif dbapiModuleName in ["excel"]: - logger.info( - 'Connecting using : %s.connect(DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=1;Extended Properties="Excel 8.0;HDR=YES";)' % ( - dbapiModuleName, dbName)) - dbconnection = db_api_2.connect( - 'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=1;Extended Properties="Excel 8.0;HDR=YES";)' % ( - dbName), autocommit=True) - elif dbapiModuleName in ["excelrw"]: - logger.info( - 'Connecting using : %s.connect(DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=0;Extended Properties="Excel 8.0;HDR=YES";)' % ( - dbapiModuleName, dbName)) - dbconnection = db_api_2.connect( - 'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=0;Extended Properties="Excel 8.0;HDR=YES";)' % ( - dbName), autocommit=True) - elif dbapiModuleName in ["ibm_db", "ibm_db_dbi"]: - dbPort = dbPort or 50000 - logger.info('Connecting using : %s.connect(DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;) ' % (dbapiModuleName, dbName, dbHost, dbPort, dbUsername, dbPassword)) - dbconnection = db_api_2.connect('DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;' % (dbName, dbHost, dbPort, dbUsername, dbPassword), '', '') - elif dbapiModuleName in ["cx_Oracle"]: - dbPort = dbPort or 1521 - oracle_dsn = db_api_2.makedsn(host=dbHost, port=dbPort, service_name=dbName) - logger.info('Connecting using: %s.connect(user=%s, password=%s, dsn=%s) ' % (dbapiModuleName, dbUsername, dbPassword, oracle_dsn)) - dbconnection = db_api_2.connect(user=dbUsername, password=dbPassword, dsn=oracle_dsn) - else: - logger.info('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort)) - dbconnection = db_api_2.connect(database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) - - - self._cache.register(dbconnection, alias=alias) + try: + + if dbapiModuleName == "excel" or dbapiModuleName == "excelrw": + self.db_api_module_name = "pyodbc" + db_api_2 = importlib.import_module("pyodbc") + else: + self.db_api_module_name = dbapiModuleName + db_api_2 = importlib.import_module(dbapiModuleName) + if dbapiModuleName in ["MySQLdb", "pymysql"]: + dbPort = dbPort or 3306 + logger.info('Connecting using : %s.connect(db=%s, user=%s, passwd=%s, host=%s, port=%s, charset=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort, dbCharset)) + dbconnection = db_api_2.connect(db=dbName, user=dbUsername, passwd=dbPassword, host=dbHost, port=dbPort, charset=dbCharset) + elif dbapiModuleName in ["psycopg2"]: + dbPort = dbPort or 5432 + logger.info('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort)) + dbconnection = db_api_2.connect(database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) + elif dbapiModuleName in ["pyodbc", "pypyodbc"]: + dbPort = dbPort or 1433 + logger.info('Connecting using : %s.connect(DRIVER={SQL Server};SERVER=%s,%s;DATABASE=%s;UID=%s;PWD=%s)' % (dbapiModuleName, dbHost, dbPort, dbName, dbUsername, dbPassword)) + dbconnection = db_api_2.connect('DRIVER={SQL Server};SERVER=%s,%s;DATABASE=%s;UID=%s;PWD=%s' % (dbHost, dbPort, dbName, dbUsername, dbPassword)) + elif dbapiModuleName in ["excel"]: + logger.info( + 'Connecting using : %s.connect(DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=1;Extended Properties="Excel 8.0;HDR=YES";)' % ( + dbapiModuleName, dbName)) + dbconnection = db_api_2.connect( + 'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=1;Extended Properties="Excel 8.0;HDR=YES";)' % ( + dbName), autocommit=True) + elif dbapiModuleName in ["excelrw"]: + logger.info( + 'Connecting using : %s.connect(DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=0;Extended Properties="Excel 8.0;HDR=YES";)' % ( + dbapiModuleName, dbName)) + dbconnection = db_api_2.connect( + 'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=0;Extended Properties="Excel 8.0;HDR=YES";)' % ( + dbName), autocommit=True) + elif dbapiModuleName in ["ibm_db", "ibm_db_dbi"]: + dbPort = dbPort or 50000 + logger.info('Connecting using : %s.connect(DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;) ' % (dbapiModuleName, dbName, dbHost, dbPort, dbUsername, dbPassword)) + dbconnection = db_api_2.connect('DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;' % (dbName, dbHost, dbPort, dbUsername, dbPassword), '', '') + elif dbapiModuleName in ["cx_Oracle"]: + dbPort = dbPort or 1521 + oracle_dsn = db_api_2.makedsn(host=dbHost, port=dbPort, service_name=dbName) + logger.info('Connecting using: %s.connect(user=%s, password=%s, dsn=%s) ' % (dbapiModuleName, dbUsername, dbPassword, oracle_dsn)) + dbconnection = db_api_2.connect(user=dbUsername, password=dbPassword, dsn=oracle_dsn) + else: + logger.info('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort)) + dbconnection = db_api_2.connect(database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) + + + self._cache.register(dbconnection, alias=alias) + + except Exception as Err: + err_msg = ('DbConnection : %s : %s' % (alias,Err)) + fail(err_msg) + def connect_to_database_using_custom_params(self, alias, dbapiModuleName=None, db_connect_string=''): From a24efe51d25f34e591d5b901118e079040a77c43 Mon Sep 17 00:00:00 2001 From: fpremoli Date: Fri, 15 Mar 2019 18:24:30 +0100 Subject: [PATCH 12/16] add assertion change --- src/DatabaseLibrary/assertion.py | 30 ++++++++++++----------- src/DatabaseLibrary/connection_manager.py | 2 +- src/DatabaseLibrary/query.py | 7 +++++- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/DatabaseLibrary/assertion.py b/src/DatabaseLibrary/assertion.py index 382f52b..08ce0c3 100644 --- a/src/DatabaseLibrary/assertion.py +++ b/src/DatabaseLibrary/assertion.py @@ -20,7 +20,7 @@ class Assertion(object): Assertion handles all the assertions of Database Library. """ - def check_if_exists_in_database(self, selectStatement, sansTran=False): + def check_if_exists_in_database(self,alias, selectStatement, sansTran=False): """ Check if any row would be returned by given the input `selectStatement`. If there are no results, then this will throw an AssertionError. Set optional input `sansTran` to True to run command without an explicit transaction @@ -42,11 +42,11 @@ def check_if_exists_in_database(self, selectStatement, sansTran=False): | Check If Exists In Database | SELECT id FROM person WHERE first_name = 'John' | True | """ logger.info ('Executing : Check If Exists In Database | %s ' % selectStatement) - if not self.query(selectStatement, sansTran): + if not self.query(alias,selectStatement, sansTran): raise AssertionError("Expected to have have at least one row from '%s' " "but got 0 rows." % selectStatement) - def check_if_not_exists_in_database(self, selectStatement, sansTran=False): + def check_if_not_exists_in_database(self,alias, selectStatement, sansTran=False): """ This is the negation of `check_if_exists_in_database`. @@ -70,12 +70,12 @@ def check_if_not_exists_in_database(self, selectStatement, sansTran=False): | Check If Not Exists In Database | SELECT id FROM person WHERE first_name = 'John' | True | """ logger.info('Executing : Check If Not Exists In Database | %s ' % selectStatement) - queryResults = self.query(selectStatement, sansTran) + queryResults = self.query(alias,selectStatement, sansTran) if queryResults: raise AssertionError("Expected to have have no rows from '%s' " "but got some rows : %s." % (selectStatement, queryResults)) - def row_count_is_0(self, selectStatement, sansTran=False): + def row_count_is_0(self,alias, selectStatement, sansTran=False): """ Check if any rows are returned from the submitted `selectStatement`. If there are, then this will throw an AssertionError. Set optional input `sansTran` to True to run command without an explicit transaction commit or @@ -97,12 +97,12 @@ def row_count_is_0(self, selectStatement, sansTran=False): | Row Count is 0 | SELECT id FROM person WHERE first_name = 'John' | True | """ logger.info('Executing : Row Count Is 0 | %s ' % selectStatement) - num_rows = self.row_count(selectStatement, sansTran) + num_rows = self.row_count(alias,selectStatement, sansTran) if num_rows > 0: raise AssertionError("Expected zero rows to be returned from '%s' " "but got rows back. Number of rows returned was %s" % (selectStatement, num_rows)) - def row_count_is_equal_to_x(self, selectStatement, numRows, sansTran=False): + def row_count_is_equal_to_x(self,alias, selectStatement, numRows, sansTran=False): """ Check if the number of rows returned from `selectStatement` is equal to the value submitted. If not, then this will throw an AssertionError. Set optional input `sansTran` to True to run command without an explicit @@ -125,12 +125,12 @@ def row_count_is_equal_to_x(self, selectStatement, numRows, sansTran=False): | Row Count Is Equal To X | SELECT id FROM person WHERE first_name = 'John' | 0 | True | """ logger.info('Executing : Row Count Is Equal To X | %s | %s ' % (selectStatement, numRows)) - num_rows = self.row_count(selectStatement, sansTran) + num_rows = self.row_count(alias,selectStatement, sansTran) if num_rows != int(numRows.encode('ascii')): raise AssertionError("Expected same number of rows to be returned from '%s' " "than the returned rows of %s" % (selectStatement, num_rows)) - def row_count_is_greater_than_x(self, selectStatement, numRows, sansTran=False): + def row_count_is_greater_than_x(self,alias, selectStatement, numRows, sansTran=False): """ Check if the number of rows returned from `selectStatement` is greater than the value submitted. If not, then this will throw an AssertionError. Set optional input `sansTran` to True to run command without an explicit @@ -153,12 +153,12 @@ def row_count_is_greater_than_x(self, selectStatement, numRows, sansTran=False): | Row Count Is Greater Than X | SELECT id FROM person | 1 | True | """ logger.info('Executing : Row Count Is Greater Than X | %s | %s ' % (selectStatement, numRows)) - num_rows = self.row_count(selectStatement, sansTran) + num_rows = self.row_count(alias,selectStatement, sansTran) if num_rows <= int(numRows.encode('ascii')): raise AssertionError("Expected more rows to be returned from '%s' " "than the returned rows of %s" % (selectStatement, num_rows)) - def row_count_is_less_than_x(self, selectStatement, numRows, sansTran=False): + def row_count_is_less_than_x(self,alias, selectStatement, numRows, sansTran=False): """ Check if the number of rows returned from `selectStatement` is less than the value submitted. If not, then this will throw an AssertionError. Set optional input `sansTran` to True to run command without an explicit @@ -181,12 +181,13 @@ def row_count_is_less_than_x(self, selectStatement, numRows, sansTran=False): | Row Count Is Less Than X | SELECT id FROM person | 3 | True | """ logger.info('Executing : Row Count Is Less Than X | %s | %s ' % (selectStatement, numRows)) - num_rows = self.row_count(selectStatement, sansTran) + status,num_rows = self.row_count(alias,selectStatement, sansTran) + logger.info('Row Num: %s ' % str(num_rows)) if num_rows >= int(numRows.encode('ascii')): raise AssertionError("Expected less rows to be returned from '%s' " "than the returned rows of %s" % (selectStatement, num_rows)) - def table_must_exist(self, tableName, sansTran=False): + def table_must_exist(self,alias, tableName, sansTran=False): """ Check if the table given exists in the database. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -212,6 +213,7 @@ def table_must_exist(self, tableName, sansTran=False): selectStatement = ("SELECT name FROM SYSIBM.SYSTABLES WHERE type='T' AND name=UPPER('%s')" % tableName) else: selectStatement = ("SELECT * FROM information_schema.tables WHERE table_name='%s'" % tableName) - num_rows = self.row_count(selectStatement, sansTran) + status,num_rows = self.row_count(alias,selectStatement, sansTran) + logger.info('Row Num: %s ' % str(num_rows)) if num_rows == 0: raise AssertionError("Table '%s' does not exist in the db" % tableName) diff --git a/src/DatabaseLibrary/connection_manager.py b/src/DatabaseLibrary/connection_manager.py index 42743ca..8086027 100644 --- a/src/DatabaseLibrary/connection_manager.py +++ b/src/DatabaseLibrary/connection_manager.py @@ -188,7 +188,7 @@ def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUserna except Exception as Err: err_msg = ('DbConnection : %s : %s' % (alias,Err)) - fail(err_msg) + raise AssertionError(err_msg) def connect_to_database_using_custom_params(self, alias, dbapiModuleName=None, db_connect_string=''): diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index f53f6a0..a3ac809 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -117,12 +117,17 @@ def row_count(self,alias, selectStatement, sansTran=False): connection = self._cache.switch(alias) cur = connection.cursor() logger.info('Executing : Row Count | %s ' % selectStatement) + self.__execute_sql(cur, selectStatement) data = cur.fetchall() + logger.info(data) + if self.db_api_module_name in ["sqlite3", "ibm_db", "ibm_db_dbi", "pyodbc"]: rowCount = len(data) else: - rowCount = cur.rowcount + rowCount = cur.rowcount + + logger.info(rowCount) return 'DONE',rowCount except Exception as Err: logger.info('Error: %s' % Err) From 917cc76a015cf2d49ba41cab49b88572e9f78ed8 Mon Sep 17 00:00:00 2001 From: fpremoli Date: Mon, 18 Mar 2019 16:36:02 +0100 Subject: [PATCH 13/16] insert caching dbapimodule --- .vscode/settings.json | 3 ++ src/DatabaseLibrary/assertion.py | 13 +++++---- src/DatabaseLibrary/connection_manager.py | 24 +++++++++++----- src/DatabaseLibrary/query.py | 34 +++++++++-------------- 4 files changed, 41 insertions(+), 33 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..500bc70 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.linting.pylintEnabled": true +} \ No newline at end of file diff --git a/src/DatabaseLibrary/assertion.py b/src/DatabaseLibrary/assertion.py index 08ce0c3..4afce4a 100644 --- a/src/DatabaseLibrary/assertion.py +++ b/src/DatabaseLibrary/assertion.py @@ -181,7 +181,7 @@ def row_count_is_less_than_x(self,alias, selectStatement, numRows, sansTran=Fals | Row Count Is Less Than X | SELECT id FROM person | 3 | True | """ logger.info('Executing : Row Count Is Less Than X | %s | %s ' % (selectStatement, numRows)) - status,num_rows = self.row_count(alias,selectStatement, sansTran) + num_rows = self.row_count(alias,selectStatement, sansTran) logger.info('Row Num: %s ' % str(num_rows)) if num_rows >= int(numRows.encode('ascii')): raise AssertionError("Expected less rows to be returned from '%s' " @@ -205,15 +205,18 @@ def table_must_exist(self,alias, tableName, sansTran=False): | Table Must Exist | person | True | """ logger.info('Executing : Table Must Exist | %s ' % tableName) - if self.db_api_module_name in ["cx_Oracle"]: + + connection,module_api = self._get_cache(alias) + + if module_api in ["cx_Oracle"]: selectStatement = ("SELECT * FROM all_objects WHERE object_type IN ('TABLE','VIEW') AND owner = SYS_CONTEXT('USERENV', 'SESSION_USER') AND object_name = UPPER('%s')" % tableName) - elif self.db_api_module_name in ["sqlite3"]: + elif module_api in ["sqlite3"]: selectStatement = ("SELECT name FROM sqlite_master WHERE type='table' AND name='%s' COLLATE NOCASE" % tableName) - elif self.db_api_module_name in ["ibm_db", "ibm_db_dbi"]: + elif module_api in ["ibm_db", "ibm_db_dbi"]: selectStatement = ("SELECT name FROM SYSIBM.SYSTABLES WHERE type='T' AND name=UPPER('%s')" % tableName) else: selectStatement = ("SELECT * FROM information_schema.tables WHERE table_name='%s'" % tableName) - status,num_rows = self.row_count(alias,selectStatement, sansTran) + num_rows = self.row_count(alias,selectStatement, sansTran) logger.info('Row Num: %s ' % str(num_rows)) if num_rows == 0: raise AssertionError("Table '%s' does not exist in the db" % tableName) diff --git a/src/DatabaseLibrary/connection_manager.py b/src/DatabaseLibrary/connection_manager.py index 8086027..3eaa4b6 100644 --- a/src/DatabaseLibrary/connection_manager.py +++ b/src/DatabaseLibrary/connection_manager.py @@ -34,12 +34,21 @@ def __init__(self): """ Initializes _dbconnection to None. """ - self._cache = robot.utils.ConnectionCache('No connection created') self.builtin = BuiltIn() - - #self._dbconnection = None self.db_api_module_name = None + + def _push_cache (self, alias, connection,db_api_module_name): + obj_dict = {'connection':connection, 'module':db_api_module_name} + self._cache.register(obj_dict, alias=alias) + + def _get_cache (self,alias): + obj_dict = self._cache.switch(alias) + dbconnection = obj_dict['connection'] + db_api_module_name = obj_dict['module'] + + return dbconnection,db_api_module_name + def connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUsername=None, dbPassword=None, dbHost=None, dbPort=None, dbCharset=None, dbConfigFile="./resources/db.cfg"): @@ -184,7 +193,8 @@ def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUserna dbconnection = db_api_2.connect(database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) - self._cache.register(dbconnection, alias=alias) + self._push_cache(alias, dbconnection,dbapiModuleName) + #self._cache.register(dbconnection, alias=alias) except Exception as Err: err_msg = ('DbConnection : %s : %s' % (alias,Err)) @@ -217,7 +227,7 @@ def _connect_to_database_using_custom_params(self, alias, dbapiModuleName=None, logger.info('Executing : Connect To Database Using Custom Params : %s.connect(%s) ' % (dbapiModuleName, db_connect_string)) dbconnection = eval(db_connect_string) - self._cache.register(dbconnection, alias=alias) + self._push_cache(alias, dbconnection,dbapiModuleName) def disconnect_from_database(self,alias): """ @@ -227,7 +237,7 @@ def disconnect_from_database(self,alias): | Disconnect From Database | # disconnects from current connection to the database | """ logger.info('Executing : Disconnect From Database') - connection = self._cache.switch(alias) + connection,module_api = self._get_cache(alias) connection.close() @@ -248,7 +258,7 @@ def set_auto_commit(self, alias,autoCommit=True): | Set Auto Commit | False """ logger.info('Executing : Set Auto Commit') - connection = self._cache.switch(alias) + connection,module_api = self._get_cache(alias) connection.autocommit = autoCommit #self._cache.register(connection, alias=alias) diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index a3ac809..ec38752 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -58,7 +58,7 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): """ cur = None try: - connection = self._cache.switch(alias) + connection,module_api = self._get_cache(alias) cur = connection.cursor() logger.info('Executing : Query | %s ' % selectStatement) self.__execute_sql(cur, selectStatement) @@ -74,15 +74,12 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): for colIdx in range(len(allRows[rowIdx])): d[col_names[colIdx]] = allRows[rowIdx][colIdx] mappedRows.append(d) - return 'DONE',mappedRows + return mappedRows - return 'DONE',allRows - except Exception as Err: - logger.info('Error: %s' % Err) - return 'ERROR',None + return allRows finally: if cur: - if not sansTran: + if not sansTran: connection.rollback() def row_count(self,alias, selectStatement, sansTran=False): @@ -114,7 +111,7 @@ def row_count(self,alias, selectStatement, sansTran=False): """ cur = None try: - connection = self._cache.switch(alias) + connection,module_api = self._get_cache(alias) cur = connection.cursor() logger.info('Executing : Row Count | %s ' % selectStatement) @@ -122,16 +119,11 @@ def row_count(self,alias, selectStatement, sansTran=False): data = cur.fetchall() logger.info(data) - if self.db_api_module_name in ["sqlite3", "ibm_db", "ibm_db_dbi", "pyodbc"]: + if module_api in ["sqlite3", "ibm_db", "ibm_db_dbi", "pyodbc"]: rowCount = len(data) else: rowCount = cur.rowcount - - logger.info(rowCount) - return 'DONE',rowCount - except Exception as Err: - logger.info('Error: %s' % Err) - return 'ERROR',None + return rowCount finally: if cur: if not sansTran: @@ -160,7 +152,7 @@ def description(self,alias, selectStatement, sansTran=False): """ cur = None try: - connection = self._cache.switch(alias) + connection,module_api = self._get_cache(alias) cur = connection.cursor() logger.info('Executing : Description | %s ' % selectStatement) self.__execute_sql(cur, selectStatement) @@ -196,7 +188,7 @@ def delete_all_rows_from_table(self,alias, tableName, sansTran=False): cur = None selectStatement = ("DELETE FROM %s;" % tableName) try: - connection = self._cache.switch(alias) + connection,module_api = self._get_cache(alias) cur = connection.cursor() logger.info('Executing : Delete All Rows From Table | %s ' % selectStatement) result = self.__execute_sql(cur, selectStatement) @@ -272,7 +264,7 @@ def execute_sql_script(self,alias, sqlScriptFileName, sansTran=False): cur = None result = 0 try: - connection = self._cache.switch(alias) + connection,module_api = self._get_cache(alias) cur = connection.cursor() logger.info('Executing : Execute SQL Script | %s ' % sqlScriptFileName) sqlStatement = '' @@ -333,7 +325,7 @@ def execute_sql_string(self,alias, sqlString, sansTran=False): cur = None result = 0 try: - connection = self._cache.switch(alias) + connection,module_api = self._get_cache(alias) cur = connection.cursor() logger.info('Executing : Execute SQL String | %s ' % sqlString) result = self.__execute_sql(cur, sqlString) @@ -372,8 +364,8 @@ def call_stored_procedure(self,alias, spName, spParams=None, sansTran=False): spParams = [] cur = None try: - connection = self._cache.switch(alias) - if self.db_api_module_name in ["cx_Oracle"]: + connection,module_api = self._get_cache(alias) + if module_api in ["cx_Oracle"]: cur = connection.cursor() else: cur = connection.cursor(as_dict=False) From 4b3efcebbcbd5247827a6e2d36b3db3e9cc958ea Mon Sep 17 00:00:00 2001 From: fpremoli Date: Mon, 18 Mar 2019 16:37:00 +0100 Subject: [PATCH 14/16] remove last self.db_api_module_name --- src/DatabaseLibrary/connection_manager.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/DatabaseLibrary/connection_manager.py b/src/DatabaseLibrary/connection_manager.py index 3eaa4b6..0837599 100644 --- a/src/DatabaseLibrary/connection_manager.py +++ b/src/DatabaseLibrary/connection_manager.py @@ -35,8 +35,7 @@ def __init__(self): Initializes _dbconnection to None. """ self._cache = robot.utils.ConnectionCache('No connection created') - self.builtin = BuiltIn() - self.db_api_module_name = None + self.builtin = BuiltIn() def _push_cache (self, alias, connection,db_api_module_name): obj_dict = {'connection':connection, 'module':db_api_module_name} @@ -148,11 +147,12 @@ def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUserna try: if dbapiModuleName == "excel" or dbapiModuleName == "excelrw": - self.db_api_module_name = "pyodbc" + db_api_module_name = "pyodbc" db_api_2 = importlib.import_module("pyodbc") else: - self.db_api_module_name = dbapiModuleName + db_api_module_name = dbapiModuleName db_api_2 = importlib.import_module(dbapiModuleName) + if dbapiModuleName in ["MySQLdb", "pymysql"]: dbPort = dbPort or 3306 logger.info('Connecting using : %s.connect(db=%s, user=%s, passwd=%s, host=%s, port=%s, charset=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort, dbCharset)) @@ -192,9 +192,7 @@ def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUserna logger.info('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort)) dbconnection = db_api_2.connect(database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) - - self._push_cache(alias, dbconnection,dbapiModuleName) - #self._cache.register(dbconnection, alias=alias) + self._push_cache(alias, dbconnection,db_api_module_name) except Exception as Err: err_msg = ('DbConnection : %s : %s' % (alias,Err)) @@ -204,7 +202,7 @@ def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUserna def connect_to_database_using_custom_params(self, alias, dbapiModuleName=None, db_connect_string=''): logger.info('Creating Db Connection using : alias=%s, dbapiModuleName=%s, db_connect_string=%s' % (alias, dbapiModuleName, db_connect_string)) - + return self._connect_to_database_using_custom_params(alias, dbapiModuleName, db_connect_string) def _connect_to_database_using_custom_params(self, alias, dbapiModuleName=None, db_connect_string=''): @@ -222,8 +220,7 @@ def _connect_to_database_using_custom_params(self, alias, dbapiModuleName=None, db_api_2 = importlib.import_module(dbapiModuleName) db_connect_string = 'db_api_2.connect(%s)' % db_connect_string - - self.db_api_module_name = dbapiModuleName + logger.info('Executing : Connect To Database Using Custom Params : %s.connect(%s) ' % (dbapiModuleName, db_connect_string)) dbconnection = eval(db_connect_string) @@ -260,5 +257,5 @@ def set_auto_commit(self, alias,autoCommit=True): logger.info('Executing : Set Auto Commit') connection,module_api = self._get_cache(alias) connection.autocommit = autoCommit - #self._cache.register(connection, alias=alias) + self._push_cache(alias, connection,module_api) From 2f7e3f360f14c873e9a071f4d9804c8e79583615 Mon Sep 17 00:00:00 2001 From: fpremoli Date: Wed, 20 Mar 2019 18:04:05 +0100 Subject: [PATCH 15/16] refactor --- .vscode/settings.json | 3 +- src/DatabaseLibrary/__init__.py | 1 + src/DatabaseLibrary/assertion.py | 64 +++--- src/DatabaseLibrary/connection_manager.py | 235 ++++++++++++---------- src/DatabaseLibrary/query.py | 64 +++--- 5 files changed, 202 insertions(+), 165 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 500bc70..c4fc3da 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "python.linting.pylintEnabled": true + "python.linting.pylintEnabled": true, + "python.pythonPath": "/usr/bin/python3" } \ No newline at end of file diff --git a/src/DatabaseLibrary/__init__.py b/src/DatabaseLibrary/__init__.py index 9ccc368..1bb38c1 100644 --- a/src/DatabaseLibrary/__init__.py +++ b/src/DatabaseLibrary/__init__.py @@ -21,6 +21,7 @@ __version_file_path__ = os.path.join(os.path.dirname(__file__), 'VERSION') __version__ = open(__version_file_path__, 'r').read().strip() + class DatabaseLibrary(ConnectionManager, Query, Assertion): """ Database Library contains utilities meant for Robot Framework's usage. diff --git a/src/DatabaseLibrary/assertion.py b/src/DatabaseLibrary/assertion.py index 4afce4a..d93ba12 100644 --- a/src/DatabaseLibrary/assertion.py +++ b/src/DatabaseLibrary/assertion.py @@ -20,7 +20,7 @@ class Assertion(object): Assertion handles all the assertions of Database Library. """ - def check_if_exists_in_database(self,alias, selectStatement, sansTran=False): + def check_if_exists_in_database(self, selectStatement, sansTran=False, alias=None): """ Check if any row would be returned by given the input `selectStatement`. If there are no results, then this will throw an AssertionError. Set optional input `sansTran` to True to run command without an explicit transaction @@ -41,12 +41,15 @@ def check_if_exists_in_database(self,alias, selectStatement, sansTran=False): Using optional `sansTran` to run command without an explicit transaction commit or rollback: | Check If Exists In Database | SELECT id FROM person WHERE first_name = 'John' | True | """ - logger.info ('Executing : Check If Exists In Database | %s ' % selectStatement) - if not self.query(alias,selectStatement, sansTran): + logger.info('Executing : Check If Exists In Database | %s ' % + selectStatement) + logger.info('Connection: Check If Exists In Database | %s' % alias) + + if not self.query(selectStatement=selectStatement, sansTran=sansTran, alias=alias): raise AssertionError("Expected to have have at least one row from '%s' " "but got 0 rows." % selectStatement) - def check_if_not_exists_in_database(self,alias, selectStatement, sansTran=False): + def check_if_not_exists_in_database(self, selectStatement, sansTran=False, alias=None): """ This is the negation of `check_if_exists_in_database`. @@ -69,13 +72,15 @@ def check_if_not_exists_in_database(self,alias, selectStatement, sansTran=False) Using optional `sansTran` to run command without an explicit transaction commit or rollback: | Check If Not Exists In Database | SELECT id FROM person WHERE first_name = 'John' | True | """ - logger.info('Executing : Check If Not Exists In Database | %s ' % selectStatement) - queryResults = self.query(alias,selectStatement, sansTran) + logger.info( + 'Executing : Check If Not Exists In Database | %s ' % selectStatement) + queryResults = self.query( + selectStatement=selectStatement, sansTran=sansTran, alias=alias) if queryResults: raise AssertionError("Expected to have have no rows from '%s' " "but got some rows : %s." % (selectStatement, queryResults)) - def row_count_is_0(self,alias, selectStatement, sansTran=False): + def row_count_is_0(self, selectStatement, sansTran=False, alias=None): """ Check if any rows are returned from the submitted `selectStatement`. If there are, then this will throw an AssertionError. Set optional input `sansTran` to True to run command without an explicit transaction commit or @@ -97,12 +102,12 @@ def row_count_is_0(self,alias, selectStatement, sansTran=False): | Row Count is 0 | SELECT id FROM person WHERE first_name = 'John' | True | """ logger.info('Executing : Row Count Is 0 | %s ' % selectStatement) - num_rows = self.row_count(alias,selectStatement, sansTran) + num_rows = self.row_count(selectStatement, sansTran, alias) if num_rows > 0: raise AssertionError("Expected zero rows to be returned from '%s' " "but got rows back. Number of rows returned was %s" % (selectStatement, num_rows)) - def row_count_is_equal_to_x(self,alias, selectStatement, numRows, sansTran=False): + def row_count_is_equal_to_x(self, selectStatement, numRows, sansTran=False, alias=None): """ Check if the number of rows returned from `selectStatement` is equal to the value submitted. If not, then this will throw an AssertionError. Set optional input `sansTran` to True to run command without an explicit @@ -124,13 +129,14 @@ def row_count_is_equal_to_x(self,alias, selectStatement, numRows, sansTran=False Using optional `sansTran` to run command without an explicit transaction commit or rollback: | Row Count Is Equal To X | SELECT id FROM person WHERE first_name = 'John' | 0 | True | """ - logger.info('Executing : Row Count Is Equal To X | %s | %s ' % (selectStatement, numRows)) - num_rows = self.row_count(alias,selectStatement, sansTran) + logger.info('Executing : Row Count Is Equal To X | %s | %s ' % + (selectStatement, numRows)) + num_rows = self.row_count(selectStatement, sansTran, alias) if num_rows != int(numRows.encode('ascii')): raise AssertionError("Expected same number of rows to be returned from '%s' " "than the returned rows of %s" % (selectStatement, num_rows)) - def row_count_is_greater_than_x(self,alias, selectStatement, numRows, sansTran=False): + def row_count_is_greater_than_x(self, selectStatement, numRows, sansTran=False, alias=None): """ Check if the number of rows returned from `selectStatement` is greater than the value submitted. If not, then this will throw an AssertionError. Set optional input `sansTran` to True to run command without an explicit @@ -152,13 +158,14 @@ def row_count_is_greater_than_x(self,alias, selectStatement, numRows, sansTran=F Using optional `sansTran` to run command without an explicit transaction commit or rollback: | Row Count Is Greater Than X | SELECT id FROM person | 1 | True | """ - logger.info('Executing : Row Count Is Greater Than X | %s | %s ' % (selectStatement, numRows)) - num_rows = self.row_count(alias,selectStatement, sansTran) + logger.info('Executing : Row Count Is Greater Than X | %s | %s ' % ( + selectStatement, numRows)) + num_rows = self.row_count(selectStatement, sansTran, alias) if num_rows <= int(numRows.encode('ascii')): raise AssertionError("Expected more rows to be returned from '%s' " "than the returned rows of %s" % (selectStatement, num_rows)) - def row_count_is_less_than_x(self,alias, selectStatement, numRows, sansTran=False): + def row_count_is_less_than_x(self, selectStatement, numRows, sansTran=False, alias=None): """ Check if the number of rows returned from `selectStatement` is less than the value submitted. If not, then this will throw an AssertionError. Set optional input `sansTran` to True to run command without an explicit @@ -180,14 +187,15 @@ def row_count_is_less_than_x(self,alias, selectStatement, numRows, sansTran=Fals Using optional `sansTran` to run command without an explicit transaction commit or rollback: | Row Count Is Less Than X | SELECT id FROM person | 3 | True | """ - logger.info('Executing : Row Count Is Less Than X | %s | %s ' % (selectStatement, numRows)) - num_rows = self.row_count(alias,selectStatement, sansTran) + logger.info('Executing : Row Count Is Less Than X | %s | %s ' % ( + selectStatement, numRows)) + num_rows = self.row_count(selectStatement, sansTran, alias) logger.info('Row Num: %s ' % str(num_rows)) if num_rows >= int(numRows.encode('ascii')): raise AssertionError("Expected less rows to be returned from '%s' " "than the returned rows of %s" % (selectStatement, num_rows)) - def table_must_exist(self,alias, tableName, sansTran=False): + def table_must_exist(self, tableName, sansTran=False, alias=None): """ Check if the table given exists in the database. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -205,18 +213,24 @@ def table_must_exist(self,alias, tableName, sansTran=False): | Table Must Exist | person | True | """ logger.info('Executing : Table Must Exist | %s ' % tableName) + logger.info('DbConnection: %s' % alias) - connection,module_api = self._get_cache(alias) + connection, module_api = self._get_cache(alias) if module_api in ["cx_Oracle"]: - selectStatement = ("SELECT * FROM all_objects WHERE object_type IN ('TABLE','VIEW') AND owner = SYS_CONTEXT('USERENV', 'SESSION_USER') AND object_name = UPPER('%s')" % tableName) + selectStatement = ("SELECT * FROM all_objects WHERE object_type IN ('TABLE','VIEW') AND owner = SYS_CONTEXT('USERENV', 'SESSION_USER') \ + AND object_name = UPPER('%s')" % tableName) elif module_api in ["sqlite3"]: - selectStatement = ("SELECT name FROM sqlite_master WHERE type='table' AND name='%s' COLLATE NOCASE" % tableName) + selectStatement = ( + "SELECT name FROM sqlite_master WHERE type='table' AND name='%s' COLLATE NOCASE" % tableName) elif module_api in ["ibm_db", "ibm_db_dbi"]: - selectStatement = ("SELECT name FROM SYSIBM.SYSTABLES WHERE type='T' AND name=UPPER('%s')" % tableName) + selectStatement = ( + "SELECT name FROM SYSIBM.SYSTABLES WHERE type='T' AND name=UPPER('%s')" % tableName) else: - selectStatement = ("SELECT * FROM information_schema.tables WHERE table_name='%s'" % tableName) - num_rows = self.row_count(alias,selectStatement, sansTran) + selectStatement = ( + "SELECT * FROM information_schema.tables WHERE table_name='%s'" % tableName) + num_rows = self.row_count(selectStatement, sansTran, alias) logger.info('Row Num: %s ' % str(num_rows)) if num_rows == 0: - raise AssertionError("Table '%s' does not exist in the db" % tableName) + raise AssertionError( + "Table '%s' does not exist in the db" % tableName) diff --git a/src/DatabaseLibrary/connection_manager.py b/src/DatabaseLibrary/connection_manager.py index 0837599..0963565 100644 --- a/src/DatabaseLibrary/connection_manager.py +++ b/src/DatabaseLibrary/connection_manager.py @@ -25,6 +25,7 @@ from robot.api import logger + class ConnectionManager(object): """ Connection Manager handles the connection & disconnection to the database. @@ -33,78 +34,37 @@ class ConnectionManager(object): def __init__(self): """ Initializes _dbconnection to None. + Added cache mode for multi connection use. + Added to all method a new field, alias (Name of connection) """ self._cache = robot.utils.ConnectionCache('No connection created') - self.builtin = BuiltIn() - - def _push_cache (self, alias, connection,db_api_module_name): - obj_dict = {'connection':connection, 'module':db_api_module_name} + self.builtin = BuiltIn() + + def _push_cache(self, alias=None, connection=None, db_api_module_name=None): + """ + Overlay _cache.register using dictionary + Create a dictionary that contains the dbconnection and the api_module used + and push it into the cache + """ + logger.info('Connection Name: %s | Db Module: %s ' % + (alias, db_api_module_name)) + obj_dict = {'connection': connection, 'module': db_api_module_name} self._cache.register(obj_dict, alias=alias) - def _get_cache (self,alias): + def _get_cache(self, alias=None): + """ + Overlay _cache.switch using dictionary + Get from cache the dictionary contain dbconnection and api_module + and return them + """ obj_dict = self._cache.switch(alias) dbconnection = obj_dict['connection'] db_api_module_name = obj_dict['module'] - return dbconnection,db_api_module_name - - - def connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUsername=None, dbPassword=None, dbHost=None, dbPort=None, dbCharset=None, dbConfigFile="./resources/db.cfg"): - - logger.info('Creating Db Connection using : alias=%s, dbapiModuleName=%s, dbName=%s, \ - dbUsername=%s, dbPassword=%s, dbHost=%s, dbPort=%s, dbCharset=%s, \ - dbConfigFile=%s ' % (alias, dbapiModuleName, dbName, dbUsername, dbPassword, dbHost,dbPort, dbCharset, dbConfigFile)) + return dbconnection, db_api_module_name - config = ConfigParser.ConfigParser() - config.read([dbConfigFile]) - - dbapiModuleName = dbapiModuleName or config.get('default', 'dbapiModuleName') - dbName = dbName or config.get('default', 'dbName') - dbUsername = dbUsername or config.get('default', 'dbUsername') - dbPassword = dbPassword if dbPassword is not None else config.get('default', 'dbPassword') - dbHost = dbHost or config.get('default', 'dbHost') or 'localhost' - dbPort = int(dbPort or config.get('default', 'dbPort')) - - return self._connect_to_database( - alias, - dbapiModuleName, - dbName, - dbUsername, - dbPassword, - dbHost, - dbPort, - dbCharset, - dbConfigFile) - - def connect_by_url(self,alias,dbapiModuleName=None,url=None, dbCharset=None, dbConfigFile="./resources/db.cfg"): - - logger.info('Creating Db Connection using : alias=%s, url=%s, dbapiModuleName=%s, dbCharset=%s, dbConfigFile=%s ' % (alias, url, dbapiModuleName, dbCharset, dbConfigFile)) - - config = ConfigParser.ConfigParser() - config.read([dbConfigFile]) - - dataConnection = urlparse(url) - - dbapiModuleName = dbapiModuleName or config.get('default', 'dbapiModuleName') - dbName = dataConnection.path[1:] or config.get('default', 'dbName') - dbUsername = dataConnection.username or config.get('default', 'dbUsername') - dbPassword = dataConnection.password if dataConnection.password is not None else config.get('default', 'dbPassword') - dbHost = dataConnection.hostname or config.get('default', 'dbHost') or 'localhost' - dbPort = int(dataConnection.port or config.get('default', 'dbPort')) - - - return self._connect_to_database( - alias, - dbapiModuleName, - dbName, - dbUsername, - dbPassword, - dbHost, - dbPort, - dbCharset, - dbConfigFile) - - def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUsername=None, dbPassword=None, dbHost=None, dbPort=None, dbCharset=None, dbConfigFile="./resources/db.cfg"): + def connect_to_database(self, dbapiModuleName=None, dbName=None, dbUsername=None, dbPassword=None, dbHost=None, + dbPort=None, dbCharset=None, dbConfigFile="./resources/db.cfg", url=None, alias=None): """ Loads the DB API 2.0 module given `dbapiModuleName` then uses it to connect to the database using `dbName`, `dbUsername`, and `dbPassword`. @@ -119,8 +79,12 @@ def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUserna The `dbConfigFile` is useful if you don't want to check into your SCM your database credentials. + Added new field alias + Added _cache.register to register given connection with alias + Example db.cfg file | [default] + | alias=aliasuwant | dbapiModuleName=pymysqlforexample | dbName=yourdbname | dbUsername=yourusername @@ -130,7 +94,7 @@ def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUserna Example usage: | # explicitly specifies all db property values | - | Connect To Database | psycopg2 | my_db | postgres | s3cr3t | tiger.foobar.com | 5432 | + | Connect To Database | alias | psycopg2 | my_db | postgres | s3cr3t | tiger.foobar.com | 5432 | | # loads all property values from default.cfg | | Connect To Database | dbConfigFile=default.cfg | @@ -139,11 +103,50 @@ def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUserna | Connect To Database | | # uses explicit `dbapiModuleName` and `dbName` but uses the `dbUsername` and `dbPassword` in 'default.cfg' | - | Connect To Database | psycopg2 | my_db_test | dbConfigFile=default.cfg | + | Connect To Database | alias | psycopg2 | my_db_test | dbConfigFile=default.cfg | | # uses explicit `dbapiModuleName` and `dbName` but uses the `dbUsername` and `dbPassword` in './resources/db.cfg' | - | Connect To Database | psycopg2 | my_db_test | + | Connect To Database | alias | psycopg2 | my_db_test | """ + + logger.info('Creating Db Connection using : alias=%s,url=%s dbapiModuleName=%s, dbName=%s, \ + dbUsername=%s, dbPassword=%s, dbHost=%s, dbPort=%s, dbCharset=%s, \ + dbConfigFile=%s ' % (alias, url, dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort, + dbCharset, dbConfigFile)) + + config = ConfigParser.ConfigParser() + config.read([dbConfigFile]) + + if not (url is None): + dataConnection = urlparse(url) + + dbapiModuleName = dbapiModuleName or config.get( + 'default', 'dbapiModuleName') + dbName = dbName or dataConnection.path[1:] or config.get( + 'default', 'dbName') + dbUsername = dbUsername or dataConnection.username or config.get( + 'default', 'dbUsername') + dbPassword = dbPassword if dbPassword is not None else \ + dataConnection.password if dataConnection.password is not None else \ + config.get('default', 'dbPassword') + dbHost = dbHost or dataConnection.hostname or config.get( + 'default', 'dbHost') or 'localhost' + dbPort = int(dbPort or dataConnection.port or config.get( + 'default', 'dbPort')) + + return self._connect_to_database( + alias, + dbapiModuleName, + dbName, + dbUsername, + dbPassword, + dbHost, + dbPort, + dbCharset, + dbConfigFile) + + def _connect_to_database(self, alias, dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort, dbCharset, dbConfigFile="./resources/db.cfg"): + try: if dbapiModuleName == "excel" or dbapiModuleName == "excelrw": @@ -155,107 +158,125 @@ def _connect_to_database(self,alias, dbapiModuleName=None, dbName=None, dbUserna if dbapiModuleName in ["MySQLdb", "pymysql"]: dbPort = dbPort or 3306 - logger.info('Connecting using : %s.connect(db=%s, user=%s, passwd=%s, host=%s, port=%s, charset=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort, dbCharset)) - dbconnection = db_api_2.connect(db=dbName, user=dbUsername, passwd=dbPassword, host=dbHost, port=dbPort, charset=dbCharset) + logger.info('Connecting using : %s.connect(db=%s, user=%s, passwd=%s, host=%s, port=%s, charset=%s) ' % + (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort, dbCharset)) + dbconnection = db_api_2.connect( + db=dbName, user=dbUsername, passwd=dbPassword, host=dbHost, port=dbPort, charset=dbCharset) elif dbapiModuleName in ["psycopg2"]: dbPort = dbPort or 5432 - logger.info('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort)) - dbconnection = db_api_2.connect(database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) + logger.info('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % + (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort)) + dbconnection = db_api_2.connect( + database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) elif dbapiModuleName in ["pyodbc", "pypyodbc"]: dbPort = dbPort or 1433 - logger.info('Connecting using : %s.connect(DRIVER={SQL Server};SERVER=%s,%s;DATABASE=%s;UID=%s;PWD=%s)' % (dbapiModuleName, dbHost, dbPort, dbName, dbUsername, dbPassword)) - dbconnection = db_api_2.connect('DRIVER={SQL Server};SERVER=%s,%s;DATABASE=%s;UID=%s;PWD=%s' % (dbHost, dbPort, dbName, dbUsername, dbPassword)) + logger.info('Connecting using : %s.connect(DRIVER={SQL Server};SERVER=%s,%s;DATABASE=%s;UID=%s;PWD=%s)' % + (dbapiModuleName, dbHost, dbPort, dbName, dbUsername, dbPassword)) + dbconnection = db_api_2.connect('DRIVER={SQL Server};SERVER=%s,%s;DATABASE=%s;UID=%s;PWD=%s' % + (dbHost, dbPort, dbName, dbUsername, dbPassword)) elif dbapiModuleName in ["excel"]: logger.info( - 'Connecting using : %s.connect(DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=1;Extended Properties="Excel 8.0;HDR=YES";)' % ( - dbapiModuleName, dbName)) + 'Connecting using : %s.connect(DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=1;' + 'Extended Properties="Excel 8.0;HDR=YES";)' % (dbapiModuleName, dbName)) dbconnection = db_api_2.connect( 'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=1;Extended Properties="Excel 8.0;HDR=YES";)' % ( dbName), autocommit=True) elif dbapiModuleName in ["excelrw"]: logger.info( - 'Connecting using : %s.connect(DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=0;Extended Properties="Excel 8.0;HDR=YES";)' % ( - dbapiModuleName, dbName)) + 'Connecting using : %s.connect(DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=0;' + 'Extended Properties="Excel 8.0;HDR=YES";)' % (dbapiModuleName, dbName)) dbconnection = db_api_2.connect( 'DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;ReadOnly=0;Extended Properties="Excel 8.0;HDR=YES";)' % ( dbName), autocommit=True) elif dbapiModuleName in ["ibm_db", "ibm_db_dbi"]: dbPort = dbPort or 50000 - logger.info('Connecting using : %s.connect(DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;) ' % (dbapiModuleName, dbName, dbHost, dbPort, dbUsername, dbPassword)) - dbconnection = db_api_2.connect('DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;' % (dbName, dbHost, dbPort, dbUsername, dbPassword), '', '') + logger.info('Connecting using : %s.connect(DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;) ' % + (dbapiModuleName, dbName, dbHost, dbPort, dbUsername, dbPassword)) + dbconnection = db_api_2.connect('DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s;' % + (dbName, dbHost, dbPort, dbUsername, dbPassword), '', '') elif dbapiModuleName in ["cx_Oracle"]: dbPort = dbPort or 1521 - oracle_dsn = db_api_2.makedsn(host=dbHost, port=dbPort, service_name=dbName) - logger.info('Connecting using: %s.connect(user=%s, password=%s, dsn=%s) ' % (dbapiModuleName, dbUsername, dbPassword, oracle_dsn)) - dbconnection = db_api_2.connect(user=dbUsername, password=dbPassword, dsn=oracle_dsn) + oracle_dsn = db_api_2.makedsn( + host=dbHost, port=dbPort, service_name=dbName) + logger.info('Connecting using: %s.connect(user=%s, password=%s, dsn=%s) ' % ( + dbapiModuleName, dbUsername, dbPassword, oracle_dsn)) + dbconnection = db_api_2.connect( + user=dbUsername, password=dbPassword, dsn=oracle_dsn) else: - logger.info('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort)) - dbconnection = db_api_2.connect(database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) + logger.info('Connecting using : %s.connect(database=%s, user=%s, password=%s, host=%s, port=%s) ' % + (dbapiModuleName, dbName, dbUsername, dbPassword, dbHost, dbPort)) + dbconnection = db_api_2.connect( + database=dbName, user=dbUsername, password=dbPassword, host=dbHost, port=dbPort) - self._push_cache(alias, dbconnection,db_api_module_name) + self._push_cache(alias, dbconnection, db_api_module_name) except Exception as Err: - err_msg = ('DbConnection : %s : %s' % (alias,Err)) + err_msg = ('DbConnection : %s : %s' % (alias, Err)) raise AssertionError(err_msg) - - def connect_to_database_using_custom_params(self, alias, dbapiModuleName=None, db_connect_string=''): + def connect_to_database_using_custom_params(self, dbapiModuleName=None, db_connect_string='', alias=None): + + logger.info('Creating Db Connection using : alias=%s, dbapiModuleName=%s, db_connect_string=%s' % + (alias, dbapiModuleName, db_connect_string)) - logger.info('Creating Db Connection using : alias=%s, dbapiModuleName=%s, db_connect_string=%s' % (alias, dbapiModuleName, db_connect_string)) - return self._connect_to_database_using_custom_params(alias, dbapiModuleName, db_connect_string) - def _connect_to_database_using_custom_params(self, alias, dbapiModuleName=None, db_connect_string=''): + def _connect_to_database_using_custom_params(self, dbapiModuleName=None, db_connect_string='', alias=None): """ Loads the DB API 2.0 module given `dbapiModuleName` then uses it to connect to the database using the map string `db_custom_param_string`. + Added field alias + Example usage: | # for psycopg2 | - | Connect To Database Using Custom Params | psycopg2 | database='my_db_test', user='postgres', password='s3cr3t', host='tiger.foobar.com', port=5432 | + | Connect To Database Using Custom Params | alias | psycopg2 | database='my_db_test', user='postgres', password='s3cr3t', host='tiger.foobar.com', port=5432 | | # for JayDeBeApi | - | Connect To Database Using Custom Params | JayDeBeApi | 'oracle.jdbc.driver.OracleDriver', 'my_db_test', 'system', 's3cr3t' | + | Connect To Database Using Custom Params | alias | JayDeBeApi | 'oracle.jdbc.driver.OracleDriver', 'my_db_test', 'system', 's3cr3t' | """ + db_api_2 = importlib.import_module(dbapiModuleName) db_connect_string = 'db_api_2.connect(%s)' % db_connect_string - - logger.info('Executing : Connect To Database Using Custom Params : %s.connect(%s) ' % (dbapiModuleName, db_connect_string)) + + logger.info('Executing : Connect To Database Using Custom Params : %s.connect(%s) ' % ( + dbapiModuleName, db_connect_string)) dbconnection = eval(db_connect_string) - self._push_cache(alias, dbconnection,dbapiModuleName) + self._push_cache(alias, dbconnection, dbapiModuleName) - def disconnect_from_database(self,alias): + def disconnect_from_database(self, alias=None): """ Disconnects from the database. + Added field alias For example: - | Disconnect From Database | # disconnects from current connection to the database | + | Disconnect From Database | alias | # disconnects from current connection to the database | """ logger.info('Executing : Disconnect From Database') - connection,module_api = self._get_cache(alias) + connection, module_api = self._get_cache(alias) connection.close() - - def set_auto_commit(self, alias,autoCommit=True): + def set_auto_commit(self, autoCommit=True, alias=None): """ Turn the autocommit on the database connection ON or OFF. - + The default behaviour on a newly created database connection is to automatically start a transaction, which means that database actions that won't work if there is an active transaction will fail. Common examples of these actions are creating or deleting a database or database snapshot. By turning on auto commit on the database connection these actions can be performed. - + + Added field alias + Example: | # Default behaviour, sets auto commit to true - | Set Auto Commit + | Set Auto Commit | alias | # Explicitly set the desired state - | Set Auto Commit | False + | Set Auto Commit | alias | False """ logger.info('Executing : Set Auto Commit') - connection,module_api = self._get_cache(alias) + connection, module_api = self._get_cache(alias) connection.autocommit = autoCommit - self._push_cache(alias, connection,module_api) - + self._push_cache(alias, connection, module_api) diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index ec38752..7889e03 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -17,12 +17,13 @@ import robot from robot.libraries.BuiltIn import BuiltIn + class Query(object): """ Query handles all the querying done by the Database Library. """ - def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): + def query(self, selectStatement, sansTran=False, returnAsDict=False, alias=None): """ Uses the input `selectStatement` to query for the values that will be returned as a list of tuples. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -57,8 +58,11 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): | @{queryResults} | Query | SELECT * FROM person | True | """ cur = None + logger.info('Connection: Query | %s' % alias) + try: - connection,module_api = self._get_cache(alias) + connection, module_api = self._get_cache(alias) + logger.info('Module: Query | %s' % module_api) cur = connection.cursor() logger.info('Executing : Query | %s ' % selectStatement) self.__execute_sql(cur, selectStatement) @@ -67,8 +71,6 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): if returnAsDict: mappedRows = [] col_names = [c[0] for c in cur.description] - - for rowIdx in range(len(allRows)): d = {} for colIdx in range(len(allRows[rowIdx])): @@ -82,10 +84,10 @@ def query(self,alias, selectStatement, sansTran=False, returnAsDict=False): if not sansTran: connection.rollback() - def row_count(self,alias, selectStatement, sansTran=False): + def row_count(self, selectStatement, sansTran=False, alias=None): """ - Uses the input `selectStatement` to query the database and returns the number of rows from the query. Set - optional input `sansTran` to True to run command without an explicit transaction commit or rollback. + Uses the input `selectStatement` to query the database and returns the number of rows from the query. + Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. For example, given we have a table `person` with the following data: | id | first_name | last_name | @@ -111,25 +113,23 @@ def row_count(self,alias, selectStatement, sansTran=False): """ cur = None try: - connection,module_api = self._get_cache(alias) + connection, module_api = self._get_cache(alias) cur = connection.cursor() logger.info('Executing : Row Count | %s ' % selectStatement) - + self.__execute_sql(cur, selectStatement) data = cur.fetchall() - logger.info(data) - if module_api in ["sqlite3", "ibm_db", "ibm_db_dbi", "pyodbc"]: rowCount = len(data) else: - rowCount = cur.rowcount + rowCount = cur.rowcount return rowCount finally: if cur: if not sansTran: connection.rollback() - def description(self,alias, selectStatement, sansTran=False): + def description(self, selectStatement, sansTran=False, alias=None): """ Uses the input `selectStatement` to query a table in the db which will be used to determine the description. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -152,21 +152,22 @@ def description(self,alias, selectStatement, sansTran=False): """ cur = None try: - connection,module_api = self._get_cache(alias) + connection, module_api = self._get_cache(alias) cur = connection.cursor() logger.info('Executing : Description | %s ' % selectStatement) self.__execute_sql(cur, selectStatement) description = list(cur.description) if sys.version_info[0] < 3: for row in range(0, len(description)): - description[row] = (description[row][0].encode('utf-8'),) + description[row][1:] + description[row] = (description[row][0].encode( + 'utf-8'),) + description[row][1:] return description finally: if cur: if not sansTran: connection.rollback() - def delete_all_rows_from_table(self,alias, tableName, sansTran=False): + def delete_all_rows_from_table(self, tableName, sansTran=False, alias=None): """ Delete all the rows within a given table. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -188,9 +189,10 @@ def delete_all_rows_from_table(self,alias, tableName, sansTran=False): cur = None selectStatement = ("DELETE FROM %s;" % tableName) try: - connection,module_api = self._get_cache(alias) + connection, module_api = self._get_cache(alias) cur = connection.cursor() - logger.info('Executing : Delete All Rows From Table | %s ' % selectStatement) + logger.info( + 'Executing : Delete All Rows From Table | %s ' % selectStatement) result = self.__execute_sql(cur, selectStatement) if result is not None: if not sansTran: @@ -203,7 +205,7 @@ def delete_all_rows_from_table(self,alias, tableName, sansTran=False): if not sansTran: connection.rollback() - def execute_sql_script(self,alias, sqlScriptFileName, sansTran=False): + def execute_sql_script(self, sqlScriptFileName, sansTran=False, alias=None): """ Executes the content of the `sqlScriptFileName` as SQL commands and returns number of rows affected. Useful for setting the database to @@ -264,9 +266,10 @@ def execute_sql_script(self,alias, sqlScriptFileName, sansTran=False): cur = None result = 0 try: - connection,module_api = self._get_cache(alias) + connection, module_api = self._get_cache(alias) cur = connection.cursor() - logger.info('Executing : Execute SQL Script | %s ' % sqlScriptFileName) + logger.info('Executing : Execute SQL Script | %s ' % + sqlScriptFileName) sqlStatement = '' for line in sqlScriptFile: PY3K = sys.version_info >= (3, 0) @@ -277,7 +280,6 @@ def execute_sql_script(self,alias, sqlScriptFileName, sansTran=False): continue elif line.startswith('--'): continue - sqlFragments = line.split(';') if len(sqlFragments) == 1: sqlStatement += line + ' ' @@ -286,9 +288,7 @@ def execute_sql_script(self,alias, sqlScriptFileName, sansTran=False): sqlFragment = sqlFragment.strip() if len(sqlFragment) == 0: continue - sqlStatement += sqlFragment + ' ' - result = result + self.__execute_sql(cur, sqlStatement) sqlStatement = '' @@ -304,7 +304,7 @@ def execute_sql_script(self,alias, sqlScriptFileName, sansTran=False): connection.rollback() return result - def execute_sql_string(self,alias, sqlString, sansTran=False): + def execute_sql_string(self, sqlString, sansTran=False, alias=None): """ Executes the sqlString as SQL commands and returns number of rows affected. Useful to pass arguments to your sql. Set optional input @@ -325,7 +325,7 @@ def execute_sql_string(self,alias, sqlString, sansTran=False): cur = None result = 0 try: - connection,module_api = self._get_cache(alias) + connection, module_api = self._get_cache(alias) cur = connection.cursor() logger.info('Executing : Execute SQL String | %s ' % sqlString) result = self.__execute_sql(cur, sqlString) @@ -337,7 +337,7 @@ def execute_sql_string(self,alias, sqlString, sansTran=False): connection.rollback() return result - def call_stored_procedure(self,alias, spName, spParams=None, sansTran=False): + def call_stored_procedure(self, spName, spParams=None, sansTran=False, alias=None): """ Uses the inputs of `spName` and 'spParams' to call a stored procedure. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -364,7 +364,7 @@ def call_stored_procedure(self,alias, spName, spParams=None, sansTran=False): spParams = [] cur = None try: - connection,module_api = self._get_cache(alias) + connection, module_api = self._get_cache(alias) if module_api in ["cx_Oracle"]: cur = connection.cursor() else: @@ -372,15 +372,15 @@ def call_stored_procedure(self,alias, spName, spParams=None, sansTran=False): PY3K = sys.version_info >= (3, 0) if not PY3K: spName = spName.encode('ascii', 'ignore') - logger.info('Executing : Call Stored Procedure | %s | %s ' % (spName, spParams)) + logger.info( + 'Executing : Call Stored Procedure | %s | %s ' % (spName, spParams)) cur.callproc(spName, spParams) cur.nextset() - retVal=list() + retVal = list() for row in cur: - #logger.info ( ' %s ' % (row)) retVal.append(row) if not sansTran: - connection.commit() + connection.commit() return retVal finally: if cur: From 3ff0474422db4621014e01161eaaa0c0d4048efd Mon Sep 17 00:00:00 2001 From: fpremoli Date: Wed, 20 Mar 2019 18:51:52 +0100 Subject: [PATCH 16/16] refactor logger --- .gitignore | 1 + src/DatabaseLibrary/assertion.py | 27 ++++++++++++++------------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index ad89c36..b735f8c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ test/log.html test/my_db_test.db test/output.xml test/report.html +.vscode/settings.json diff --git a/src/DatabaseLibrary/assertion.py b/src/DatabaseLibrary/assertion.py index d93ba12..3104858 100644 --- a/src/DatabaseLibrary/assertion.py +++ b/src/DatabaseLibrary/assertion.py @@ -41,9 +41,7 @@ def check_if_exists_in_database(self, selectStatement, sansTran=False, alias=Non Using optional `sansTran` to run command without an explicit transaction commit or rollback: | Check If Exists In Database | SELECT id FROM person WHERE first_name = 'John' | True | """ - logger.info('Executing : Check If Exists In Database | %s ' % - selectStatement) - logger.info('Connection: Check If Exists In Database | %s' % alias) + logger.info('Executing : Check If Exists In Database | %s | %s ' % (selectStatement,alias)) if not self.query(selectStatement=selectStatement, sansTran=sansTran, alias=alias): raise AssertionError("Expected to have have at least one row from '%s' " @@ -73,7 +71,7 @@ def check_if_not_exists_in_database(self, selectStatement, sansTran=False, alias | Check If Not Exists In Database | SELECT id FROM person WHERE first_name = 'John' | True | """ logger.info( - 'Executing : Check If Not Exists In Database | %s ' % selectStatement) + 'Executing : Check If Not Exists In Database | %s | %s ' % (selectStatement,alias)) queryResults = self.query( selectStatement=selectStatement, sansTran=sansTran, alias=alias) if queryResults: @@ -101,7 +99,9 @@ def row_count_is_0(self, selectStatement, sansTran=False, alias=None): Using optional `sansTran` to run command without an explicit transaction commit or rollback: | Row Count is 0 | SELECT id FROM person WHERE first_name = 'John' | True | """ - logger.info('Executing : Row Count Is 0 | %s ' % selectStatement) + logger.info('Executing : Row Count Is 0 | %s | %s ' % (selectStatement,alias)) + logger.info( + 'Connection: Row Count Is 0 | %s' % alias) num_rows = self.row_count(selectStatement, sansTran, alias) if num_rows > 0: raise AssertionError("Expected zero rows to be returned from '%s' " @@ -129,8 +129,9 @@ def row_count_is_equal_to_x(self, selectStatement, numRows, sansTran=False, alia Using optional `sansTran` to run command without an explicit transaction commit or rollback: | Row Count Is Equal To X | SELECT id FROM person WHERE first_name = 'John' | 0 | True | """ - logger.info('Executing : Row Count Is Equal To X | %s | %s ' % - (selectStatement, numRows)) + logger.info('Executing : Row Count Is Equal To X | %s | %s | %s ' % + (selectStatement, numRows,alias)) + num_rows = self.row_count(selectStatement, sansTran, alias) if num_rows != int(numRows.encode('ascii')): raise AssertionError("Expected same number of rows to be returned from '%s' " @@ -158,8 +159,9 @@ def row_count_is_greater_than_x(self, selectStatement, numRows, sansTran=False, Using optional `sansTran` to run command without an explicit transaction commit or rollback: | Row Count Is Greater Than X | SELECT id FROM person | 1 | True | """ - logger.info('Executing : Row Count Is Greater Than X | %s | %s ' % ( - selectStatement, numRows)) + logger.info('Executing : Row Count Is Greater Than X | %s | %s | %s ' % ( + selectStatement, numRows,alias)) + num_rows = self.row_count(selectStatement, sansTran, alias) if num_rows <= int(numRows.encode('ascii')): raise AssertionError("Expected more rows to be returned from '%s' " @@ -187,8 +189,8 @@ def row_count_is_less_than_x(self, selectStatement, numRows, sansTran=False, ali Using optional `sansTran` to run command without an explicit transaction commit or rollback: | Row Count Is Less Than X | SELECT id FROM person | 3 | True | """ - logger.info('Executing : Row Count Is Less Than X | %s | %s ' % ( - selectStatement, numRows)) + logger.info('Executing : Row Count Is Less Than X | %s | %s | %s ' % ( + selectStatement, numRows,alias)) num_rows = self.row_count(selectStatement, sansTran, alias) logger.info('Row Num: %s ' % str(num_rows)) if num_rows >= int(numRows.encode('ascii')): @@ -212,8 +214,7 @@ def table_must_exist(self, tableName, sansTran=False, alias=None): Using optional `sansTran` to run command without an explicit transaction commit or rollback: | Table Must Exist | person | True | """ - logger.info('Executing : Table Must Exist | %s ' % tableName) - logger.info('DbConnection: %s' % alias) + logger.info('Executing : Table Must Exist | %s | %s ' % (tableName,alias)) connection, module_api = self._get_cache(alias)