Blame db/types.py

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