mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-26 20:57:58 +01:00
implement Query() and search_messages()
However, this is still brittle and often segfaults for unknown reasons --HG-- extra : transplant_source : %D1%FB%2B%FC%EA%E9%EB%3E%D2%13%DFV.o%D6%A6%CE%81%00%8C
This commit is contained in:
parent
9ed5e8a0e3
commit
92d3c24bc8
2 changed files with 114 additions and 4 deletions
|
@ -149,8 +149,63 @@ class Query(object):
|
||||||
Do note that as soon as we tear down this object, all derived
|
Do note that as soon as we tear down this object, all derived
|
||||||
threads, and messages will be freed as well.
|
threads, and messages will be freed as well.
|
||||||
"""
|
"""
|
||||||
|
# constants
|
||||||
|
SORT_OLDEST_FIRST = 0
|
||||||
|
SORT_NEWEST_FIRST = 1
|
||||||
|
SORT_MESSAGE_ID = 2
|
||||||
|
|
||||||
|
"""notmuch_query_create"""
|
||||||
|
_create = nmlib.notmuch_query_create
|
||||||
|
_create.restype = c_void_p
|
||||||
|
|
||||||
|
"""notmuch_query_search_messages"""
|
||||||
|
_search_messages = nmlib.notmuch_query_search_messages
|
||||||
|
_search_messages.restype = c_void_p
|
||||||
|
|
||||||
def __init__(self, db, querystr):
|
def __init__(self, db, querystr):
|
||||||
pass
|
"""TODO: document"""
|
||||||
|
self._db = None
|
||||||
|
self._query = None
|
||||||
|
self.create(db, querystr)
|
||||||
|
|
||||||
|
def create(self, db, querystr):
|
||||||
|
"""db is a Database() and querystr a string
|
||||||
|
|
||||||
|
raises NotmuchError STATUS.NOT_INITIALIZED if db is not inited and
|
||||||
|
STATUS.NULL_POINTER if the query creation failed (too little memory)
|
||||||
|
"""
|
||||||
|
if db.db_p is None:
|
||||||
|
raise NotmuchError(STATUS.NOT_INITIALIZED)
|
||||||
|
# create reference to parent db to keep it alive
|
||||||
|
self._db = db
|
||||||
|
|
||||||
|
# create query, return None if too little mem available
|
||||||
|
query_p = Query._create(db.db_p, querystr)
|
||||||
|
if query_p is None:
|
||||||
|
NotmuchError(STATUS.NULL_POINTER)
|
||||||
|
self._query = query_p
|
||||||
|
|
||||||
|
|
||||||
|
def search_messages(self):
|
||||||
|
"""notmuch_query_search_messages
|
||||||
|
Returns Messages() or a raises a NotmuchError()
|
||||||
|
"""
|
||||||
|
if self._query is None:
|
||||||
|
raise NotmuchError(STATUS.NOT_INITIALIZED)
|
||||||
|
|
||||||
|
msgs_p = Query._search_messages(self._query)
|
||||||
|
|
||||||
|
if msgs_p is None:
|
||||||
|
NotmuchError(STATUS.NULL_POINTER)
|
||||||
|
|
||||||
|
return Messages(msgs_p,self)
|
||||||
|
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
"""Close and free the Query"""
|
||||||
|
if self._query is not None:
|
||||||
|
print("Freeing the Query now")
|
||||||
|
nmlib.notmuch_query_destroy (self._query)
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
class Tags(object):
|
class Tags(object):
|
||||||
|
@ -184,11 +239,11 @@ class Tags(object):
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
""" Make Tags an iterator """
|
""" Make Tags an iterator """
|
||||||
|
if self._tags is None:
|
||||||
|
raise NotmuchError(STATUS.NOT_INITIALIZED)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def next(self):
|
def next(self):
|
||||||
if self._tags is None:
|
|
||||||
raise StopIteration
|
|
||||||
nmlib.notmuch_tags_move_to_next(self._tags)
|
nmlib.notmuch_tags_move_to_next(self._tags)
|
||||||
if not nmlib.notmuch_tags_valid(self._tags):
|
if not nmlib.notmuch_tags_valid(self._tags):
|
||||||
print("Freeing the Tags now")
|
print("Freeing the Tags now")
|
||||||
|
@ -202,6 +257,61 @@ class Tags(object):
|
||||||
print("Freeing the Tags now")
|
print("Freeing the Tags now")
|
||||||
nmlib.notmuch_tags_destroy (self._tags)
|
nmlib.notmuch_tags_destroy (self._tags)
|
||||||
|
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
class Messages(object):
|
||||||
|
"""Wrapper around notmuch_messages_t"""
|
||||||
|
|
||||||
|
#notmuch_tags_get
|
||||||
|
_get = nmlib.notmuch_messages_get
|
||||||
|
_get.restype = c_void_p
|
||||||
|
|
||||||
|
def __init__(self, msgs_p, parent=None):
|
||||||
|
"""
|
||||||
|
msg_p is a pointer to an notmuch_messages_t Structure. If it is None,
|
||||||
|
we will raise an NotmuchError(STATUS.NULL_POINTER).
|
||||||
|
|
||||||
|
If passed the parent query this Messages() is derived from, it saves a
|
||||||
|
reference to it, so we can automatically delete the parent query object
|
||||||
|
once all derived objects are dead.
|
||||||
|
|
||||||
|
Messages() provides an iterator over all contained Message()s.
|
||||||
|
However, you will only be able to iterate over it once,
|
||||||
|
because the underlying C function only allows iterating once.
|
||||||
|
#TODO: make the iterator work more than once and cache the tags in
|
||||||
|
the Python object.
|
||||||
|
"""
|
||||||
|
if msgs_p is None:
|
||||||
|
NotmuchError(STATUS.NULL_POINTER)
|
||||||
|
|
||||||
|
self._msgs = msgs_p
|
||||||
|
#store parent, so we keep them alive as long as self is alive
|
||||||
|
self._parent = parent
|
||||||
|
print "Inited Messages derived from %s" %(str(parent))
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
""" Make Messages an iterator """
|
||||||
|
return self
|
||||||
|
|
||||||
|
def next(self):
|
||||||
|
if self._msgs is None:
|
||||||
|
raise NotmuchError(STATUS.NOT_INITIALIZED)
|
||||||
|
|
||||||
|
nmlib.notmuch_messages_move_to_next(self._msgs)
|
||||||
|
if not nmlib.notmuch_messages_valid(self._msgs):
|
||||||
|
print("Freeing the Messages now")
|
||||||
|
nmlib.notmuch_messages_destroy (self._msgs)
|
||||||
|
self._msgs = None
|
||||||
|
raise StopIteration
|
||||||
|
return Message(Messages._get (self._msgs), self)
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
"""Close and free the notmuch Messages"""
|
||||||
|
if self._msgs is not None:
|
||||||
|
print("Freeing the Messages now")
|
||||||
|
nmlib.notmuch_messages_destroy (self._msgs)
|
||||||
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
class Message(object):
|
class Message(object):
|
||||||
"""Wrapper around notmuch_message_t"""
|
"""Wrapper around notmuch_message_t"""
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import ctypes
|
import ctypes
|
||||||
from ctypes import c_int, c_char_p
|
from ctypes import c_int, c_char_p
|
||||||
from database import Database,Tags
|
from database import Database,Tags,Query
|
||||||
from cnotmuch.globals import nmlib,STATUS,NotmuchError
|
from cnotmuch.globals import nmlib,STATUS,NotmuchError
|
||||||
|
|
||||||
# 114 typedef struct _notmuch_query notmuch_query_t;
|
# 114 typedef struct _notmuch_query notmuch_query_t;
|
||||||
|
|
Loading…
Reference in a new issue