3 # Copyright 2023, 2024 Paul Hänsch
5 # Permission to use, copy, modify, and/or distribute this software for any
6 # purpose with or without fee is hereby granted, provided that the above
7 # copyright notice and this permission notice appear in all copies.
9 # THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
12 # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
15 # IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 . "$_EXEC/cgilite/storage.sh"
20 local call data file key val seq
21 data="${BR}${1}${BR}" call="$2"
29 cat "$file" || return 1
31 check|contains) key="$(STRING "$1")" val=''
32 val="${data##*"${BR}${key}" }" val="${val%%"${BR}"*}"
33 [ "$val" = '' ] && return 1
35 count) key="$(STRING "$1")" val='' seq=0
36 val="${data##*"${BR}${key}" }" val="${val%%"${BR}"*}"
37 [ "$val" = '' ] || val="${val} "
38 while [ "$val" != '' ]; do
39 seq=$((seq + 1)) val="${val#* }"
42 [ $seq = 0 ] && return 1
44 get) key="$(STRING "$1")" seq="${2:-1}"
45 val="${data##*"${BR}${key}" }" val="${val%%"${BR}"*}"
46 [ "$val" = '' ] && return 1 || val="${val} "
47 while [ $seq -gt 1 ]; do
48 seq=$((seq - 1)) val="${val#* }"
50 [ "$val" = '' ] && return 1
53 iterate|raw) key="$(STRING "$1")"
54 val="${data##*"${BR}${key}" }" val="${val%%"${BR}"*}"
55 [ "$val" = '' ] && return 1
58 delete|remove) key="$(STRING "$1")"
59 val="${data#*"${BR}${key}" *"${BR}"}"
60 key="${data%"${BR}${key}" *"${BR}"*}"
61 [ "${key}${BR}${val}" = "${data}" ] && return 1
62 printf '%s' "${key#"${BR}"}${BR}${val%"${BR}"}"
64 set|store) key="$(STRING "$1")" val=""
66 val="$(for v in "$@"; do STRING "$v"; printf \\t; done)"
67 if [ "${data#*"${BR}${key}" *}" != "$data" ]; then
68 data="${data%"${BR}${key}" *"${BR}"*}${BR}${key} ${val% }${BR}${data#*"${BR}${key}" *"${BR}"}"
69 data="${data#"${BR}"}" data="${data%"${BR}"}"
71 data="${data#"${BR}"}${key} ${val% }${BR}"
72 data="${data#"${BR}"}"
74 printf %s\\n "${data}"
76 append) key="$(STRING "$1")" val=""
77 val="${data##*"${BR}${key}" }" val="${val%%"${BR}"*}"
78 if [ "$val" = '' ]; then
79 printf %s\\n "${data}"
83 val="${val}$(for v in "$@"; do printf \\t; STRING "$v"; done)"
84 data="${data%"${BR}${key}" *"${BR}"*}${BR}${key} ${val% }${BR}${data#*"${BR}${key}" *"${BR}"}"
85 data="${data#"${BR}"}" data="${data%"${BR}"}"
86 printf %s\\n "${data}"
89 flush|save|write) file="$1"
90 data="${data#"${BR}"}" data="${data%"${BR}"}"
91 printf '%s\n' "$data" >"$file" || return 1
98 # wrapper function that allows easyer use of DB2
99 # by always keeping file data in $db3_data
102 new|discard|open|load|delete|remove|set|store|append)
103 db3_data="$(DB2 "$db3_data" "$@")"
106 get|count|check|contains|iterate|raw|flush|save|write)