--- a/src/python/recoll/pyrecoll.cpp
+++ b/src/python/recoll/pyrecoll.cpp
@@ -38,6 +38,7 @@
#include "pathut.h"
#include "plaintorich.h"
#include "hldata.h"
+#include "smallut.h"
#include "pyrecoll.h"
@@ -428,19 +429,82 @@
return pdict;
}
-static bool docget(recoll_DocObject *self, const string& key, string& value)
-{
- //
- if (!key.compare("xdocid")) {
- char cid[30];
- sprintf(cid, "%lu", (unsigned long)self->doc->xdocid);
- value = cid;
- return true;
- } else {
- if (self->doc->getmeta(key, 0)) {
- value = self->doc->meta[key];
+static bool idocget(recoll_DocObject *self, const string& key, string& value)
+{
+ switch (key.at(0)) {
+ case 'u':
+ if (!key.compare(Rcl::Doc::keyurl)) {
+ value = self->doc->url;
+ return true;
+ }
+ break;
+ case 'f':
+ if (!key.compare(Rcl::Doc::keyfs)) {
+ value = self->doc->fbytes;
+ return true;
+ } else if (!key.compare(Rcl::Doc::keyfmt)) {
+ value = self->doc->fmtime;
+ return true;
+ }
+ break;
+ case 'd':
+ if (!key.compare(Rcl::Doc::keyds)) {
+ value = self->doc->dbytes;
+ return true;
+ } else if (!key.compare(Rcl::Doc::keydmt)) {
+ value = self->doc->dmtime;
+ return true;
+ }
+ break;
+ case 'i':
+ if (!key.compare(Rcl::Doc::keyipt)) {
+ value = self->doc->ipath;
+ return true;
+ }
+ break;
+ case 'm':
+ if (!key.compare(Rcl::Doc::keytp)) {
+ value = self->doc->mimetype;
+ return true;
+ } else if (!key.compare(Rcl::Doc::keymt)) {
+ value = self->doc->dmtime.empty() ? self->doc->fmtime :
+ self->doc->dmtime;
+ return true;
+ }
+ break;
+ case 'o':
+ if (!key.compare(Rcl::Doc::keyoc)) {
+ value = self->doc->origcharset;
+ return true;
+ }
+ break;
+ case 's':
+ if (!key.compare(Rcl::Doc::keysig)) {
+ value = self->doc->sig;
+ return true;
+ } else if (!key.compare(Rcl::Doc::keysz)) {
+ value = self->doc->dbytes.empty() ? self->doc->fbytes :
+ self->doc->dbytes;
+ return true;
+ }
+ break;
+ case 't':
+ if (!key.compare("text")) {
+ value = self->doc->text;
+ return true;
+ }
+ break;
+ case 'x':
+ if (!key.compare("xdocid")) {
+ ulltodecstr(self->doc->xdocid, value);
return true;
}
+ break;
+ }
+
+ if (self->doc->getmeta(key, 0)) {
+ value = self->doc->meta[key];
+ return true;
}
return false;
}
@@ -452,7 +516,7 @@
static PyObject *
Doc_get(recoll_DocObject *self, PyObject *args)
{
- LOGDEB0("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;
@@ -465,10 +529,8 @@
PyMem_Free(sutf8);
string value;
- bool found = docget(self, key, value);
-
- if (found) {
- return PyUnicode_Decode(value.c_str(), value.size(), "UTF-8", "replace");
+ if (idocget(self, key, value)) {
+ return PyUnicode_Decode(value.c_str(), value.size(), "UTF-8","replace");
}
Py_RETURN_NONE;
@@ -495,14 +557,15 @@
return 0;
}
- bool found = false;
- string value;
- string key;
+ PyObject *meth = PyObject_GenericGetAttr((PyObject*)self, nameobj);
+ if (meth) {
+ return meth;
+ }
+ PyErr_Clear();
+
char *name = 0;
- PyObject* utf8o = 0;
-
if (PyUnicode_Check(nameobj)) {
- utf8o = PyUnicode_AsUTF8String(nameobj);
+ PyObject* utf8o = PyUnicode_AsUTF8String(nameobj);
if (utf8o == 0) {
LOGERR("Doc_getattro: encoding name to utf8 failed\n" );
PyErr_SetString(PyExc_AttributeError, "name??");
@@ -517,90 +580,12 @@
Py_RETURN_NONE;
}
- key = rclconfig->fieldQCanon(string(name));
- LOGDEB1("Doc_getattro: key: " << key << endl);
-
- switch (key.at(0)) {
- case 'u':
- if (!key.compare(Rcl::Doc::keyurl)) {
- value = self->doc->url; found = true;
- }
- break;
- case 'f':
- if (!key.compare(Rcl::Doc::keyfs)) {
- value = self->doc->fbytes; found = true;
- } else if (!key.compare(Rcl::Doc::keyfmt)) {
- value = self->doc->fmtime; found = true;
- }
- break;
- case 'd':
- if (!key.compare(Rcl::Doc::keyds)) {
- value = self->doc->dbytes; found = true;
- } else if (!key.compare(Rcl::Doc::keydmt)) {
- value = self->doc->dmtime; found = true;
- }
- break;
- case 'i':
- if (!key.compare(Rcl::Doc::keyipt)) {
- value = self->doc->ipath; found = true;
- }
- break;
- case 'm':
- if (!key.compare(Rcl::Doc::keytp)) {
- value = self->doc->mimetype; found = true;
- } else if (!key.compare(Rcl::Doc::keymt)) {
- value = self->doc->dmtime.empty() ? self->doc->fmtime :
- self->doc->dmtime; found = true;
- }
- break;
- case 'o':
- if (!key.compare(Rcl::Doc::keyoc)) {
- value = self->doc->origcharset; found = true;
- }
- break;
- case 's':
- if (!key.compare(Rcl::Doc::keysig)) {
- value = self->doc->sig; found = true;
- } else if (!key.compare(Rcl::Doc::keysz)) {
- value = self->doc->dbytes.empty() ? self->doc->fbytes :
- self->doc->dbytes; found = true;
- }
- break;
- case 't':
- if (!key.compare("text")) {
- value = self->doc->text; found = true;
- }
- break;
- case 'x':
- if (!key.compare("xdocid")) {
- char cid[30];
- sprintf(cid, "%lu", (unsigned long)self->doc->xdocid);
- value = cid;
- found = true;
- }
- break;
- }
-
- if (!found) {
- // This will look up a method name (we have no other standard
- // attributes)
- PyObject *meth = PyObject_GenericGetAttr((PyObject*)self, nameobj);
- if (meth) {
- return meth;
- }
- PyErr_Clear();
- // Else look for another attribute
- if (self->doc->getmeta(key, 0)) {
- value = self->doc->meta[key];
- found = true;
- }
- }
-
- if (found) {
+ string key = rclconfig->fieldQCanon(string(name));
+ string value;
+ if (idocget(self, key, value)) {
LOGDEB1("Doc_getattro: [" << key << "] -> [" << value << "]\n");
// Return a python unicode object
- return PyUnicode_Decode(value.c_str(), value.size(), "utf-8",
- "replace");
+ return PyUnicode_Decode(value.c_str(), value.size(), "utf-8","replace");
}
Py_RETURN_NONE;
@@ -739,10 +724,8 @@
string skey = rclconfig->fieldQCanon(string(name));
string value;
- bool found = docget(self, skey, value);
-
- if (found) {
- return PyUnicode_Decode(value.c_str(), value.size(), "UTF-8", "replace");
+ if (idocget(self, skey, value)) {
+ return PyUnicode_Decode(value.c_str(), value.size(), "UTF-8","replace");
}
Py_RETURN_NONE;