]> git.plutz.net Git - serve0/blob - db_meta.sh
f1eec4d237db1c97ab890b7f71c92a4564c70f71
[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     read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME <<-EOF
69         $(grep -F "     ${name}${CR}" "$meta_db")
70         EOF
71     if [ ! "$NAME" ]; then
72       RELEASE "$meta_db"
73       return 1
74     fi
75     printf '%i  %i      %i      tags=%s comment=%s      %s\r\n' \
76            "${length:-${length-${LENGTH}}${length+0}}" \
77            "${width:-${width-${WIDTH}}${width+0}}" \
78            "${height:-${height-${HEIGHT}}${height+0}}" \
79            "$(STRING "${tags-$(UNSTRING "${TAGS#tags=}")}")" \
80            "$(STRING "${comment-$(UNSTRING "${COMMENT#comment=}")}")" \
81            "${NAME%${CR}}" \
82     >"${meta_db}.$$"
83
84     grep -vF "  ${name}${CR}" "$meta_db" >>"${meta_db}.$$"
85
86     mv -- "${meta_db}.$$" "${meta_db}"
87     RELEASE "$meta_db"
88   else
89     return 1
90   fi
91 }
92
93 new_meta(){
94   local name="$1" meta_db="$_DATA/.index/meta"
95   local LENGTH WIDTH HEIGHT TAGS COMMENT NAME
96
97   [ "${name%%/*}" != "$name" ] \
98   && meta_db="$_DATA/${name%%/*}/.index/meta"
99   name="$(STRING "${name##*/}")"
100
101   if LOCK "$meta_db"; then
102     while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME; do
103       if [ "$name" = "${NAME%${CR}}" ]; then
104         RELEASE "$vid_db"
105         return 1
106       fi
107     done <"$meta_db"
108     printf '0   0       0       tags=\\ comment=\\      %s\r\n' \
109            "${name}" >>"$meta_db"
110     RELEASE "$meta_db"
111   else
112     return 1
113   fi
114 }
115
116 delete_meta() {
117   local name="$1" meta_db="$_DATA/.index/meta"
118   local LENGTH WIDTH HEIGHT TAGS COMMENT NAME
119
120   [ "${name%%/*}" != "$name" ] \
121   && meta_db="$_DATA/${name%%/*}/.index/meta"
122   name="$(STRING "${name##*/}")"
123
124   if LOCK "$meta_db"; then
125     while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME; do
126       [ "$name" = "${NAME%${CR}}" ] \
127       || printf '%i     %i      %i      tags=%s comment=%s      %s\r\n' \
128                 "$length" "$width" "$height" "${TAGS#tags=}" \
129                 "${COMMENT#comment=}" "${NAME%${CR}}"
130     done <"$meta_db" >"${meta_db}.$$"
131
132     mv -- "${meta_db}.$$" "$meta_db"
133     RELEASE "$meta_db"
134   else
135     return 1
136   fi
137 }
138
139 list_meta(){
140   local meta pfx
141   local LENGTH WIDTH HEIGHT TAGS COMMENT NAME
142
143   if [ "$#" -eq 0 ]; then
144     find "$_DATA" -path '*/.index/meta'
145   else
146     printf %s\\n "$@"
147   fi \
148   | while read meta; do
149     pfx="${meta#$_DATA}"
150     pfx="${pfx%/.index/meta}"
151     pfx="$(STRING "${pfx#/}")"
152     [ "$pfx" = '\' ] && pfx='' || pfx="${pfx}/"
153
154     while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME; do
155       printf '%i        %i      %i      tags=%s comment=%s      %s%s\r\n' \
156              $LENGTH $WIDTH $HEIGHT "${TAGS#tags=}" \
157              "${COMMENT#comment=}" "${pfx}" "${NAME%${CR}}"
158     done <"$meta"
159   done
160 }