summaryrefslogtreecommitdiffstats
path: root/src/db.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/db.sh')
-rw-r--r--src/db.sh293
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
+}