Switch to side-by-side view

--- a/src/python/recoll/pyrecoll.cpp
+++ b/src/python/recoll/pyrecoll.cpp
@@ -63,7 +63,8 @@
 static void 
 SearchData_dealloc(recoll_SearchDataObject *self)
 {
-    LOGDEB("SearchData_dealloc. Releasing. Count before: "  << (self->sd.use_count()) << "\n" );
+    LOGDEB("SearchData_dealloc. Releasing. Count before: " <<
+           self->sd.use_count() << "\n");
     self->sd.reset();
     Py_TYPE(self)->tp_free((PyObject*)self);
 }
@@ -71,7 +72,7 @@
 static PyObject *
 SearchData_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
-    LOGDEB("SearchData_new\n" );
+    LOGDEB("SearchData_new\n");
     recoll_SearchDataObject *self;
 
     self = (recoll_SearchDataObject *)type->tp_alloc(type, 0);
@@ -90,7 +91,7 @@
 static int
 SearchData_init(recoll_SearchDataObject *self, PyObject *args, PyObject *kwargs)
 {
-    LOGDEB("SearchData_init\n" );
+    LOGDEB("SearchData_init\n");
     static const char* kwlist[] = {"type", "stemlang", NULL};
     char *stp = 0;
     char *steml = 0;
@@ -180,9 +181,9 @@
 SearchData_addclause(recoll_SearchDataObject* self, PyObject *args, 
 		     PyObject *kwargs)
 {
-    LOGDEB0("SearchData_addclause\n" );
+    LOGDEB0("SearchData_addclause\n");
     if (!self->sd) {
-	LOGERR("SearchData_addclause: not init??\n" );
+	LOGERR("SearchData_addclause: not init??\n");
         PyErr_SetString(PyExc_AttributeError, "sd");
         return 0;
     }
@@ -294,7 +295,7 @@
 static void 
 Doc_dealloc(recoll_DocObject *self)
 {
-    LOGDEB("Doc_dealloc\n" );
+    LOGDEB("Doc_dealloc\n");
     if (self->doc)
 	the_docs.erase(self->doc);
     deleteZ(self->doc);
@@ -304,7 +305,7 @@
 static PyObject *
 Doc_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
-    LOGDEB("Doc_new\n" );
+    LOGDEB("Doc_new\n");
     recoll_DocObject *self;
 
     self = (recoll_DocObject *)type->tp_alloc(type, 0);
@@ -318,7 +319,7 @@
 static int
 Doc_init(recoll_DocObject *self, PyObject *, PyObject *)
 {
-    LOGDEB("Doc_init\n" );
+    LOGDEB("Doc_init\n");
     if (self->doc)
 	the_docs.erase(self->doc);
     delete self->doc;
@@ -340,7 +341,7 @@
 static PyObject *
 Doc_getbinurl(recoll_DocObject *self)
 {
-    LOGDEB0("Doc_getbinurl\n" );
+    LOGDEB0("Doc_getbinurl\n");
     if (self->doc == 0 || 
 	the_docs.find(self->doc) == the_docs.end()) {
         PyErr_SetString(PyExc_AttributeError, "doc");
@@ -359,7 +360,7 @@
 static PyObject *
 Doc_setbinurl(recoll_DocObject *self, PyObject *value)
 {
-    LOGDEB0("Doc_setbinurl\n" );
+    LOGDEB0("Doc_setbinurl\n");
     if (self->doc == 0 || 
 	the_docs.find(self->doc) == the_docs.end()) {
         PyErr_SetString(PyExc_AttributeError, "doc??");
@@ -381,7 +382,7 @@
 static PyObject *
 Doc_keys(recoll_DocObject *self)
 {
-    LOGDEB0("Doc_keys\n" );
+    LOGDEB0("Doc_keys\n");
     if (self->doc == 0 || 
 	the_docs.find(self->doc) == the_docs.end()) {
         PyErr_SetString(PyExc_AttributeError, "doc");
@@ -406,7 +407,7 @@
 static PyObject *
 Doc_items(recoll_DocObject *self)
 {
-    LOGDEB0("Doc_items\n" );
+    LOGDEB0("Doc_items\n");
     if (self->doc == 0 || 
 	the_docs.find(self->doc) == the_docs.end()) {
         PyErr_SetString(PyExc_AttributeError, "doc");
@@ -516,7 +517,7 @@
 static PyObject *
 Doc_get(recoll_DocObject *self, PyObject *args)
 {
-    LOGDEB1("Doc_get\n" );
+    LOGDEB1("Doc_get\n");
     if (self->doc == 0 || the_docs.find(self->doc) == the_docs.end()) {
         PyErr_SetString(PyExc_AttributeError, "doc??");
 	return 0;
@@ -567,7 +568,7 @@
     if (PyUnicode_Check(nameobj)) {
 	PyObject* utf8o = PyUnicode_AsUTF8String(nameobj);
 	if (utf8o == 0) {
-	    LOGERR("Doc_getattro: encoding name to utf8 failed\n" );
+	    LOGERR("Doc_getattro: encoding name to utf8 failed\n");
 	    PyErr_SetString(PyExc_AttributeError, "name??");
 	    Py_RETURN_NONE;
 	}
@@ -583,7 +584,7 @@
     string key = rclconfig->fieldQCanon(string(name));
     string value;
     if (idocget(self, key, value)) {
-	LOGDEB1("Doc_getattro: ["  << key << "] -> ["  << value << "]\n");
+	LOGDEB1("Doc_getattro: [" << key << "] -> [" << value << "]\n");
 	// Return a python unicode object
 	return PyUnicode_Decode(value.c_str(), value.size(), "utf-8","replace");
     }
@@ -621,7 +622,7 @@
 
     PyObject* putf8 = PyUnicode_AsUTF8String(value);
     if (putf8 == 0) {
-	LOGERR("Doc_setmeta: encoding to utf8 failed\n" );
+	LOGERR("Doc_setmeta: encoding to utf8 failed\n");
 	PyErr_SetString(PyExc_AttributeError, "value??");
 	return -1;
     }
@@ -709,7 +710,7 @@
     if (PyUnicode_Check(key)) {
         PyObject* utf8o = PyUnicode_AsUTF8String(key);
 	if (utf8o == 0) {
-	    LOGERR("Doc_getitemo: encoding name to utf8 failed\n" );
+	    LOGERR("Doc_getitemo: encoding name to utf8 failed\n");
 	    PyErr_SetString(PyExc_AttributeError, "name??");
 	    Py_RETURN_NONE;
 	}
@@ -830,6 +831,7 @@
     int         ascending;
     int         arraysize; // Default size for fetchmany
     recoll_DbObject* connection;
+    bool        fetchtext;
 } recoll_QueryObject;
 
 PyDoc_STRVAR(doc_Query_close,
@@ -838,7 +840,7 @@
 static PyObject *
 Query_close(recoll_QueryObject *self)
 {
-    LOGDEB("Query_close\n" );
+    LOGDEB("Query_close\n");
     if (self->query) {
 	the_queries.erase(self->query);
         deleteZ(self->query);
@@ -854,7 +856,7 @@
 static void 
 Query_dealloc(recoll_QueryObject *self)
 {
-    LOGDEB("Query_dealloc\n" );
+    LOGDEB("Query_dealloc\n");
     PyObject *ret = Query_close(self);
     Py_DECREF(ret);
     Py_TYPE(self)->tp_free((PyObject*)self);
@@ -863,7 +865,7 @@
 static PyObject *
 Query_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
 {
-    LOGDEB("Query_new\n" );
+    LOGDEB("Query_new\n");
     recoll_QueryObject *self;
 
     self = (recoll_QueryObject *)type->tp_alloc(type, 0);
@@ -876,6 +878,7 @@
     self->ascending = 1;
     self->arraysize = 1;
     self->connection = 0;
+    self->fetchtext = false;
     return (PyObject *)self;
 }
 
@@ -885,7 +888,7 @@
 static int
 Query_init(recoll_QueryObject *self, PyObject *, PyObject *)
 {
-    LOGDEB("Query_init\n" );
+    LOGDEB("Query_init\n");
 
     if (self->query)
 	the_queries.erase(self->query);
@@ -913,7 +916,7 @@
 static PyObject *
 Query_sortby(recoll_QueryObject* self, PyObject *args, PyObject *kwargs)
 {
-    LOGDEB0("Query_sortby\n" );
+    LOGDEB0("Query_sortby\n");
     static const char *kwlist[] = {"field", "ascending", NULL};
     char *sfield = 0;
     PyObject *ascobj = 0;
@@ -936,7 +939,8 @@
 }
 
 PyDoc_STRVAR(doc_Query_execute,
-"execute(query_string, stemming=1|0, stemlang=\"stemming language\")\n"
+"execute(query_string, stemming=1|0, stemlang=\"stemming language\", "
+             "fetchtext=False)\n"
 "\n"
 "Starts a search for query_string, a Recoll search language string\n"
 "(mostly Xesam-compatible).\n"
@@ -947,20 +951,28 @@
 static PyObject *
 Query_execute(recoll_QueryObject* self, PyObject *args, PyObject *kwargs)
 {
-    LOGDEB0("Query_execute\n" );
-    static const char *kwlist[] = {"query_string", "stemming", "stemlang", NULL};
+    LOGDEB0("Query_execute\n");
+    static const char *kwlist[] = {"query_string", "stemming", "stemlang",
+                                   "fetchtext", NULL};
     char *sutf8 = 0; // needs freeing
     char *sstemlang = 0;
-    int dostem = 1;
     PyObject *dostemobj = 0;
-    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "es|Oes:Query_execute", 
+    PyObject *fetchtextobj = 0;
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "es|OesO:Query_execute", 
 				     (char**)kwlist, "utf-8", &sutf8,
 				     &dostemobj, 
-				     "utf-8", &sstemlang)) {
-	return 0;
-    }
+				     "utf-8", &sstemlang, &fetchtextobj)) {
+	return 0;
+    }
+
+    bool dostem{true};
     if (dostemobj != 0 && !PyObject_IsTrue(dostemobj))
-	dostem = 0;
+	dostem = false;
+    if (fetchtextobj != 0 && PyObject_IsTrue(fetchtextobj)) {
+	self->fetchtext = true;
+    } else {
+        self->fetchtext = false;
+    }
 
     string utf8(sutf8);
     PyMem_Free(sutf8);
@@ -970,7 +982,8 @@
 	PyMem_Free(sstemlang);
     }
 
-    LOGDEB0("Query_execute: ["  << (utf8) << "] dostem "  << (dostem) << " stemlang ["  << (stemlang) << "]\n" );
+    LOGDEB0("Query_execute: [" << utf8 << "] dostem " << dostem <<
+            " stemlang [" << stemlang << "]\n");
 
     if (self->query == 0 || 
 	the_queries.find(self->query) == the_queries.end()) {
@@ -999,7 +1012,7 @@
 }
 
 PyDoc_STRVAR(doc_Query_executesd,
-"executesd(SearchData)\n"
+"executesd(SearchData, fetchtext=False)\n"
 "\n"
 "Starts a search for the query defined by the SearchData object.\n"
 );
@@ -1007,18 +1020,24 @@
 static PyObject *
 Query_executesd(recoll_QueryObject* self, PyObject *args, PyObject *kwargs)
 {
-    LOGDEB0("Query_executeSD\n" );
-    static const char *kwlist[] = {"searchdata", NULL};
+    LOGDEB0("Query_executeSD\n");
+    static const char *kwlist[] = {"searchdata", "fetchtext", NULL};
     recoll_SearchDataObject *pysd = 0;
-    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!:Query_execute", 
-				     (char **)kwlist,
-				     &recoll_SearchDataType, &pysd)) {
+    PyObject *fetchtextobj = 0;
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|O:Query_execute", 
+				     (char **)kwlist, &recoll_SearchDataType,
+                                     &pysd, &fetchtextobj)) {
 	return 0;
     }
     if (pysd == 0 || self->query == 0 || 
 	the_queries.find(self->query) == the_queries.end()) {
         PyErr_SetString(PyExc_AttributeError, "query");
 	return 0;
+    }
+    if (fetchtextobj != 0 && PyObject_IsTrue(fetchtextobj)) {
+	self->fetchtext = true;
+    } else {
+        self->fetchtext = false;
     }
     self->query->setSortBy(*self->sortfield, self->ascending);
     self->query->setQuery(pysd->sd);
@@ -1049,7 +1068,7 @@
 static PyObject *
 Query_fetchone(PyObject *_self)
 {
-    LOGDEB0("Query_fetchone/next\n" );
+    LOGDEB0("Query_fetchone/next\n");
     recoll_QueryObject* self = (recoll_QueryObject*)_self;
 
     if (self->query == 0 || 
@@ -1072,7 +1091,7 @@
     // We used to check against rowcount here, but this was wrong:
     // xapian result count estimate are sometimes wrong, we must go on
     // fetching until we fail
-    if (!self->query->getDoc(self->next, *result->doc)) {
+    if (!self->query->getDoc(self->next, *result->doc, self->fetchtext)) {
         PyErr_SetNone(PyExc_StopIteration);
 	return 0;
     }
@@ -1090,7 +1109,7 @@
 static PyObject *
 Query_fetchmany(recoll_QueryObject* self, PyObject *args, PyObject *kwargs)
 {
-    LOGDEB0("Query_fetchmany\n" );
+    LOGDEB0("Query_fetchmany\n");
     static const char *kwlist[] = {"size", NULL};
     int size = 0;
 
@@ -1120,7 +1139,7 @@
             PyErr_SetString(PyExc_EnvironmentError, "doc create failed");
             return 0;
         }
-        if (!self->query->getDoc(self->next, *docobj->doc)) {
+        if (!self->query->getDoc(self->next, *docobj->doc, self->fetchtext)) {
             PyErr_SetNone(PyExc_StopIteration);
             break;
         }
@@ -1140,7 +1159,7 @@
 static PyObject *
 Query_scroll(recoll_QueryObject* self, PyObject *args, PyObject *kwargs)
 {
-    LOGDEB0("Query_scroll\n" );
+    LOGDEB0("Query_scroll\n");
     static const char *kwlist[] = {"position", "mode", NULL};
     int pos = 0;
     char *smode = 0;
@@ -1227,7 +1246,7 @@
 static PyObject *
 Query_highlight(recoll_QueryObject* self, PyObject *args, PyObject *kwargs)
 {
-    LOGDEB0("Query_highlight\n" );
+    LOGDEB0("Query_highlight\n");
     static const char *kwlist[] = {"text", "ishtml", "eolbr", "methods", NULL};
     char *sutf8 = 0; // needs freeing
     int ishtml = 0;
@@ -1249,7 +1268,7 @@
 	ishtml = 1;
     if (eolbrobj && !PyObject_IsTrue(eolbrobj))
 	eolbr = 0;
-    LOGDEB0("Query_highlight: ishtml "  << (ishtml) << "\n" );
+    LOGDEB0("Query_highlight: ishtml " << ishtml << "\n");
 
     if (self->query == 0 || 
 	the_queries.find(self->query) == the_queries.end()) {
@@ -1287,7 +1306,7 @@
 static PyObject *
 Query_makedocabstract(recoll_QueryObject* self, PyObject *args,PyObject *kwargs)
 {
-    LOGDEB0("Query_makeDocAbstract\n" );
+    LOGDEB0("Query_makeDocAbstract\n");
     static const char *kwlist[] = {"doc", "methods", NULL};
     recoll_DocObject *pydoc = 0;
     PyObject *hlmethods = 0;
@@ -1299,12 +1318,12 @@
     }
 
     if (pydoc->doc == 0 || the_docs.find(pydoc->doc) == the_docs.end()) {
-	LOGERR("Query_makeDocAbstract: doc not found "  << (pydoc->doc) << "\n" );
+	LOGERR("Query_makeDocAbstract: doc not found " << pydoc->doc << "\n");
         PyErr_SetString(PyExc_AttributeError, "doc");
         return 0;
     }
     if (the_queries.find(self->query) == the_queries.end()) {
-	LOGERR("Query_makeDocAbstract: query not found "  << (self->query) << "\n" );
+	LOGERR("Query_makeDocAbstract: query not found " << self->query << "\n");
         PyErr_SetString(PyExc_AttributeError, "query");
         return 0;
     }
@@ -1357,7 +1376,7 @@
 static PyObject *
 Query_getxquery(recoll_QueryObject* self, PyObject *, PyObject *)
 {
-    LOGDEB0("Query_getxquery self->query "  << (self->query) << "\n" );
+    LOGDEB0("Query_getxquery self->query " << self->query << "\n");
 
     if (self->query == 0 || 
 	the_queries.find(self->query) == the_queries.end()) {
@@ -1385,7 +1404,7 @@
 static PyObject *
 Query_getgroups(recoll_QueryObject* self, PyObject *, PyObject *)
 {
-    LOGDEB0("Query_getgroups\n" );
+    LOGDEB0("Query_getgroups\n");
 
     if (self->query == 0 || 
 	the_queries.find(self->query) == the_queries.end()) {
@@ -1530,7 +1549,7 @@
 static PyObject *
 Db_close(recoll_DbObject *self)
 {
-    LOGDEB("Db_close. self "  << (self) << "\n" );
+    LOGDEB("Db_close. self " << self << "\n");
     if (self->db) {
 	the_dbs.erase(self->db);
         delete self->db;
@@ -1542,7 +1561,7 @@
 static void 
 Db_dealloc(recoll_DbObject *self)
 {
-    LOGDEB("Db_dealloc\n" );
+    LOGDEB("Db_dealloc\n");
     PyObject *ret = Db_close(self);
     Py_DECREF(ret);
     Py_TYPE(self)->tp_free((PyObject*)self);
@@ -1551,7 +1570,7 @@
 static PyObject *
 Db_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
-    LOGDEB2("Db_new\n" );
+    LOGDEB2("Db_new\n");
     recoll_DbObject *self;
 
     self = (recoll_DbObject *)type->tp_alloc(type, 0);
@@ -1583,7 +1602,7 @@
     } else {
 	rclconfig = recollinit(0, 0, reason, 0);
     }
-    LOGDEB("Db_init\n" );
+    LOGDEB("Db_init\n");
 
     if (rclconfig == 0) {
 	PyErr_SetString(PyExc_EnvironmentError, reason.c_str());
@@ -1599,7 +1618,7 @@
     delete self->db;
     self->db = new Rcl::Db(rclconfig);
     if (!self->db->open(writable ? Rcl::Db::DbUpd : Rcl::Db::DbRO)) {
-	LOGERR("Db_init: db open error\n" );
+	LOGERR("Db_init: db open error\n");
 	PyErr_SetString(PyExc_EnvironmentError, "Can't open index");
         return -1;
     }
@@ -1642,9 +1661,9 @@
 static PyObject *
 Db_query(recoll_DbObject* self)
 {
-    LOGDEB("Db_query\n" );
+    LOGDEB("Db_query\n");
     if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) {
-	LOGERR("Db_query: db not found "  << (self->db) << "\n" );
+	LOGERR("Db_query: db not found " << self->db << "\n");
         PyErr_SetString(PyExc_AttributeError, "db");
         return 0;
     }
@@ -1663,18 +1682,19 @@
 static PyObject *
 Db_setAbstractParams(recoll_DbObject *self, PyObject *args, PyObject *kwargs)
 {
-    LOGDEB0("Db_setAbstractParams\n" );
+    LOGDEB0("Db_setAbstractParams\n");
     static const char *kwlist[] = {"maxchars", "contextwords", NULL};
     int ctxwords = -1, maxchars = -1;
     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ii", (char**)kwlist,
 				     &maxchars, &ctxwords))
 	return 0;
     if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) {
-	LOGERR("Db_query: db not found "  << (self->db) << "\n" );
+	LOGERR("Db_query: db not found " << self->db << "\n");
         PyErr_SetString(PyExc_AttributeError, "db id not found");
         return 0;
     }
-    LOGDEB0("Db_setAbstractParams: mxchrs "  << (maxchars) << ", ctxwrds "  << (ctxwords) << "\n" );
+    LOGDEB0("Db_setAbstractParams: mxchrs " << maxchars << ", ctxwrds " <<
+            ctxwords << "\n");
     self->db->setAbstractParams(-1, maxchars, ctxwords);
     Py_RETURN_NONE;
 }
@@ -1682,7 +1702,7 @@
 static PyObject *
 Db_makeDocAbstract(recoll_DbObject* self, PyObject *args)
 {
-    LOGDEB0("Db_makeDocAbstract\n" );
+    LOGDEB0("Db_makeDocAbstract\n");
     recoll_DocObject *pydoc = 0;
     recoll_QueryObject *pyquery = 0;
     if (!PyArg_ParseTuple(args, "O!O!:Db_makeDocAbstract",
@@ -1691,18 +1711,18 @@
 	return 0;
     }
     if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) {
-	LOGERR("Db_makeDocAbstract: db not found "  << (self->db) << "\n" );
+	LOGERR("Db_makeDocAbstract: db not found " << self->db << "\n");
         PyErr_SetString(PyExc_AttributeError, "db");
         return 0;
     }
     if (pydoc->doc == 0 || the_docs.find(pydoc->doc) == the_docs.end()) {
-	LOGERR("Db_makeDocAbstract: doc not found "  << (pydoc->doc) << "\n" );
+	LOGERR("Db_makeDocAbstract: doc not found " << pydoc->doc << "\n");
         PyErr_SetString(PyExc_AttributeError, "doc");
         return 0;
     }
     if (pyquery->query == 0 || 
 	the_queries.find(pyquery->query) == the_queries.end()) {
-	LOGERR("Db_makeDocAbstract: query not found "  << (pyquery->query) << "\n" );
+	LOGERR("Db_makeDocAbstract: query not found " << pyquery->query << "\n");
         PyErr_SetString(PyExc_AttributeError, "query");
         return 0;
     }
@@ -1727,7 +1747,7 @@
 static PyObject *
 Db_termMatch(recoll_DbObject* self, PyObject *args, PyObject *kwargs)
 {
-    LOGDEB0("Db_termMatch\n" );
+    LOGDEB0("Db_termMatch\n");
     static const char *kwlist[] = {"type", "expr", "field", "maxlen", 
 				   "casesens", "diacsens", "lang", NULL};
     char *tp = 0;
@@ -1750,7 +1770,7 @@
 	return 0;
 
     if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) {
-	LOGERR("Db_termMatch: db not found "  << (self->db) << "\n" );
+	LOGERR("Db_termMatch: db not found " << self->db << "\n");
         PyErr_SetString(PyExc_AttributeError, "db");
 	goto out;
     }
@@ -1775,7 +1795,7 @@
 
     if (!self->db->termMatch(typ_sens, lang ? lang : "english", 
 			     expr, result, maxlen, field ? field : "")) {
-	LOGERR("Db_termMatch: db termMatch error\n" );
+	LOGERR("Db_termMatch: db termMatch error\n");
         PyErr_SetString(PyExc_AttributeError, "rcldb termMatch error");
 	goto out;
     }
@@ -1796,7 +1816,7 @@
 static PyObject *
 Db_needUpdate(recoll_DbObject* self, PyObject *args, PyObject *kwds)
 {
-    LOGDEB0("Db_needUpdate\n" );
+    LOGDEB0("Db_needUpdate\n");
     char *udi = 0; // needs freeing
     char *sig = 0; // needs freeing
     if (!PyArg_ParseTuple(args, "eses:Db_needUpdate", 
@@ -1804,7 +1824,7 @@
 	return 0;
     }
     if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) {
-	LOGERR("Db_needUpdate: db not found "  << (self->db) << "\n" );
+	LOGERR("Db_needUpdate: db not found " << self->db << "\n");
         PyErr_SetString(PyExc_AttributeError, "db");
 	PyMem_Free(udi);
 	PyMem_Free(sig);
@@ -1819,13 +1839,13 @@
 static PyObject *
 Db_delete(recoll_DbObject* self, PyObject *args, PyObject *kwds)
 {
-    LOGDEB0("Db_delete\n" );
+    LOGDEB0("Db_delete\n");
     char *udi = 0; // needs freeing
     if (!PyArg_ParseTuple(args, "es:Db_delete", "utf-8", &udi)) {
 	return 0;
     }
     if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) {
-	LOGERR("Db_delete: db not found "  << (self->db) << "\n" );
+	LOGERR("Db_delete: db not found " << self->db << "\n");
         PyErr_SetString(PyExc_AttributeError, "db");
 	PyMem_Free(udi);
         return 0;
@@ -1838,9 +1858,9 @@
 static PyObject *
 Db_purge(recoll_DbObject* self)
 {
-    LOGDEB0("Db_purge\n" );
+    LOGDEB0("Db_purge\n");
     if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) {
-	LOGERR("Db_purge: db not found "  << (self->db) << "\n" );
+	LOGERR("Db_purge: db not found " << self->db << "\n");
         PyErr_SetString(PyExc_AttributeError, "db");
         return 0;
     }
@@ -1851,7 +1871,7 @@
 static PyObject *
 Db_addOrUpdate(recoll_DbObject* self, PyObject *args, PyObject *)
 {
-    LOGDEB0("Db_addOrUpdate\n" );
+    LOGDEB0("Db_addOrUpdate\n");
     char *sudi = 0; // needs freeing
     char *sparent_udi = 0; // needs freeing
     recoll_DocObject *pydoc;
@@ -1867,17 +1887,17 @@
     PyMem_Free(sparent_udi);
 
     if (self->db == 0 || the_dbs.find(self->db) == the_dbs.end()) {
-	LOGERR("Db_addOrUpdate: db not found "  << (self->db) << "\n" );
+	LOGERR("Db_addOrUpdate: db not found " << self->db << "\n");
         PyErr_SetString(PyExc_AttributeError, "db");
         return 0;
     }
     if (pydoc->doc == 0 || the_docs.find(pydoc->doc) == the_docs.end()) {
-	LOGERR("Db_addOrUpdate: doc not found "  << (pydoc->doc) << "\n" );
+	LOGERR("Db_addOrUpdate: doc not found " << pydoc->doc << "\n");
         PyErr_SetString(PyExc_AttributeError, "doc");
         return 0;
     }
     if (!self->db->addOrUpdate(udi, parent_udi, *pydoc->doc)) {
-	LOGERR("Db_addOrUpdate: rcldb error\n" );
+	LOGERR("Db_addOrUpdate: rcldb error\n");
         PyErr_SetString(PyExc_AttributeError, "rcldb error");
         return 0;
     }
@@ -1992,7 +2012,7 @@
 static PyObject *
 recoll_connect(PyObject *self, PyObject *args, PyObject *kwargs)
 {
-    LOGDEB2("recoll_connect\n" );
+    LOGDEB2("recoll_connect\n");
     recoll_DbObject *db = (recoll_DbObject *)
 	PyObject_Call((PyObject *)&recoll_DbType, args, kwargs);
     return (PyObject *)db;