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