-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsql.py
61 lines (51 loc) · 1.7 KB
/
sql.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class Schema:
storage_name = 'sqlite'
target_types = 'tables indexes triggers'.split()
def __init__( me, *refs, **data):
for n in me.target_types:
setattr( me, n, data.get( n, {}))
me.refs = {}
for r in refs:
for n in r.names:
me.refs.setdefault( r.target_type,{})[ n] = r.aspect
def update( me, o):
for name, table in o.iter_over('tables'):
if name in me.tables:
me.tables[ name].update( table)
else:
me.tables[ name] = table
me.indexes.update( o.iter_over('indexes'))
me.triggers.update( o.iter_over('triggers'))
def iter_over( me, typ):
for name, aspect in me.refs.get( typ, {}).iteritems():
storage = getattr( aspect, me.storage_name)
yield name, getattr( storage.schema, typ)[ name]
for name, val in getattr(me, typ).iteritems():
yield name, val
class Ref:
target_type = None
storage_name = 'sqlite'
def __init__( me, aspect, *names):
me.aspect = aspect
me.names = names
def get_targets( me):
storage = getattr( me.aspect, me.storage_name)
t = getattr( storage.schema, me.target_type)
return dict( (n,t[n]) for n in me.names)
class UsesTables( Ref):
target_type = 'tables'
class RefIndexes( Ref):
target_type = 'indexes'
class RefTriggers( Ref):
target_type = 'triggers'
Table = dict
class Constraint(str): pass
class Index:
def __init__( me, table, *columns):
me.table = table
me.columns = columns
class Trigger:
def __init__( me, when, *what):
me.when = when
me.what = what
# vim:ts=4:sw=4:expandtab