Project

General

Profile

1 2211 aaronmk
# SQL code generation
2
3
import sql
4
5
class Code:
6
    def to_str(self, db): raise NotImplemented()
7
8
class Literal:
9
    def __init__(self, value): self.value = value
10 2213 aaronmk
11
    def to_str(self, db): return db.esc_value(self.value)
12 2211 aaronmk
13
class Table(Code):
14
    def __init__(self, name, schema=None):
15
        '''
16
        @param schema str|None (for no schema)
17
        '''
18
        self.name = name
19
        self.schema = schema
20
21
    def to_str(self, db): return sql.qual_name(db, self.schema, self.name)
22
23
class Col(Code):
24
    def __init__(self, name, table=None):
25
        '''
26
        @param table Table|None (for no table)
27
        '''
28
        assert table == None or isinstance(table, Table)
29
30
        self.name = name
31
        self.table = table
32
33
    def to_str(self, db):
34
        str_ = ''
35
        if self.table != None: str_ += self.table.to_str(db)+'.'
36
        str_ += sql.esc_name(db, self.name)
37
        return str_
38
39 2214 aaronmk
class ValueCond:
40 2213 aaronmk
    def __init__(self, value):
41
        if not isinstance(value, Literal): value = Literal(value)
42
43
        self.value = value
44 2214 aaronmk
45
    def to_str(self, db, value_code):
46
        '''
47
        @param value_code The SQL code that the condition is being applied on
48
        '''
49
        raise NotImplemented()
50 2211 aaronmk
51
class CompareCond(ValueCond):
52
    def __init__(self, value, operator='='):
53
        ValueCond.__init__(self, value)
54
        self.operator = operator
55
56 2214 aaronmk
    def to_str(self, db, value_code):
57
        return value_code+' '+self.operator+' '+self.value.to_str(db)