diff options
Diffstat (limited to 'src/db.sh')
-rw-r--r-- | src/db.sh | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/src/db.sh b/src/db.sh new file mode 100644 index 0000000..e2f8fb7 --- /dev/null +++ b/src/db.sh @@ -0,0 +1,293 @@ +# 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/>. + +[ "x${_DB_SM+set}" = 'xset' ] && return 0 +_DB_SM=1 + +use dir + +# +# Functions for the suites indices +# + +db_get_srcver() +{ + local chan="${1}" + local dist="${2}" + local source="${3}" + local dir= + + dir="${base_dir}/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="${base_dir}/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="${base_dir}/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 arch="${3}" + local plat="${4}" + local source="${5}" + local dir= + + dir="${base_dir}/feeds/${chan}/${dist}/.db" + dir="${dir}/$(hash_name "${source}")/${source}/${arch}_${plat}" + if [ -f "${dir}/binver" ]; then + cat "${dir}/binver" + fi + + return 0 +} + +db_set_binver() +{ + local chan="${1}" + local dist="${2}" + local arch="${3}" + local plat="${4}" + local source="${5}" + local binver="${6}" + local dir= + + dir="${base_dir}/feeds/${chan}/${dist}/.db" + dir="${dir}/$(hash_name "${source}")/${source}/${arch}_${plat}" + mkdir -p "${dir}" + printf '%s\n' "${binver}" >"${dir}/binver" + + return 0 +} + +db_del_binver() +{ + local chan="${1}" + local dist="${2}" + local arch="${3}" + local plat="${4}" + local source="${5}" + local dir= + + dir="${base_dir}/feeds/${chan}/${dist}/.db" + dir="${dir}/$(hash_name "${source}")/${source}/${arch}_${plat}" + rm -f "${dir}/binver" + # Remove ".../.db/<hash>/<source>/<arch>_<plat>". + rmdir "${dir}" + + return 0 +} + +db_foreach_source() +{ + local chan="${1}" + local dist="${2}" + local cb="${3}" + local dir= + + shift 3 + + dir="${base_dir}/feeds/${chan}/${dist}/.db" + # For each hash: + for dir in "${dir}/"*/; do + if [ ! -d "${dir}" ]; then + continue + fi + # For each source: + for dir in "${dir}/"*/; do + if [ ! -d "${dir}" ]; then + continue + fi + dir="${dir%/}" + dir="${dir##*/}" + "${cb}" "${chan}" "${dist}" "${dir}" "${@}" + done + done + + return 0 +} + +db_get_archplats() +{ + local chan="${1}" + local dist="${2}" + local source="${3}" + local dir= + + dir="${base_dir}/feeds/${chan}/${dist}/.db" + dir="${dir}/$(hash_name "${source}")/${source}" + for dir in "${dir}/"*_*/; do + if [ ! -d "${dir}" ]; then + continue + fi + dir="${dir%/}" + dir="${dir##*/}" + printf '%s %s\n' "${dir%%_*}" "${dir#*_}" + done + + return 0 +} + +# +# Functions for the pool indices +# + +db_get_packages() +{ + local arch="${1}" + local plat="${2}" + local source="${3}" + local binver="${4}" + local dir= + + dir="${base_dir}/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 arch="${1}" + local plat="${2}" + local source="${3}" + local binver="${4}" + local size="${5}" + local sect="${6}" + local pkg="${7}" + local dir= + + dir="${base_dir}/pool/$(hash_name "${source}")/${source}/.db" + dir="${dir}/${binver}_${arch}_${plat}" + mkdir -p "${dir}" + printf '%s %s %s\n' "${size}" "${sect}" "${pkg}" >>"${dir}/packages" + + return 0 +} + +db_del_packages() +{ + local arch="${1}" + local plat="${2}" + local source="${3}" + local binver="${4}" + local dir= + + dir="${base_dir}/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 arch="${1}" + local plat="${2}" + local source="${3}" + local binver="${4}" + local dir= + local refs= + + dir="${base_dir}/pool/$(hash_name "${source}")/${source}/.db" + dir="${dir}/${binver}_${arch}_${plat}" + if [ -f "${dir}/references" ]; then + refs="$(cat "${dir}/references")" + refs=$(($refs + 1)) + else + refs=1 + mkdir -p "${dir}" + fi + printf '%d\n' "${refs}" >"${dir}/references" + printf '%d\n' "${refs}" + + return 0 +} + +db_dec_references() +{ + local arch="${1}" + local plat="${2}" + local source="${3}" + local binver="${4}" + local dir= + local refs= + + dir="${base_dir}/pool/$(hash_name "${source}")/${source}/.db" + dir="${dir}/${binver}_${arch}_${plat}" + if [ -f "${dir}/references" ]; then + refs="$(cat "${dir}/references")" + refs=$(($refs - 1)) + else + refs=0 + fi + if [ ${refs} -eq 0 ]; then + rm -f "${dir}/references" + else + printf '%d\n' "${refs}" >"${dir}/references" + fi + printf '%d\n' "${refs}" + + return 0 +} |