+
+class Query(dbutils.Query):
+ def sql(self):
+ res = "SELECT "
+ res += ",".join(["(%s)" % f.sql() for f in self.fields])
+
+ res += " FROM "
+ res += ",".join([t.sql() for t in self.tables])
+
+ if self.constraints:
+ res += " WHERE "
+ res += " AND ".join(["(%s)" % c.sql() for c in self.constraints])
+
+ return res
+
+
+class Field(dbutils.Field):
+ def sql(self):
+ return "%s.`%s`" % (self.table.sql(), self.field_name)
+
+
+class Table(dbutils.Table):
+ def sql(self):
+ return "`%s`.`%s`" % (self.db_name, self.table_name)
+
+
+class Constraint(dbutils.Constraint):
+ def sql(self):
+ operator = self.operator.strip().lower()
+ if operator == "starts":
+ return "(%s) LIKE (%s)" % (self.args[0].sql(), self.args[1].sql()[:-1] + "%'")
+ elif operator == "in":
+ return "(%s) IN (%s)" % (self.args[0].sql(), ",".join(["(%s)" % a.sql() for a in self.args[1:]]))
+ elif operator == "=":
+ return "(%s) = (%s)" % (self.args[0].sql(), self.args[1].sql())
+ else:
+ token = " %s " % operator.upper()
+ return token.join(["(%s)" % a.sql() for a in self.args])
+
+
+class Literal(dbutils.Literal):
+ def sql(self):
+ if type(self.value) in (int, float):
+ return "%s" % self.value
+ else:
+ return "'%s'" % str(self.value).replace("'", "''")
+
+