python: make sure that all ways to get a doc attr use the same code
This commit is contained in:
parent
01d0f4b734
commit
aff4bd10a5
1 changed files with 90 additions and 107 deletions
|
@ -38,6 +38,7 @@ using namespace std;
|
||||||
#include "pathut.h"
|
#include "pathut.h"
|
||||||
#include "plaintorich.h"
|
#include "plaintorich.h"
|
||||||
#include "hldata.h"
|
#include "hldata.h"
|
||||||
|
#include "smallut.h"
|
||||||
|
|
||||||
#include "pyrecoll.h"
|
#include "pyrecoll.h"
|
||||||
|
|
||||||
|
@ -428,19 +429,82 @@ Doc_items(recoll_DocObject *self)
|
||||||
return pdict;
|
return pdict;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool docget(recoll_DocObject *self, const string& key, string& value)
|
static bool idocget(recoll_DocObject *self, const string& key, string& value)
|
||||||
{
|
{
|
||||||
//
|
switch (key.at(0)) {
|
||||||
if (!key.compare("xdocid")) {
|
case 'u':
|
||||||
char cid[30];
|
if (!key.compare(Rcl::Doc::keyurl)) {
|
||||||
sprintf(cid, "%lu", (unsigned long)self->doc->xdocid);
|
value = self->doc->url;
|
||||||
value = cid;
|
return true;
|
||||||
return true;
|
}
|
||||||
} else {
|
break;
|
||||||
if (self->doc->getmeta(key, 0)) {
|
case 'f':
|
||||||
value = self->doc->meta[key];
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self->doc->getmeta(key, 0)) {
|
||||||
|
value = self->doc->meta[key];
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -452,7 +516,7 @@ PyDoc_STRVAR(doc_Doc_get,
|
||||||
static PyObject *
|
static PyObject *
|
||||||
Doc_get(recoll_DocObject *self, PyObject *args)
|
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()) {
|
if (self->doc == 0 || the_docs.find(self->doc) == the_docs.end()) {
|
||||||
PyErr_SetString(PyExc_AttributeError, "doc??");
|
PyErr_SetString(PyExc_AttributeError, "doc??");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -465,10 +529,8 @@ Doc_get(recoll_DocObject *self, PyObject *args)
|
||||||
PyMem_Free(sutf8);
|
PyMem_Free(sutf8);
|
||||||
|
|
||||||
string value;
|
string value;
|
||||||
bool found = docget(self, key, value);
|
if (idocget(self, key, value)) {
|
||||||
|
return PyUnicode_Decode(value.c_str(), value.size(), "UTF-8","replace");
|
||||||
if (found) {
|
|
||||||
return PyUnicode_Decode(value.c_str(), value.size(), "UTF-8", "replace");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
|
@ -495,14 +557,15 @@ Doc_getattro(recoll_DocObject *self, PyObject *nameobj)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool found = false;
|
PyObject *meth = PyObject_GenericGetAttr((PyObject*)self, nameobj);
|
||||||
string value;
|
if (meth) {
|
||||||
string key;
|
return meth;
|
||||||
|
}
|
||||||
|
PyErr_Clear();
|
||||||
|
|
||||||
char *name = 0;
|
char *name = 0;
|
||||||
PyObject* utf8o = 0;
|
|
||||||
|
|
||||||
if (PyUnicode_Check(nameobj)) {
|
if (PyUnicode_Check(nameobj)) {
|
||||||
utf8o = PyUnicode_AsUTF8String(nameobj);
|
PyObject* utf8o = PyUnicode_AsUTF8String(nameobj);
|
||||||
if (utf8o == 0) {
|
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??");
|
PyErr_SetString(PyExc_AttributeError, "name??");
|
||||||
|
@ -517,90 +580,12 @@ Doc_getattro(recoll_DocObject *self, PyObject *nameobj)
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
key = rclconfig->fieldQCanon(string(name));
|
string key = rclconfig->fieldQCanon(string(name));
|
||||||
LOGDEB1("Doc_getattro: key: " << key << endl);
|
string value;
|
||||||
|
if (idocget(self, key, value)) {
|
||||||
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) {
|
|
||||||
LOGDEB1("Doc_getattro: [" << key << "] -> [" << value << "]\n");
|
LOGDEB1("Doc_getattro: [" << key << "] -> [" << value << "]\n");
|
||||||
// Return a python unicode object
|
// Return a python unicode object
|
||||||
return PyUnicode_Decode(value.c_str(), value.size(), "utf-8",
|
return PyUnicode_Decode(value.c_str(), value.size(), "utf-8","replace");
|
||||||
"replace");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
|
@ -739,10 +724,8 @@ Doc_subscript(recoll_DocObject *self, PyObject *key)
|
||||||
|
|
||||||
string skey = rclconfig->fieldQCanon(string(name));
|
string skey = rclconfig->fieldQCanon(string(name));
|
||||||
string value;
|
string value;
|
||||||
bool found = docget(self, skey, value);
|
if (idocget(self, skey, value)) {
|
||||||
|
return PyUnicode_Decode(value.c_str(), value.size(), "UTF-8","replace");
|
||||||
if (found) {
|
|
||||||
return PyUnicode_Decode(value.c_str(), value.size(), "UTF-8", "replace");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue