1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
# -*- coding: utf-8 -*-
#
# File: portato/db/database.py
# This file is part of the Portato-Project, a graphical portage-frontend.
#
# Copyright (C) 2006-2010 René 'Necoro' Neumann
# This is free software. You may redistribute copies of it under the terms of
# the GNU General Public License version 2.
# There is NO WARRANTY, to the extent permitted by law.
#
# Written by René 'Necoro' Neumann <necoro@necoro.net>
from threading import RLock
from functools import wraps
from ..helper import warning
from .exceptions import UnsupportedSearchTypeError
class UnsupportedSearchTypeError(Exception):
pass
class PkgData (object):
__slots__ = ("cat", "pkg", "inst", "disabled")
def __init__ (self, cat, pkg, inst = False, disabled = False):
self.cat = cat
self.pkg = pkg
self.inst = inst
self.disabled = disabled
def __iter__ (self):
return iter((self.cat, self.pkg, self.inst, self.disabled))
def __cmp__ (self, other):
return cmp(self.pkg.lower(), other.pkg.lower())
def __repr__ (self):
return "<Package (%(cat)s, %(pkg)s, %(inst)s)>" % {"cat" : self.cat, "pkg" : self.pkg, "inst" : self.inst}
class Database (object):
ALL = _("ALL")
SEARCH_NAME = 1
SEARCH_DESCRIPTION = 2
TYPES = {
SEARCH_NAME : _("Name"),
SEARCH_DESCRIPTION : _("Description"),
SEARCH_NAME | SEARCH_DESCRIPTION : "%s + %s" % (_("Name"), _("Description"))
}
def __init__ (self):
self._lock = RLock()
self.type = self.SEARCH_NAME
@staticmethod
def lock (f):
@wraps(f)
def wrapper (self, *args, **kwargs):
with self._lock:
r = f(self, *args, **kwargs)
return r
return wrapper
def search_types (self):
"""The types of search supported by the database.
@return: type
@rtype: int"""
raise NotImplentedError
def set_type (self, type):
if type & self.search_types() != type:
raise UnsupportedSearchTypeError(type)
self._type = type
def get_type (self):
return self._type
type = property(get_type, set_type)
def populate (self, category = None):
"""Populates the database.
@param category: An optional category - so only packages of this category are inserted.
@type category: string
"""
raise NotImplentedError
def get_cat (self, cat = None, byName = True, showDisabled = False):
"""Returns the packages in the category.
@param cat: category to return the packages from; if None it defaults to C{ALL}
@type cat: string
@param byName: selects whether to return the list sorted by name or by installation
@type byName: boolean
@param showDisabled: should disabled packages be returned
@type showDisabled: boolean
@return: an iterator over the packages
@rtype: L{PkgData}<iterator>
"""
raise NotImplentedError
def get_categories (self, installed = False):
"""Returns all categories.
@param installed: Only return these with at least one installed package.
@type installed: boolean
@returns: the list of categories
@rtype: string<iterator>
"""
raise NotImplentedError
def disable (self, cpv):
"""Marks the CPV as disabled.
@param cpv: the cpv to mark
"""
raise NotImplentedError
def reload (self, cat = None):
"""Reloads the given category.
@param cat: category
@type cat: string
"""
raise NotImplentedError
|