Completed
Pull Request — master (#448)
by
unknown
02:51
created

MSSQLRunner.run()   A

Complexity

Conditions 4

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 12
rs 9.2
cc 4
1
import _mssql
2
import ast
3
import sys
4
5
from lib.mssql_action import MSSQLAction
6
from lib.results_processor import ResultsProcessor
7
8
9
class MSSQLRunner(MSSQLAction):
10
    """
11
    Sends an action to MS SQL Server. An exception is logged on failure.
12
13
    The query_string accepts Python formatting. Please see README for details.
14
    """
15
16
    # Pack actions map to a pair of methods: PyMSSQL (_mssql) driver and ResultsProcessor handler
17
    ACTION_MAPPING = {
18
        'execute_insert': ('execute_non_query', 'execute_insert')
19
        # default: (action_name, action_name)
20
    }
21
22
    def __init__(self, config):
23
        super(MSSQLRunner, self).__init__(config)
24
        self.processor = ResultsProcessor(self.config, self.logger)
25
26
    def run(self, action, query_string, params=None,
27
            database=None, server=None, user=None, password=None):
28
        try:
29
            # action corresponds to a pair of _mssql and ResultsProcessor methods
30
            driver_action, processor_action = self.ACTION_MAPPING.get(action, (action, action))
31
            with self.connect(database, server, user, password) as cursor:
32
                params = ast.literal_eval(params) if params else None
33
                response = getattr(cursor, driver_action)(query_string, params)
34
                return getattr(self.processor, processor_action)(response, cursor)
35
        except _mssql.MSSQLException as e:  # pylint: disable=no-member
36
            self.logger.error(e)
37
            sys.exit(1)
38