]> git.plutz.net Git - shellwiki/blob - db23.sh
Merge commit '8a7abfd24c55754dc0ee886cbece67cd3afc585c'
[shellwiki] / db23.sh
1 #!/bin/sh
2
3 # Copyright 2023, 2024 Paul Hänsch
4
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.
8
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.
16
17 . "$_EXEC/cgilite/storage.sh"
18
19 DB2() {
20   local call data file key val seq
21   data="${BR}${1}${BR}" call="$2"
22   shift 2
23
24   case $call in
25     new|discard)
26       printf ''
27       ;;
28     open|load) file="$1"
29       cat "$file" || return 1
30       ;;
31     check|contains) key="$(STRING "$1")" val=''
32       val="${data##*"${BR}${key}"       }" val="${val%%"${BR}"*}"
33       [ "$val" = '' ] && return 1
34       ;;
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#*   }"
40       done
41       printf "%i\n" "$seq"
42       [ $seq = 0 ] && return 1
43       ;;
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#*   }"
49       done
50       [ "$val" = '' ] && return 1
51       UNSTRING "${val%% *}"
52       ;;
53     iterate|raw) key="$(STRING "$1")"
54       val="${data##*"${BR}${key}"       }" val="${val%%"${BR}"*}"
55       [ "$val" = '' ] && return 1
56       printf '%s\n' $val
57       ;;
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}"}"
63       ;;
64     set|store) key="$(STRING "$1")" val=""
65       shift 1
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}"}"
70       else
71         data="${data#"${BR}"}${key}     ${val%  }${BR}"
72         data="${data#"${BR}"}"
73       fi
74       printf %s\\n "${data}"
75       ;;
76     append) key="$(STRING "$1")" val=""
77       val="${data##*"${BR}${key}"       }" val="${val%%"${BR}"*}"
78       if [ "$val" = '' ]; then
79         printf %s\\n "${data}"
80         return 1
81       else
82         shift 1
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}"
87       fi
88       ;;
89     flush|save|write) file="$1"
90       data="${data#"${BR}"}" data="${data%"${BR}"}"
91       printf '%s\n' "$data" >"$file" || return 1
92       ;;
93   esac
94   return 0
95 }
96
97 DB3() {
98   # wrapper function that allows easyer use of DB2
99   # by always keeping file data in $db3_data
100
101   case "$1" in
102     new|discard|open|load|delete|remove|set|store|append)
103       db3_data="$(DB2 "$db3_data" "$@")"
104       return "$?"
105       ;;
106     get|count|check|contains|iterate|raw|flush|save|write)
107       DB2 "$db3_data" "$@"
108       return "$?"
109       ;;
110   esac
111 }