2010-05-22 07:45:40 +02:00
|
|
|
/* The Ruby interface to the notmuch mail library
|
|
|
|
*
|
2011-09-24 14:43:43 +02:00
|
|
|
* Copyright © 2010, 2011 Ali Polatel
|
2010-05-22 07:45:40 +02:00
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
2016-06-02 18:26:14 +02:00
|
|
|
* along with this program. If not, see https://www.gnu.org/licenses/ .
|
2010-05-22 07:45:40 +02:00
|
|
|
*
|
|
|
|
* Author: Ali Polatel <alip@exherbo.org>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "defs.h"
|
|
|
|
|
2010-05-26 19:56:07 +02:00
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_alloc (VALUE klass)
|
2010-05-26 19:56:07 +02:00
|
|
|
{
|
2021-05-15 23:21:02 +02:00
|
|
|
return Data_Wrap_Notmuch_Object (klass, ¬much_rb_database_type, NULL);
|
2010-05-26 19:56:07 +02:00
|
|
|
}
|
|
|
|
|
2010-05-22 07:45:40 +02:00
|
|
|
/*
|
2010-05-26 19:56:07 +02:00
|
|
|
* call-seq: Notmuch::Database.new(path [, {:create => false, :mode => Notmuch::MODE_READ_ONLY}]) => DB
|
2010-05-22 07:45:40 +02:00
|
|
|
*
|
|
|
|
* Create or open a notmuch database using the given path.
|
2010-05-26 19:56:07 +02:00
|
|
|
*
|
2010-05-22 07:45:40 +02:00
|
|
|
* If :create is +true+, create the database instead of opening.
|
2010-05-26 19:56:07 +02:00
|
|
|
*
|
2010-05-22 07:45:40 +02:00
|
|
|
* The argument :mode specifies the open mode of the database.
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_initialize (int argc, VALUE *argv, VALUE self)
|
2010-05-22 07:45:40 +02:00
|
|
|
{
|
|
|
|
const char *path;
|
|
|
|
int create, mode;
|
2010-05-26 18:10:40 +02:00
|
|
|
VALUE pathv, hashv;
|
2010-05-26 17:54:25 +02:00
|
|
|
VALUE modev;
|
2012-04-30 18:25:37 +02:00
|
|
|
notmuch_database_t *database;
|
|
|
|
notmuch_status_t ret;
|
2010-05-22 07:45:40 +02:00
|
|
|
|
|
|
|
/* Check arguments */
|
2011-10-04 15:41:52 +02:00
|
|
|
rb_scan_args (argc, argv, "11", &pathv, &hashv);
|
|
|
|
|
|
|
|
SafeStringValue (pathv);
|
|
|
|
path = RSTRING_PTR (pathv);
|
|
|
|
|
|
|
|
if (!NIL_P (hashv)) {
|
|
|
|
Check_Type (hashv, T_HASH);
|
|
|
|
create = RTEST (rb_hash_aref (hashv, ID2SYM (ID_db_create)));
|
|
|
|
modev = rb_hash_aref (hashv, ID2SYM (ID_db_mode));
|
|
|
|
if (NIL_P (modev))
|
|
|
|
mode = NOTMUCH_DATABASE_MODE_READ_ONLY;
|
|
|
|
else if (!FIXNUM_P (modev))
|
|
|
|
rb_raise (rb_eTypeError, ":mode isn't a Fixnum");
|
|
|
|
else {
|
|
|
|
mode = FIX2INT (modev);
|
|
|
|
switch (mode) {
|
|
|
|
case NOTMUCH_DATABASE_MODE_READ_ONLY:
|
|
|
|
case NOTMUCH_DATABASE_MODE_READ_WRITE:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
rb_raise ( rb_eTypeError, "Invalid mode");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
create = 0;
|
|
|
|
mode = NOTMUCH_DATABASE_MODE_READ_ONLY;
|
2010-05-22 07:45:40 +02:00
|
|
|
}
|
|
|
|
|
2021-05-15 23:21:02 +02:00
|
|
|
rb_check_typeddata (self, ¬much_rb_database_type);
|
2012-04-30 18:25:37 +02:00
|
|
|
if (create)
|
|
|
|
ret = notmuch_database_create (path, &database);
|
|
|
|
else
|
|
|
|
ret = notmuch_database_open (path, mode, &database);
|
|
|
|
notmuch_rb_status_raise (ret);
|
|
|
|
|
2021-05-17 21:39:14 +02:00
|
|
|
DATA_PTR (self) = notmuch_rb_object_create (database);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2010-05-26 19:56:07 +02:00
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* call-seq: Notmuch::Database.open(path [, ahash]) {|db| ...}
|
|
|
|
*
|
|
|
|
* Identical to new, except that when it is called with a block, it yields with
|
|
|
|
* the new instance and closes it, and returns the result which is returned from
|
|
|
|
* the block.
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_open (int argc, VALUE *argv, VALUE klass)
|
2010-05-26 19:56:07 +02:00
|
|
|
{
|
|
|
|
VALUE obj;
|
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
obj = rb_class_new_instance (argc, argv, klass);
|
|
|
|
if (!rb_block_given_p ())
|
|
|
|
return obj;
|
2010-05-26 19:56:07 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
return rb_ensure (rb_yield, obj, notmuch_rb_database_close, obj);
|
2010-05-22 07:45:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* call-seq: DB.close => nil
|
|
|
|
*
|
|
|
|
* Close the notmuch database.
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_close (VALUE self)
|
2010-05-22 07:45:40 +02:00
|
|
|
{
|
2014-04-16 14:59:20 +02:00
|
|
|
notmuch_status_t ret;
|
2021-05-15 23:21:03 +02:00
|
|
|
ret = notmuch_rb_object_destroy (self, ¬much_rb_database_type);
|
2014-04-16 14:59:20 +02:00
|
|
|
notmuch_rb_status_raise (ret);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* call-seq: DB.path => String
|
|
|
|
*
|
|
|
|
* Return the path of the database
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_path (VALUE self)
|
2010-05-22 07:45:40 +02:00
|
|
|
{
|
2010-05-26 17:54:25 +02:00
|
|
|
notmuch_database_t *db;
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
Data_Get_Notmuch_Database (self, db);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
return rb_str_new2 (notmuch_database_get_path (db));
|
2010-05-22 07:45:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* call-seq: DB.version => Fixnum
|
|
|
|
*
|
|
|
|
* Return the version of the database
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_version (VALUE self)
|
2010-05-22 07:45:40 +02:00
|
|
|
{
|
2010-05-26 17:54:25 +02:00
|
|
|
notmuch_database_t *db;
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
Data_Get_Notmuch_Database (self, db);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
return INT2FIX (notmuch_database_get_version (db));
|
2010-05-22 07:45:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* call-seq: DB.needs_upgrade? => true or false
|
|
|
|
*
|
|
|
|
* Return the +true+ if the database needs upgrading, +false+ otherwise
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_needs_upgrade (VALUE self)
|
2010-05-22 07:45:40 +02:00
|
|
|
{
|
2010-05-26 17:54:25 +02:00
|
|
|
notmuch_database_t *db;
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
Data_Get_Notmuch_Database (self, db);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
return notmuch_database_needs_upgrade (db) ? Qtrue : Qfalse;
|
2010-05-22 07:45:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_upgrade_notify (void *closure, double progress)
|
2010-05-22 07:45:40 +02:00
|
|
|
{
|
2011-10-04 15:41:52 +02:00
|
|
|
VALUE *block = (VALUE *) closure;
|
|
|
|
rb_funcall (*block, ID_call, 1, rb_float_new (progress));
|
2010-05-22 07:45:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2010-05-23 10:42:52 +02:00
|
|
|
* call-seq: DB.upgrade! [{|progress| block }] => nil
|
2010-05-22 07:45:40 +02:00
|
|
|
*
|
|
|
|
* Upgrade the database.
|
|
|
|
*
|
|
|
|
* If a block is given the block is called with a progress indicator as a
|
|
|
|
* floating point value in the range of [0.0..1.0].
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_upgrade (VALUE self)
|
2010-05-22 07:45:40 +02:00
|
|
|
{
|
|
|
|
notmuch_status_t ret;
|
|
|
|
void (*pnotify) (void *closure, double progress);
|
2010-05-26 17:54:25 +02:00
|
|
|
notmuch_database_t *db;
|
2010-05-22 07:45:40 +02:00
|
|
|
VALUE block;
|
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
Data_Get_Notmuch_Database (self, db);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
if (rb_block_given_p ()) {
|
|
|
|
pnotify = notmuch_rb_upgrade_notify;
|
|
|
|
block = rb_block_proc ();
|
2010-05-22 07:45:40 +02:00
|
|
|
}
|
|
|
|
else
|
2011-10-04 15:41:52 +02:00
|
|
|
pnotify = NULL;
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
ret = notmuch_database_upgrade (db, pnotify, pnotify ? &block : NULL);
|
|
|
|
notmuch_rb_status_raise (ret);
|
2010-05-26 17:54:25 +02:00
|
|
|
|
2010-05-22 07:45:40 +02:00
|
|
|
return Qtrue;
|
|
|
|
}
|
|
|
|
|
2011-09-24 14:43:43 +02:00
|
|
|
/*
|
|
|
|
* call-seq: DB.begin_atomic => nil
|
|
|
|
*
|
|
|
|
* Begin an atomic database operation.
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_begin_atomic (VALUE self)
|
2011-09-24 14:43:43 +02:00
|
|
|
{
|
|
|
|
notmuch_status_t ret;
|
|
|
|
notmuch_database_t *db;
|
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
Data_Get_Notmuch_Database (self, db);
|
2011-09-24 14:43:43 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
ret = notmuch_database_begin_atomic (db);
|
|
|
|
notmuch_rb_status_raise (ret);
|
2011-09-24 14:43:43 +02:00
|
|
|
|
|
|
|
return Qtrue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* call-seq: DB.end_atomic => nil
|
|
|
|
*
|
|
|
|
* Indicate the end of an atomic database operation.
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_end_atomic (VALUE self)
|
2011-09-24 14:43:43 +02:00
|
|
|
{
|
|
|
|
notmuch_status_t ret;
|
|
|
|
notmuch_database_t *db;
|
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
Data_Get_Notmuch_Database (self, db);
|
2011-09-24 14:43:43 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
ret = notmuch_database_end_atomic (db);
|
|
|
|
notmuch_rb_status_raise (ret);
|
2011-09-24 14:43:43 +02:00
|
|
|
|
|
|
|
return Qtrue;
|
|
|
|
}
|
|
|
|
|
2010-05-22 07:45:40 +02:00
|
|
|
/*
|
|
|
|
* call-seq: DB.get_directory(path) => DIR
|
|
|
|
*
|
|
|
|
* Retrieve a directory object from the database for 'path'
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_get_directory (VALUE self, VALUE pathv)
|
2010-05-22 07:45:40 +02:00
|
|
|
{
|
|
|
|
const char *path;
|
2012-05-14 01:36:12 +02:00
|
|
|
notmuch_status_t ret;
|
2010-05-26 17:54:25 +02:00
|
|
|
notmuch_directory_t *dir;
|
|
|
|
notmuch_database_t *db;
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
Data_Get_Notmuch_Database (self, db);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
SafeStringValue (pathv);
|
|
|
|
path = RSTRING_PTR (pathv);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2012-05-14 01:36:12 +02:00
|
|
|
ret = notmuch_database_get_directory (db, path, &dir);
|
|
|
|
notmuch_rb_status_raise (ret);
|
|
|
|
if (dir)
|
2021-05-15 23:21:02 +02:00
|
|
|
return Data_Wrap_Notmuch_Object (notmuch_rb_cDirectory, ¬much_rb_directory_type, dir);
|
2012-05-14 01:36:12 +02:00
|
|
|
return Qnil;
|
2010-05-22 07:45:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* call-seq: DB.add_message(path) => MESSAGE, isdup
|
|
|
|
*
|
2010-05-26 17:54:25 +02:00
|
|
|
* Add a message to the database and return it.
|
|
|
|
*
|
2010-05-22 07:45:40 +02:00
|
|
|
* +isdup+ is a boolean that specifies whether the added message was a
|
|
|
|
* duplicate.
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_add_message (VALUE self, VALUE pathv)
|
2010-05-22 07:45:40 +02:00
|
|
|
{
|
|
|
|
const char *path;
|
|
|
|
notmuch_status_t ret;
|
2010-05-26 17:54:25 +02:00
|
|
|
notmuch_message_t *message;
|
|
|
|
notmuch_database_t *db;
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
Data_Get_Notmuch_Database (self, db);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
SafeStringValue (pathv);
|
|
|
|
path = RSTRING_PTR (pathv);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
database: add n_d_index_file (deprecates n_d_add_message)
We need a way to pass parameters to the indexing functionality on the
first index, not just on reindexing. The obvious place is in
notmuch_database_add_message. But since modifying the argument list
would break both API and ABI, we needed a new name.
I considered notmuch_database_add_message_with_params(), but the
functionality we're talking about doesn't always add a message. It
tries to index a specific file, possibly adding a message, but
possibly doing other things, like adding terms to an existing message,
or failing to deal with message objects entirely (e.g. because the
file didn't contain a message).
So i chose the function name notmuch_database_index_file.
I confess i'm a little concerned about confusing future notmuch
developers with the new name, since we already have a private
_notmuch_message_index_file function, and the two do rather different
things. But i think the added clarity for people linking against the
future libnotmuch and the capacity for using index parameters makes
this a worthwhile tradeoff. (that said, if anyone has another name
that they strongly prefer, i'd be happy to go with it)
This changeset also adjusts the tests so that we test whether the new,
preferred function returns bad values (since the deprecated function
just calls the new one).
We can keep the deprecated n_d_add_message function around as long as
we like, but at the next place where we're forced to break API or ABI
we can probably choose to drop the name relatively safely.
NOTE: there is probably more cleanup to do in the ruby and go bindings
to complete the deprecation directly. I don't know those languages
well enough to attempt a fix; i don't know how to test them; and i
don't know the culture around those languages about API additions or
deprecations.
2017-08-18 01:14:25 +02:00
|
|
|
ret = notmuch_database_index_file (db, path, NULL, &message);
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_status_raise (ret);
|
2021-05-15 23:21:02 +02:00
|
|
|
return rb_assoc_new (Data_Wrap_Notmuch_Object (notmuch_rb_cMessage, ¬much_rb_message_type, message),
|
2010-05-26 17:54:25 +02:00
|
|
|
(ret == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) ? Qtrue : Qfalse);
|
2010-05-22 07:45:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2011-10-04 15:41:52 +02:00
|
|
|
* call-seq: DB.remove_message (path) => isdup
|
2010-05-22 07:45:40 +02:00
|
|
|
*
|
|
|
|
* Remove a message from the database.
|
2010-05-26 17:54:25 +02:00
|
|
|
*
|
2010-05-22 07:45:40 +02:00
|
|
|
* +isdup+ is a boolean that specifies whether the removed message was a
|
|
|
|
* duplicate.
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_remove_message (VALUE self, VALUE pathv)
|
2010-05-22 07:45:40 +02:00
|
|
|
{
|
|
|
|
const char *path;
|
|
|
|
notmuch_status_t ret;
|
2010-05-26 17:54:25 +02:00
|
|
|
notmuch_database_t *db;
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
Data_Get_Notmuch_Database (self, db);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
SafeStringValue (pathv);
|
|
|
|
path = RSTRING_PTR (pathv);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
ret = notmuch_database_remove_message (db, path);
|
|
|
|
notmuch_rb_status_raise (ret);
|
2010-05-22 07:45:40 +02:00
|
|
|
return (ret == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) ? Qtrue : Qfalse;
|
|
|
|
}
|
|
|
|
|
2011-10-04 15:06:20 +02:00
|
|
|
/*
|
|
|
|
* call-seq: DB.find_message(id) => MESSAGE or nil
|
|
|
|
*
|
|
|
|
* Find a message by message id.
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_find_message (VALUE self, VALUE idv)
|
2011-10-04 15:06:20 +02:00
|
|
|
{
|
|
|
|
const char *id;
|
|
|
|
notmuch_status_t ret;
|
|
|
|
notmuch_database_t *db;
|
|
|
|
notmuch_message_t *message;
|
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
Data_Get_Notmuch_Database (self, db);
|
2011-10-04 15:06:20 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
SafeStringValue (idv);
|
|
|
|
id = RSTRING_PTR (idv);
|
2011-10-04 15:06:20 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
ret = notmuch_database_find_message (db, id, &message);
|
|
|
|
notmuch_rb_status_raise (ret);
|
2011-10-04 15:06:20 +02:00
|
|
|
|
|
|
|
if (message)
|
2021-05-15 23:21:02 +02:00
|
|
|
return Data_Wrap_Notmuch_Object (notmuch_rb_cMessage, ¬much_rb_message_type, message);
|
2011-10-04 15:06:20 +02:00
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* call-seq: DB.find_message_by_filename(path) => MESSAGE or nil
|
|
|
|
*
|
|
|
|
* Find a message by filename.
|
|
|
|
*/
|
|
|
|
VALUE
|
2011-10-04 15:41:52 +02:00
|
|
|
notmuch_rb_database_find_message_by_filename (VALUE self, VALUE pathv)
|
2011-10-04 15:06:20 +02:00
|
|
|
{
|
|
|
|
const char *path;
|
|
|
|
notmuch_status_t ret;
|
|
|
|
notmuch_database_t *db;
|
|
|
|
notmuch_message_t *message;
|
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
Data_Get_Notmuch_Database (self, db);
|
2011-10-04 15:06:20 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
SafeStringValue (pathv);
|
|
|
|
path = RSTRING_PTR (pathv);
|
2011-10-04 15:06:20 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
ret = notmuch_database_find_message_by_filename (db, path, &message);
|
|
|
|
notmuch_rb_status_raise (ret);
|
2011-10-04 15:06:20 +02:00
|
|
|
|
|
|
|
if (message)
|
2021-05-15 23:21:02 +02:00
|
|
|
return Data_Wrap_Notmuch_Object (notmuch_rb_cMessage, ¬much_rb_message_type, message);
|
2011-10-04 15:06:20 +02:00
|
|
|
return Qnil;
|
|
|
|
}
|
|
|
|
|
2016-03-06 12:56:28 +01:00
|
|
|
/*
|
|
|
|
* call-seq: DB.get_all_tags() => TAGS
|
|
|
|
*
|
|
|
|
* Returns a list of all tags found in the database.
|
|
|
|
*/
|
|
|
|
VALUE
|
|
|
|
notmuch_rb_database_get_all_tags (VALUE self)
|
|
|
|
{
|
|
|
|
notmuch_database_t *db;
|
|
|
|
notmuch_tags_t *tags;
|
|
|
|
|
|
|
|
Data_Get_Notmuch_Database (self, db);
|
|
|
|
|
|
|
|
tags = notmuch_database_get_all_tags (db);
|
|
|
|
if (!tags) {
|
|
|
|
const char *msg = notmuch_database_status_string (db);
|
|
|
|
if (!msg)
|
|
|
|
msg = "Unknown notmuch error";
|
|
|
|
|
|
|
|
rb_raise (notmuch_rb_eBaseError, "%s", msg);
|
|
|
|
}
|
2021-05-15 23:21:02 +02:00
|
|
|
return Data_Wrap_Notmuch_Object (notmuch_rb_cTags, ¬much_rb_tags_type, tags);
|
2016-03-06 12:56:28 +01:00
|
|
|
}
|
|
|
|
|
2010-05-22 07:45:40 +02:00
|
|
|
/*
|
2021-05-24 04:19:09 +02:00
|
|
|
* call-seq:
|
|
|
|
* DB.query(query) => QUERY
|
|
|
|
* DB.query(query, sort:, excluded_tags:, omit_excluded:) => QUERY
|
2010-05-22 07:45:40 +02:00
|
|
|
*
|
2021-05-24 04:19:09 +02:00
|
|
|
* Retrieve a query object for the query string 'query'. When using keyword
|
|
|
|
* arguments they are passwed to the query object.
|
2010-05-22 07:45:40 +02:00
|
|
|
*/
|
|
|
|
VALUE
|
2021-05-24 04:19:09 +02:00
|
|
|
notmuch_rb_database_query_create (int argc, VALUE *argv, VALUE self)
|
2010-05-22 07:45:40 +02:00
|
|
|
{
|
2021-05-24 04:19:09 +02:00
|
|
|
VALUE qstrv;
|
|
|
|
VALUE opts;
|
2010-05-22 07:45:40 +02:00
|
|
|
const char *qstr;
|
2010-05-26 17:54:25 +02:00
|
|
|
notmuch_query_t *query;
|
|
|
|
notmuch_database_t *db;
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2021-05-24 04:19:09 +02:00
|
|
|
rb_scan_args (argc, argv, "1:", &qstrv, &opts);
|
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
Data_Get_Notmuch_Database (self, db);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
SafeStringValue (qstrv);
|
|
|
|
qstr = RSTRING_PTR (qstrv);
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2011-10-04 15:41:52 +02:00
|
|
|
query = notmuch_query_create (db, qstr);
|
2010-05-26 17:54:25 +02:00
|
|
|
if (!query)
|
2011-10-04 15:41:52 +02:00
|
|
|
rb_raise (notmuch_rb_eMemoryError, "Out of memory");
|
2010-05-22 07:45:40 +02:00
|
|
|
|
2021-05-24 04:19:09 +02:00
|
|
|
if (!NIL_P (opts)) {
|
|
|
|
VALUE sort, exclude_tags, omit_excluded;
|
|
|
|
VALUE kwargs[3];
|
|
|
|
static ID keyword_ids[3];
|
|
|
|
|
|
|
|
if (!keyword_ids[0]) {
|
|
|
|
keyword_ids[0] = rb_intern_const ("sort");
|
|
|
|
keyword_ids[1] = rb_intern_const ("exclude_tags");
|
|
|
|
keyword_ids[2] = rb_intern_const ("omit_excluded");
|
|
|
|
}
|
|
|
|
|
|
|
|
rb_get_kwargs (opts, keyword_ids, 0, 3, kwargs);
|
|
|
|
|
|
|
|
sort = kwargs[0];
|
|
|
|
exclude_tags = kwargs[1];
|
|
|
|
omit_excluded = kwargs[2];
|
|
|
|
|
|
|
|
if (sort != Qundef)
|
|
|
|
notmuch_query_set_sort (query, FIX2UINT (sort));
|
|
|
|
|
|
|
|
if (exclude_tags != Qundef) {
|
|
|
|
for (int i = 0; i < RARRAY_LEN (exclude_tags); i++) {
|
|
|
|
VALUE e = RARRAY_AREF (exclude_tags, i);
|
|
|
|
notmuch_query_add_tag_exclude (query, RSTRING_PTR (e));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (omit_excluded != Qundef) {
|
|
|
|
notmuch_exclude_t omit;
|
|
|
|
omit = FIXNUM_P (omit_excluded) ? FIX2UINT (omit_excluded) : RTEST(omit_excluded);
|
|
|
|
notmuch_query_set_omit_excluded (query, omit);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-15 23:21:02 +02:00
|
|
|
return Data_Wrap_Notmuch_Object (notmuch_rb_cQuery, ¬much_rb_query_type, query);
|
2010-05-22 07:45:40 +02:00
|
|
|
}
|