diff options
author | Austin Clements <amdragon@MIT.EDU> | 2013-01-06 15:22:41 -0500 |
---|---|---|
committer | David Bremner <bremner@debian.org> | 2013-01-06 22:40:32 -0400 |
commit | 425e2bc81263230df301c67d93c64ff9685ff840 (patch) | |
tree | 2c9dc32b233d80b805148bb3d438b27bdd70c606 /notmuch-restore.c | |
parent | d08c714b6a172cf0018bee4f60aff069d5508d4e (diff) |
dump/restore: Use Xapian queries for batch-tag format
This switches the new batch-tag format away from using a home-grown
hex-encoding scheme for message IDs in the dump to simply using Xapian
queries with Xapian quoting syntax.
This has a variety of advantages beyond presenting a cleaner and more
consistent interface. Foremost is that it will dramatically simplify
the quoting for batch tagging, which shares the same input format.
While the hex-encoding is no better or worse for the simple ID queries
used by dump/restore, it becomes onerous for general-purpose queries
used in batch tagging. It also better handles strange cases like
"id:foo and bar", since this is no longer syntactically valid.
Diffstat (limited to 'notmuch-restore.c')
-rw-r--r-- | notmuch-restore.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/notmuch-restore.c b/notmuch-restore.c index fc5d1fb8..cf26a423 100644 --- a/notmuch-restore.c +++ b/notmuch-restore.c @@ -221,7 +221,7 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[]) INTERNAL_ERROR ("compile time constant regex failed."); do { - char *query_string; + char *query_string, *prefix, *term; if (line_ctx != NULL) talloc_free (line_ctx); @@ -234,19 +234,22 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[]) &query_string, tag_ops); if (ret == 0) { - if (strncmp ("id:", query_string, 3) != 0) { - fprintf (stderr, "Warning: unsupported query: %s\n", query_string); + ret = parse_boolean_term (line_ctx, query_string, + &prefix, &term); + if (ret && errno == EINVAL) { + fprintf (stderr, "Warning: cannot parse query: %s (skipping)\n", query_string); + continue; + } else if (ret) { + /* This is more fatal (e.g., out of memory) */ + fprintf (stderr, "Error parsing query: %s\n", + strerror (errno)); + ret = 1; + break; + } else if (strcmp ("id", prefix) != 0) { + fprintf (stderr, "Warning: not an id query: %s (skipping)\n", query_string); continue; } - /* delete id: from front of string; tag_message - * expects a raw message-id. - * - * XXX: Note that query string id:foo and bar will be - * interpreted as a message id "foo and bar". This - * should eventually be fixed to give a better error - * message. - */ - query_string = query_string + 3; + query_string = term; } } |