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
|
#!/usr/bin/python3
import sisyphus
import sqlite3
def searchDB(filter, cat = '', pn = '', desc = ''):
NOVIRT = "AND cat NOT LIKE 'virtual'"
SELECTS = {
'all': f'''SELECT
i.category AS cat,
i.name as pn,
i.version as iv,
IFNULL(a.version, 'None') AS av,
d.description AS desc
FROM local_packages AS i LEFT OUTER JOIN remote_packages as a
ON i.category = a.category
AND i.name = a.name
AND i.slot = a.slot
LEFT JOIN remote_descriptions AS d ON i.name = d.name AND i.category = d.category
WHERE cat LIKE '%{cat}%' AND pn LIKE '%{pn}%' AND desc LIKE '%{desc}%' {NOVIRT}
UNION
SELECT
a.category AS cat,
a.name as pn,
IFNULL(i.version, 'None') AS iv,
a.version as av,
d.description AS desc
FROM remote_packages AS a LEFT OUTER JOIN local_packages AS i
ON a.category = i.category
AND a.name = i.name
AND a.slot = i.slot
LEFT JOIN remote_descriptions AS d ON a.name = d.name AND a.category = d.category
WHERE cat LIKE '%{cat}%' AND pn LIKE '%{pn}%' AND desc LIKE '%{desc}%' {NOVIRT}''',
'installed': f'''SELECT
i.category AS cat,
i.name AS pn,
i.version AS iv,
a.version as av,
d.description AS desc
FROM local_packages AS i
LEFT JOIN remote_packages AS a
ON i.category = a.category
AND i.name = a.name
AND i.slot = a.slot
LEFT JOIN remote_descriptions AS d ON i.name = d.name AND i.category = d.category
WHERE cat LIKE '%{cat}%' AND pn LIKE '%{pn}%' AND desc LIKE '%{desc}%' {NOVIRT}''',
'local': f'''SELECT
i.category AS cat,
i.name AS pn,
i.version as iv,
a.version AS av,
d.description AS desc
FROM local_packages AS i
LEFT JOIN remote_packages AS a
ON a.category = i.category
AND a.name = i.name
AND a.slot = i.slot
LEFT JOIN remote_descriptions AS d ON i.name = d.name AND i.category = d.category
WHERE cat LIKE '%{cat}%' AND pn LIKE '%{pn}%' AND desc LIKE '%{desc}%' {NOVIRT}
AND av IS NULL''',
'remote': f'''SELECT
a.category AS cat,
a.name AS pn,
i.version as iv,
a.version AS av,
d.description AS desc
FROM remote_packages AS a
LEFT JOIN local_packages AS i
ON a.category = i.category
AND a.name = i.name
AND a.slot = i.slot
LEFT JOIN remote_descriptions AS d ON a.name = d.name AND a.category = d.category
WHERE cat LIKE '%{cat}%' AND pn LIKE '%{pn}%' AND desc LIKE '%{desc}%' {NOVIRT}
AND iv IS NULL''',
'upgrade': f'''SELECT
i.category AS cat,
i.name AS pn,
i.version as iv,
a.version AS av,
d.description AS desc
FROM local_packages AS i
INNER JOIN remote_packages AS a
ON i.category = a.category
AND i.name = a.name
AND i.slot = a.slot
LEFT JOIN remote_descriptions AS d ON i.name = d.name AND i.category = d.category
WHERE cat LIKE '%{cat}%' AND pn LIKE '%{pn}%' AND desc LIKE '%{desc}%' {NOVIRT}
AND iv <> av'''
}
with sqlite3.connect(sisyphus.filesystem.localDatabase) as db:
db.row_factory = sqlite3.Row
cursor = db.cursor()
cursor.execute(SELECTS[filter])
rows = cursor.fetchall()
return rows
def tosql(string):
return '%%' if string == '' else string.replace('*', '%').replace('?', '_')
def showSearch(filter, cat, pn, desc, single = False):
print(f"Searching for {filter} packages ...\n")
pkglist = searchDB(filter, tosql(cat), tosql(pn), tosql(desc))
if len(pkglist) == 0:
print("No binary package found!")
else:
for pkg in pkglist:
if not single:
print(f"* {pkg['cat']}/{pkg['pn']}")
print(f"\tInstalled version: {pkg['iv']}")
print(f"\tLatest available version: {pkg['av']}")
print(f"\tDescription: {pkg['desc']}\n")
else:
cpn = f"{pkg['cat']}/{pkg['pn']}"
print(f"{cpn:45} i:{str(pkg['iv']):20} a:{str(pkg['av'])}")
print(f"\nFound {len(pkglist)} binary package(s)")
print("To search for source packages, use the '--ebuild' option.")
|