cleaned up processing of metadata from diverse origins (doc,extattrs,localfields)
This commit is contained in:
+16
-13
@@ -47,8 +47,10 @@
|
||||
#include "rclinit.h"
|
||||
#include "execmd.h"
|
||||
|
||||
// When using extended attributes, we have to use the ctime.
|
||||
// This is quite an expensive price to pay...
|
||||
|
||||
// When using extended attributes, we have to use the ctime, because
|
||||
// this is all that gets set when the attributes are modified. This
|
||||
// is quite an expensive price to pay...
|
||||
#ifdef RCL_USE_XATTR
|
||||
#define RCL_STTIME st_ctime
|
||||
#else
|
||||
@@ -420,22 +422,21 @@ void FsIndexer::localfieldsfromconf()
|
||||
vector<string> nmlst = attrs.getNames(cstr_null);
|
||||
for (vector<string>::const_iterator it = nmlst.begin();
|
||||
it != nmlst.end(); it++) {
|
||||
attrs.get(*it, m_localfields[*it]);
|
||||
string nm = m_config->fieldCanon(*it);
|
||||
attrs.get(*it, m_localfields[nm]);
|
||||
LOGDEB2(("FsIndexer::localfieldsfromconf: [%s]->[%s]\n",
|
||||
nm.c_str(), m_localfields[nm].c_str()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
void FsIndexer::setlocalfields(const map<string, string>& fields, Rcl::Doc& doc)
|
||||
{
|
||||
for (map<string, string>::const_iterator it = fields.begin();
|
||||
it != fields.end(); it++) {
|
||||
// Should local fields override those coming from the document
|
||||
// ? I think not, but not too sure. We could also chose to
|
||||
// concatenate the values ?
|
||||
if (doc.meta.find(it->second) == doc.meta.end()) {
|
||||
doc.meta[it->first] = it->second;
|
||||
}
|
||||
// Being chosen by the user, localfields override values from
|
||||
// the filter. The key is already canonic (see
|
||||
// localfieldsfromconf())
|
||||
doc.meta[it->first] = it->second;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -484,7 +485,9 @@ void FsIndexer::reapmetadata(const vector<MDReaper>& reapers, const string& fn,
|
||||
}
|
||||
string output;
|
||||
if (ExecCmd::backtick(cmd, output)) {
|
||||
doc.meta[rp->fieldname] += string(" ") + output;
|
||||
// addmeta() creates or appends. fieldname is already
|
||||
// canonic (see above)
|
||||
doc.addmeta(rp->fieldname, output);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -534,7 +537,7 @@ void *FsIndexerInternfileWorker(void * fsp)
|
||||
TempDir tmpdir;
|
||||
RclConfig myconf(*(fip->m_stableconfig));
|
||||
|
||||
InternfileTask *tsk;
|
||||
InternfileTask *tsk = 0;
|
||||
for (;;) {
|
||||
if (!tqp->take(&tsk)) {
|
||||
tqp->workerExit();
|
||||
|
||||
+17
-11
@@ -567,22 +567,22 @@ const char *RclIntf::event_name(int code)
|
||||
code &= ~(IN_ISDIR|IN_ONESHOT);
|
||||
switch (code) {
|
||||
case IN_ACCESS: return "IN_ACCESS";
|
||||
case IN_MODIFY: return "IN_MODIFY";
|
||||
case IN_ATTRIB: return "IN_ATTRIB";
|
||||
case IN_CLOSE_WRITE: return "IN_CLOSE_WRITE";
|
||||
case IN_CLOSE_NOWRITE: return "IN_CLOSE_NOWRITE";
|
||||
case IN_CLOSE: return "IN_CLOSE";
|
||||
case IN_OPEN: return "IN_OPEN";
|
||||
case IN_MOVED_FROM: return "IN_MOVED_FROM";
|
||||
case IN_MOVED_TO: return "IN_MOVED_TO";
|
||||
case IN_MOVE: return "IN_MOVE";
|
||||
case IN_CLOSE_NOWRITE: return "IN_CLOSE_NOWRITE";
|
||||
case IN_CLOSE_WRITE: return "IN_CLOSE_WRITE";
|
||||
case IN_CREATE: return "IN_CREATE";
|
||||
case IN_DELETE: return "IN_DELETE";
|
||||
case IN_DELETE_SELF: return "IN_DELETE_SELF";
|
||||
case IN_MOVE_SELF: return "IN_MOVE_SELF";
|
||||
case IN_UNMOUNT: return "IN_UNMOUNT";
|
||||
case IN_Q_OVERFLOW: return "IN_Q_OVERFLOW";
|
||||
case IN_IGNORED: return "IN_IGNORED";
|
||||
case IN_MODIFY: return "IN_MODIFY";
|
||||
case IN_MOVE: return "IN_MOVE";
|
||||
case IN_MOVED_FROM: return "IN_MOVED_FROM";
|
||||
case IN_MOVED_TO: return "IN_MOVED_TO";
|
||||
case IN_MOVE_SELF: return "IN_MOVE_SELF";
|
||||
case IN_OPEN: return "IN_OPEN";
|
||||
case IN_Q_OVERFLOW: return "IN_Q_OVERFLOW";
|
||||
case IN_UNMOUNT: return "IN_UNMOUNT";
|
||||
default: {
|
||||
static char msg[50];
|
||||
sprintf(msg, "Unknown event 0x%x", code);
|
||||
@@ -599,6 +599,12 @@ bool RclIntf::addWatch(const string& path, bool)
|
||||
// CLOSE_WRITE is covered through MODIFY. CREATE is needed for mkdirs
|
||||
uint32_t mask = IN_MODIFY | IN_CREATE
|
||||
| IN_MOVED_FROM | IN_MOVED_TO | IN_DELETE
|
||||
#ifdef RCL_USE_XATTR
|
||||
// It seems that IN_ATTRIB is not needed to receive extattr
|
||||
// modification events, which is a bit weird because only ctime is
|
||||
// set.
|
||||
// | IN_ATTRIB
|
||||
#endif
|
||||
#ifdef IN_DONT_FOLLOW
|
||||
| IN_DONT_FOLLOW
|
||||
#endif
|
||||
@@ -692,7 +698,7 @@ bool RclIntf::getEvent(RclMonEvent& ev, int msecs)
|
||||
eraseWatchSubTree(m_idtopath, ev.m_path);
|
||||
}
|
||||
|
||||
|
||||
// IN_ATTRIB apparently not needed, see comment above
|
||||
if (evp->mask & (IN_MODIFY)) {
|
||||
ev.m_etyp = RclMonEvent::RCLEVT_MODIFY;
|
||||
} else if (evp->mask & (IN_DELETE | IN_MOVED_FROM)) {
|
||||
|
||||
Reference in New Issue
Block a user