summaryrefslogtreecommitdiff
path: root/portato/db/eix_sql.py
blob: 758f42c0725eb1daf3180da2a2fc21f42c0ce6f7 (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
# -*- 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>

from __future__ import absolute_import, with_statement

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

import os

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

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

        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()