]> git.notmuchmail.org Git - notmuch/blobdiff - bindings/ruby/defs.h
ruby: move towards more modern RTypedData
[notmuch] / bindings / ruby / defs.h
index 81f652fba1d983c596b7f36557dac7d1575bc7af..6dbaa85dcfbcd0fd5ec03146d11d176483245cfa 100644 (file)
@@ -1,6 +1,6 @@
 /* The Ruby interface to the notmuch mail library
  *
- * Copyright © 2010, 2011 Ali Polatel
+ * Copyright © 2010, 2011, 2012 Ali Polatel
  *
  * 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
@@ -13,7 +13,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see http://www.gnu.org/licenses/ .
+ * along with this program.  If not, see https://www.gnu.org/licenses/ .
  *
  * Author: Ali Polatel <alip@exherbo.org>
  */
 #include <notmuch.h>
 #include <ruby.h>
 
-VALUE notmuch_rb_cDatabase;
-VALUE notmuch_rb_cDirectory;
-VALUE notmuch_rb_cFileNames;
-VALUE notmuch_rb_cQuery;
-VALUE notmuch_rb_cThreads;
-VALUE notmuch_rb_cThread;
-VALUE notmuch_rb_cMessages;
-VALUE notmuch_rb_cMessage;
-VALUE notmuch_rb_cTags;
-
-VALUE notmuch_rb_eBaseError;
-VALUE notmuch_rb_eDatabaseError;
-VALUE notmuch_rb_eMemoryError;
-VALUE notmuch_rb_eReadOnlyError;
-VALUE notmuch_rb_eXapianError;
-VALUE notmuch_rb_eFileError;
-VALUE notmuch_rb_eFileNotEmailError;
-VALUE notmuch_rb_eNullPointerError;
-VALUE notmuch_rb_eTagTooLongError;
-VALUE notmuch_rb_eUnbalancedFreezeThawError;
-VALUE notmuch_rb_eUnbalancedAtomicError;
-
-ID ID_call;
-ID ID_db_create;
-ID ID_db_mode;
+extern VALUE notmuch_rb_cDatabase;
+extern VALUE notmuch_rb_cDirectory;
+extern VALUE notmuch_rb_cFileNames;
+extern VALUE notmuch_rb_cQuery;
+extern VALUE notmuch_rb_cThreads;
+extern VALUE notmuch_rb_cThread;
+extern VALUE notmuch_rb_cMessages;
+extern VALUE notmuch_rb_cMessage;
+extern VALUE notmuch_rb_cTags;
+
+extern VALUE notmuch_rb_eBaseError;
+extern VALUE notmuch_rb_eDatabaseError;
+extern VALUE notmuch_rb_eMemoryError;
+extern VALUE notmuch_rb_eReadOnlyError;
+extern VALUE notmuch_rb_eXapianError;
+extern VALUE notmuch_rb_eFileError;
+extern VALUE notmuch_rb_eFileNotEmailError;
+extern VALUE notmuch_rb_eNullPointerError;
+extern VALUE notmuch_rb_eTagTooLongError;
+extern VALUE notmuch_rb_eUnbalancedFreezeThawError;
+extern VALUE notmuch_rb_eUnbalancedAtomicError;
+
+extern ID ID_call;
+extern ID ID_db_create;
+extern ID ID_db_mode;
 
 /* RSTRING_PTR() is new in ruby-1.9 */
 #if !defined(RSTRING_PTR)
 # define RSTRING_PTR(v) (RSTRING((v))->ptr)
 #endif /* !defined (RSTRING_PTR) */
 
-#define Data_Get_Notmuch_Database(obj, ptr)                    \
-    do {                                                       \
-       Check_Type ((obj), T_DATA);                             \
-       if (DATA_PTR ((obj)) == NULL)                           \
-       rb_raise (rb_eRuntimeError, "database closed");         \
-       Data_Get_Struct ((obj), notmuch_database_t, (ptr));     \
-    } while (0)
+extern const rb_data_type_t notmuch_rb_object_type;
 
