#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License # as published by the Free Software Foundation # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2005 Duke University """ utility functions to handle differences in pysqlite versions These are from Wichert Akkerman <wichert@deephackmode.org>'s python-dhm http://www.wiggy.net/code/python-dhm """ try: import sqlite3 as sqlite except ImportError: import sqlite class TokenizeError(Exception): """Tokenizer error class""" pass def Tokenize(str, whitespace=" \t\r\n", quotes="\"", escapes="\\"): """String tokenizer This function tokenizes a string while taking quotation and escaping into account. >>> import dhm.strtools >>> dhm.strtools.Tokenize("this is a test") ['this', 'is', 'a', 'test'] >>> dhm.strtools.Tokenize("this \"is a\" test") ['this', 'is a', 'test'] >>> dhm.strtools.Tokenize("this \\\"is\\\" a test") ['this', '"is"', 'a', 'test'] >>> dhm.strtools.Tokenize("this \"is a test") Traceback (most recent call last): File "<stdin>", line 1, in ? File "/usr/local/lib/python2.2/site-packages/dhm/strtools.py", line 80, in Tokenize raise TokenizeError, "Unexpected end of string in quoted text" dhm.strtools.TokenizeError: Unexecpted end of string in quoted text @param str: string to tokenize @type str: string @param whitespace: whitespace characters separating tokens @type whitespace: string @param quotes: legal quoting characters @type quotes: string @param escapes: characters which can escape quoting characters @type escapes: string @return: list of tokens @rtype: sequence of strings """ (buffer, tokens, curtoken, quote)=(str, [], None, None) try: while buffer: if buffer[0]==quote: quote=None elif (quote==None) and (buffer[0] in quotes): quote=buffer[0] elif buffer[0] in whitespace: if quote!=None: curtoken+=buffer[0] else: tokens.append(curtoken) curtoken=None while buffer[1] in whitespace: buffer=buffer[1:] elif buffer[0] in escapes: if curtoken==None: curtoken=buffer[1] else: curtoken+=buffer[1] buffer=buffer[1:] else: if curtoken==None: curtoken=buffer[0] else: curtoken+=buffer[0] buffer=buffer[1:] except IndexError: raise TokenizeError, "Unexpected end of string" if quote: raise TokenizeError, "Unexpected end of string in quoted text" if curtoken!=None: tokens.append(curtoken) return tokens def QmarkToPyformat(query, params): """Convert from qmark to pyformat parameter style. The python DB-API 2.0 specifies four different possible parameter styles that can be used by drivers. This function converts from the qmark style to pyformat style. @param query: SQL query to transform @type query: string @param params: arguments to query @type params: sequence of strings @return: converted query and parameters @rtype: tuple with the new command and a dictionary of arguments """ tokens=Tokenize(query, quotes="'") output=[] count=1 for token in tokens: if token.endswith("?"): output.append(token[:-1] + "%%(param%d)s" % count) count+=1 elif token.endswith("?,") or token.endswith("?)"): ntoken = token[:-2] + "%%(param%d)s" % count ntoken += token[-1] output.append(ntoken) count+=1 else: output.append(token) dict={} count=1 for param in params: dict["param%d" % count]=param count+=1 return (" ".join(output), dict) def executeSQLPyFormat(cursor, query, params=None): """ Execute a python < 2.5 (external sqlite module) style query. @param cursor: A sqlite cursor @param query: The query to execute @param params: An optional list of parameters to the query """ if params is None: return cursor.execute(query) # Leading whitespace confuses QmarkToPyformat() query = query.strip() (q, p) = QmarkToPyformat(query, params) return cursor.execute(q, p) def executeSQLQmark(cursor, query, params=None): """ Execute a python 2.5 (sqlite3) style query. @param cursor: A sqlite cursor @param query: The query to execute @param params: An optional list of parameters to the query """ if params is None: return cursor.execute(query) return cursor.execute(query, params) if sqlite.version_info[0] > 1: executeSQL = executeSQLQmark else: executeSQL = executeSQLPyFormat def sql_esc(pattern): """ Apply SQLite escaping, if needed. Returns pattern and esc. """ esc = '' if "_" in pattern or "%" in pattern: esc = ' ESCAPE "!"' pattern = pattern.replace("!", "!!") pattern = pattern.replace("%", "!%") pattern = pattern.replace("_", "!_") return (pattern, esc) def sql_esc_glob(patterns): """ Converts patterns to SQL LIKE format, if required (or gives up if not possible). """ ret = [] for pattern in patterns: if '[' in pattern: # LIKE only has % and _, so [abc] can't be done. return [] # So Load everything # Convert to SQL LIKE format (pattern, esc) = sql_esc(pattern) pattern = pattern.replace("*", "%") pattern = pattern.replace("?", "_") ret.append((pattern, esc)) return ret
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
Errors.py | File | 4.26 KB | 0755 |
|
Errors.pyc | File | 9.08 KB | 0644 |
|
__init__.py | File | 304.1 KB | 0755 |
|
__init__.pyc | File | 199.78 KB | 0644 |
|
callbacks.py | File | 5.64 KB | 0755 |
|
callbacks.pyc | File | 6.23 KB | 0644 |
|
comps.py | File | 31.59 KB | 0755 |
|
comps.pyc | File | 26.87 KB | 0644 |
|
config.py | File | 49.89 KB | 0755 |
|
config.pyc | File | 48.02 KB | 0644 |
|
constants.py | File | 4.52 KB | 0755 |
|
constants.pyc | File | 3.42 KB | 0644 |
|
depsolve.py | File | 74.05 KB | 0755 |
|
depsolve.pyc | File | 46.91 KB | 0644 |
|
drpm.py | File | 12.85 KB | 0755 |
|
drpm.pyc | File | 10.83 KB | 0644 |
|
failover.py | File | 5 KB | 0755 |
|
failover.pyc | File | 5.24 KB | 0644 |
|
fssnapshots.py | File | 10.16 KB | 0755 |
|
fssnapshots.pyc | File | 9.75 KB | 0644 |
|
history.py | File | 61.13 KB | 0755 |
|
history.pyc | File | 53.31 KB | 0644 |
|
i18n.py | File | 20.44 KB | 0755 |
|
i18n.pyc | File | 16.05 KB | 0644 |
|
igroups.py | File | 9.31 KB | 0755 |
|
igroups.pyc | File | 10.22 KB | 0644 |
|
logginglevels.py | File | 7.9 KB | 0755 |
|
logginglevels.pyc | File | 6.51 KB | 0644 |
|
mdparser.py | File | 6.26 KB | 0755 |
|
mdparser.pyc | File | 7.58 KB | 0644 |
|
metalink.py | File | 9.19 KB | 0755 |
|
metalink.pyc | File | 8.84 KB | 0644 |
|
misc.py | File | 39.57 KB | 0755 |
|
misc.pyc | File | 39.58 KB | 0644 |
|
packageSack.py | File | 40.79 KB | 0755 |
|
packageSack.pyc | File | 41.88 KB | 0644 |
|
packages.py | File | 84.1 KB | 0755 |
|
packages.pyc | File | 84.51 KB | 0644 |
|
parser.py | File | 7.97 KB | 0755 |
|
parser.pyc | File | 6.5 KB | 0644 |
|
pgpmsg.py | File | 53.5 KB | 0755 |
|
pgpmsg.pyc | File | 38.27 KB | 0644 |
|
pkgtag_db.py | File | 4.86 KB | 0755 |
|
pkgtag_db.pyc | File | 5.06 KB | 0644 |
|
plugins.py | File | 28.1 KB | 0755 |
|
plugins.pyc | File | 29.1 KB | 0644 |
|
repoMDObject.py | File | 11.23 KB | 0755 |
|
repoMDObject.pyc | File | 9.17 KB | 0644 |
|
repos.py | File | 16.53 KB | 0755 |
|
repos.pyc | File | 17.38 KB | 0644 |
|
rpmsack.py | File | 70.25 KB | 0755 |
|
rpmsack.pyc | File | 58.36 KB | 0644 |
|
rpmtrans.py | File | 24.84 KB | 0755 |
|
rpmtrans.pyc | File | 22.54 KB | 0644 |
|
sqlitesack.py | File | 69.76 KB | 0755 |
|
sqlitesack.pyc | File | 53.75 KB | 0644 |
|
sqlutils.py | File | 6.27 KB | 0755 |
|
sqlutils.pyc | File | 5.6 KB | 0644 |
|
transactioninfo.py | File | 33.78 KB | 0755 |
|
transactioninfo.pyc | File | 30.29 KB | 0644 |
|
update_md.py | File | 25.9 KB | 0755 |
|
update_md.pyc | File | 21.72 KB | 0644 |
|
updateinfo.py | File | 18.29 KB | 0755 |
|
updateinfo.pyc | File | 16.36 KB | 0644 |
|
yumRepo.py | File | 83.85 KB | 0755 |
|
yumRepo.pyc | File | 64.83 KB | 0644 |
|