diff options
Diffstat (limited to 'lib/db.sh')
-rw-r--r-- | lib/db.sh | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/lib/db.sh b/lib/db.sh new file mode 100644 index 0000000..caeb0da --- /dev/null +++ b/lib/db.sh @@ -0,0 +1,247 @@ +# pro-archman +# lib/db.sh +# Functions for querying and modifying the database +# +# Copyright (C) 2013 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +use dir + +# +# Functions for the suites indices +# + +db_get_srcver() +{ + local chan="${1}" + local dist="${2}" + local source="${3}" + local dir= + + dir="${archive}/feeds/${chan}/${dist}/.db" + dir="${dir}/$(hash_name "${source}")/${source}" + if [ -f "${dir}/srcver" ]; then + cat "${dir}/srcver" + fi + + return 0 +} + +db_set_srcver() +{ + local chan="${1}" + local dist="${2}" + local source="${3}" + local srcver="${4}" + local dir= + + dir="${archive}/feeds/${chan}/${dist}/.db" + dir="${dir}/$(hash_name "${source}")/${source}" + mkdir -p "${dir}" + printf '%s\n' "${srcver}" >"${dir}/srcver" + + return 0 +} + +db_del_srcver() +{ + local chan="${1}" + local dist="${2}" + local source="${3}" + local dir= + + dir="${archive}/feeds/${chan}/${dist}/.db" + dir="${dir}/$(hash_name "${source}")/${source}" + rm -f "${dir}/srcver" + # Remove ".../.db/<hash>/<source>". + rmdir "${dir}" + # Try to remove ".../.db/<hash>" and ".../.db". + for dir in "${dir%/*}" "${dir%/*/*}"; do + try_rmdir "${dir}" || break + done + + return 0 +} + +db_get_binver() +{ + local chan="${1}" + local dist="${2}" + local plat="${3}" + local arch="${4}" + local source="${5}" + local dir= + + dir="${archive}/feeds/${chan}/${dist}/.db" + dir="${dir}/$(hash_name "${source}")/${source}/${plat}_${arch}" + if [ -f "${dir}/binver" ]; then + cat "${dir}/binver" + fi + + return 0 +} + +db_set_binver() +{ + local chan="${1}" + local dist="${2}" + local plat="${3}" + local arch="${4}" + local source="${5}" + local binver="${6}" + local dir= + + dir="${archive}/feeds/${chan}/${dist}/.db" + dir="${dir}/$(hash_name "${source}")/${source}/${plat}_${arch}" + mkdir -p "${dir}" + printf '%s\n' "${binver}" >"${dir}/binver" + + return 0 +} + +db_del_binver() +{ + local chan="${1}" + local dist="${2}" + local plat="${3}" + local arch="${4}" + local source="${5}" + local dir= + + dir="${archive}/feeds/${chan}/${dist}/.db" + dir="${dir}/$(hash_name "${source}")/${source}/${plat}_${arch}" + rm -f "${dir}/binver" + # Remove ".../.db/<hash>/<source>/<plat>_<arch>". + rmdir "${dir}" + + return 0 +} + +db_get_archplats() +{ + local chan="${1}" + local dist="${2}" + local source="${3}" + local dir= + + dir="${archive}/feeds/${chan}/${dist}/.db" + dir="${dir}/$(hash_name "${source}")/${source}" + for dir in "${dir}/"*_*/; do + dir="${dir%/}" + dir="${dir##*/}" + printf '%s %s\n' "${dir%%_*}" "${dir#*_}" + done + + return 0 +} + +# +# Functions for the pool indices +# + +db_get_packages() +{ + local plat="${1}" + local arch="${2}" + local source="${3}" + local binver="${4}" + local dir= + + dir="${archive}/pool/$(hash_name "${source}")/${source}/.db" + dir="${dir}/${binver}_${arch}_${plat}" + if [ -f "${dir}/packages" ]; then + cat "${dir}/packages" + fi + + return 0 +} + +db_add_package() +{ + local plat="${1}" + local arch="${2}" + local source="${3}" + local binver="${4}" + local sect="${5}" + local pkg="${6}" + local dir= + + dir="${archive}/pool/$(hash_name "${source}")/${source}/.db" + dir="${dir}/${binver}_${arch}_${plat}" + printf '%s %s\n' "${sect}" "${pkg}" >>"${dir}/packages" + + return 0 +} + +db_del_packages() +{ + local plat="${1}" + local arch="${2}" + local source="${3}" + local binver="${4}" + local dir= + + dir="${archive}/pool/$(hash_name "${source}")/${source}/.db" + dir="${dir}/${binver}_${arch}_${plat}" + rm -f "${dir}/packages" + # Remove "pool/<hash>/<source>/.db/<binver>_<arch>_<plat>". + rmdir "${dir}" + # Try to remove "pool/<hash>/<source>/.db". + try_rmdir "${dir%/*}" + + return 0 +} + +db_inc_references() +{ + local plat="${1}" + local arch="${2}" + local source="${3}" + local binver="${4}" + local dir= + local refs= + + dir="${archive}/pool/$(hash_name "${source}")/${source}/.db" + dir="${dir}/${binver}_${arch}_${plat}" + refs="$(cat "${dir}/references")" + refs=$(($refs + 1)) + printf '%d\n' "${refs}" >"${dir}/references" + printf '%d\n' "${refs}" + + return 0 +} + +db_dec_references() +{ + local plat="${1}" + local arch="${2}" + local source="${3}" + local binver="${4}" + local dir= + local refs= + + dir="${archive}/pool/$(hash_name "${source}")/${source}/.db" + dir="${dir}/${binver}_${arch}_${plat}" + refs="$(cat "${dir}/references")" + refs=$(($refs - 1)) + if [ ${refs} -eq 0 ]; then + rm -f "${dir}/references" + else + printf '%d\n' "${refs}" >"${dir}/references" + fi + printf '%d\n' "${refs}" + + return 0 +} |