unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* Re: Not much database creation error
       [not found] <1315110898.32058.13.camel@delen>
@ 2011-09-05 13:57 ` Sebastian Spaeth
  2011-09-07  5:26   ` Martin Owens
  0 siblings, 1 reply; 8+ messages in thread
From: Sebastian Spaeth @ 2011-09-05 13:57 UTC (permalink / raw)
  To: Martin Owens; +Cc: Notmuch developer list, Paul Tagliamonte

[-- Attachment #1: Type: text/plain, Size: 645 bytes --]

On Sun, 04 Sep 2011 00:34:58 -0400, Martin Owens <doctormo@gmail.com> wrote:
> I am creating a program using notmuch and the python notmuch API and
> have found a problem. when creating or loading a database using a
> unicode path, notmuch returns an error:
> 
> Error: Cannot create directory //.notmuch: Permission denied

Hi Martin,

the underlying notmuch library is agnostic to whatever encoding it is
handed and I indeed had simply assumed strings. I have now added
encoding/decoding in a couple of places where it seemed necessary and
pushed the result to the master branch.

Let me know if this fixes things.

Sebastian

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Not much database creation error
  2011-09-05 13:57 ` Not much database creation error Sebastian Spaeth
@ 2011-09-07  5:26   ` Martin Owens
  2011-09-08 13:45     ` Sebastian Spaeth
  0 siblings, 1 reply; 8+ messages in thread
From: Martin Owens @ 2011-09-07  5:26 UTC (permalink / raw)
  To: Sebastian Spaeth; +Cc: Notmuch developer list, Paul Tagliamonte

Thanks Sebastian,

I'll test it as soon as I can.

As a further question, I have a program opening the database for
READ_WRITE access (this process provides a simple write only dbus
interface) and I want clients to connect to notmuch over a read only
connection.

A problem I'm having is that when I add messages to the database,
searching using the read only interface fails to show anything.

Searching using the read-write interface shows each email message being
added successfully.

Is this api topology not expected/recommended/working? Please advise.

Best Regards, Martin Owens

On Mon, 2011-09-05 at 15:57 +0200, Sebastian Spaeth wrote:
> 
> Let me know if this fixes things. 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Not much database creation error
  2011-09-07  5:26   ` Martin Owens
@ 2011-09-08 13:45     ` Sebastian Spaeth
  2011-09-08 14:01       ` Martin Owens
  2011-09-15 17:41       ` Python Unicode Was: " Martin Owens
  0 siblings, 2 replies; 8+ messages in thread
From: Sebastian Spaeth @ 2011-09-08 13:45 UTC (permalink / raw)
  To: Martin Owens; +Cc: Notmuch developer list, Paul Tagliamonte

[-- Attachment #1: Type: text/plain, Size: 1197 bytes --]

On Wed, 07 Sep 2011 01:26:59 -0400, Martin Owens <doctormo@gmail.com> wrote:
> As a further question, I have a program opening the database for
> READ_WRITE access (this process provides a simple write only dbus
> interface) and I want clients to connect to notmuch over a read only
> connection.
> 
> A problem I'm having is that when I add messages to the database,
> searching using the read only interface fails to show anything.

> Is this api topology not expected/recommended/working? Please advise.

hi Martin,

I have to admit, I am not deep into the libnotmuch/xapian internals, so
I might be the wrong person to ask (I just do some python bindings to
whatever libnotmuch provides).

However, when a read-write connection changes content, I believe that
all other existing connections will return an error stating
DATABASE_MODIFIED. I think we throw (or at least are supposed to throw)
an exception in this case.

Are you seeing any exceptions or errors been thrown?  Does it not show
ANYTHING or only not the new messages?

An open database connection provides you only with a snapshot, and you
need to reopen it after content has been modified.

Sebastian

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Not much database creation error
  2011-09-08 13:45     ` Sebastian Spaeth
@ 2011-09-08 14:01       ` Martin Owens
  2011-09-15 17:41       ` Python Unicode Was: " Martin Owens
  1 sibling, 0 replies; 8+ messages in thread
From: Martin Owens @ 2011-09-08 14:01 UTC (permalink / raw)
  To: Sebastian Spaeth; +Cc: Notmuch developer list, Paul Tagliamonte

On Thu, 2011-09-08 at 15:45 +0200, Sebastian Spaeth wrote:
> An open database connection provides you only with a snapshot, and you
> need to reopen it after content has been modified. 

You are correct and I have submitted a patch for libnotmuch and the
python bindings to add reopen and flush to the code. To this notmuch
mailing list.

Errors didn't seem to happen consistently though, I got one error out of
20 tests or so.

Martin,

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Python Unicode Was: Not much database creation error
  2011-09-08 13:45     ` Sebastian Spaeth
  2011-09-08 14:01       ` Martin Owens
@ 2011-09-15 17:41       ` Martin Owens
  2011-09-15 18:12         ` Austin Clements
                           ` (2 more replies)
  1 sibling, 3 replies; 8+ messages in thread
From: Martin Owens @ 2011-09-15 17:41 UTC (permalink / raw)
  To: Sebastian Spaeth; +Cc: Notmuch developer list, Paul Tagliamonte

[-- Attachment #1: Type: text/plain, Size: 491 bytes --]

Hello Sebastian,

I've attached a diff for some proposed changes to help make dealing with
unicode and strings in the bindings more regular. I noticed some of the
methods were protected and others were not.

Let me know.

Best Regards, Martin Owens

On Thu, 2011-09-08 at 15:45 +0200, Sebastian Spaeth wrote:
> I have to admit, I am not deep into the libnotmuch/xapian internals,
> so
> I might be the wrong person to ask (I just do some python bindings to
> whatever libnotmuch provides). 

[-- Attachment #2: unicode.patch --]
[-- Type: text/x-patch, Size: 6195 bytes --]

diff --git a/bindings/python/notmuch/database.py b/bindings/python/notmuch/database.py
index b070019..4f44de0 100644
--- a/bindings/python/notmuch/database.py
+++ b/bindings/python/notmuch/database.py
@@ -19,12 +19,11 @@ Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de>'
 
 import os
 from ctypes import c_int, c_char_p, c_void_p, c_uint, c_long, byref
-from notmuch.globals import nmlib, STATUS, NotmuchError, Enum
+from notmuch.globals import nmlib, STATUS, NotmuchError, Enum, _str
 from notmuch.thread import Threads
 from notmuch.message import Messages, Message
 from notmuch.tag import Tags
 
-
 class Database(object):
     """Represents a notmuch database (wraps notmuch_database_t)
 
@@ -105,7 +104,6 @@ class Database(object):
                 Database._std_db_path = self._get_user_default_db()
             path = Database._std_db_path
 
-        assert isinstance(path, basestring), 'Path must be a string or None.'
         if create == False:
             self.open(path, mode)
         else:
@@ -136,7 +134,7 @@ class Database(object):
             raise NotmuchError(message="Cannot create db, this Database() "
                                        "already has an open one.")
 
-        res = Database._create(path, Database.MODE.READ_WRITE)
+        res = Database._create(_str(path), Database.MODE.READ_WRITE)
 
         if res is None:
             raise NotmuchError(
@@ -156,9 +154,7 @@ class Database(object):
         :exception: Raises :exc:`NotmuchError` in case
                     of any failure (after printing an error message on stderr).
         """
-        if isinstance(path, unicode):
-            path = path.encode('utf-8') 
-        res = Database._open(path, mode)
+        res = Database._open(_str(path), mode)
 
         if res is None:
             raise NotmuchError(
@@ -263,12 +259,10 @@ class Database(object):
             #we got a relative path, make it absolute
             abs_dirpath = os.path.abspath(os.path.join(self.get_path(), path))
 
-        if isinstance(path, unicode):
-            path = path.encode('UTF-8')
-        dir_p = Database._get_directory(self._db, path)
+        dir_p = Database._get_directory(self._db, _str(path))
 
         # return the Directory, init it with the absolute path
-        return Directory(abs_dirpath, dir_p, self)
+        return Directory(_str(abs_dirpath), dir_p, self)
 
     def add_message(self, filename, sync_maildir_flags=False):
         """Adds a new message to the database
@@ -325,7 +319,7 @@ class Database(object):
 
         msg_p = c_void_p()
         status = nmlib.notmuch_database_add_message(self._db,
-                                                  filename,
+                                                  _str(filename),
                                                   byref(msg_p))
 
         if not status in [STATUS.SUCCESS, STATUS.DUPLICATE_MESSAGE_ID]:
@@ -394,7 +388,7 @@ class Database(object):
         # Raise a NotmuchError if not initialized
         self._verify_initialized_db()
 
-        msg_p = Database._find_message(self._db, msgid)
+        msg_p = Database._find_message(self._db, _str(msgid))
         if msg_p is None:
             return None
         return Message(msg_p, self)
@@ -404,8 +398,7 @@ class Database(object):
            with this filename.
         """
         self._verify_initialized_db()
-
-        msg_p = Database._find_message_by_filename(self._db, filename)
+        msg_p = Database._find_message_by_filename(self._db, _str(filename))
         return msg_p and Message(msg_p, self) or None
 
     def get_all_tags(self):
@@ -558,11 +551,8 @@ class Query(object):
             raise NotmuchError(STATUS.NOT_INITIALIZED)
         # create reference to parent db to keep it alive
         self._db = db
-        if isinstance(querystr, unicode):
-            # xapian takes utf-8 encoded byte arrays
-            querystr = querystr.encode('utf-8')
         # create query, return None if too little mem available
-        query_p = Query._create(db.db_p, querystr)
+        query_p = Query._create(db.db_p, _str(querystr))
         if query_p is None:
             NotmuchError(STATUS.NULL_POINTER)
         self._query = query_p
diff --git a/bindings/python/notmuch/globals.py b/bindings/python/notmuch/globals.py
index 77f2905..5c81076 100644
--- a/bindings/python/notmuch/globals.py
+++ b/bindings/python/notmuch/globals.py
@@ -98,3 +98,13 @@ class NotmuchError(Exception):
             return self.args[0]
         else:
             return STATUS.status2str(self.args[1])
+
+# C++ code expects strings to be well formatted and
+# unicode strings to have no null bytes.
+def _str(value):
+    if not isinstance(value, basestring):
+        raise TypeError("Expected str or unicode, got %s" % str(type(value)))
+    if isinstance(value, unicode):
+        return value.encode('UTF-8')
+    return str(value)
+
diff --git a/bindings/python/notmuch/message.py b/bindings/python/notmuch/message.py
index ae6ae1b..4f93a2a 100644
--- a/bindings/python/notmuch/message.py
+++ b/bindings/python/notmuch/message.py
@@ -21,7 +21,7 @@ Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de>'
 
 from ctypes import c_char_p, c_void_p, c_long, c_uint, c_int
 from datetime import date
-from notmuch.globals import nmlib, STATUS, NotmuchError, Enum
+from notmuch.globals import nmlib, STATUS, NotmuchError, Enum, _str
 from notmuch.tag import Tags
 from notmuch.filename import Filenames
 import sys
@@ -505,7 +505,7 @@ class Message(object):
         if self._msg is None:
             raise NotmuchError(STATUS.NOT_INITIALIZED)
 
-        status = nmlib.notmuch_message_add_tag(self._msg, tag)
+        status = nmlib.notmuch_message_add_tag(self._msg, _str(tag))
 
         # bail out on failure
         if status != STATUS.SUCCESS:
@@ -549,7 +549,7 @@ class Message(object):
         if self._msg is None:
             raise NotmuchError(STATUS.NOT_INITIALIZED)
 
-        status = nmlib.notmuch_message_remove_tag(self._msg, tag)
+        status = nmlib.notmuch_message_remove_tag(self._msg, _str(tag))
         # bail out on error
         if status != STATUS.SUCCESS:
             raise NotmuchError(status)

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: Python Unicode Was: Not much database creation error
  2011-09-15 17:41       ` Python Unicode Was: " Martin Owens
@ 2011-09-15 18:12         ` Austin Clements
  2011-09-16 11:32         ` Sebastian Spaeth
  2011-09-16 11:41         ` Sebastian Spaeth
  2 siblings, 0 replies; 8+ messages in thread
From: Austin Clements @ 2011-09-15 18:12 UTC (permalink / raw)
  To: Martin Owens; +Cc: Notmuch developer list, Paul Tagliamonte

This seems like a symptom of a much bigger problem.  Shouldn't the
bindings be checking or coercing the type of *every* argument that
gets passed from the caller through to a ctypes-wrapped libnotmuch
function?  Otherwise, a simple type error in a caller, like passing a
number instead of a string to one of the Python methods, would likely
result in a segfault.

On Thu, Sep 15, 2011 at 1:41 PM, Martin Owens <doctormo@gmail.com> wrote:
> Hello Sebastian,
>
> I've attached a diff for some proposed changes to help make dealing with
> unicode and strings in the bindings more regular. I noticed some of the
> methods were protected and others were not.
>
> Let me know.
>
> Best Regards, Martin Owens
>
> On Thu, 2011-09-08 at 15:45 +0200, Sebastian Spaeth wrote:
>> I have to admit, I am not deep into the libnotmuch/xapian internals,
>> so
>> I might be the wrong person to ask (I just do some python bindings to
>> whatever libnotmuch provides).

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Python Unicode Was: Not much database creation error
  2011-09-15 17:41       ` Python Unicode Was: " Martin Owens
  2011-09-15 18:12         ` Austin Clements
@ 2011-09-16 11:32         ` Sebastian Spaeth
  2011-09-16 11:41         ` Sebastian Spaeth
  2 siblings, 0 replies; 8+ messages in thread
From: Sebastian Spaeth @ 2011-09-16 11:32 UTC (permalink / raw)
  To: Martin Owens; +Cc: Notmuch developer list, Paul Tagliamonte

[-- Attachment #1: Type: text/plain, Size: 679 bytes --]

On Thu, 15 Sep 2011 13:41:11 -0400, Martin Owens wrote:
> I've attached a diff for some proposed changes to help make dealing with
> unicode and strings in the bindings more regular. I noticed some of the
> methods were protected and others were not.

I've now pushed a slightly modified version of the patch (BTW, you have
find_message_by_filename() when I don't, care to send that patch too?
:-))

As discussed on IRC with Bremner and ojwb: Rather than hardcoding UTF-8
we should probably detect the systems locale variable and use that as
encoding for file paths (falling back to utf8).

But your patch is better than what we have before, so it's going in for
now.

Sebastian

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Python Unicode Was: Not much database creation error
  2011-09-15 17:41       ` Python Unicode Was: " Martin Owens
  2011-09-15 18:12         ` Austin Clements
  2011-09-16 11:32         ` Sebastian Spaeth
@ 2011-09-16 11:41         ` Sebastian Spaeth
  2 siblings, 0 replies; 8+ messages in thread
From: Sebastian Spaeth @ 2011-09-16 11:41 UTC (permalink / raw)
  To: Martin Owens; +Cc: Notmuch developer list, Paul Tagliamonte

[-- Attachment #1: Type: text/plain, Size: 152 bytes --]


P.S. perhaps we should be using:

locale.getpreferredencoding()

to determine the default path and tag encoding? Opinions, Experiences,...?

Sebastian

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2011-09-16 11:41 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1315110898.32058.13.camel@delen>
2011-09-05 13:57 ` Not much database creation error Sebastian Spaeth
2011-09-07  5:26   ` Martin Owens
2011-09-08 13:45     ` Sebastian Spaeth
2011-09-08 14:01       ` Martin Owens
2011-09-15 17:41       ` Python Unicode Was: " Martin Owens
2011-09-15 18:12         ` Austin Clements
2011-09-16 11:32         ` Sebastian Spaeth
2011-09-16 11:41         ` Sebastian Spaeth

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).