jssh_updateDB without deleting existing values

This commit is contained in:
Kay Marquardt (Gnadelwartz) 2019-06-04 13:16:48 +02:00
parent 55c9d8bb4d
commit 9b9125c9cc

View File

@ -5,7 +5,7 @@
# This file is public domain in the USA and all free countries. # This file is public domain in the USA and all free countries.
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
# #
#### $$VERSION$$ v0.91-4-gaad0bfe #### $$VERSION$$ v0.91-5-g55c9d8b
# #
# source from commands.sh to use jsonDB functions # source from commands.sh to use jsonDB functions
# #
@ -16,22 +16,47 @@
# $1 ARRAY name, must be delared with "declare -A ARRAY" upfront # $1 ARRAY name, must be delared with "declare -A ARRAY" upfront
# $2 filename, must be relative to BASHBOT_ETC, and not contain '..' # $2 filename, must be relative to BASHBOT_ETC, and not contain '..'
jssh_readDB() { jssh_readDB() {
local DB; DB="$(jssh_checkname "$2")" local DB; DB="$(jssh_checkDB "$2")"
[ "${DB}" = "" ] && return 1 [ "${DB}" = "" ] && return 1
[ ! -f "${DB}" ] && return 2 [ ! -f "${DB}" ] && return 2
Json2Array "$1" <"${DB}" Json2Array "$1" <"${DB}"
} }
# write ARRAY content to a file in JSON.sh format # write ARRAY content to a file in JSON.sh format
# Warning: old content is overwritten
# $1 ARRAY name, must be delared with "declare -A ARRAY" upfront # $1 ARRAY name, must be delared with "declare -A ARRAY" upfront
# $2 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..' # $2 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..'
jssh_writeDB() { jssh_writeDB() {
local DB; DB="$(jssh_checkname "$2")" local DB; DB="$(jssh_checkDB "$2")"
[ "${DB}" = "" ] && return 1 [ "${DB}" = "" ] && return 1
[ ! -f "${DB}" ] && return 2 [ ! -f "${DB}" ] && return 2
Array2Json "$1" >"${DB}" Array2Json "$1" >"${DB}"
} }
# 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"
[ "${ARRAY[*]}" = "" ] && return 1
declare -A oldARR newARR
jssh_readDB "oldARR" "$2" || return "$?"
if [ "${oldARR[*]}" = "" ]; then
# 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
}
# insert, update, apped key/value to jsshDB # insert, update, apped key/value to jsshDB
# $1 key name, can onyl contain -a-zA-Z0-9,._ # $1 key name, can onyl contain -a-zA-Z0-9,._
# $2 key value # $2 key value
@ -39,7 +64,7 @@ jssh_writeDB() {
jssh_insertDB() { jssh_insertDB() {
[[ "$1" =~ ^[-a-zA-Z0-9,._]+$ ]] || return 3 [[ "$1" =~ ^[-a-zA-Z0-9,._]+$ ]] || return 3
local key="$1" value="$2" local key="$1" value="$2"
local DB; DB="$(jssh_checkname "$3")" local DB; DB="$(jssh_checkDB "$3")"
[ "${DB}" = "" ] && return 1 [ "${DB}" = "" ] && return 1
[ ! -f "${DB}" ] && return 2 [ ! -f "${DB}" ] && return 2
# its append, but last one counts, its a simple DB ... # its append, but last one counts, its a simple DB ...
@ -61,14 +86,15 @@ jssh_getDB() {
# $1 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..' # $1 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..'
jssh_newDB() { jssh_newDB() {
local DB; DB="$(jssh_checkname "$1")" local DB; DB="$(jssh_checkDB "$1")"
[ "${DB}" = "" ] && return 1 [ "${DB}" = "" ] && return 1
[ -f "${DB}" ] && return 2 # already exist, do not zero out [ -f "${DB}" ] && return 2 # already exist, do not zero out
printf '\n' >"${DB}" printf '\n' >"${DB}"
} }
# $1 filename, check if must be relative to BASHBOT_ETC, and not contain '..' # $1 filename, check filename, it must be relative to BASHBOT_ETC, and not contain '..'
jssh_checkname(){ # returns real path to DB file if everything is ok
jssh_checkDB(){
[ "$1" = "" ] && return 1 [ "$1" = "" ] && return 1
local DB="${BASHBOT_ETC:-.}/$1.jssh" local DB="${BASHBOT_ETC:-.}/$1.jssh"
[[ "$1" = "${BASHBOT_ETC:-.}"* ]] && DB="$1.jssh" [[ "$1" = "${BASHBOT_ETC:-.}"* ]] && DB="$1.jssh"