# pro-archman # src/db.sh # Functions for querying and modifying the database # # Copyright (C) 2013 Patrick McDermott # # This file is part of the ProteanOS Archive Manager. # # The ProteanOS Archive Manager 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. # # The ProteanOS Archive Manager 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 the ProteanOS Archive Manager. If not, see # . # # Functions for the suites indices # db_get_srcver() { local chan="${1}" local dist="${2}" local source="${3}" shift 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}" shift 4 local dir= dir="${base_dir}/feeds/${chan}/${dist}/.db" dir="${dir}/$(hash_name "${source}")/${source}" mkdir -p -- "${dir}" printf '%s\n' "${srcver}" 1>"${dir}/srcver" return 0 } db_del_srcver() { local chan="${1}" local dist="${2}" local source="${3}" shift 3 local dir= dir="${base_dir}/feeds/${chan}/${dist}/.db" dir="${dir}/$(hash_name "${source}")/${source}" rm -f -- "${dir}/srcver" # Remove ".../.db//". rmdir -- "${dir}" # Try to remove ".../.db/" 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}" shift 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}" shift 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}" 1>"${dir}/binver" return 0 } db_del_binver() { local chan="${1}" local dist="${2}" local arch="${3}" local plat="${4}" local source="${5}" shift 5 local dir= dir="${base_dir}/feeds/${chan}/${dist}/.db" dir="${dir}/$(hash_name "${source}")/${source}/${arch}_${plat}" rm -f -- "${dir}/binver" # Remove ".../.db///_". rmdir -- "${dir}" return 0 } db_foreach_source() { local chan="${1}" local dist="${2}" local cb="${3}" shift 3 local dir= 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}" shift 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}" shift 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}" shift 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}" 1>>"${dir}/packages" return 0 } db_del_packages() { local arch="${1}" local plat="${2}" local source="${3}" local binver="${4}" shift 4 local dir= dir="${base_dir}/pool/$(hash_name "${source}")/${source}/.db" dir="${dir}/${binver}_${arch}_${plat}" rm -f -- "${dir}/packages" # Remove "pool///.db/__". rmdir -- "${dir}" # Try to remove "pool///.db". try_rmdir "${dir%/*}" || : return 0 } db_inc_references() { local arch="${1}" local plat="${2}" local source="${3}" local binver="${4}" shift 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}" 1>"${dir}/references" printf '%d\n' "${refs}" return 0 } db_dec_references() { local arch="${1}" local plat="${2}" local source="${3}" local binver="${4}" shift 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}" 1>"${dir}/references" fi printf '%d\n' "${refs}" return 0 }