From e141ec4a5b7d0ec0da9fd9e3860bd003ad2d758e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Wed, 18 Jul 2018 02:20:42 +0200 Subject: [PATCH] speed gain by omitting record checks (heuristic pagination) --- indexmeta.sh | 16 +++++++++++++++- list.sh | 45 +++++++++++++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/indexmeta.sh b/indexmeta.sh index 0c5d7d9..4545df9 100644 --- a/indexmeta.sh +++ b/indexmeta.sh @@ -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 248027f..d729c6c 100644 --- 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 ']' } -- 2.39.2