aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2021-08-24 08:17:16 -0700
committerDavid Bremner <david@tethera.net>2021-09-04 17:07:19 -0700
commitbe7e83de96b706af418fc9f139ded4d50bf342f6 (patch)
tree35350510d2fdb3302d8625fdd730463756536ed5 /lib
parent9ae4188610dc21101fe9bdeb158854fc7c63463e (diff)
lib/parse-sexp: parse single terms and the empty list.
There is not much of a parser here yet, but it already does some useful error reporting. Most functionality sketched in the documentation is not implemented yet; detailed documentation will follow with the implementation.
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile.local3
-rw-r--r--lib/database-private.h7
-rw-r--r--lib/parse-sexp.cc55
-rw-r--r--lib/query.cc8
4 files changed, 66 insertions, 7 deletions
diff --git a/lib/Makefile.local b/lib/Makefile.local
index e2d4b91d..1378a74b 100644
--- a/lib/Makefile.local
+++ b/lib/Makefile.local
@@ -63,7 +63,8 @@ libnotmuch_cxx_srcs = \
$(dir)/features.cc \
$(dir)/prefix.cc \
$(dir)/open.cc \
- $(dir)/init.cc
+ $(dir)/init.cc \
+ $(dir)/parse-sexp.cc
libnotmuch_modules := $(libnotmuch_c_srcs:.c=.o) $(libnotmuch_cxx_srcs:.cc=.o)
diff --git a/lib/database-private.h b/lib/database-private.h
index 9706c17e..f206efaf 100644
--- a/lib/database-private.h
+++ b/lib/database-private.h
@@ -300,4 +300,11 @@ _notmuch_database_setup_standard_query_fields (notmuch_database_t *notmuch);
notmuch_status_t
_notmuch_database_setup_user_query_fields (notmuch_database_t *notmuch);
+#if __cplusplus
+/* parse-sexp.cc */
+notmuch_status_t
+_notmuch_sexp_string_to_xapian_query (notmuch_database_t *notmuch, const char *querystr,
+ Xapian::Query &output);
+#endif
+
#endif
diff --git a/lib/parse-sexp.cc b/lib/parse-sexp.cc
new file mode 100644
index 00000000..66dbdb41
--- /dev/null
+++ b/lib/parse-sexp.cc
@@ -0,0 +1,55 @@
+#include <xapian.h>
+#include "notmuch-private.h"
+
+#if HAVE_SFSEXP
+#include "sexp.h"
+
+
+/* _sexp is used for file scope symbols to avoid clashing with
+ * definitions from sexp.h */
+
+/* Here we expect the s-expression to be a proper list, with first
+ * element defining and operation, or as a special case the empty
+ * list */
+
+static notmuch_status_t
+_sexp_to_xapian_query (notmuch_database_t *notmuch, const sexp_t *sx,
+ Xapian::Query &output)
+{
+
+ if (sx->ty == SEXP_VALUE) {
+ output = Xapian::Query (Xapian::Unicode::tolower (sx->val));
+ return NOTMUCH_STATUS_SUCCESS;
+ }
+
+ /* Empty list */
+ if (! sx->list) {
+ output = Xapian::Query::MatchAll;
+ return NOTMUCH_STATUS_SUCCESS;
+ }
+
+ if (sx->list->ty == SEXP_VALUE)
+ _notmuch_database_log (notmuch, "unknown prefix '%s'\n", sx->list->val);
+ else
+ _notmuch_database_log (notmuch, "unexpected list in field/operation position\n",
+ sx->list->val);
+
+ return NOTMUCH_STATUS_BAD_QUERY_SYNTAX;
+}
+
+notmuch_status_t
+_notmuch_sexp_string_to_xapian_query (notmuch_database_t *notmuch, const char *querystr,
+ Xapian::Query &output)
+{
+ const sexp_t *sx = NULL;
+ char *buf = talloc_strdup (notmuch, querystr);
+
+ sx = parse_sexp (buf, strlen (querystr));
+ if (! sx) {
+ _notmuch_database_log (notmuch, "invalid s-expression: '%s'\n", querystr);
+ return NOTMUCH_STATUS_BAD_QUERY_SYNTAX;
+ }
+
+ return _sexp_to_xapian_query (notmuch, sx, output);
+}
+#endif
diff --git a/lib/query.cc b/lib/query.cc
index a3fe3793..435f7229 100644
--- a/lib/query.cc
+++ b/lib/query.cc
@@ -23,10 +23,6 @@
#include <glib.h> /* GHashTable, GPtrArray */
-#if HAVE_SFSEXP
-#include "sexp.h"
-#endif
-
struct _notmuch_query {
notmuch_database_t *notmuch;
const char *query_string;
@@ -210,8 +206,8 @@ _notmuch_query_ensure_parsed_sexpr (notmuch_query_t *query)
if (query->parsed)
return NOTMUCH_STATUS_SUCCESS;
- query->xapian_query = Xapian::Query::MatchAll;
- return NOTMUCH_STATUS_SUCCESS;
+ return _notmuch_sexp_string_to_xapian_query (query->notmuch, query->query_string,
+ query->xapian_query);
}
static notmuch_status_t