#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # 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 2009 Red Hat, Inc # written by seth vidal # parse sqlite tag database # return pkgnames and tag that was matched from sqlutils import sqlite, executeSQL, sql_esc from Errors import PkgTagsError import sqlutils import sys import misc def catchSqliteException(func): """This decorator converts sqlite exceptions into PkgTagsError""" def newFunc(*args, **kwargs): try: return func(*args, **kwargs) except sqlutils.sqlite.Error, e: # 2.4.x requires this, but 2.6.x complains about even hasattr() # of e.message ... *sigh* if sys.hexversion < 0x02050000: if hasattr(e,'message'): raise PkgTagsError, str(e.message) else: raise PkgTagsError, str(e) raise PkgTagsError, str(e) newFunc.__name__ = func.__name__ newFunc.__doc__ = func.__doc__ newFunc.__dict__.update(func.__dict__) return newFunc class PackageTagDB(object): @catchSqliteException def __init__(self, repoid, sqlite_file): self.sqlite_file = sqlite_file self.repoid = repoid # take a path to the sqlite tag db # open it and leave a cursor in place for the db self._conn = sqlite.connect(sqlite_file) self.cur = self._conn.cursor() def _getTagsCount(self): ''' Unused, so no need to cache. ''' for n in self._sql_exec("select count(*) from packagetags",): return n[0] count = property(fget=lambda self: self._getTagsCount(), doc="Number of entries in the pkgtag DB") @catchSqliteException def _sql_exec(self, sql, *args): """ Exec SQL against an MD of the repo, return a cursor. """ executeSQL(self.cur, sql, *args) return self.cur def search_tags(self, tag): """Search by tag name/glob Return dict of dict[packagename] = [stringmatched, stringmatched, ...]""" res = {} (tag, esc) = sql_esc(tag) query = "SELECT name, tag, score FROM packagetags where tag like ? %s" % esc tag = '%' + tag + '%' rows = self._sql_exec(query, (tag,)) for (name, tag, score) in rows: if name not in res: res[name] = [] res[name].append(tag) return res def search_names(self, name): """Search by package name/glob. Return dict of dict[packagename] = [tag1, tag2, tag3, tag4, ...]""" res = {} (name, esc) = sql_esc(name) query = "SELECT name, tag, score FROM packagetags where name like ?%s " % esc name = '%' + name + '%' rows = self._sql_exec(query, (name,)) for (name, tag, score) in rows: if name not in res: res[name] = [] res[name].append(tag) return res class PackageTags(object): def __init__(self): self.db_objs = {} def add(self, repoid, sqlite_file): if repoid in self.db_objs: raise PkgTagsError, "Already added tags from %s" % repoid dbobj = PackageTagDB(repoid, sqlite_file) self.db_objs[repoid] = dbobj def remove(self, repoid): if repoid in self.db_objs: del self.db_objs[repoid] else: raise PkgTagsError, "No tag db for %s" % repoid def search_names(self, name): res = {} for ptd in self.db_objs.values(): for (name, taglist) in ptd.search_names(name).items(): if not name in res: res[name] = [] res[name].extend(taglist) out = {} for (name, taglist) in res.items(): out[name] = misc.unique(taglist) return out def search_tags(self, tagname): res = {} for ptd in self.db_objs.values(): for (name, taglist) in ptd.search_tags(tagname).items(): if not name in res: res[name] = [] res[name].extend(taglist) out = {} for (name, taglist) in res.items(): out[name] = misc.unique(taglist) return out
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 |
|