1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
from datetime import date, datetime
from enum import Enum
from uuid import UUID
from pytz import timezone
escape_chars_map = {
"\b": "\\b",
"\f": "\\f",
"\r": "\\r",
"\n": "\\n",
"\t": "\\t",
"\0": "\\0",
"\a": "\\a",
"\v": "\\v",
"\\": "\\\\",
"'": "\\'"
}
def escape_datetime(item, context):
server_tz = timezone(context.server_info.timezone)
if item.tzinfo is not None:
item = item.astimezone(server_tz)
return "'%s'" % item.strftime('%Y-%m-%d %H:%M:%S')
def escape_param(item, context):
if item is None:
return 'NULL'
elif isinstance(item, datetime):
return escape_datetime(item, context)
elif isinstance(item, date):
return "'%s'" % item.strftime('%Y-%m-%d')
elif isinstance(item, str):
return "'%s'" % ''.join(escape_chars_map.get(c, c) for c in item)
elif isinstance(item, list):
return "[%s]" % ', '.join(str(escape_param(x, context)) for x in item)
elif isinstance(item, tuple):
return "(%s)" % ', '.join(str(escape_param(x, context)) for x in item)
elif isinstance(item, Enum):
return escape_param(item.value, context)
elif isinstance(item, UUID):
return "'%s'" % str(item)
else:
return item
def escape_params(params, context):
escaped = {}
for key, value in params.items():
escaped[key] = escape_param(value, context)
return escaped
|