From c372df97f631470048b98e1849d3ccd1a9db8e5f Mon Sep 17 00:00:00 2001 From: Lucy Phipps Date: Sat, 21 Nov 2020 18:33:58 +0000 Subject: [PATCH] vastly reduce database size by not storing $PREFIX also escape filenames for sqlite, realpath -sm --- update-whatprovides-db.sh | 4 +++- whatprovides | 28 ++++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/update-whatprovides-db.sh b/update-whatprovides-db.sh index cab3d52..e5975ed 100755 --- a/update-whatprovides-db.sh +++ b/update-whatprovides-db.sh @@ -7,7 +7,9 @@ set -e -u list_files() { - dpkg-deb -c "${1}" | grep -o "/data/data/com.termux/.*" | sed -E 's@(.*) ->..*@\1@g' + dpkg-deb -c "${1}" | grep -o "/data/data/com\.termux/files/.\+" \ + | sed -E 's@(.*) ->..*@\1@g;s@/$@@g' \ + | xargs -rd\\n realpath -sm --relative-base=$TERMUX_PREFIX -- } write_sql_script() { diff --git a/whatprovides b/whatprovides index 1107534..6ce116b 100755 --- a/whatprovides +++ b/whatprovides @@ -118,12 +118,32 @@ if ${REVERSE_MODE}; then sqlite3 "${DB_PATH}" \ "SELECT owned_file FROM 'whatprovides' WHERE package_name == '${1}' ORDER BY owned_file" \ - | awk "{ print \"${1}: \"\$0 }" + | awk "NR == 1 { print \"${1}: /.\\n${1}: /data\\n${1}: /data/data\\n${1}: /data/data/com.termux\\n${1}: /data/data/com.termux/files\\n${1}: ${PREFIX}\" } { print \"${1}: ${PREFIX}/\"\$0 }" else - FILE="$(realpath "$1")" + NEWPREFIX= + FILE="$(realpath -sm "$1")" + + if [[ "${PREFIX}/" = "${FILE}/"* || "${FILE}" = / ]]; then + # FILE is (((great...)grand)parent of) PREFIX, including root + if [ "${FILE}" = / ]; then + FILE=/. + fi + + sqlite3 "${DB_PATH}" \ + "SELECT DISTINCT package_name FROM 'whatprovides' ORDER BY package_name" \ + | awk "{ print \$0\": ${FILE}\" }" + exit 0 + fi + + if [[ "${FILE}" = "${PREFIX}/"* ]]; then + # FILE is in PREFIX + FILE="${FILE##${PREFIX}/}" + NEWPREFIX="${PREFIX}/" + fi # else FILE is entirely separate from PREFIX (unlikely to be in DB) + if ! sqlite3 "${DB_PATH}" \ - "SELECT package_name FROM 'whatprovides' WHERE owned_file == '$FILE' ORDER BY package_name" \ - | awk "{ print \$0\": $FILE\" } END {if (NR == 0) exit 1 }" + "SELECT package_name FROM 'whatprovides' WHERE owned_file == '${FILE//\'/\'\'}' ORDER BY package_name" \ + | awk "{ print \$0\": ${NEWPREFIX}${FILE}\" } END { if (NR == 0) exit 1 }" then { echo