diff options
Diffstat (limited to 'src/backend/searchdb.py')
-rw-r--r-- | src/backend/searchdb.py | 185 |
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)) |