From 9574fb60991fa81799fbd1d26d41693ca2794e6b Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Sat, 15 May 2021 16:21:02 -0500 Subject: [PATCH] ruby: add all data types Signed-off-by: Felipe Contreras --- bindings/ruby/database.c | 16 ++++++++-------- bindings/ruby/defs.h | 35 ++++++++++++++++++++++------------- bindings/ruby/directory.c | 4 ++-- bindings/ruby/init.c | 16 ++++++++++++++++ bindings/ruby/message.c | 6 +++--- bindings/ruby/messages.c | 4 ++-- bindings/ruby/query.c | 4 ++-- bindings/ruby/thread.c | 6 +++--- bindings/ruby/threads.c | 2 +- 9 files changed, 59 insertions(+), 34 deletions(-) diff --git a/bindings/ruby/database.c b/bindings/ruby/database.c index bb4273e6..4ecc8f78 100644 --- a/bindings/ruby/database.c +++ b/bindings/ruby/database.c @@ -23,7 +23,7 @@ VALUE notmuch_rb_database_alloc (VALUE klass) { - return Data_Wrap_Notmuch_Object (klass, NULL); + return Data_Wrap_Notmuch_Object (klass, ¬much_rb_database_type, NULL); } /* @@ -74,7 +74,7 @@ notmuch_rb_database_initialize (int argc, VALUE *argv, VALUE self) mode = NOTMUCH_DATABASE_MODE_READ_ONLY; } - rb_check_typeddata (self, ¬much_rb_object_type); + rb_check_typeddata (self, ¬much_rb_database_type); if (create) ret = notmuch_database_create (path, &database); else @@ -266,7 +266,7 @@ notmuch_rb_database_get_directory (VALUE self, VALUE pathv) ret = notmuch_database_get_directory (db, path, &dir); notmuch_rb_status_raise (ret); if (dir) - return Data_Wrap_Notmuch_Object (notmuch_rb_cDirectory, dir); + return Data_Wrap_Notmuch_Object (notmuch_rb_cDirectory, ¬much_rb_directory_type, dir); return Qnil; } @@ -293,7 +293,7 @@ notmuch_rb_database_add_message (VALUE self, VALUE pathv) ret = notmuch_database_index_file (db, path, NULL, &message); notmuch_rb_status_raise (ret); - return rb_assoc_new (Data_Wrap_Notmuch_Object (notmuch_rb_cMessage, message), + return rb_assoc_new (Data_Wrap_Notmuch_Object (notmuch_rb_cMessage, ¬much_rb_message_type, message), (ret == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) ? Qtrue : Qfalse); } @@ -344,7 +344,7 @@ notmuch_rb_database_find_message (VALUE self, VALUE idv) notmuch_rb_status_raise (ret); if (message) - return Data_Wrap_Notmuch_Object (notmuch_rb_cMessage, message); + return Data_Wrap_Notmuch_Object (notmuch_rb_cMessage, ¬much_rb_message_type, message); return Qnil; } @@ -370,7 +370,7 @@ notmuch_rb_database_find_message_by_filename (VALUE self, VALUE pathv) notmuch_rb_status_raise (ret); if (message) - return Data_Wrap_Notmuch_Object (notmuch_rb_cMessage, message); + return Data_Wrap_Notmuch_Object (notmuch_rb_cMessage, ¬much_rb_message_type, message); return Qnil; } @@ -395,7 +395,7 @@ notmuch_rb_database_get_all_tags (VALUE self) rb_raise (notmuch_rb_eBaseError, "%s", msg); } - return Data_Wrap_Notmuch_Object (notmuch_rb_cTags, tags); + return Data_Wrap_Notmuch_Object (notmuch_rb_cTags, ¬much_rb_tags_type, tags); } /* @@ -419,5 +419,5 @@ notmuch_rb_database_query_create (VALUE self, VALUE qstrv) if (!query) rb_raise (notmuch_rb_eMemoryError, "Out of memory"); - return Data_Wrap_Notmuch_Object (notmuch_rb_cQuery, query); + return Data_Wrap_Notmuch_Object (notmuch_rb_cQuery, ¬much_rb_query_type, query); } diff --git a/bindings/ruby/defs.h b/bindings/ruby/defs.h index 6dbaa85d..fa7b9515 100644 --- a/bindings/ruby/defs.h +++ b/bindings/ruby/defs.h @@ -56,45 +56,54 @@ extern ID ID_db_mode; #endif /* !defined (RSTRING_PTR) */ extern const rb_data_type_t notmuch_rb_object_type; +extern const rb_data_type_t notmuch_rb_database_type; +extern const rb_data_type_t notmuch_rb_directory_type; +extern const rb_data_type_t notmuch_rb_filenames_type; +extern const rb_data_type_t notmuch_rb_query_type; +extern const rb_data_type_t notmuch_rb_threads_type; +extern const rb_data_type_t notmuch_rb_thread_type; +extern const rb_data_type_t notmuch_rb_messages_type; +extern const rb_data_type_t notmuch_rb_message_type; +extern const rb_data_type_t notmuch_rb_tags_type; -#define Data_Get_Notmuch_Object(obj, ptr) \ +#define Data_Get_Notmuch_Object(obj, type, ptr) \ do { \ - (ptr) = rb_check_typeddata ((obj), ¬much_rb_object_type); \ + (ptr) = rb_check_typeddata ((obj), (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_Wrap_Notmuch_Object(klass, ptr) \ - TypedData_Wrap_Struct ((klass), ¬much_rb_object_type, (ptr)) +#define Data_Wrap_Notmuch_Object(klass, type, ptr) \ + TypedData_Wrap_Struct ((klass), (type), (ptr)) #define Data_Get_Notmuch_Database(obj, ptr) \ - Data_Get_Notmuch_Object ((obj), (ptr)) + Data_Get_Notmuch_Object ((obj), ¬much_rb_database_type, (ptr)) #define Data_Get_Notmuch_Directory(obj, ptr) \ - Data_Get_Notmuch_Object ((obj), (ptr)) + Data_Get_Notmuch_Object ((obj), ¬much_rb_directory_type, (ptr)) #define Data_Get_Notmuch_FileNames(obj, ptr) \ - Data_Get_Notmuch_Object ((obj), (ptr)) + Data_Get_Notmuch_Object ((obj), ¬much_rb_filenames_type, (ptr)) #define Data_Get_Notmuch_Query(obj, ptr) \ - Data_Get_Notmuch_Object ((obj), (ptr)) + Data_Get_Notmuch_Object ((obj), ¬much_rb_query_type, (ptr)) #define Data_Get_Notmuch_Threads(obj, ptr) \ - Data_Get_Notmuch_Object ((obj), (ptr)) + Data_Get_Notmuch_Object ((obj), ¬much_rb_threads_type, (ptr)) #define Data_Get_Notmuch_Messages(obj, ptr) \ - Data_Get_Notmuch_Object ((obj), (ptr)) + Data_Get_Notmuch_Object ((obj), ¬much_rb_messages_type, (ptr)) #define Data_Get_Notmuch_Thread(obj, ptr) \ - Data_Get_Notmuch_Object ((obj), (ptr)) + Data_Get_Notmuch_Object ((obj), ¬much_rb_thread_type, (ptr)) #define Data_Get_Notmuch_Message(obj, ptr) \ - Data_Get_Notmuch_Object ((obj), (ptr)) + Data_Get_Notmuch_Object ((obj), ¬much_rb_message_type, (ptr)) #define Data_Get_Notmuch_Tags(obj, ptr) \ - Data_Get_Notmuch_Object ((obj), (ptr)) + Data_Get_Notmuch_Object ((obj), ¬much_rb_tags_type, (ptr)) /* status.c */ void diff --git a/bindings/ruby/directory.c b/bindings/ruby/directory.c index 36ef3984..17d60d1d 100644 --- a/bindings/ruby/directory.c +++ b/bindings/ruby/directory.c @@ -92,7 +92,7 @@ notmuch_rb_directory_get_child_files (VALUE self) fnames = notmuch_directory_get_child_files (dir); - return Data_Wrap_Notmuch_Object (notmuch_rb_cFileNames, fnames); + return Data_Wrap_Notmuch_Object (notmuch_rb_cFileNames, ¬much_rb_filenames_type, fnames); } /* @@ -111,5 +111,5 @@ notmuch_rb_directory_get_child_directories (VALUE self) fnames = notmuch_directory_get_child_directories (dir); - return Data_Wrap_Notmuch_Object (notmuch_rb_cFileNames, fnames); + return Data_Wrap_Notmuch_Object (notmuch_rb_cFileNames, ¬much_rb_filenames_type, fnames); } diff --git a/bindings/ruby/init.c b/bindings/ruby/init.c index f3b2e5b1..a9f863eb 100644 --- a/bindings/ruby/init.c +++ b/bindings/ruby/init.c @@ -50,6 +50,22 @@ const rb_data_type_t notmuch_rb_object_type = { .wrap_struct_name = "notmuch_object", }; +#define define_type(id) \ + const rb_data_type_t notmuch_rb_ ## id ## _type = { \ + .wrap_struct_name = "notmuch_" #id, \ + .parent = ¬much_rb_object_type, \ + } + +define_type (database); +define_type (directory); +define_type (filenames); +define_type (query); +define_type (threads); +define_type (thread); +define_type (messages); +define_type (message); +define_type (tags); + /* * Document-module: Notmuch * diff --git a/bindings/ruby/message.c b/bindings/ruby/message.c index 1990bb97..b3aed604 100644 --- a/bindings/ruby/message.c +++ b/bindings/ruby/message.c @@ -89,7 +89,7 @@ notmuch_rb_message_get_replies (VALUE self) messages = notmuch_message_get_replies (message); - return Data_Wrap_Notmuch_Object (notmuch_rb_cMessages, messages); + return Data_Wrap_Notmuch_Object (notmuch_rb_cMessages, ¬much_rb_messages_type, messages); } /* @@ -125,7 +125,7 @@ notmuch_rb_message_get_filenames (VALUE self) fnames = notmuch_message_get_filenames (message); - return Data_Wrap_Notmuch_Object (notmuch_rb_cFileNames, fnames); + return Data_Wrap_Notmuch_Object (notmuch_rb_cFileNames, ¬much_rb_filenames_type, fnames); } /* @@ -226,7 +226,7 @@ notmuch_rb_message_get_tags (VALUE self) if (!tags) rb_raise (notmuch_rb_eMemoryError, "Out of memory"); - return Data_Wrap_Notmuch_Object (notmuch_rb_cTags, tags); + return Data_Wrap_Notmuch_Object (notmuch_rb_cTags, ¬much_rb_tags_type, tags); } /* diff --git a/bindings/ruby/messages.c b/bindings/ruby/messages.c index 3d1669ee..e04f3af1 100644 --- a/bindings/ruby/messages.c +++ b/bindings/ruby/messages.c @@ -53,7 +53,7 @@ notmuch_rb_messages_each (VALUE self) for (; notmuch_messages_valid (messages); notmuch_messages_move_to_next (messages)) { message = notmuch_messages_get (messages); - rb_yield (Data_Wrap_Notmuch_Object (notmuch_rb_cMessage, message)); + rb_yield (Data_Wrap_Notmuch_Object (notmuch_rb_cMessage, ¬much_rb_message_type, message)); } return self; @@ -76,5 +76,5 @@ notmuch_rb_messages_collect_tags (VALUE self) if (!tags) rb_raise (notmuch_rb_eMemoryError, "Out of memory"); - return Data_Wrap_Notmuch_Object (notmuch_rb_cTags, tags); + return Data_Wrap_Notmuch_Object (notmuch_rb_cTags, ¬much_rb_tags_type, tags); } diff --git a/bindings/ruby/query.c b/bindings/ruby/query.c index b0fb4ea7..79727d6a 100644 --- a/bindings/ruby/query.c +++ b/bindings/ruby/query.c @@ -142,7 +142,7 @@ notmuch_rb_query_search_threads (VALUE self) if (status) notmuch_rb_status_raise (status); - return Data_Wrap_Notmuch_Object (notmuch_rb_cThreads, threads); + return Data_Wrap_Notmuch_Object (notmuch_rb_cThreads, ¬much_rb_threads_type, threads); } /* @@ -163,7 +163,7 @@ notmuch_rb_query_search_messages (VALUE self) if (status) notmuch_rb_status_raise (status); - return Data_Wrap_Notmuch_Object (notmuch_rb_cMessages, messages); + return Data_Wrap_Notmuch_Object (notmuch_rb_cMessages, ¬much_rb_messages_type, messages); } /* diff --git a/bindings/ruby/thread.c b/bindings/ruby/thread.c index e09be147..f6bf7849 100644 --- a/bindings/ruby/thread.c +++ b/bindings/ruby/thread.c @@ -88,7 +88,7 @@ notmuch_rb_thread_get_toplevel_messages (VALUE self) if (!messages) rb_raise (notmuch_rb_eMemoryError, "Out of memory"); - return Data_Wrap_Notmuch_Object (notmuch_rb_cMessages, messages); + return Data_Wrap_Notmuch_Object (notmuch_rb_cMessages, ¬much_rb_messages_type, messages); } /* @@ -108,7 +108,7 @@ notmuch_rb_thread_get_messages (VALUE self) if (!messages) rb_raise (notmuch_rb_eMemoryError, "Out of memory"); - return Data_Wrap_Notmuch_Object (notmuch_rb_cMessages, messages); + return Data_Wrap_Notmuch_Object (notmuch_rb_cMessages, ¬much_rb_messages_type, messages); } /* @@ -209,5 +209,5 @@ notmuch_rb_thread_get_tags (VALUE self) if (!tags) rb_raise (notmuch_rb_eMemoryError, "Out of memory"); - return Data_Wrap_Notmuch_Object (notmuch_rb_cTags, tags); + return Data_Wrap_Notmuch_Object (notmuch_rb_cTags, ¬much_rb_tags_type, tags); } diff --git a/bindings/ruby/threads.c b/bindings/ruby/threads.c index 19e09a7e..d809b571 100644 --- a/bindings/ruby/threads.c +++ b/bindings/ruby/threads.c @@ -53,7 +53,7 @@ notmuch_rb_threads_each (VALUE self) for (; notmuch_threads_valid (threads); notmuch_threads_move_to_next (threads)) { thread = notmuch_threads_get (threads); - rb_yield (Data_Wrap_Notmuch_Object (notmuch_rb_cThread, thread)); + rb_yield (Data_Wrap_Notmuch_Object (notmuch_rb_cThread, ¬much_rb_thread_type, thread)); } return self;