Blob Blame Raw


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,
}