summaryrefslogtreecommitdiff
path: root/portato/db/database.py
blob: 9ab431ce11e3bbb799edc122d98b447b5a9e4cf0 (plain)
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