annotate examples/trac/trac/db/util.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2005-2006 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2005 Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # Copyright (C) 2006 Matthew Good <trac@matt-good.net>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16 # Author: Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18 def sql_escape_percent(sql):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 import re
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 return re.sub("'((?:[^']|(?:''))*)'", lambda m: m.group(0).replace('%', '%%'), sql)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 class IterableCursor(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 """Wrapper for DB-API cursor objects that makes the cursor iterable
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 and escapes all "%"s used inside literal strings with parameterized
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 queries.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 Iteration will generate the rows of a SELECT query one by one.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30 __slots__ = ['cursor']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 def __init__(self, cursor):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33 self.cursor = cursor
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 def __getattr__(self, name):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 return getattr(self.cursor, name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 def __iter__(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39 while True:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 row = self.cursor.fetchone()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 if not row:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 return
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43 yield row
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 def execute(self, sql, args=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 if args:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47 return self.cursor.execute(sql_escape_percent(sql), args)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 return self.cursor.execute(sql)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 def executemany(self, sql, args=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51 if args:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 return self.cursor.executemany(sql_escape_percent(sql), args)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 return self.cursor.executemany(sql)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 class ConnectionWrapper(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 """Generic wrapper around connection objects.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 This wrapper makes cursors produced by the connection iterable using
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 `IterableCursor`.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 __slots__ = ['cnx']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 def __init__(self, cnx):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 self.cnx = cnx
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 def __getattr__(self, name):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 if hasattr(self, 'cnx'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 return getattr(self.cnx, name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 return object.__getattr__(self, name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 def cursor(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 return IterableCursor(self.cnx.cursor())
Copyright (C) 2012-2017 Edgewall Software