2019-05-27 12:30:21 +00:00
|
|
|
#!/bin/bash
|
|
|
|
# file: modules/jsshDB.sh
|
|
|
|
# do not edit, this file will be overwritten on update
|
|
|
|
|
|
|
|
# This file is public domain in the USA and all free countries.
|
|
|
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
|
|
|
#
|
2020-05-14 20:12:44 +00:00
|
|
|
#### $$VERSION$$ v0.94-pre-7-g64efe96
|
2019-05-27 12:30:21 +00:00
|
|
|
#
|
|
|
|
# source from commands.sh to use jsonDB functions
|
|
|
|
#
|
2019-06-04 10:00:19 +00:00
|
|
|
# jsonDB provides simple functions to read and store bash Arrays
|
|
|
|
# from to file in JSON.sh output format, its a simple key/value storage.
|
2019-05-27 12:30:21 +00:00
|
|
|
|
2020-05-14 17:47:37 +00:00
|
|
|
# source once magic, function named like file
|
|
|
|
eval "$(basename "${BASH_SOURCE[0]}")(){ :; }"
|
|
|
|
|
2019-05-27 12:30:21 +00:00
|
|
|
# read content of a file in JSON.sh format into given ARRAY
|
|
|
|
# $1 ARRAY name, must be delared with "declare -A ARRAY" upfront
|
|
|
|
# $2 filename, must be relative to BASHBOT_ETC, and not contain '..'
|
|
|
|
jssh_readDB() {
|
2019-06-04 11:16:48 +00:00
|
|
|
local DB; DB="$(jssh_checkDB "$2")"
|
2020-05-14 18:33:30 +00:00
|
|
|
[ -z "${DB}" ] && return 1
|
2019-06-04 10:00:19 +00:00
|
|
|
[ ! -f "${DB}" ] && return 2
|
2019-05-27 12:30:21 +00:00
|
|
|
Json2Array "$1" <"${DB}"
|
|
|
|
}
|
|
|
|
|
|
|
|
# write ARRAY content to a file in JSON.sh format
|
2019-06-04 11:16:48 +00:00
|
|
|
# Warning: old content is overwritten
|
2019-05-27 12:30:21 +00:00
|
|
|
# $1 ARRAY name, must be delared with "declare -A ARRAY" upfront
|
|
|
|
# $2 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..'
|
|
|
|
jssh_writeDB() {
|
2019-06-04 11:16:48 +00:00
|
|
|
local DB; DB="$(jssh_checkDB "$2")"
|
2020-05-14 18:33:30 +00:00
|
|
|
[ -z "${DB}" ] && return 1
|
2019-06-04 10:00:19 +00:00
|
|
|
[ ! -f "${DB}" ] && return 2
|
2019-05-27 12:30:21 +00:00
|
|
|
Array2Json "$1" >"${DB}"
|
|
|
|
}
|
|
|
|
|
2019-06-04 11:16:48 +00:00
|
|
|
# update/write ARRAY content in file without deleting keys not in ARRAY
|
|
|
|
# $1 ARRAY name, must be delared with "declare -A ARRAY" upfront
|
|
|
|
# $2 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..'
|
|
|
|
jssh_updateDB() {
|
|
|
|
declare -n ARRAY="$1"
|
2020-05-14 18:33:30 +00:00
|
|
|
[ -z "${ARRAY[*]}" ] && return 1
|
2019-06-04 11:16:48 +00:00
|
|
|
declare -A oldARR newARR
|
|
|
|
jssh_readDB "oldARR" "$2" || return "$?"
|
2020-05-14 18:33:30 +00:00
|
|
|
if [ -z "${oldARR[*]}" ]; then
|
2019-06-04 11:16:48 +00:00
|
|
|
# no old content
|
|
|
|
jssh_writeDB "$1" "$2"
|
|
|
|
else
|
|
|
|
# merge arrays
|
|
|
|
local o1 o2 n1 n2
|
|
|
|
o1="$(declare -p oldARR)"; o2="${o1#*\(}"
|
|
|
|
n1="$(declare -p ARRAY)"; n2="${n1#*\(}"
|
|
|
|
unset IFS; set -f
|
|
|
|
#shellcheck disable=SC2034,SC2190,SC2206
|
|
|
|
newARR=( ${o2:0:${#o2}-1} ${n2:0:${#n2}-1} )
|
|
|
|
set +f
|
|
|
|
jssh_writeDB "newARR" "$2"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2019-06-04 10:00:19 +00:00
|
|
|
# insert, update, apped key/value to jsshDB
|
|
|
|
# $1 key name, can onyl contain -a-zA-Z0-9,._
|
|
|
|
# $2 key value
|
|
|
|
# $3 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..'
|
|
|
|
jssh_insertDB() {
|
|
|
|
[[ "$1" =~ ^[-a-zA-Z0-9,._]+$ ]] || return 3
|
|
|
|
local key="$1" value="$2"
|
2019-06-04 11:16:48 +00:00
|
|
|
local DB; DB="$(jssh_checkDB "$3")"
|
2020-05-14 18:33:30 +00:00
|
|
|
[ -z "${DB}" ] && return 1
|
2019-06-04 10:00:19 +00:00
|
|
|
[ ! -f "${DB}" ] && return 2
|
|
|
|
# its append, but last one counts, its a simple DB ...
|
|
|
|
printf '["%s"]\t"%s"\n' "${key//,/\",\"}" "${value//\"/\\\"}" >>"${DB}"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
# get key/value from jsshDB
|
|
|
|
# $1 key name, can onyl contain -a-zA-Z0-9,._
|
|
|
|
# $2 key value
|
|
|
|
# $3 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..'
|
|
|
|
# returns value
|
|
|
|
jssh_getDB() {
|
|
|
|
[[ "$1" =~ ^[-a-zA-Z0-9,._]+$ ]] || return 3
|
|
|
|
declare -A getARR
|
|
|
|
jssh_readDB "getARR" "$3" || return "$?"
|
|
|
|
printf '%s\n' "${getARR[${key}]}"
|
|
|
|
}
|
|
|
|
|
2019-05-27 12:30:21 +00:00
|
|
|
# $1 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..'
|
|
|
|
jssh_newDB() {
|
2019-06-04 11:16:48 +00:00
|
|
|
local DB; DB="$(jssh_checkDB "$1")"
|
2020-05-14 18:33:30 +00:00
|
|
|
[ -z "${DB}" ] && return 1
|
2019-06-04 10:00:19 +00:00
|
|
|
[ -f "${DB}" ] && return 2 # already exist, do not zero out
|
2019-05-27 12:30:21 +00:00
|
|
|
printf '\n' >"${DB}"
|
|
|
|
}
|
2019-05-30 16:02:57 +00:00
|
|
|
|
2019-06-04 11:16:48 +00:00
|
|
|
# $1 filename, check filename, it must be relative to BASHBOT_ETC, and not contain '..'
|
|
|
|
# returns real path to DB file if everything is ok
|
|
|
|
jssh_checkDB(){
|
2020-05-14 18:33:30 +00:00
|
|
|
[ -z "$1" ] && return 1
|
2019-05-30 16:02:57 +00:00
|
|
|
local DB="${BASHBOT_ETC:-.}/$1.jssh"
|
2020-05-14 20:00:05 +00:00
|
|
|
if [[ "$1" = "${BASHBOT_ETC:-.}"* ]] || [[ "$1" = "${BASHBOT_DATA:-.}"* ]]; then
|
|
|
|
DB="$1.jssh"
|
|
|
|
fi
|
2019-06-04 10:00:19 +00:00
|
|
|
[[ "$1" = *'..'* ]] && return 2
|
2019-05-30 16:02:57 +00:00
|
|
|
printf '%s\n' "${DB}"
|
|
|
|
}
|
2019-06-04 10:00:19 +00:00
|
|
|
|