Currently, a message is owned by its iterator (messages object) and, ultimately, its query. This unfortunately makes encapsulating query logic difficult because there is no way to return a message after disposing of the query used to find the message (other than looking it up again in the database by id). This patch adds a function `notmuch_message_own` that reparents a message onto the database making it the user's job to destroy it. --- lib/message.cc | 6 ++++++ lib/notmuch.h | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/message.cc b/lib/message.cc index 26b5e76..014363f 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -1657,6 +1657,12 @@ notmuch_message_thaw (notmuch_message_t *message) } void +notmuch_message_own (notmuch_message_t *message) +{ + talloc_steal(message->notmuch, message); +} + +void notmuch_message_destroy (notmuch_message_t *message) { talloc_free (message); diff --git a/lib/notmuch.h b/lib/notmuch.h index 310a8b8..c80d7aa 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -1629,6 +1629,18 @@ notmuch_message_freeze (notmuch_message_t *message); notmuch_status_t notmuch_message_thaw (notmuch_message_t *message); + +/** + * Reparent a notmuch_message_t object onto the database. + * + * Calling this function allows a notmuch_message_t object to outlive its + * query. The message will automatically be reclaimed when the database is + * destroyed but if you want to free its memory before then, you should call + * notmuch_message_destroy. + */ +void +notmuch_message_own (notmuch_message_t *message); + /** * Destroy a notmuch_message_t object. * -- 2.6.2