]> git.plutz.net Git - serve0/commitdiff
speed gain by omitting record checks (heuristic pagination)
authorPaul Hänsch <paul@plutz.net>
Wed, 18 Jul 2018 00:20:42 +0000 (02:20 +0200)
committerPaul Hänsch <paul@plutz.net>
Wed, 18 Jul 2018 00:20:42 +0000 (02:20 +0200)
indexmeta.sh
list.sh

index 0c5d7d959ba2d289f2079b57921aefc2f1ff91e3..4545df93118bff9869839b0d9dbebcee3011c19e 100644 (file)
@@ -40,7 +40,7 @@ meta_file(){
   name="$(meta_name "$file")"
 
   if [ -d "${meta%/meta}" ] && LOCK "$meta"; then
-    grep -vF " ${name}" "$meta" >"$meta.tmp"
+    grep -avF "        ${name}" "$meta" >"$meta.tmp"
     meta_line "$file" \
     | tee -a "$meta.tmp"
     mv "$meta.tmp" "$meta"
@@ -48,6 +48,20 @@ meta_file(){
   fi
 }
 
+meta_purge(){
+  local file meta name
+  file="$1"
+  meta="${file%/*}/.index/meta"
+  name="$(meta_name "$file")"
+
+  if [ -d "${meta%/meta}" ] && LOCK "$meta"; then
+    grep -avF "        ${name}" "$meta" >"$meta.tmp"
+    grep -aF " ${name}" "$meta" >>"$meta.trash"
+    mv "$meta.tmp" "$meta"
+    RELEASE "$meta"
+  fi
+}
+
 meta_info(){
   local file meta
   file="$1"
diff --git a/list.sh b/list.sh
index 248027fb71a10b0134508d55b301d6d0ae8c4a0c..d729c6c34a8c35c11a590752bc35378c62b3b8ba 100644 (file)
--- a/list.sh
+++ b/list.sh
@@ -11,7 +11,7 @@ list_item() {
 
   if [ -d "$_DATA/$ITEM/$1" ]; then
     printf '[a .list .dir href="%s" %s]' "${path}?${qry}" "$name"
-  else
+  elif [ -f "$_DATA/$ITEM/$1" ]; then
     read -r length width height tags comment n <<-EOF
        $(meta_info "$_DATA/$ITEM/$1")
        EOF
@@ -25,6 +25,9 @@ list_item() {
       "$width" "$height" \
       "$(UNSTRING "${tags#tags=}" |tr , '\0' |xargs -r0 printf ' [span .tag %s]')" \
       "$path" "$path" "$path"
+  else
+    printf 'Canning record for nonexist file: %s\n' "$1" >&2
+    meta_purge "$_DATA/$ITEM/$1"
   fi
 }
 
@@ -48,6 +51,15 @@ list_directories(){
   | tail -n1
 )"
 
+list_fullname(){
+  sn="$1"
+  [ ! "${sn%%*/*}" ] && base="${sn%/*}" || base=.
+  file="$(printf '%s' "$_DATA/$ITEM/$sn".*)"
+  file="${file##*/}"
+  [ -e "$_DATA/$ITEM/$base/${file}" ] \
+  && printf '%s\n' "${base}/${file}"
+}
+
 list_filemeta(){
   local meta base f fn file
   base="$1"
@@ -67,13 +79,9 @@ list_filemeta(){
     grep -viE "$(STRING "${SEARCH#!}")"
   else
     grep -iE "$(STRING "${SEARCH}")"
-  fi |cut -f6 \
-  | UNSTRING \
+  fi |cut -f6 | UNSTRING \
   | while read -r fn; do
-    file="$(printf '%s' "$_DATA/$ITEM/$base/${fn%${CR}}".*)"
-    file="${file##*/}"
-    [ -e "$_DATA/$ITEM/$base/${file}" ] \
-    && printf '%s\n' "${base}/${file}"
+    printf '%s\n' "${base}/${fn%${CR}}"
   done
 }
 
@@ -86,6 +94,15 @@ list_index(){
   done
 }
 
+list_dateorder(){
+  while read -r sn; do 
+    list_fullname "$sn"
+  done \
+  | xargs -rd'\n' stat -c '%Y  %n' \
+  | sort -rn |cut -d/ -f2- \
+  | sed -r 's;\.[^\.]*$;;;'
+}
+
 list_items() {
   local mode
   mode="$(COOKIE mode |grep -m1 -xE 'index|browse' || printf browse )"
@@ -94,16 +111,12 @@ list_items() {
 
   if   [ "$mode" = browse -a "$ORDER" = Date ]; then
     list_directories
-    list_filemeta . \
-    | xargs -rd'\n' stat -c '%Y        %n' \
-    | sort -rn |cut -d/ -f2-
+    list_filemeta . |list_dateorder
+  elif [ "$mode" = index  -a "$ORDER" = Date ]; then
+    list_index |list_dateorder
   elif [ "$mode" = browse ]; then
     list_directories
     list_filemeta .
-  elif [ "$mode" = index  -a "$ORDER" = Date ]; then
-    list_index \
-    | xargs -rd'\n' stat -c '%Y        %n' \
-    | sort -rn | cut -d/ -f2-
   elif [ "$mode" = index ]; then
     list_index
   fi
@@ -117,7 +130,7 @@ list_paginate() {
   printf '[div .itemlist '
   while read -r i; do
     [ $c -ge $page -a $c -lt $end  ] \
-    && list_item "$i"
+    && list_item "$(list_fullname "$i")"
     c=$((c + 1))
   done
   printf ']'
@@ -125,7 +138,7 @@ list_paginate() {
   printf '[div .pagination'
   for n in $( seq 1 $((c / LISTSIZE + 1)) ); do
     printf '[a .page href="%s" %s]' \
-      "?p=$(( (n - 1) * LISTSIZE + 1))" "$n"
+      "?p=$(( (n - 1) * LISTSIZE + 1))&$qry" "$n"
   done
   printf ']'
 }