summaryrefslogtreecommitdiff
path: root/portato/db/eix_sql.py
blob: e93a6139c64c7cb1ea65d8f16c1e5a65d2b9d7fc (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
# -*- coding: utf-8 -*-
#
# File: portato/db/eix_sql.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>



try:
    import sqlite3 as sql
except ImportError:
    from pysqlite2 import dbapi2 as sql

import os

from .sql import SQLDatabase
from .exceptions import DatabaseInitError
from ..eix import EixReader
from ..helper import debug, warning
from ..backend import system

class EixInitError (DatabaseInitError):
    pass

class EixSQLDatabase (SQLDatabase):

    CACHE_FILE = "/var/cache/eix"

    def __init__ (self, session):

        self.cache = session.get("cache", self.CACHE_FILE)
        if not os.path.exists(self.cache):
            warning(_("Cache file '%s' does not exist. Using default instead."), self.cache)
            self.cache = self.CACHE_FILE

        if not os.path.exists(self.cache):
            raise EixInitError(_("Cache file '%s' does not exist.") % self.cache)

        debug("Using '%s' as eix cache file.", self.cache)
        
        session["cache"] = self.cache
        
        SQLDatabase.__init__(self, session)

    def search_types(self):
        return self.SEARCH_NAME | self.SEARCH_DESCRIPTION

    def updated (self):
        mtime = os.stat(self.cache).st_mtime
        old = float(self.session.get("mtime", 0))
        
        self.session["mtime"] = str(mtime)

        return old < mtime

    def generate_cat_expr (self, cat):
        # be a noop
        return cat

    @SQLDatabase.con
    def populate (self, category = None, connection = None):
        inst = set(system.find_packages(pkgSet = system.SET_INSTALLED, key = category, with_version = False))

        def _get():
            with EixReader(self.cache) as eix:
                for cat in eix.categories:
                    if category is None or cat.name == category:
                        for pkg in cat.packages:
                            p = "%s/%s" % (cat.name, pkg.name)
                            yield (cat.name, pkg.name, pkg.description, p in inst, False)

        connection.executemany("INSERT INTO packages (cat, name, descr, inst, disabled) VALUES (?, ?, ?, ?, ?)", _get())
        connection.commit()