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