[Yum-devel] [PATCH 4/4] actually add the pkgtag classes
Tim Lauridsen
tim.lauridsen at googlemail.com
Sat Feb 6 15:14:56 UTC 2010
On Sat, Feb 6, 2010 at 12:31 AM, Seth Vidal <skvidal at fedoraproject.org>wrote:
> ---
> 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
>
> _______________________________________________
> Yum-devel mailing list
> Yum-devel at lists.baseurl.org
> http://lists.baseurl.org/mailman/listinfo/yum-devel
ACK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.baseurl.org/pipermail/yum-devel/attachments/20100206/4d64f0fe/attachment-0001.htm>
More information about the Yum-devel
mailing list