]>
git.saurik.com Git - cyql.git/blob - __init__.py
dd150ae19ea6a64aed2b26103205267c773e21d0
1 from __future__
import unicode_literals
2 from __future__
import print_function
7 from contextlib
import contextmanager
10 import psycopg2
.extras
13 psycopg2
.extensions
.register_type(psycopg2
.extensions
.UNICODE
)
15 class connection(object):
16 def __init__(self
, driver
):
22 cursor
= self
.driver
.cursor(cursor_factory
=psycopg2
.extras
.DictCursor
)
28 def execute_(self
, statement
, locals):
29 with self
.cursor() as cursor
:
30 cursor
.execute(statement
.format(**locals), locals)
34 def execute(self
, statement
, depth
=0, context
=None):
35 with self
.cursor() as cursor
:
36 # two frames, accounting for execute() and @contextmanager
37 locals = inspect
.currentframe(depth
+ 2).f_locals
41 cursor
.execute(statement
.format(**locals), context
)
47 def transact(self
, synchronous_commit
=True):
48 with self
.cursor() as cursor
:
49 if not synchronous_commit
:
50 cursor
.execute('set local synchronous_commit = off')
53 yield transaction(self
)
56 self
.driver
.rollback()
59 class transaction(object):
60 def __init__(self
, connection
):
61 self
.connection
= connection
63 def __call__(self
, statement
, locals=None):
64 with self
.connection
.execute(statement
, 1, locals) as cursor
:
68 def set(self
, statement
):
69 with self
.connection
.execute(statement
, 1) as cursor
:
72 def all(self
, statement
):
73 with self
.connection
.execute(statement
, 1) as cursor
:
74 return cursor
.fetchall()
76 def one(self
, statement
):
77 with self
.connection
.execute(statement
, 1) as cursor
:
78 one
= cursor
.fetchone()
81 assert cursor
.fetchone() == None
84 def pull(self
, statement
):
85 with self
.connection
.execute(statement
, 1) as cursor
:
86 return cursor
.fetchall()
88 def yank(self
, statement
, offset
=0):
89 with self
.connection
.execute(statement
, 1 + offset
) as cursor
:
90 rows
= cursor
.fetchall()
91 return rows
[0] if len(rows
) != 0 else None
93 def push(self
, statement
):
94 with self
.connection
.execute(statement
, 1) as cursor
:
97 def push_(self
, statement
, locals):
98 with self
.connection
.execute_(statement
, locals) as cursor
:
101 def exists(self
, statement
):
106 '''.format(**locals()), 1)[0]
113 driver
= psycopg2
.connect(**dsn
)
115 except psycopg2
.OperationalError
, e
:
118 attempt
= attempt
+ 1
121 driver
.set_client_encoding('UNICODE')
122 yield connection(driver
)
128 def replaced(*args
, **kw
):
129 with connect(dsn
) as connection
:
130 return method(connection
, *args
, **kw
)
135 def transact(dsn
, **args
):
136 with connect(dsn
) as connection
:
137 with connection
.transact(**args
) as cursor
:
141 def slap_(sql, table, keys, values, path):
144 csr.execute('savepoint iou')
146 both = dict(keys, **values)
150 insert into %s (%s) values (%s)
154 ', '.join(['%s' for key in fields])
156 except psycopg2.IntegrityError, e:
157 csr.execute('rollback to savepoint iou')
160 update %s set %s where %s
165 for key in values.keys()]),
168 for key in keys.keys()])
169 ), values.values() + keys.values())
171 return path_(csr, path)