Python module: add Doc object method to retrieve binary path
This commit is contained in:
parent
799c6bf2d6
commit
83af1a37da
2 changed files with 83 additions and 20 deletions
|
@ -295,6 +295,55 @@ Doc_init(recoll_DocObject *self, PyObject *, PyObject *)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyDoc_STRVAR(doc_getbinurl,
|
||||||
|
"getbinurl(none) -> binary url\n"
|
||||||
|
"\n"
|
||||||
|
"Returns an URL with a path part which is a as bit for bit copy of the \n"
|
||||||
|
"file system path, without encoding\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
Doc_getbinurl(recoll_DocObject *self)
|
||||||
|
{
|
||||||
|
LOGDEB(("Doc_getbinurl\n"));
|
||||||
|
if (self->doc == 0 ||
|
||||||
|
the_docs.find(self->doc) == the_docs.end()) {
|
||||||
|
PyErr_SetString(PyExc_AttributeError, "doc");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return PyByteArray_FromStringAndSize(self->doc->url.c_str(),
|
||||||
|
self->doc->url.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
PyDoc_STRVAR(doc_setbinurl,
|
||||||
|
"setbinurl(url) -> binary url\n"
|
||||||
|
"\n"
|
||||||
|
"Set the URL from binary path like file://may/contain/unencodable/bytes\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
static int
|
||||||
|
Doc_setbinurl(recoll_DocObject *self, PyObject *value)
|
||||||
|
{
|
||||||
|
if (self->doc == 0 ||
|
||||||
|
the_docs.find(self->doc) == the_docs.end()) {
|
||||||
|
PyErr_SetString(PyExc_AttributeError, "doc??");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
self->doc->url = string(PyByteArray_AsString(value),
|
||||||
|
PyByteArray_Size(value));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static PyMethodDef Doc_methods[] = {
|
||||||
|
{"getbinurl", (PyCFunction)Doc_getbinurl, METH_NOARGS,
|
||||||
|
doc_getbinurl},
|
||||||
|
{"setbinurl", (PyCFunction)Doc_setbinurl, METH_O,
|
||||||
|
doc_setbinurl},
|
||||||
|
{NULL} /* Sentinel */
|
||||||
|
};
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
Doc_getattr(recoll_DocObject *self, char *name)
|
Doc_getattr(recoll_DocObject *self, char *name)
|
||||||
{
|
{
|
||||||
|
@ -312,66 +361,79 @@ Doc_getattr(recoll_DocObject *self, char *name)
|
||||||
#endif
|
#endif
|
||||||
string key = rclconfig->fieldCanon(string(name));
|
string key = rclconfig->fieldCanon(string(name));
|
||||||
|
|
||||||
// Handle special cases, then try retrieving key value from meta
|
// Handle special cases, then check this is not a method then
|
||||||
// array
|
// try retrieving key value from the meta array
|
||||||
|
|
||||||
string value;
|
string value;
|
||||||
|
bool found = false;
|
||||||
switch (key.at(0)) {
|
switch (key.at(0)) {
|
||||||
case 'u':
|
case 'u':
|
||||||
if (!key.compare(Rcl::Doc::keyurl)) {
|
if (!key.compare(Rcl::Doc::keyurl)) {
|
||||||
value = self->doc->url;
|
value = self->doc->url; found = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
if (!key.compare(Rcl::Doc::keyfs)) {
|
if (!key.compare(Rcl::Doc::keyfs)) {
|
||||||
value = self->doc->fbytes;
|
value = self->doc->fbytes; found = true;
|
||||||
} else if (!key.compare(Rcl::Doc::keyfs)) {
|
} else if (!key.compare(Rcl::Doc::keyfs)) {
|
||||||
value = self->doc->fbytes;
|
value = self->doc->fbytes; found = true;
|
||||||
} else if (!key.compare(Rcl::Doc::keyfmt)) {
|
} else if (!key.compare(Rcl::Doc::keyfmt)) {
|
||||||
value = self->doc->fmtime;
|
value = self->doc->fmtime; found = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
if (!key.compare(Rcl::Doc::keyds)) {
|
if (!key.compare(Rcl::Doc::keyds)) {
|
||||||
value = self->doc->dbytes;
|
value = self->doc->dbytes; found = true;
|
||||||
} else if (!key.compare(Rcl::Doc::keydmt)) {
|
} else if (!key.compare(Rcl::Doc::keydmt)) {
|
||||||
value = self->doc->dmtime;
|
value = self->doc->dmtime; found = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
if (!key.compare(Rcl::Doc::keyipt)) {
|
if (!key.compare(Rcl::Doc::keyipt)) {
|
||||||
value = self->doc->ipath;
|
value = self->doc->ipath; found = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
if (!key.compare(Rcl::Doc::keytp)) {
|
if (!key.compare(Rcl::Doc::keytp)) {
|
||||||
value = self->doc->mimetype;
|
value = self->doc->mimetype; found = true;
|
||||||
} else if (!key.compare(Rcl::Doc::keymt)) {
|
} else if (!key.compare(Rcl::Doc::keymt)) {
|
||||||
value = self->doc->dmtime.empty() ? self->doc->fmtime :
|
value = self->doc->dmtime.empty() ? self->doc->fmtime :
|
||||||
self->doc->dmtime;
|
self->doc->dmtime; found = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
if (!key.compare(Rcl::Doc::keyoc)) {
|
if (!key.compare(Rcl::Doc::keyoc)) {
|
||||||
value = self->doc->origcharset;
|
value = self->doc->origcharset; found = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
if (!key.compare(Rcl::Doc::keysig)) {
|
if (!key.compare(Rcl::Doc::keysig)) {
|
||||||
value = self->doc->sig;
|
value = self->doc->sig; found = true;
|
||||||
} else if (!key.compare(Rcl::Doc::keysz)) {
|
} else if (!key.compare(Rcl::Doc::keysz)) {
|
||||||
value = self->doc->dbytes.empty() ? self->doc->fbytes :
|
value = self->doc->dbytes.empty() ? self->doc->fbytes :
|
||||||
self->doc->dbytes;
|
self->doc->dbytes; found = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value.empty())
|
if (!found) {
|
||||||
|
PyObject *meth = Py_FindMethod(Doc_methods, (PyObject*)self,
|
||||||
|
key.c_str());
|
||||||
|
if (meth) {
|
||||||
|
return meth;
|
||||||
|
} else {
|
||||||
|
PyErr_Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self->doc->getmeta(key, 0)) {
|
||||||
value = self->doc->meta[key];
|
value = self->doc->meta[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LOGDEB(("Doc_getattr: [%s] (%s) -> [%s]\n",
|
LOGDEB(("Doc_getattr: [%s] (%s) -> [%s]\n",
|
||||||
name, key.c_str(), value.c_str()));
|
name, key.c_str(), value.c_str()));
|
||||||
// Return a python unicode object
|
// Return a python unicode object
|
||||||
PyObject* res = PyUnicode_Decode(value.c_str(), value.size(), "UTF-8",
|
PyObject* res = PyUnicode_Decode(value.c_str(), value.size(), "utf-8",
|
||||||
"replace");
|
"replace");
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -467,6 +529,7 @@ Doc_setattr(recoll_DocObject *self, char *name, PyObject *value)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PyDoc_STRVAR(doc_DocObject,
|
PyDoc_STRVAR(doc_DocObject,
|
||||||
"Doc()\n"
|
"Doc()\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
@ -532,7 +595,7 @@ static PyTypeObject recoll_DocType = {
|
||||||
0, /* tp_weaklistoffset */
|
0, /* tp_weaklistoffset */
|
||||||
0, /* tp_iter */
|
0, /* tp_iter */
|
||||||
0, /* tp_iternext */
|
0, /* tp_iternext */
|
||||||
0, /* tp_methods */
|
Doc_methods, /* tp_methods */
|
||||||
0, /* tp_members */
|
0, /* tp_members */
|
||||||
0, /* tp_getset */
|
0, /* tp_getset */
|
||||||
0, /* tp_base */
|
0, /* tp_base */
|
||||||
|
|
|
@ -16,7 +16,6 @@ def Usage():
|
||||||
sys.exit(1);
|
sys.exit(1);
|
||||||
|
|
||||||
def doquery(db, q):
|
def doquery(db, q):
|
||||||
"""Parse and execute query on open db"""
|
|
||||||
# Get query object
|
# Get query object
|
||||||
query = db.query()
|
query = db.query()
|
||||||
# Parse/run input query string
|
# Parse/run input query string
|
||||||
|
@ -27,8 +26,9 @@ def doquery(db, q):
|
||||||
while query.next >= 0 and query.next < nres:
|
while query.next >= 0 and query.next < nres:
|
||||||
doc = query.fetchone()
|
doc = query.fetchone()
|
||||||
print query.next, ":",
|
print query.next, ":",
|
||||||
for k in ("title", "url", "mtime"):
|
for k in ("title", "mtime", "author"):
|
||||||
print k, ":", getattr(doc, k).encode('utf-8')
|
print k, ":", getattr(doc, k).encode('utf-8')
|
||||||
|
print "Bin URL :", doc.getbinurl()
|
||||||
abs = db.makeDocAbstract(doc, query).encode('utf-8')
|
abs = db.makeDocAbstract(doc, query).encode('utf-8')
|
||||||
print abs
|
print abs
|
||||||
print
|
print
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue