use flock for atomic, update doc
This commit is contained in:
parent
52bde30271
commit
c02327f7a1
|
@ -468,6 +468,11 @@ The file extions is '.jssh' and for security reasons location of jssh files is r
|
||||||
|
|
||||||
Note: File names containg '..' and absolute file names pointing outside BASHBOT_ETC or BASHBOT_DATA are refused by jsshDB functions.
|
Note: File names containg '..' and absolute file names pointing outside BASHBOT_ETC or BASHBOT_DATA are refused by jsshDB functions.
|
||||||
|
|
||||||
|
Note2: Since version 0.94 jsshDB functions support file locking with flock. Write / Update operations use flock to wait until
|
||||||
|
previous operations are finished. see "man flock" for more information. Bashbot uses a maximum timeout of 10 seconds for flock.
|
||||||
|
|
||||||
|
If you don't want atomic write / update operations use the *_async variant of jsshDB functions. If flock is not availible
|
||||||
|
the *_async variant is automatically used.
|
||||||
|
|
||||||
*Example:* for file name:
|
*Example:* for file name:
|
||||||
```bash
|
```bash
|
||||||
|
@ -514,6 +519,8 @@ Note: Existing content is overwritten.
|
||||||
|
|
||||||
*usage:* jssh_writeDB "ARRAY" "filename"
|
*usage:* jssh_writeDB "ARRAY" "filename"
|
||||||
|
|
||||||
|
*usage:* jssh_writeDB_async "ARRAY" "filename"
|
||||||
|
|
||||||
*example:*
|
*example:*
|
||||||
```bash
|
```bash
|
||||||
# Prepare array to store vaules
|
# Prepare array to store vaules
|
||||||
|
@ -570,6 +577,8 @@ Note: Existing content not in ARRAY is kept in file.
|
||||||
|
|
||||||
*usage:* jssh_updateDB "ARRAY" "filename"
|
*usage:* jssh_updateDB "ARRAY" "filename"
|
||||||
|
|
||||||
|
*usage:* jssh_updateDB_async "ARRAY" "filename"
|
||||||
|
|
||||||
*example:*
|
*example:*
|
||||||
```bash
|
```bash
|
||||||
# continued example from writeDB
|
# continued example from writeDB
|
||||||
|
@ -595,35 +604,16 @@ cat "$DBfile"
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
##### jssh_insertDB
|
|
||||||
Insert, update, append a key=value pair to a jsshDB file, key name is only allowed to contain '-a-zA-Z0-9,._'
|
|
||||||
|
|
||||||
*usage:* jssh_insertDB "key" "value" "filename"
|
|
||||||
|
|
||||||
*example:*
|
|
||||||
```bash
|
|
||||||
jssh_insertDB "newkey" "an other value" "${DATADIR:-.}/myvalues"
|
|
||||||
```
|
|
||||||
|
|
||||||
##### jssh_getDB
|
|
||||||
Read a key=value pair from a jsshDB file, key name is only allowed to contain '-a-zA-Z0-9,._'
|
|
||||||
|
|
||||||
*usage:* jssh_getDB "key" "filename"
|
|
||||||
|
|
||||||
*example:*
|
|
||||||
```bash
|
|
||||||
result="$(jssh_getDB "newvalue" "${DATADIR:-.}/myvalues")"
|
|
||||||
|
|
||||||
# lets see whats the value of key newvalue
|
|
||||||
echo "$result"
|
|
||||||
this is new
|
|
||||||
```
|
|
||||||
|
|
||||||
##### jssh_readDB
|
##### jssh_readDB
|
||||||
Read content of a file in JSON.sh format into given ARRAY. ARRAY name must be delared with "declare -A ARRAY" upfront,
|
Read content of a file in JSON.sh format into given ARRAY. ARRAY name must be delared with "declare -A ARRAY" upfront,
|
||||||
|
|
||||||
*usage:* jssh_readDB "ARRAY" "filename"
|
*usage:* jssh_readDB "ARRAY" "filename"
|
||||||
|
|
||||||
|
*usage:* jssh_readDB_async "ARRAY" "filename"
|
||||||
|
|
||||||
|
Note: readDB uses concurrent / shared locking from flock so multiple proceses can read from file, as long no process is writing.
|
||||||
|
Maximum timeour for reading is 1s to not block readers.
|
||||||
|
|
||||||
*example:*
|
*example:*
|
||||||
```bash
|
```bash
|
||||||
# Prepare array to read vaules
|
# Prepare array to read vaules
|
||||||
|
@ -669,7 +659,34 @@ jssh_printDB READVALUES
|
||||||
["whynot","subindex1"] "whynot A"
|
["whynot","subindex1"] "whynot A"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
##### jssh_insertDB
|
||||||
|
Insert, update, append a key=value pair to a jsshDB file, key name is only allowed to contain '-a-zA-Z0-9,._'
|
||||||
|
|
||||||
|
*usage:* jssh_insertDB "key" "value" "filename"
|
||||||
|
|
||||||
|
*usage:* jssh_insertDB_asnyc "key" "value" "filename"
|
||||||
|
|
||||||
|
Note: insertDB uses also excusiv write locking, but with a maximum timeout of 2s. insertDB is a "fast" operation, simply adding the value to the end of the file.
|
||||||
|
|
||||||
|
*example:*
|
||||||
|
```bash
|
||||||
|
jssh_insertDB "newkey" "an other value" "${DATADIR:-.}/myvalues"
|
||||||
|
```
|
||||||
|
|
||||||
|
##### jssh_deleteKeyDB
|
||||||
|
Deleted a key=value pair froma jsshDB file, key name is only allowed to contain '-a-zA-Z0-9,._'
|
||||||
|
|
||||||
|
*usage:* jssh_deleteKeyDB "key" "filename"
|
||||||
|
|
||||||
|
*usage:* jssh_deleteKeyDB_async "key" "filename"
|
||||||
|
|
||||||
|
*example:*
|
||||||
|
```bash
|
||||||
|
jssh_deleteKeyDB "delkey"" "${DATADIR:-.}/myvalues"
|
||||||
|
```
|
||||||
|
|
||||||
https://linuxhint.com/associative_array_bash/
|
https://linuxhint.com/associative_array_bash/
|
||||||
|
|
||||||
https://linuxconfig.org/how-to-use-arrays-in-bash-script
|
https://linuxconfig.org/how-to-use-arrays-in-bash-script
|
||||||
|
|
||||||
|
|
||||||
|
@ -956,5 +973,5 @@ The name of your bot is availible as bash variable "$ME", there is no need to ca
|
||||||
#### [Prev Best Practice](5_practice.md)
|
#### [Prev Best Practice](5_practice.md)
|
||||||
#### [Next Notes for Developers](7_develop.md)
|
#### [Next Notes for Developers](7_develop.md)
|
||||||
|
|
||||||
#### $$VERSION$$ v0.94-pre-9-gd1f509a
|
#### $$VERSION$$ v0.94-pre-13-g52bde30
|
||||||
|
|
||||||
|
|
|
@ -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.94-pre-10-g23a3d4b
|
#### $$VERSION$$ v0.94-pre-13-g52bde30
|
||||||
#
|
#
|
||||||
# source from commands.sh to use jsonDB functions
|
# source from commands.sh to use jsonDB functions
|
||||||
#
|
#
|
||||||
|
@ -103,6 +103,23 @@ if _exists flock; then
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# delete key/value from jsshDB
|
||||||
|
# $1 key name, can onyl contain -a-zA-Z0-9,._
|
||||||
|
# $2 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..'
|
||||||
|
jssh_deleteKeyDB() {
|
||||||
|
[[ "$1" =~ ^[-a-zA-Z0-9,._]+$ ]] || return 3
|
||||||
|
declare -A oldARR
|
||||||
|
# start atomic delete here, exclusive max wait 10s
|
||||||
|
{ flock -e -w 10 200
|
||||||
|
Json2Array "oldARR" <"${DB}"
|
||||||
|
if [[ -v "oldAR[$1]" ]] ; then
|
||||||
|
unset oldARR["$1"]
|
||||||
|
Array2Json "oldARR" >"${DB}"
|
||||||
|
fi
|
||||||
|
} 200>"${DB}${BASHBOT_LOCKNAME}"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
else
|
else
|
||||||
#########
|
#########
|
||||||
# we have no flock, use "old" not atomic functions
|
# we have no flock, use "old" not atomic functions
|
||||||
|
@ -123,6 +140,9 @@ else
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jssh_deleteKeyDB() {
|
||||||
|
jssh_deleteKeyDB_async "$@"
|
||||||
|
}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
##############
|
##############
|
||||||
|
@ -188,10 +208,10 @@ jssh_updateDB_async() {
|
||||||
declare -n ARRAY="$1"
|
declare -n ARRAY="$1"
|
||||||
[ -z "${ARRAY[*]}" ] && return 1
|
[ -z "${ARRAY[*]}" ] && return 1
|
||||||
declare -A oldARR newARR
|
declare -A oldARR newARR
|
||||||
jssh_readDB "oldARR" "$2" || return "$?"
|
jssh_readDB_async "oldARR" "$2" || return "$?"
|
||||||
if [ -z "${oldARR[*]}" ]; then
|
if [ -z "${oldARR[*]}" ]; then
|
||||||
# no old content
|
# no old content
|
||||||
jssh_writeDB "$1" "$2"
|
jssh_writeDB_async "$1" "$2"
|
||||||
else
|
else
|
||||||
# merge arrays
|
# merge arrays
|
||||||
local o1 o2 n1 n2
|
local o1 o2 n1 n2
|
||||||
|
@ -201,7 +221,7 @@ jssh_updateDB_async() {
|
||||||
#shellcheck disable=SC2034,SC2190,SC2206
|
#shellcheck disable=SC2034,SC2190,SC2206
|
||||||
newARR=( ${o2:0:${#o2}-1} ${n2:0:${#n2}-1} )
|
newARR=( ${o2:0:${#o2}-1} ${n2:0:${#n2}-1} )
|
||||||
set +f
|
set +f
|
||||||
jssh_writeDB "newARR" "$2"
|
jssh_writeDB_async "newARR" "$2"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,3 +236,13 @@ jssh_insertDB_async() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jssh_deleteKeyDB_async() {
|
||||||
|
[[ "$1" =~ ^[-a-zA-Z0-9,._]+$ ]] || return 3
|
||||||
|
declare -A oldARR
|
||||||
|
jssh_readDB_async "oldARR" "$2" || return "$?"
|
||||||
|
if [[ -v "oldAR[$1]" ]] ; then
|
||||||
|
unset oldARR["$1"]
|
||||||
|
jssh_writeDB_async "oldARR" "$2"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue