def setvariable(cursor, mysqlvar, value, mode='global'): """ Set a global mysql variable to a given value The DB driver will handle quoting of the given value based on its type, thus numeric strings like '3.0' or '8' are illegal, they should be passed as numeric literals. """ if mode == 'persist': query = "SET PERSIST %s = " % mysql_quote_identifier(mysqlvar, 'vars') elif mode == 'global': query = "SET GLOBAL %s = " % mysql_quote_identifier(mysqlvar, 'vars') elif mode == 'persist_only': query = "SET PERSIST_ONLY %s = " % mysql_quote_identifier( mysqlvar, 'vars') try: cursor.execute(query + "%s", (value, )) executed_queries.append(query + "%s" % value) cursor.fetchall() result = True except Exception as e: result = to_native(e) return result
def db_delete(cursor, db): if not db: return False for each_db in db: query = "DROP DATABASE %s" % mysql_quote_identifier(each_db, 'database') cursor.execute(query) return True
def main(): module = AnsibleModule( argument_spec=dict( login_user=dict(default=None), login_password=dict(default=None, no_log=True), login_host=dict(default="localhost"), login_port=dict(default=3306, type='int'), login_unix_socket=dict(default=None), name=dict(required=True, aliases=['db']), state=dict(default="present", choices=['absent', 'present']), table=dict(required=True), identifiers=dict(required=True, type='dict'), values=dict(default=None, type='dict'), defaults=dict(default=None, type='dict'), #allow_insert=dict(default=False, type='bool'), #limit=dict(default=1, type='int'), ), supports_check_mode=True) if mysql_driver is None: module.fail_json(msg=mysql_driver_fail_msg) # mysql_quote all identifiers and get the parameters into shape table = mysql_quote_identifier(module.params['table'], 'table') identifiers = dict(extract_column_value_maps(module.params['identifiers'])) values = dict(extract_column_value_maps(module.params['values'])) defaults = dict(extract_column_value_maps(module.params['defaults'])) exit_messages = { DELETE_REQUIRED: dict(changed=True, msg='Record needs to be deleted'), INSERT_REQUIRED: dict(changed=True, msg='No such record, need to insert'), UPDATE_REQUIRED: dict(changed=True, msg='Records needs to be updated'), NO_ACTION_REQUIRED: dict(changed=False), ERR_NO_SUCH_TABLE: dict(failed=True, msg='No such table %s' % table) } with closing(connect(build_connection_parameter(module.params), module)) as db_connection: # find out what needs to be done (independently of check-mode) required_action = change_required(module.params['state'], db_connection.cursor(), table, identifiers, values) # if we're in check mode, there's no action required, or we already failed: directly set the exit_message if module.check_mode or required_action == NO_ACTION_REQUIRED or failed( required_action): exit_message = exit_messages[required_action] else: # otherwise, execute the required action to get the exit message exit_message = execute_action(db_connection.cursor(), required_action, table, identifiers, values, defaults) db_connection.commit() if 'failed' in exit_message and exit_message.get('failed'): module.fail_json(**exit_message) else: module.exit_json(**exit_message)
def extract_column_value_maps(parameter): """ extract mysql-quoted tuple-lists for parameters given as ansible params :param parameter: :return: """ if parameter: for column, value in parameter.items(): yield (mysql_quote_identifier(column, 'column'), value)
def db_create(cursor, db, encoding, collation): query_params = dict(enc=encoding, collate=collation) query = ['CREATE DATABASE %s' % mysql_quote_identifier(db, 'database')] if encoding: query.append("CHARACTER SET %(enc)s") if collation: query.append("COLLATE %(collate)s") query = ' '.join(query) cursor.execute(query, query_params) return True
def db_create(cursor, db, encoding, collation): query_params = dict(enc=encoding, collate=collation) query = ['CREATE DATABASE %s' % mysql_quote_identifier(db, 'database')] if encoding: query.append("CHARACTER SET %(enc)s") if collation: query.append("COLLATE %(collate)s") query = ' '.join(query) cursor.execute(query, query_params) return True
def db_create(cursor, db, encoding, collation): if not db: return False query_params = dict(enc=encoding, collate=collation) res = 0 for each_db in db: query = ['CREATE DATABASE %s' % mysql_quote_identifier(each_db, 'database')] if encoding: query.append("CHARACTER SET %(enc)s") if collation: query.append("COLLATE %(collate)s") query = ' '.join(query) res += cursor.execute(query, query_params) return res > 0
def setvariable(cursor, mysqlvar, value): """ Set a global mysql variable to a given value The DB driver will handle quoting of the given value based on its type, thus numeric strings like '3.0' or '8' are illegal, they should be passed as numeric literals. """ query = "SET GLOBAL %s = " % mysql_quote_identifier(mysqlvar, 'vars') try: cursor.execute(query + "%s", (value,)) cursor.fetchall() result = True except Exception as e: result = to_native(e) return result
def setvariable(cursor, mysqlvar, value): """ Set a global mysql variable to a given value The DB driver will handle quoting of the given value based on its type, thus numeric strings like '3.0' or '8' are illegal, they should be passed as numeric literals. """ query = "SET GLOBAL %s = " % mysql_quote_identifier(mysqlvar, 'vars') try: cursor.execute(query + "%s", (value,)) cursor.fetchall() result = True except Exception as e: result = to_native(e) return result
def db_delete(cursor, db): query = "DROP DATABASE %s" % mysql_quote_identifier(db, 'database') cursor.execute(query) return True
def db_delete(cursor, db): query = "DROP DATABASE %s" % mysql_quote_identifier(db, 'database') cursor.execute(query) return True