import datetime
dateformat = '%Y-%m-%dT%H:%M:%S'
datepattern = '0000-00-00T00:00:00'
def date_to_str(date):
return date.strftime(dateformat).rjust(len(datepattern), '0')
def set_timezone(date, tz = datetime.timezone.utc):
return datetime.datetime(
year = date.year,
month = date.month,
day = date.day,
hour = date.hour,
minute = date.minute,
second = date.second,
microsecond = date.microsecond,
tzinfo = tz )
def str_to_date(s):
return set_timezone( datetime.datetime.strptime(s, date_format) )
class Type:
def from_raw(self, value):
return None
def from_db(self, connection, value):
return value
def to_db(self, connection, value):
return connection.escape(self.from_raw(value))
class Int(Type):
def from_raw(self, value):
return int(value if value else 0)
class String(Type):
def from_raw(self, value):
return '' if value is None else str(value)
def to_db(self, connection, value):
return "'" + connection.escape_string(self.from_raw(value)) + "'"
class Float(Type):
def from_raw(self, value):
return float(value if value else 0)
class Date(Type):
def from_raw(self, value):
return str_to_date(date_to_str(value) if type(value) is datetime.datetime else str(value))
def from_db(self, connection, value):
return set_timezone(value)
class Field(Type):
def from_raw(self, value):
result = str(value)
assert(result.isidentifier())
return result
def to_db(self, connection, value):
return '`' + connection.escape_string(self.from_raw(value)) + '`'
class Table(Type):
def from_raw(self, value):
result = str(value)
assert(result.isidentifier())
return result
def from_db(self, connection, value):
value = str(value)
prefix = connection.pool.server.config['db']['prefix']
assert value.startswith(prefix)
return self.from_raw(value[len(prefix):])
def to_db(self, connection, value):
return '`' + connection.escape_string( connection.pool.server.config['db']['prefix'] + self.from_raw(value)) + '`'
tint = Int()
tstring = String()
tfloat = Float()
tdate = Date()
tfield = Field()
ttable = Table()
bytype = {
int : tint,
str : tstring,
float : tfloat,
datetime.datetime: tdate,
}
bychar = {
'd': tint,
's': tstring,
'f': tfloat,
'D': tdate,
'F': tfield,
'T': ttable,
}