summaryrefslogtreecommitdiff
path: root/src/backend/searchdb.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/searchdb.py')
-rw-r--r--src/backend/searchdb.py185
1 files changed, 185 insertions, 0 deletions
diff --git a/src/backend/searchdb.py b/src/backend/searchdb.py
new file mode 100644
index 0000000..22bd4ba
--- /dev/null
+++ b/src/backend/searchdb.py
@@ -0,0 +1,185 @@
+#!/usr/bin/python3
+
+import signal
+import sqlite3
+import subprocess
+import sisyphus.checkenv
+import sisyphus.getcolor
+import sisyphus.getfs
+import sisyphus.update
+
+
+def sigint_handler(signal, frame):
+ sys.exit(0)
+
+
+signal.signal(signal.SIGINT, sigint_handler)
+
+
+def srch_db(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, 'alien') 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}''',
+ 'alien': f'''SELECT
+ i.category AS cat,
+ i.name AS pn,
+ i.version as iv,
+ IFNULL(a.version, 'alien') 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 'alien' ''',
+ 'available': 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''',
+ 'upgradable': 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.getfs.lcl_db) 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 srch_rslt(filter, cat, pn, desc, single):
+ print("\nSearching" + sisyphus.getcolor.bright_yellow + " " +
+ f"{filter}" + " " + sisyphus.getcolor.reset + "packages ..." + "\n")
+ pkglist = srch_db(filter, tosql(cat), tosql(pn), tosql(desc))
+
+ if len(pkglist) == 0:
+ print(sisyphus.getcolor.bright_red +
+ "No binary package found!\n" + sisyphus.getcolor.reset)
+ print(sisyphus.getcolor.bright_yellow + "Use the" + sisyphus.getcolor.reset + " " + "'" + "--ebuild" +
+ "'" + " " + sisyphus.getcolor.bright_yellow + "option to search source packages" + sisyphus.getcolor.reset)
+ print(sisyphus.getcolor.bright_yellow + "Use" + sisyphus.getcolor.reset + " " + "'" +
+ "sisyphus search --help" + "'" + " " + sisyphus.getcolor.bright_yellow + "for help" + sisyphus.getcolor.reset)
+ else:
+ if single:
+ print(sisyphus.getcolor.green +
+ f"{'Package category/name':45} {'Installed version':20} {'Latest available version':30} {'Description'}" + sisyphus.getcolor.reset)
+ for pkg in pkglist:
+ if not single:
+ print(sisyphus.getcolor.bright_green + "*" + " " + sisyphus.getcolor.reset +
+ sisyphus.getcolor.bright_white + f"{pkg['cat']}/{pkg['pn']}" + sisyphus.getcolor.reset)
+ print(sisyphus.getcolor.green + "\tInstalled version:" +
+ " " + sisyphus.getcolor.reset + f"{pkg['iv']}")
+ if pkg['av'] != 'alien':
+ print(sisyphus.getcolor.green + "\tLatest available version:" +
+ " " + sisyphus.getcolor.reset + f"{pkg['av']}")
+ else:
+ print(sisyphus.getcolor.green + "\tAlien package:" + " " + sisyphus.getcolor.reset +
+ "Use `sisyphus search --ebuild" + " " + f"{pkg['pn']}`" + " " + "for available version!")
+ print(sisyphus.getcolor.green + "\tDescription:" + " " +
+ sisyphus.getcolor.reset + f"{pkg['desc']}" + "\n")
+ else:
+ cpn = f"{pkg['cat']}/{pkg['pn']}"
+ print(sisyphus.getcolor.bright_white + f"{cpn:45}" + " " + sisyphus.getcolor.reset +
+ f"{str(pkg['iv']):20}" + " " + f"{str(pkg['av']):30}" + " " + f"{str(pkg['desc'])}")
+ print("\nFound" + " " + sisyphus.getcolor.bright_yellow +
+ f"{len(pkglist)}" + " " + sisyphus.getcolor.reset + "matching package(s) ...")
+
+
+def start(filter, cat, pn, desc, single):
+ if sisyphus.checkenv.root():
+ print(sisyphus.getcolor.bright_red +
+ "\nSearching as root, database can be updated!\n" + sisyphus.getcolor.reset)
+ print(sisyphus.getcolor.bright_yellow +
+ "Search results will be accurate\n" + sisyphus.getcolor.reset)
+ while True:
+ user_input = input(sisyphus.getcolor.bright_white + "Would you like to proceed?" + sisyphus.getcolor.reset + " " +
+ "[" + sisyphus.getcolor.bright_green + "Yes" + sisyphus.getcolor.reset + "/" + sisyphus.getcolor.bright_red + "No" + sisyphus.getcolor.reset + "]" + " ")
+ if user_input.lower() in ['yes', 'y', '']:
+ sisyphus.update.start(gfx_ui=False)
+ break
+ elif user_input.lower() in ['no', 'n']:
+ print(sisyphus.getcolor.bright_red +
+ "\nSkipping database update, displaying search results!\n" + sisyphus.getcolor.reset)
+ print(sisyphus.getcolor.bright_yellow +
+ "Search results may be inaccurate" + sisyphus.getcolor.reset)
+ break
+ else:
+ continue
+ else:
+ print(sisyphus.getcolor.bright_red +
+ "\nSearching as user, database cannot be updated!\n" + sisyphus.getcolor.reset)
+ print(sisyphus.getcolor.bright_yellow +
+ "Search results may be inaccurate" + sisyphus.getcolor.reset)
+
+ srch_rslt(filter, cat, pn, desc, single)
+
+
+def estart(pkgname):
+ subprocess.call(['emerge', '--search', '--getbinpkg'] + list(pkgname))