-#define Data_Get_Notmuch_Directory(obj, ptr)                   \
-    do {                                                       \
-       Check_Type ((obj), T_DATA);                             \
-       if (DATA_PTR ((obj)) == NULL)                           \
-       rb_raise (rb_eRuntimeError, "directory destroyed");     \
-       Data_Get_Struct ((obj), notmuch_directory_t, (ptr));    \
+#define Data_Get_Notmuch_Object(obj, ptr)                                          \
+    do {                                                                           \
+       (ptr) = rb_check_typeddata ((obj), &notmuch_rb_object_type);                \
+       if (RB_UNLIKELY (!(ptr))) {                                                 \
+           VALUE cname = rb_class_name (CLASS_OF ((obj)));                         \
+           rb_raise (rb_eRuntimeError, "%"PRIsVALUE" object destroyed", cname);    \
+       }                                                                           \
     } while (0)
 
-#define Data_Get_Notmuch_FileNames(obj, ptr)                   \
-    do {                                                       \
-       Check_Type ((obj), T_DATA);                             \
-       if (DATA_PTR ((obj)) == NULL)                           \
-       rb_raise (rb_eRuntimeError, "filenames destroyed");     \
-       Data_Get_Struct ((obj), notmuch_filenames_t, (ptr));    \
-    } while (0)
+#define Data_Wrap_Notmuch_Object(klass, ptr)   \
+    TypedData_Wrap_Struct ((klass), &notmuch_rb_object_type, (ptr))
 
-#define Data_Get_Notmuch_Query(obj, ptr)                       \
-    do {                                                       \
-       Check_Type ((obj), T_DATA);                             \
-       if (DATA_PTR ((obj)) == NULL)                           \
-       rb_raise (rb_eRuntimeError, "query destroyed");         \
-       Data_Get_Struct ((obj), notmuch_query_t, (ptr));        \
-    } while (0)
+#define Data_Get_Notmuch_Database(obj, ptr) \
+    Data_Get_Notmuch_Object ((obj), (ptr))
 
-#define Data_Get_Notmuch_Threads(obj, ptr)                     \
-    do {                                                       \
-       Check_Type ((obj), T_DATA);                             \
-       if (DATA_PTR ((obj)) == NULL)                           \
-       rb_raise (rb_eRuntimeError, "threads destroyed");       \
-       Data_Get_Struct ((obj), notmuch_threads_t, (ptr));      \
-    } while (0)
+#define Data_Get_Notmuch_Directory(obj, ptr) \
+    Data_Get_Notmuch_Object ((obj), (ptr))
 
-#define Data_Get_Notmuch_Messages(obj, ptr)                    \
-    do {                                                       \
-       Check_Type ((obj), T_DATA);                             \
-       if (DATA_PTR ((obj)) == NULL)                           \
-       rb_raise (rb_eRuntimeError, "messages destroyed");      \
-       Data_Get_Struct ((obj), notmuch_messages_t, (ptr));     \
-    } while (0)
+#define Data_Get_Notmuch_FileNames(obj, ptr) \
+    Data_Get_Notmuch_Object ((obj), (ptr))
 
-#define Data_Get_Notmuch_Thread(obj, ptr)                      \
-    do {                                                       \
-       Check_Type ((obj), T_DATA);                             \
-       if (DATA_PTR ((obj)) == NULL)                           \
-       rb_raise (rb_eRuntimeError, "thread destroyed");        \
-       Data_Get_Struct ((obj), notmuch_thread_t, (ptr));       \
-    } while (0)
+#define Data_Get_Notmuch_Query(obj, ptr) \
+    Data_Get_Notmuch_Object ((obj), (ptr))
 
-#define Data_Get_Notmuch_Message(obj, ptr)                     \
-    do {                                                       \
-       Check_Type ((obj), T_DATA);                             \
-       if (DATA_PTR ((obj)) == NULL)                           \
-       rb_raise (rb_eRuntimeError, "message destroyed");       \
-       Data_Get_Struct ((obj), notmuch_message_t, (ptr));      \
-    } while (0)
+#define Data_Get_Notmuch_Threads(obj, ptr) \
+    Data_Get_Notmuch_Object ((obj), (ptr))
 
-#define Data_Get_Notmuch_Tags(obj, ptr)                        \
-    do {                                               \
-       Check_Type ((obj), T_DATA);                     \
-       if (DATA_PTR ((obj)) == NULL)                   \
-       rb_raise (rb_eRuntimeError, "tags destroyed");  \
-       Data_Get_Struct ((obj), notmuch_tags_t, (ptr)); \
-    } while (0)
+#define Data_Get_Notmuch_Messages(obj, ptr) \
+    Data_Get_Notmuch_Object ((obj), (ptr))
+
+#define Data_Get_Notmuch_Thread(obj, ptr) \
+    Data_Get_Notmuch_Object ((obj), (ptr))
+
+#define Data_Get_Notmuch_Message(obj, ptr) \
+    Data_Get_Notmuch_Object ((obj), (ptr))
+
+#define Data_Get_Notmuch_Tags(obj, ptr) \
+    Data_Get_Notmuch_Object ((obj), (ptr))
 
 /* status.c */
 void
@@ -177,6 +146,9 @@ notmuch_rb_database_find_message (VALUE self, VALUE idv);
 VALUE
 notmuch_rb_database_find_message_by_filename (VALUE self, VALUE pathv);
 
+VALUE
+notmuch_rb_database_get_all_tags (VALUE self);
+
 VALUE
 notmuch_rb_database_query_create (VALUE self, VALUE qstrv);
 
@@ -216,12 +188,24 @@ notmuch_rb_query_set_sort (VALUE self, VALUE sortv);
 VALUE
 notmuch_rb_query_get_string (VALUE self);
 
+VALUE
+notmuch_rb_query_add_tag_exclude (VALUE self, VALUE tagv);
+
+VALUE
+notmuch_rb_query_set_omit_excluded (VALUE self, VALUE omitv);
+
 VALUE
 notmuch_rb_query_search_threads (VALUE self);
 
 VALUE
 notmuch_rb_query_search_messages (VALUE self);
 
+VALUE
+notmuch_rb_query_count_messages (VALUE self);
+
+VALUE
+notmuch_rb_query_count_threads (VALUE self);
+
 /* threads.c */
 VALUE
 notmuch_rb_threads_destroy (VALUE self);
@@ -252,6 +236,9 @@ notmuch_rb_thread_get_total_messages (VALUE self);
 VALUE
 notmuch_rb_thread_get_toplevel_messages (VALUE self);
 
+VALUE
+notmuch_rb_thread_get_messages (VALUE self);
+
 VALUE
 notmuch_rb_thread_get_matched_messages (VALUE self);