1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-10-05 19:18:01 +08:00
ULib/tests/examples/IR/WEB/cgi-bin/.env
2015-01-23 17:24:36 +01:00

351 lines
7.2 KiB
Bash

#!/bin/sh
set_ENV() {
# global var
BASE_NAME=$(basename $1 .sh)
if [ -n "$HTTP_ACCEPT_LANGUAGE" -a -d ../form/$HTTP_ACCEPT_LANGUAGE ]; then
FORM_FILE_DIR=../form/$HTTP_ACCEPT_LANGUAGE
else
FORM_FILE_DIR=../form/en
fi
# ULib version
ULIB_VERSION=1.0.5
# location of index db
IR_DIRECTORY=../../../IR
# location of docs indexed
DOC_DIRECTORY=/usr/src/ULib-$ULIB_VERSION/tests/examples/IR/doc
# directory to put result search, session, etc...
RESULT_DIR=../result
if [ -n "$HTTP_COOKIE" ]; then
RESULT_DIR=$RESULT_DIR/$HTTP_COOKIE
fi
export BASE_NAME FORM_FILE_DIR ULIB_VERSION IR_DIRECTORY DOC_DIRECTORY RESULT_DIR TMP_FORM_FILE SET_COOKIE FORM_PART1 FORM_PART2 FORM_PART3 QUERY TIME
# paginazione
export FOR_PAGE NUM_START NUM_END NUM_DOC pagina_corrente link_paginazione
}
write_OUTPUT() {
if [ -n "$1" ]; then
if [ -n "$SET_COOKIE" ]; then
# REQ: Set-Cookie: TODO[ data expire path domain secure HttpOnly ]
# ----------------------------------------------------------------------------------------------------------------------------
# string -- Data to put into the cookie -- must
# int -- Lifetime of the cookie in HOURS -- must (0 -> valid until browser exit)
# string -- Path where the cookie can be used -- opt
# string -- Domain which can read the cookie -- opt
# bool -- Secure mode -- opt
# bool -- Only allow HTTP usage -- opt
# ----------------------------------------------------------------------------------------------------------------------------
# RET: Set-Cookie: ulib_sid=data&expire&HMAC-MD5(data&expire); expires=expire(GMT); path=path; domain=domain; secure; HttpOnly
echo -e "Set-Cookie: TODO[ $SET_COOKIE 24 ]\r"
fi
echo -e "Content-Type: text/html; charset=iso-8859-1\r\n\r"
echo -n -E "$1"
exit 0
fi
}
view_form() {
if [ -z "$FORM_PART3" ]; then
FORM_PART3=$ULIB_VERSION
fi
printf -v OUTPUT "`cat $FORM_FILE_DIR/$BASE_NAME.tmpl`" "sh" "$FORM_PART1" "$FORM_PART2" "$FORM_PART3"
unset FORM_PART1 FORM_PART2
}
view_form_with_help() {
FORM_PART1=$BASE_NAME".sh"
if [ -z "$FORM_PART2" ]; then
FORM_PART2="`cat $FORM_FILE_DIR/$BASE_NAME.hlp`"
fi
view_form
}
view_form_without_help() {
FORM_PART1="?ext=help"
if [ -z "$FORM_PART2" ]; then
FORM_PART2="`cat $FORM_FILE_DIR/$BASE_NAME.top`"
fi
view_form
}
load_value_session() {
if [ -f $TMP_FORM_FILE ]; then
i=0
while read LINE
do
let "i = i + 1"
eval v$i=\"$LINE\"
done < $TMP_FORM_FILE
fi
}
save_value_session() {
cat <<END >$TMP_FORM_FILE
$1
$2
$3
$4
$5
END
}
execute_query() {
# set session cookie
if [ -z "$HTTP_COOKIE" ]; then
SET_COOKIE=SESSION_$$
HTTP_COOKIE=$SET_COOKIE
RESULT_DIR=$RESULT_DIR/$HTTP_COOKIE
fi
mkdir -p $RESULT_DIR
TMP_FORM_FILE=$RESULT_DIR/$BASE_NAME.query
QUERY=$1
FOR_PAGE=$2
# run query
(cd ../../..; TIME='%e' time ../../examples/IR/query -c index.cfg "$QUERY") 2>$TMP_FORM_FILE >$RESULT_DIR/$BASE_NAME.list
TIME=`tail -n 1 $TMP_FORM_FILE`
NUM_DOC=`wc -l < $RESULT_DIR/$BASE_NAME.list`
# read num records index db
CDB_NUM_RECS=../../../../../cdb/cdbnumrecs
if [ -x $CDB_NUM_RECS ]; then
NUM_REC_DOCS=`$CDB_NUM_RECS < $IR_DIRECTORY/db/tbl_names.cdb`
NUM_REC_WORDS=`$CDB_NUM_RECS < $IR_DIRECTORY/db/tbl_words.cdb`
fi
printf -v FORM_PART3 "$ULIB_VERSION, with %u documents and %u words." $NUM_REC_DOCS $NUM_REC_WORDS
set_paginazione 1
view_page
save_value_session "$QUERY" $FOR_PAGE $TIME $NUM_DOC "$FORM_PART3"
}
view_page() {
# header
printf -v RESULT_TOP "`cat $FORM_FILE_DIR/result.top`" $NUM_START $NUM_END $NUM_DOC "$QUERY" $TIME
# documents
if [ $NUM_DOC -eq 0 ]; then
RESULT_DOC="<p class=\"note\">Your search did not match any documents.</p>"
else
RESULT_DOC_FILE="`cat $FORM_FILE_DIR/result.doc`"
DOC_VEC=( $(cat "$RESULT_DIR/$BASE_NAME.list") )
for (( i=$NUM_START-1; i<$NUM_END; i+=1 )); do
DOC=${DOC_VEC[i]}
SNIPPET_DOC=`fmt -w 300 $IR_DIRECTORY/doc/$DOC | head -n 1 | ../../../../base/crypto_xml`
printf -v ADD "$RESULT_DOC_FILE" $IR_DIRECTORY/doc/$DOC `basename $DOC` "$SNIPPET_DOC" $DOC_DIRECTORY/$DOC
RESULT_DOC=$RESULT_DOC$ADD" "
done
fi
# link page
printf -v RESULT_PAG "`cat $FORM_FILE_DIR/result.pag`" "$link_paginazione"
FORM_PART2="$RESULT_TOP $RESULT_DOC $RESULT_PAG"
view_form_without_help
}
view_page_result() {
TMP_FORM_FILE=$RESULT_DIR/$BASE_NAME.query
load_value_session
QUERY="$v1"
FOR_PAGE=$v2
TIME=$v3
NUM_DOC=$v4
FORM_PART3="$v5"
set_paginazione $1
view_page
}
# funzioni che creano i link alle pagine dei risultati
# ----------------------------------------------------
crea_link() {
if [ "$pagina_corrente" = "$1" ]; then
ADD="<span class=\"pnow\">$1</span>"
else
ADD="<a href=\"?page=$1\" class=\"pnum\">$1</a>"
fi
link_paginazione=$link_paginazione$ADD" "
}
set_paginazione() {
pagina_corrente=$1
if [ $NUM_DOC -le $FOR_PAGE ]; then
if [ $NUM_DOC -eq 0 ]; then
NUM_START=0
else
NUM_START=1
fi
NUM_END=$NUM_DOC
link_paginazione="<span class=\"void\">PREV</span><span class=\"void\">NEXT</span>"
return
fi
let "pagina_precedente = $pagina_corrente - 1"
let "pagina_successiva = $pagina_corrente + 1"
let "tot_pagine = $NUM_DOC / $FOR_PAGE"
let "resto = $NUM_DOC % $FOR_PAGE"
if [ $resto -ne 0 ]; then
let "tot_pagine = $tot_pagine + 1"
fi
let "ultima_pagina = $tot_pagine - 1"
let "penultima_pagina = $ultima_pagina - 1"
# link alla pagina precedente
if [ $pagina_corrente -eq 1 ]; then
NUM_START=1
link_paginazione="<span class=\"void\">PREV</span> "
else
let "NUM_START = 1 + $pagina_precedente * $FOR_PAGE"
link_paginazione="<a href=\"?page=$pagina_precedente\" class=\"pnum\">PREV</a> "
fi
# mostriamo sempre il link alla prima pagina
crea_link 1
# se il prossimo link non è alla seconda pagina aggiungo dei puntini ... oppure la sola pagina mancante
if [ $pagina_precedente -gt 2 ]; then
if [ $pagina_precedente -eq 3 ]; then
crea_link 2
else
link_paginazione=$link_paginazione" ... "
fi
fi
# creo i link alla pagina corrente ed a quelle ad essa vicine
for (( i=$pagina_precedente; i<=$pagina_successiva; i+=1 )); do
# se tra quelle vicine c'è la prima pagina (già riportata)
if [ $i -lt 2 ]; then
continue
fi
# se tra quelle vicine c'è l'ultima pagina (che mostrerò con le prossime istruzioni)
if [ $i -gt $ultima_pagina ]; then
continue
fi
crea_link $i
done
# se il precedente link non era alla penultima pagina aggiungo dei puntini ... oppure la sola pagina mancante
if [ $pagina_successiva -lt $ultima_pagina ]; then
if [ $pagina_successiva -eq $penultima_pagina ]; then
crea_link $ultima_pagina
else
link_paginazione=$link_paginazione" ... "
fi
fi
# mostriamo il link all'ultima pagina se questa non coincide con la prima
if [ $tot_pagine -ne 1 ]; then
crea_link $tot_pagine
fi
# link alla pagina successiva
if [ $pagina_corrente -eq $tot_pagine ]; then
NUM_END=$NUM_DOC
link_paginazione=$link_paginazione"<span class=\"void\">NEXT</span>"
else
let "NUM_END = $NUM_START + $FOR_PAGE - 1"
link_paginazione=$link_paginazione"<a href=\"?page=$pagina_successiva\" class=\"pnum\">NEXT</a>"
fi
}
# ------------------------------------------------------