[Yum-devel] [PATCH 4/4] actually add the pkgtag classes
Seth Vidal
skvidal at fedoraproject.org
Fri Feb 5 23:31:44 UTC 2010
---
yum/pkgtag_db.py | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 136 insertions(+), 0 deletions(-)
create mode 100644 yum/pkgtag_db.py
diff --git a/yum/pkgtag_db.py b/yum/pkgtag_db.py
new file mode 100644
index 0000000..eddf175
--- /dev/null
+++ b/yum/pkgtag_db.py
@@ -0,0 +1,136 @@
+#!/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
+import sqlite3 as sqlite
+from sqlutils import executeSQL
+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):
+ 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()
+ self.count = self._sql_exec("select count(*) from packagetags",)
+
+
+ @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 = '%%%s%%' % tag
+ query = "SELECT name, tag, score FROM packagetags where tag like ?"
+ 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 = '%%%s%%' % name
+ query = "SELECT name, tag, score FROM packagetags where name like ?"
+ 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
+
--
1.6.6
More information about the Yum-devel
mailing list