core/lib/payload/direct.py (28 lines of code) (raw):
#!/usr/bin/env python3
"""
Copyright (c) 2017-present, Facebook, Inc.
All rights reserved.
This source code is licensed under the BSD-style license found in the
LICENSE file in the root directory of this source tree.
"""
import logging as log
import MySQLdb
from ..error import OSCError
from .base import Payload
class DirectPayload(Payload):
"""
This payload is usually for SQL which can be executed *online*, which
includes CREATE and online ALTERs which are supported by MySQL.
As it's user's choice to let a SQL being executed directly against MySQL
or using OSC, there's no additional check to tell whether this SQL is
a supported online ALTER or not.
This make it possible to run non-online ALTER against MySQL directly
when you think locking a table for certain amount of time won't be a
big deal for your application
"""
def run_ddl(self, db, sql):
log.debug("Creating table using: \n {}".format(sql))
try:
self.use_db(db)
self.execute_sql(sql)
except (MySQLdb.OperationalError, MySQLdb.ProgrammingError) as e:
errnum, errmsg = e.args
log.error(
"SQL execution error: [{}] {}\n"
"When executing: {}\n"
"With args: {}".format(
errnum, errmsg, self._sql_now, self._sql_args_now
)
)
raise OSCError(
"GENERIC_MYSQL_ERROR",
{
"stage": "running DDL on db '{}'".format(db),
"errnum": errnum,
"errmsg": errmsg,
},
mysql_err_code=errnum,
)