X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=cnotmuch%2Fdatabase.py;h=dde7da16eecea67fec9e513d27c16588a1abccf8;hp=cad73c69089272e8bdd7bdad9aa42a0aa62105c3;hb=63c5a6d77d2b51104305e91676720099f4667e92;hpb=c90c28ded713936080b9862d4bc8502bc47da83a diff --git a/cnotmuch/database.py b/cnotmuch/database.py index cad73c69..dde7da16 100644 --- a/cnotmuch/database.py +++ b/cnotmuch/database.py @@ -293,6 +293,29 @@ class Database(object): raise NotmuchError(STATUS.NULL_POINTER) return Tags(tags_p, self) + def create_query(self, querystring): + """Returns a :class:`Query` derived from this database + + This is a shorthand method for doing:: + + # short version + # Automatically frees the Database() when 'q' is deleted + + q = Database(dbpath).create_query('from:"Biene Maja"') + + # long version, which is functionally equivalent but will keep the + # Database in the 'db' variable around after we delete 'q': + + db = Database(dbpath) + q = Query(db,'from:"Biene Maja"') + + This function is a python extension and not in the underlying C API. + """ + # Raise a NotmuchError if not initialized + self._verify_initialized_db() + + return Query(self, querystring) + def __repr__(self): return "'Notmuch DB " + self.get_path() + "'" @@ -691,7 +714,13 @@ class Messages(object): """len(:class:`Messages`) returns the number of contained messages .. note:: As this iterates over the messages, we will not be able to - iterate over them again (as in retrieve them)! + iterate over them again! So this will fail:: + + #THIS FAILS + msgs = Database().create_query('').search_message() + if len(msgs) > 0: #this 'exhausts' msgs + # next line raises NotmuchError(STATUS.NOT_INITIALIZED)!!! + for msg in msgs: print msg """ if self._msgs is None: raise NotmuchError(STATUS.NOT_INITIALIZED) @@ -731,6 +760,10 @@ class Message(object): _get_thread_id = nmlib.notmuch_message_get_thread_id _get_thread_id.restype = c_char_p + """notmuch_message_get_replies""" + _get_replies = nmlib.notmuch_message_get_replies + _get_replies.restype = c_void_p + """notmuch_message_get_tags (notmuch_message_t *message)""" _get_tags = nmlib.notmuch_message_get_tags _get_tags.restype = c_void_p @@ -788,6 +821,33 @@ class Message(object): return Message._get_thread_id (self._msg); + def get_replies(self): + """Gets all direct replies to this message as :class:`Messages` iterator + + .. note:: This call only makes sense if 'message' was + ultimately obtained from a :class:`Thread` object, (such as + by coming directly from the result of calling + :meth:`Thread.get_toplevel_messages` or by any number of + subsequent calls to :meth:`get_replies`). If this message was + obtained through some non-thread means, (such as by a call + to :meth:`Query.search_messages`), then this function will + return `None`. + + :returns: :class:`Messages` or `None` if there are no replies to + this message. + :exception: :exc:`NotmuchError` STATUS.NOT_INITIALIZED if the message + is not initialized. + """ + if self._msg is None: + raise NotmuchError(STATUS.NOT_INITIALIZED) + + msgs_p = Message._get_replies(self._msg); + + if msgs_p is None: + return None + + return Messages(msgs_p,self) + def get_date(self): """Returns time_t of the message date @@ -1048,7 +1108,9 @@ class Message(object): msg['from'] = self.get_header('from') msg['tags'] = str(self.get_tags()) msg['date'] = date.fromtimestamp(self.get_date()) - return "%(from)s (%(date)s) (%(tags)s)" % (msg) + replies = self.get_replies() + msg['replies'] = len(replies) if replies is not None else -1 + return "%(from)s (%(date)s) (%(tags)s) (%(replies)d) replies" % (msg) def format_as_text(self): """Output like notmuch show (Not implemented)"""