add script for generating or updating database

This commit is contained in:
Leonid Pliushch 2020-11-21 20:39:09 +02:00
parent 8078679e7a
commit f93bad1cfc
No known key found for this signature in database
GPG Key ID: 45F2964132545795
1 changed files with 74 additions and 0 deletions

74
update-whatprovides-db.sh Executable file
View File

@ -0,0 +1,74 @@
#!/usr/bin/env bash
##
## Script that generates or updates a Whatprovides
## database for Termux.
##
set -e -u
list_files() {
dpkg-deb -c "${1}" | grep -o "/data/data/com.termux/.*" | sed -E 's@(.*) ->..*@\1@g'
}
write_sql_script() {
local debfile_dir=$1
local debfile_path
# SQL statements should be executed within a single
# transaction, otherwise execution performance would
# be very slow.
echo "BEGIN TRANSACTION;" >> "$SQLSCRIPT_TMPFILE"
while read -r debfile_path; do
# .deb files are named package-name_version-revision_cpuarch.deb
local package_name
package_name=$(basename "$debfile_path" | cut -d_ -f1)
echo "[*] Processing '${debfile_path}'..." >&2
# Delete content of processed package to ensure there will not be any
# duplicates and stale entries.
echo "DELETE FROM whatprovides WHERE package_name == \"${package_name}\";" >> "$SQLSCRIPT_TMPFILE"
# Add row with matching package-name and file-name.
while read -r file_path; do
echo "${package_name}: adding '${file_path}'" >&2
echo "INSERT INTO whatprovides (package_name, owned_file) VALUES (\"${package_name}\", \"${file_path}\");" >> "$SQLSCRIPT_TMPFILE"
done < <(list_files "$debfile_path")
# Note: searching only for ARCH "all" (platform-independent) and "aarch64" which
# has 100% support by Termux packages.
done < <(find "$debfile_dir" -type f \( -name "*_all.deb" -o -name "*_aarch64.deb" \) -print)
echo "COMMIT;" >> "$SQLSCRIPT_TMPFILE"
# Databases which were not generated from scratch needs
# to be compacted.
echo "VACUUM;" >> "$SQLSCRIPT_TMPFILE"
echo "REINDEX;" >> "$SQLSCRIPT_TMPFILE"
}
if [ $# -ge 2 ]; then
SQLSCRIPT_TMPFILE=$(mktemp -t "whatprovides.XXXXXX.sql")
if [ ! -e "${1}" ]; then
echo "[*] Creating new database." >&2
sqlite3 "$1" "CREATE TABLE whatprovides ( id INTEGER PRIMARY KEY, package_name TEXT NOT NULL, owned_file TEXT NOT NULL);"
fi
echo "[*] Generating SQL script..." >&2
write_sql_script "$2" "$SQLSCRIPT_TMPFILE"
echo "[*] Rebuilding database..." >&2
sqlite3 "$1" < "$SQLSCRIPT_TMPFILE"
rm -f "${SQLSCRIPT_TMPFILE}"
echo "[*] Done." >&2
else
echo
echo "Usage: update-whatprovides-db.sh [db path] [directory with .deb files]"
echo
echo "Regenerate a database for Termux Whatprovides utility."
echo
exit 1
fi