commit 68834784349efbe0e38388d9415f2765283698e1
parent 159a080fd9fb5afaa8051c6a9b80d0cf649d89b4
Author: Jaromil <jaromil@dyne.org>
Date: Tue, 18 Sep 2012 19:49:57 +0200
search function refactored, now also searches into addressbook, or specified folders
Diffstat:
2 files changed, 96 insertions(+), 129 deletions(-)
diff --git a/src/zlibs/addressbook b/src/zlibs/addressbook
@@ -89,7 +89,17 @@ WHERE name LIKE "%${1}%";
EOF
}
search_email() {
- func "search email from $list is $1"
+ func "search addressbook $list for $1"
+ cat <<EOF | ${SQL} -column -batch ${addressbook}
+.width 64 128
+SELECT * FROM $list
+WHERE email LIKE "%${1}%";
+EOF
+}
+
+
+lookup_email() {
+ func "lookup email id from $list where $1"
cat <<EOF | ${SQL} -column -batch ${addressbook}
SELECT rowid FROM $list
WHERE email IS "${1}";
@@ -124,7 +134,7 @@ isknown() {
exitcode=1
- lookup="`search_email ${email}`"
+ lookup="`lookup_email ${email}`"
{ test "$lookup" != "" } && { exitcode=0 }
@@ -292,7 +302,7 @@ BEGIN { newcard=0; c=0; name=""; email=""; }
{ test "${a[1]}" = "#" } && {
newa=1; # its the end of the entry
# check if we have this email already
- foundemail=`search_email "${_email}"`
+ foundemail=`lookup_email "${_email}"`
{ test "$foundemail" = "" } && {
insert_address "${_email}" "${_name}"
act "${a} ${_name} <${_email}>"
diff --git a/src/zlibs/search b/src/zlibs/search
@@ -24,156 +24,113 @@
## Search into maildirs
# using mairix
search() {
- { command -v mairix > /dev/null } || {
- error "Mairix not found, operation aborted."
- return 1 }
- id=$RANDOM
- rc=$TMPDIR/search.conf.$id
- typeset -al expr
+ # check if the name of a maildir is among params
+ # we need at least 2 maildirs, the second is the destination
typeset -al fold
+ typeset -al term
# intelligent parse of args, position independent
# check if its a folder, if not is an expression
- mlstr="all folders"; ml=""; c=0
- basedir=$MAILDIRS
- # check if the name of a maildir is among params
for p in ${PARAM}; do
- c=$(( $c + 1 ))
- func "checking param: ${p}"
if [ -r ${p} ]; then
-
{ maildircheck ${p} } && {
- fold+=(${p})
- { test ${#fold} = 1 } && {
- # base path is the dir of the first folder
- pushd `dirname ${p}`
- basedir=`pwd`
- popd }
- }
-
- elif [ -r ${MAILDIRS}/${p} ]; then
-
- { maildircheck ${MAILDIRS}/${p} } && { fold+=(${MAILDIRS}/${p}) }
-
- else # not a folder, add it to expressions array
- expr+=(${p})
+ func "param ${p} is a maildir"
+ fold+=(${p}) }
+ elif [ -r "${MAILDIRS}/${p}" ]; then
+ { maildircheck ${MAILDIRS}/${p} } && {
+ func "param ${p} is a jaro maildir"
+ fold+=(${MAILDIRS}/${p}) }
+ else
+ func "param ${p} is a search term"
+ term+=(${p})
fi
done
+ # now fold is an array of specified folders
+ # term is an array of specified search expressions
+
+ { test "${#term}" = "0" } && {
+ error "No search terms specified."
+ act "Parameters: ${PARAM}"
+ return 1
+ }
+ # no folders specified, search into the addressbook
+ { test "${#fold}" = "0" } && {
+ typeset -alU results
+ notice "Searching addressbook for: ${PARAM}"
+ res=""
- # now fold is an array of specified folders
- # expr is an array of specified search expressions
+ for t in ${term}; do
+ res+=`search_name ${t}`
+ res+=`search_email ${t}`
+ done
+ for rr in ${(f)res}; do
+ _email=`print $rr | awk '{ print $1 }'`
+ _name=`print $rr | awk '{ for(c=2;c<=NF;c++) printf "%s ", $c }'`
+ results+=("$_name \t::\t <$_email>")
+ done
- # to search only one maildir then we need to index it
- # separate from the rest of the maildirs
- if [ ${#fold} != 0 ]; then
- { test ${#expr} = 0 } && {
- error "no search expression given for folders ${fold[@]}"
- return 1 }
- # forge the folder string for mairix conf
- folders=""; for f in ${fold}; do folders="$folders`basename $f`:"; done
- cat <<EOF > $rc
+ { test "${#results}" = "0" } || {
+ act "${#results} matches found:"
+ for i in ${results}; do
+ print "$i"; done
+ return 0
+ }
+ notice "No matches found."
+ return 1
+ }
+
+ # base path is the dir of the first folder
+ pushd `dirname ${fold[1]}`
+ basedir=`pwd`
+ popd
+
+ notice "Searching ${#fold} folders in $basedir for: ${term}"
+ { command -v mairix > /dev/null } || {
+ error "Mairix not found, operation aborted."
+ return 1 }
+ act "Searching through: ${fold}"
+ act "Please wait..."
+ id=$datestamp.$RANDOM
+ rc=$TMPDIR/search.conf.$id
+ # forge the folder string for mairix conf
+ folders=""; for f in ${fold}; do folders="$folders`basename $f`:"; done
+ cat <<EOF > $rc
base=$basedir
database=$TMPDIR/search.db.$id
maildir=${folders}
mfolder=$TMPDIR/search.result.$id
mformat=maildir
EOF
+ { test $DEBUG = 1 } && {
+ func "Mairix conf (debug output)"
+ cat $rc }
+ exitcode=0
+ { test "$DRYRUN" = "1" } || {
exitcode=1
- { test $DRYRUN != 1 } && {
- act "Indexing ${folders}"
- mairix -F -f $rc 2> /dev/null
- { test $? = 0 } && {
- act "Searching for: ${expr}"
- found=`mairix -F -f $rc ${=expr} 2> /dev/null | awk '{ print $2}'`
- if [ $found != 0 ]; then
- mutt -F $MUTTDIR/rc -R -f $TMPDIR/search.result.$id
- notice "Found $found matches looking for '$expr' in $folders"
- find $TMPDIR/search.result.$id
- cat $rc
- exitcode=0
- else error "No matches found."; fi
- }
-
- } # DRYRUN
-
- rm -f $rc
- rm -f $TMPDIR/search.db.$id
-# rm -rf $TMPDIR/search.result.$id
- return $exitcode
-
-
- ####################################################
- else # no folder specified on commandline, search all
- # make index if no params given
- list_maildirs
- for i in ${maildirs}; do
- # exclude zz. trash from search
- { test ${i[1,2]} != 'zz' } && { ml="$ml:$i" }
- done
- fi
-
- cat <<EOF > $rc
-base=$MAILDIRS
-database=$WORKDIR/search.db
-maildir=${ml}
-mfolder=$TMPDIR/search.result.$id
-mformat=maildir
-EOF
- # just index
- { test ${#PARAM} = 0 } && {
- { test $DRYRUN = 1 } && {
- act "Would index ${#maildirs} maildirs:"
- act "${maildirs}"
- act "Dry run exit."
- return 0
+ mairix -F -f $rc 2>/dev/null
+ { test $? = 0 } && {
+ found=`mairix -F -f $rc ${=term} 2> /dev/null | awk '{ print $2}'`
+ if [ "$found" = "0" ]; then
+ error "No matches found."
+ else
+ mutt -F $MUTTDIR/rc -R -f $TMPDIR/search.result.$id
+ notice "Found $found matches looking for '$term' in $folders"
+ exitcode=0
+ fi
}
- act "Indexing ${#maildirs} maildirs for search"
- act "please be patient..."
- mairix -F -f $rc
- rm -f $rc
- exitcode=$?
- if [ $exitcode = 0 ]; then notice "Done."
- else error "Error, indexing aborted."; fi
- rm -f $rc
- return $exitcode
- }
-
- { test $DRYRUN = 1 } && {
- act "Would search $mlstr for: ${expr}"
- act "Dry run exit."
- return 0
- }
-
- act "Searching $mlstr for: ${expr}"
- exitcode=1
-
- found=`mairix -F -f $rc ${=expr} 2> /dev/null | awk '{print $2}'`
- if [ $CALLMUTT = 1 ]; then
-
- if [ $found != 0 ]; then
- ${=mutt} -F $MUTTDIR/rc -R -f $TMPDIR/search.result.$id
- notice "Found $found matches looking for '$expr' in all mail folders"
- exitcode=0
- else error "Nothing found matching '$expr'"; fi
-
- rm -rf $TMPDIR/search.*.$id
- rm -f $rc
- return $exitcode
-
- else ### if not calling mutt, internal use mode:
- # print out the full path to the results maildir
- # return number of found hits
- echo $TMPDIR/search.result.$id
- return $found
- fi
+ } # DRYRUN
+ ${=rm} $TMPDIR/search.db.$id
+ ${=rm} $TMPDIR/search.conf.$id
+ ${=rm} $TMPDIR/search.result.$id
+ return $exitcode
}
-
backup() {
- mairixrc=$TMPDIR/backup.rc.$datestamp.$RANDOM
- mairixdb=$TMPDIR/backup.db.$datestamp.$RANDOM
+ id=$datestamp.$RANDOM
+ mairixrc=$TMPDIR/backup.rc.$id
+ mairixdb=$TMPDIR/backup.db.$id
typeset -al expr
typeset -al fold