# pro-archman
# lib/db.sh
# Functions for querying and modifying the database
#
# Copyright (C) 2013 Patrick "P. J." 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}"
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//".
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}"
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///_".
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///.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}"
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
}