#!/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 <$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="

Your search did not match any documents.

" 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="$1" else ADD="$1" 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="PREVNEXT" 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="PREV " else let "NUM_START = 1 + $pagina_precedente * $FOR_PAGE" link_paginazione="PREV " 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"NEXT" else let "NUM_END = $NUM_START + $FOR_PAGE - 1" link_paginazione=$link_paginazione"NEXT" fi } # ------------------------------------------------------