]> git.plutz.net Git - serve0/blob - db_meta.sh
include storage functions
[serve0] / db_meta.sh
1 #!/bin/sh
2
3 [ "$include_dbmeta" ] && return 0
4 include_dbmeta="$0"
5
6 . "$_EXEC/cgilite/storage.sh"
7
8 # == FILE FORMAT ==
9 # LENGTH        WIDTH   HEIGHT  TAGS    COMMENT NAME
10
11 # == GLOBALS ==
12 UNSET_META='unset \
13   META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME
14 '
15
16 LOCAL_META='local \
17   META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME
18 '
19
20 eval "$UNSET_META"
21
22 read_meta() {
23   local name="$1" meta_db="$_DATA/.index/meta"
24
25   [ "${name%%/*}" != "$name" ] \
26   && meta_db="$_DATA/${name%%/*}/.index/meta"
27   name="$(STRING "${name##*/}")"
28
29   # Global exports
30   META_LENGTH='' META_WIDTH='' META_HEIGHT='' META_TAGS=''
31   META_COMMENT='' META_NAME=''
32
33   if [ $# -eq 0 ]; then
34     read -r META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME
35   elif [ "$name" -a -f "$meta_db" -a -r "$meta_db" ]; then
36     read -r META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME <<-EOF
37         $(grep -F "     ${name}${CR}" "$meta_db")
38         EOF
39   fi
40   if [ "$META_NAME" ]; then
41        META_NAME="$(UNSTRING "${META_NAME%${CR}}")"
42     META_COMMENT="$(UNSTRING "${META_COMMENT#comment=}")"
43        META_TAGS="$(UNSTRING "${META_TAGS#tags=}")"
44   else
45     eval "$UNSET_META"
46     return 1
47   fi
48 }
49
50 update_meta(){
51   local name="${1:=${META_NAME}}" tags comment length width height
52   local LENGTH WIDTH HEIGH TAGS COMMENT NAME
53   local arg cnt meta_db="$_DATA/.index/meta"
54
55   [ "${name%%/*}" != "$name" ] \
56   && meta_db="$_DATA/${name%%/*}/.index/meta"
57   name="$(STRING "${name##*/}")"
58
59   for arg in "$@"; do case $arg in
60     comment=*) comment="${arg#*=}";;
61        tags=*)    tags="${arg#*=}";;
62      lenght=*)  lenght="${arg#*=}";;
63       width=*)   width="${arg#*=}";;
64      height=*)  height="${arg#*=}";;
65   esac; done
66
67   if LOCK "$meta_db"; then
68     while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME; do
69       if [ "$name" = "${NAME%${CR}}" ]; then
70         printf '%i      %i      %i      tags=%s comment=%s      %s\r\n' \
71                "${length:-${length-${LENGTH}}${length+0}}" \
72                "${width:-${width-${WIDTH}}${width+0}}" \
73                "${height:-${height-${HEIGHT}}${height+0}}" \
74                "$(STRING "${tags-$(UNSTRING "${TAGS#tags=}")}")" \
75                "$(STRING "${comment-$(UNSTRING "${COMMENT#comment=}")}")" \
76                "$(STRING "${name-$(UNSTRING "${NAME%${CR}}")}")"
77       else
78         printf '%i      %i      %i      tags=%s comment=%s      %s\r\n' \
79                "$LENGTH" "$WIDTH" "$HEIGHT" "${TAGS#tags=}" \
80                "${COMMENT#comment=}" "${NAME%${CR}}"
81       fi
82     done <"$meta_db" >"${meta_db}.$$"
83     mv -- "${meta_db}.$$" "${meta_db}"
84     RELEASE "$meta_db"
85   else
86     return 1
87   fi
88 }
89
90 new_meta(){
91   local name="$1" meta_db="$_DATA/.index/meta"
92   local LENGTH WIDTH HEIGHT TAGS COMMENT NAME
93
94   [ "${name%%/*}" != "$name" ] \
95   && meta_db="$_DATA/${name%%/*}/.index/meta"
96   name="$(STRING "${name##*/}")"
97
98   if LOCK "$meta_db"; then
99     while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME; do
100       if [ "$name" = "${NAME%${CR}}" ]; then
101         RELEASE "$vid_db"
102         return 1
103       fi
104     done <"$meta_db"
105     printf '0   0       0       tags=\\ comment=\\      %s\r\n' \
106            "${name}" >>"$meta_db"
107     RELEASE "$meta_db"
108   else
109     return 1
110   fi
111 }
112
113 delete_meta() {
114   local name="$1" meta_db="$_DATA/.index/meta"
115   local LENGTH WIDTH HEIGHT TAGS COMMENT NAME
116
117   [ "${name%%/*}" != "$name" ] \
118   && meta_db="$_DATA/${name%%/*}/.index/meta"
119   name="$(STRING "${name##*/}")"
120
121   if LOCK "$meta_db"; then
122     while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME; do
123       [ "$name" = "${NAME%${CR}}" ] \
124       || printf '%i     %i      %i      tags=%s comment=%s      %s\r\n' \
125                 "$length" "$width" "$height" "${TAGS#tags=}" \
126                 "${COMMENT#comment=}" "${NAME%${CR}}"
127     done <"$meta_db" >"${meta_db}.$$"
128
129     mv -- "${meta_db}.$$" "$meta_db"
130     RELEASE "$meta_db"
131   else
132     return 1
133   fi
134 }
135
136 list_meta(){
137   local meta pfx
138   local LENGTH WIDTH HEIGHT TAGS COMMENT NAME
139
140   if [ "$#" -eq 0 ]; then
141     find "$_DATA" -path '*/.index/meta'
142   else
143     printf %s\\n "$@"
144   fi \
145   | while read meta; do
146     pfx="${meta#$_DATA}"
147     pfx="${pfx%/.index/meta}"
148     pfx="$(STRING "${pfx#/}")"
149     [ "$pfx" = '\' ] && pfx='' || pfx="${pfx}/"
150
151     while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME; do
152       printf '%i        %i      %i      tags=%s comment=%s      %s%s\r\n' \
153              $LENGTH $WIDTH $HEIGHT "${TAGS#tags=}" \
154              "${COMMENT#comment=}" "${pfx}" "${NAME%${CR}}"
155     done <"$meta"
156   done
157 }