gui connected to rcldb (init)
This commit is contained in:
parent
5210139b85
commit
15855b018f
@ -1,24 +1,22 @@
|
|||||||
|
BIGLIB = ../lib/librcl.a
|
||||||
CXXFLAGS = -Wall -g -I. -I../unac -I../utils -I/usr/local/include
|
CXXFLAGS = -Wall -g -I. -I../unac -I../utils -I/usr/local/include
|
||||||
CFLAGS = -g -I. -I../unac -I/usr/local/include -DUNAC_VERSION=\"1.0.7\"
|
|
||||||
|
|
||||||
|
|
||||||
PROGS = unacpp
|
PROGS = unacpp textsplit
|
||||||
all: $(PROGS)
|
all: $(PROGS)
|
||||||
|
|
||||||
UNACPP_OBJS= trunacpp.o unacpp.o unac.o readfile.o
|
UNACPP_OBJS= trunacpp.o $(BIGLIB)
|
||||||
unacpp : $(UNACPP_OBJS)
|
unacpp : $(UNACPP_OBJS)
|
||||||
$(CXX) $(CXXFLAGS) -o unacpp $(UNACPP_OBJS) \
|
$(CXX) $(CXXFLAGS) -o unacpp $(UNACPP_OBJS) \
|
||||||
-L/usr/local/lib -liconv
|
-L/usr/local/lib -liconv
|
||||||
|
|
||||||
unac.o : ../unac/unac.c ../unac/unac.h
|
|
||||||
$(CC) $(CFLAGS) -c -o unac.o ../unac/unac.c
|
|
||||||
|
|
||||||
readfile.o : ../utils/readfile.cpp ../utils/readfile.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o readfile.o ../utils/readfile.cpp
|
|
||||||
|
|
||||||
trunacpp.o : unacpp.cpp unacpp.h
|
trunacpp.o : unacpp.cpp unacpp.h
|
||||||
$(CXX) $(CXXFLAGS) -DTEST_UNACPP -c -o trunacpp.o unacpp.cpp
|
$(CXX) $(CXXFLAGS) -DTEST_UNACPP -c -o trunacpp.o unacpp.cpp
|
||||||
|
|
||||||
|
TEXTSPLIT_OBJS= trtextsplit.o $(BIGLIB)
|
||||||
|
textsplit : $(TEXTSPLIT_OBJS)
|
||||||
|
$(CXX) $(CXXFLAGS) -o textsplit $(TEXTSPLIT_OBJS)
|
||||||
|
trtextsplit.o : textsplit.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -DTEST_TEXTSPLIT -c -o trtextsplit.o \
|
||||||
|
textsplit.cpp
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o $(PROGS)
|
rm -f *.o $(PROGS)
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char rcsid[] = "@(#$Id: rclconfig.cpp,v 1.3 2005-01-24 13:17:58 dockes Exp $ (C) 2004 J.F.Dockes";
|
static char rcsid[] = "@(#$Id: rclconfig.cpp,v 1.4 2005-01-25 14:37:20 dockes Exp $ (C) 2004 J.F.Dockes";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -7,6 +7,18 @@ static char rcsid[] = "@(#$Id: rclconfig.cpp,v 1.3 2005-01-24 13:17:58 dockes Ex
|
|||||||
#include "rclconfig.h"
|
#include "rclconfig.h"
|
||||||
#include "pathut.h"
|
#include "pathut.h"
|
||||||
#include "conftree.h"
|
#include "conftree.h"
|
||||||
|
#include "debuglog.h"
|
||||||
|
|
||||||
|
static DebugLog debuglog;
|
||||||
|
DebugLog *dbl = &debuglog;
|
||||||
|
class loginitializer {
|
||||||
|
public:
|
||||||
|
loginitializer() {
|
||||||
|
dbl->setlogfilename("stderr");
|
||||||
|
dbl->setloglevel(10);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
static loginitializer lgntlzr;
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@ -54,6 +66,7 @@ RclConfig::RclConfig()
|
|||||||
cerr << "No mime conf file" << endl;
|
cerr << "No mime conf file" << endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
setKeyDir(string(""));
|
||||||
// mimeconf->list();
|
// mimeconf->list();
|
||||||
m_ok = true;
|
m_ok = true;
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -1,67 +1,23 @@
|
|||||||
|
|
||||||
CXXFLAGS = -Wall -g -I. -I../utils -I../common -I/usr/local/include
|
CXXFLAGS = -Wall -g -I. -I../utils -I../common -I/usr/local/include
|
||||||
|
|
||||||
|
BIGLIB = ../lib/librcl.a
|
||||||
|
|
||||||
PROGS = transcode textsplit idxdriver csguess
|
PROGS = idxdriver csguess
|
||||||
all: $(PROGS)
|
all: $(PROGS)
|
||||||
|
|
||||||
IDXDRIVER_OBJS= idxdriver.o pathut.o conftree.o rclconfig.o fstreewalk.o \
|
IDXDRIVER_OBJS= idxdriver.o $(BIGLIB)
|
||||||
mimetype.o rcldb.o readfile.o transcode.o csguess.o \
|
|
||||||
textsplit.o unac.o unacpp.o
|
|
||||||
|
|
||||||
idxdriver : $(IDXDRIVER_OBJS)
|
idxdriver : $(IDXDRIVER_OBJS)
|
||||||
$(CXX) $(CXXFLAGS) -o idxdriver $(IDXDRIVER_OBJS) \
|
$(CXX) $(CXXFLAGS) -o idxdriver $(IDXDRIVER_OBJS) \
|
||||||
-L/usr/local/lib -lxapian -liconv
|
-L/usr/local/lib -lxapian -liconv
|
||||||
|
|
||||||
TEXTSPLIT_OBJS= trtextsplit.o textsplit.o readfile.o
|
CSGUESS_OBJS= trcsguess.o $(BIGLIB)
|
||||||
textsplit : $(TEXTSPLIT_OBJS)
|
|
||||||
$(CXX) $(CXXFLAGS) -o textsplit $(TEXTSPLIT_OBJS)
|
|
||||||
trtextsplit.o : ../common/textsplit.cpp ../common/textsplit.h
|
|
||||||
$(CXX) $(CXXFLAGS) -DTEST_TEXTSPLIT -c -o trtextsplit.o \
|
|
||||||
../common/textsplit.cpp
|
|
||||||
|
|
||||||
pathut.o : ../utils/pathut.cpp ../utils/pathut.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o pathut.o ../utils/pathut.cpp
|
|
||||||
conftree.o : ../utils/conftree.cpp ../utils/conftree.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o conftree.o ../utils/conftree.cpp
|
|
||||||
rclconfig.o : ../common/rclconfig.cpp ../common/rclconfig.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o rclconfig.o ../common/rclconfig.cpp
|
|
||||||
fstreewalk.o : ../utils/fstreewalk.cpp ../utils/fstreewalk.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o fstreewalk.o ../utils/fstreewalk.cpp
|
|
||||||
readfile.o : ../utils/readfile.cpp ../utils/readfile.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o readfile.o ../utils/readfile.cpp
|
|
||||||
|
|
||||||
|
|
||||||
unacpp.o : ../common/unacpp.cpp ../common/unacpp.h
|
|
||||||
$(CXX) $(CXXFLAGS) -I../unac -c -o unacpp.o ../common/unacpp.cpp
|
|
||||||
|
|
||||||
|
|
||||||
rcldb.o : ../common/rcldb.cpp ../common/rcldb.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o rcldb.o ../common/rcldb.cpp
|
|
||||||
textsplit.o : ../common/textsplit.cpp ../common/textsplit.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o textsplit.o ../common/textsplit.cpp
|
|
||||||
|
|
||||||
CSGUESS_OBJS= trcsguess.o csguess.o readfile.o
|
|
||||||
csguess : $(CSGUESS_OBJS)
|
csguess : $(CSGUESS_OBJS)
|
||||||
$(CXX) $(CXXFLAGS) -o csguess $(CSGUESS_OBJS) \
|
$(CXX) $(CXXFLAGS) -o csguess $(CSGUESS_OBJS) \
|
||||||
-L/usr/local/lib -liconv
|
-L/usr/local/lib -liconv
|
||||||
trcsguess.o : csguess.cpp csguess.h
|
trcsguess.o : csguess.cpp
|
||||||
$(CXX) $(CXXFLAGS) -DTEST_CSGUESS -c -o trcsguess.o \
|
$(CXX) $(CXXFLAGS) -DTEST_CSGUESS -c -o trcsguess.o \
|
||||||
csguess.cpp
|
csguess.cpp
|
||||||
TRANSCODE_OBJS= trtranscode.o transcode.o readfile.o
|
|
||||||
transcode : $(TRANSCODE_OBJS)
|
|
||||||
$(CXX) $(CXXFLAGS) -o transcode $(TRANSCODE_OBJS) \
|
|
||||||
-L/usr/local/lib -liconv
|
|
||||||
trtranscode.o : transcode.cpp transcode.h
|
|
||||||
$(CXX) $(CXXFLAGS) -DTEST_TRANSCODE -c -o trtranscode.o \
|
|
||||||
transcode.cpp
|
|
||||||
|
|
||||||
|
|
||||||
CFLAGS = -g -I. -I../unac -I/usr/local/include -DUNAC_VERSION=\"1.0.7\"
|
|
||||||
unac.o : ../unac/unac.c ../unac/unac.h
|
|
||||||
$(CC) $(CFLAGS) -c -o unac.o ../unac/unac.c
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o $(PROGS)
|
rm -f *.o $(PROGS)
|
||||||
|
|||||||
@ -1,14 +1,9 @@
|
|||||||
#ifndef _INDEXER_H_INCLUDED_
|
#ifndef _INDEXER_H_INCLUDED_
|
||||||
#define _INDEXER_H_INCLUDED_
|
#define _INDEXER_H_INCLUDED_
|
||||||
/* @(#$Id: indexer.h,v 1.2 2004-12-15 15:00:37 dockes Exp $ (C) 2004 J.F.Dockes */
|
/* @(#$Id: indexer.h,v 1.3 2005-01-25 14:37:21 dockes Exp $ (C) 2004 J.F.Dockes */
|
||||||
|
|
||||||
#include "rclconfig.h"
|
#include "rclconfig.h"
|
||||||
|
|
||||||
/* Definition for document interner functions */
|
|
||||||
typedef bool (*MimeHandlerFunc)(RclConfig *, const string &,
|
|
||||||
const string &, Rcl::Doc&);
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
class FsIndexer {
|
class FsIndexer {
|
||||||
const ConfTree &conf;
|
const ConfTree &conf;
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char rcsid[] = "@(#$Id: recollindex.cpp,v 1.4 2004-12-17 13:01:01 dockes Exp $ (C) 2004 J.F.Dockes";
|
static char rcsid[] = "@(#$Id: recollindex.cpp,v 1.5 2005-01-25 14:37:21 dockes Exp $ (C) 2004 J.F.Dockes";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
@ -18,101 +18,11 @@ static char rcsid[] = "@(#$Id: recollindex.cpp,v 1.4 2004-12-17 13:01:01 dockes
|
|||||||
#include "indexer.h"
|
#include "indexer.h"
|
||||||
#include "csguess.h"
|
#include "csguess.h"
|
||||||
#include "transcode.h"
|
#include "transcode.h"
|
||||||
|
#include "mimehandler.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
bool textPlainToDoc(RclConfig *conf, const string &fn,
|
|
||||||
const string &mtype, Rcl::Doc &docout)
|
|
||||||
{
|
|
||||||
string otext;
|
|
||||||
if (!file_to_string(fn, otext))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Try to guess charset, then convert to utf-8, and fill document
|
|
||||||
// fields The charset guesser really doesnt work well in general
|
|
||||||
// and should be avoided (especially for short documents)
|
|
||||||
string charset;
|
|
||||||
if (conf->guesscharset) {
|
|
||||||
charset = csguess(otext, conf->defcharset);
|
|
||||||
} else
|
|
||||||
charset = conf->defcharset;
|
|
||||||
string utf8;
|
|
||||||
cerr << "textPlainToDoc: transcod from " << charset << " to UTF-8"
|
|
||||||
<< endl;
|
|
||||||
|
|
||||||
if (!transcode(otext, utf8, charset, "UTF-8")) {
|
|
||||||
cerr << "textPlainToDoc: transcode failed: charset '" << charset
|
|
||||||
<< "' to UTF-8: "<< utf8 << endl;
|
|
||||||
otext.erase();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Rcl::Doc out;
|
|
||||||
out.origcharset = charset;
|
|
||||||
out.text = utf8;
|
|
||||||
//out.text = otext;
|
|
||||||
docout = out;
|
|
||||||
cerr << utf8 << endl;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Map of mime types to internal interner functions. This could just as well
|
|
||||||
// be an if else if suite inside getMimeHandler(), but this is prettier ?
|
|
||||||
static map<string, MimeHandlerFunc> ihandlers;
|
|
||||||
// Static object to get the map to be initialized at program start.
|
|
||||||
class IHandler_Init {
|
|
||||||
public:
|
|
||||||
IHandler_Init() {
|
|
||||||
ihandlers["text/plain"] = textPlainToDoc;
|
|
||||||
// Add new associations here when needed
|
|
||||||
}
|
|
||||||
};
|
|
||||||
static IHandler_Init ihandleriniter;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return handler function for given mime type
|
|
||||||
*/
|
|
||||||
MimeHandlerFunc getMimeHandler(const std::string &mtype, ConfTree *mhandlers)
|
|
||||||
{
|
|
||||||
// Return handler definition for mime type
|
|
||||||
string hs;
|
|
||||||
if (!mhandlers->get(mtype, hs, ""))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// Break definition into type and name
|
|
||||||
vector<string> toks;
|
|
||||||
ConfTree::stringToStrings(hs, toks);
|
|
||||||
if (toks.size() < 1) {
|
|
||||||
cerr << "Bad mimeconf line for " << mtype << endl;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieve handler function according to type
|
|
||||||
if (!strcasecmp(toks[0].c_str(), "internal")) {
|
|
||||||
cerr << "Internal Handler" << endl;
|
|
||||||
map<string, MimeHandlerFunc>::const_iterator it =
|
|
||||||
ihandlers.find(mtype);
|
|
||||||
if (it == ihandlers.end()) {
|
|
||||||
cerr << "Internal handler not found for " << mtype << endl;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
cerr << "Got handler" << endl;
|
|
||||||
return it->second;
|
|
||||||
} else if (!strcasecmp(toks[0].c_str(), "dll")) {
|
|
||||||
if (toks.size() != 2)
|
|
||||||
return 0;
|
|
||||||
return 0;
|
|
||||||
} else if (!strcasecmp(toks[0].c_str(), "exec")) {
|
|
||||||
if (toks.size() != 2)
|
|
||||||
return 0;
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bunch holder for data used while indexing a directory tree
|
* Bunch holder for data used while indexing a directory tree
|
||||||
*/
|
*/
|
||||||
@ -151,7 +61,11 @@ void DirIndexer::index()
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* This function gets called for every file and directory found by the
|
* This function gets called for every file and directory found by the
|
||||||
* tree walker. Adjust parameters and index files if/when needed.
|
* tree walker. It checks with the db is the file has changed and needs to
|
||||||
|
* be reindexed. If so, it calls an appropriate handler depending on the mime
|
||||||
|
* type, which is responsible for populating an Rcl::Doc.
|
||||||
|
* Accent and majuscule handling are performed by the db module when doing
|
||||||
|
* the actual indexing work.
|
||||||
*/
|
*/
|
||||||
FsTreeWalker::Status
|
FsTreeWalker::Status
|
||||||
indexfile(void *cdata, const std::string &fn, const struct stat *stp,
|
indexfile(void *cdata, const std::string &fn, const struct stat *stp,
|
||||||
@ -209,7 +123,6 @@ indexfile(void *cdata, const std::string &fn, const struct stat *stp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, const char **argv)
|
int main(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
RclConfig *config = new RclConfig;
|
RclConfig *config = new RclConfig;
|
||||||
|
|||||||
65
src/lib/Makefile
Normal file
65
src/lib/Makefile
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
CXXFLAGS = -Wall -g -I. -I../index -I../utils -I../common \
|
||||||
|
-I../unac -I/usr/local/include
|
||||||
|
|
||||||
|
UNACCFLAGS = -g -I. -I../unac -I/usr/local/include -DUNAC_VERSION=\"1.0.7\"
|
||||||
|
|
||||||
|
|
||||||
|
LIBS = librcl.a
|
||||||
|
all: $(LIBS)
|
||||||
|
|
||||||
|
OBJS = conftree.o csguess.o debuglog.o \
|
||||||
|
fstreewalk.o \
|
||||||
|
mimehandler.o mimetype.o pathut.o \
|
||||||
|
rclconfig.o rcldb.o readfile.o \
|
||||||
|
textsplit.o transcode.o \
|
||||||
|
unacpp.o unac.o
|
||||||
|
SRCS = ../utils/conftree.cpp ../index/csguess.cpp ../utils/debuglog.cpp \
|
||||||
|
../utils/fstreewalk.cpp \
|
||||||
|
../common/mimehandler.cpp ../index/mimetype.cpp ../utils/pathut.cpp \
|
||||||
|
../common/rclconfig.cpp ../common/rcldb.cpp ../utils/readfile.cpp \
|
||||||
|
../common/textsplit.cpp ../utils/transcode.cpp \
|
||||||
|
../common/unacpp.cpp ../unac/unac.c
|
||||||
|
|
||||||
|
librcl.a : $(OBJS)
|
||||||
|
ar ru librcl.a $(OBJS)
|
||||||
|
|
||||||
|
unac.o : ../unac/unac.c ../unac/unac.h
|
||||||
|
$(CC) $(UNACCFLAGS) -c $<
|
||||||
|
|
||||||
|
# $(CXX) $(CXXFLAGS) -c $<
|
||||||
|
conftree.o : ../utils/conftree.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
csguess.o : ../index/csguess.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
debuglog.o : ../utils/debuglog.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
fstreewalk.o : ../utils/fstreewalk.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
mimehandler.o : ../common/mimehandler.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
mimetype.o : ../index/mimetype.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
pathut.o : ../utils/pathut.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
rclconfig.o : ../common/rclconfig.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
rcldb.o : ../common/rcldb.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
readfile.o : ../utils/readfile.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
textsplit.o : ../common/textsplit.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
transcode.o : ../utils/transcode.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
unacpp.o : ../common/unacpp.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o $(LIBS)
|
||||||
|
|
||||||
|
alldeps:depend
|
||||||
|
depend:
|
||||||
|
$(CXX) $(CXXFLAGS) -M $(SRCS) > alldeps
|
||||||
|
include alldeps
|
||||||
|
|
||||||
@ -1,11 +1,68 @@
|
|||||||
|
#include <signal.h>
|
||||||
#include <qapplication.h>
|
#include <qapplication.h>
|
||||||
#include "form1.h"
|
#include <qmessagebox.h>
|
||||||
|
|
||||||
|
#include "recollmain.h"
|
||||||
|
#include "rcldb.h"
|
||||||
|
#include "rclconfig.h"
|
||||||
|
|
||||||
|
RclConfig *rclconfig;
|
||||||
|
Rcl::Db *rcldb;
|
||||||
|
|
||||||
|
static void cleanup()
|
||||||
|
{
|
||||||
|
delete rcldb;
|
||||||
|
rcldb = 0;
|
||||||
|
delete rclconfig;
|
||||||
|
rclconfig = 0;
|
||||||
|
}
|
||||||
|
static void sigcleanup(int sig)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "sigcleanup\n");
|
||||||
|
cleanup();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
int main( int argc, char ** argv )
|
int main( int argc, char ** argv )
|
||||||
{
|
{
|
||||||
QApplication a( argc, argv );
|
QApplication a( argc, argv );
|
||||||
Form1 w;
|
RecollMain w;
|
||||||
w.show();
|
w.show();
|
||||||
a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
|
a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
|
||||||
|
|
||||||
|
rclconfig = new RclConfig;
|
||||||
|
if (!rclconfig || !rclconfig->ok()) {
|
||||||
|
QMessageBox::critical(0, "Recoll",
|
||||||
|
QString("Could not find configuration"));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
string dbdir;
|
||||||
|
if (rclconfig->getConfParam(string("dbdir"), dbdir) == 0) {
|
||||||
|
// Note: this will have to be replaced by a call to a
|
||||||
|
// configuration buildin dialog for initial configuration
|
||||||
|
QMessageBox::critical(0, "Recoll",
|
||||||
|
QString("No db directory in configuration"));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
rcldb = new Rcl::Db;
|
||||||
|
|
||||||
|
if (!rcldb->open(dbdir, Rcl::Db::DbRO)) {
|
||||||
|
QMessageBox::critical(0, "Recoll",
|
||||||
|
QString("Could not open database in ") +
|
||||||
|
QString(dbdir));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
atexit(cleanup);
|
||||||
|
if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
|
||||||
|
signal(SIGHUP, sigcleanup);
|
||||||
|
if (signal(SIGINT, SIG_IGN) != SIG_IGN)
|
||||||
|
signal(SIGINT, sigcleanup);
|
||||||
|
if (signal(SIGQUIT, SIG_IGN) != SIG_IGN)
|
||||||
|
signal(SIGQUIT, sigcleanup);
|
||||||
|
if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
|
||||||
|
signal(SIGTERM, sigcleanup);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return a.exec();
|
return a.exec();
|
||||||
}
|
}
|
||||||
|
|||||||
30
src/qtgui/recoll.pro
Normal file
30
src/qtgui/recoll.pro
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
TEMPLATE = app
|
||||||
|
LANGUAGE = C++
|
||||||
|
|
||||||
|
CONFIG += qt warn_on release
|
||||||
|
|
||||||
|
SOURCES += main.cpp
|
||||||
|
|
||||||
|
FORMS = recollmain.ui
|
||||||
|
|
||||||
|
IMAGES = images/filenew \
|
||||||
|
images/fileopen \
|
||||||
|
images/filesave \
|
||||||
|
images/print \
|
||||||
|
images/undo \
|
||||||
|
images/redo \
|
||||||
|
images/editcut \
|
||||||
|
images/editcopy \
|
||||||
|
images/editpaste \
|
||||||
|
images/searchfind
|
||||||
|
|
||||||
|
unix {
|
||||||
|
UI_DIR = .ui
|
||||||
|
MOC_DIR = .moc
|
||||||
|
OBJECTS_DIR = .obj
|
||||||
|
LIBS += ../lib/librcl.a -L/usr/local/lib -lxapian -liconv
|
||||||
|
INCLUDEPATH += ../common ../index ../query ../unac ../utils
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
245
src/qtgui/recollmain.ui
Normal file
245
src/qtgui/recollmain.ui
Normal file
@ -0,0 +1,245 @@
|
|||||||
|
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
||||||
|
<class>RecollMain</class>
|
||||||
|
<widget class="QMainWindow">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>RecollMain</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>774</width>
|
||||||
|
<height>619</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="caption">
|
||||||
|
<string>recoll</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QLayoutWidget">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>layout7</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>11</x>
|
||||||
|
<y>11</y>
|
||||||
|
<width>752</width>
|
||||||
|
<height>41</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<hbox>
|
||||||
|
<property name="name">
|
||||||
|
<cstring>unnamed</cstring>
|
||||||
|
</property>
|
||||||
|
<widget class="QLineEdit">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>queryText</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="frameShape">
|
||||||
|
<enum>LineEditPanel</enum>
|
||||||
|
</property>
|
||||||
|
<property name="frameShadow">
|
||||||
|
<enum>Sunken</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QPushButton">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>Search</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>pushButton1</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<spacer>
|
||||||
|
<property name="name">
|
||||||
|
<cstring>spacer1</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeType">
|
||||||
|
<enum>Expanding</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</hbox>
|
||||||
|
</widget>
|
||||||
|
<widget class="QSplitter">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>splitter9</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>11</x>
|
||||||
|
<y>58</y>
|
||||||
|
<width>752</width>
|
||||||
|
<height>491</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<widget class="QTextEdit">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>resTextEdit</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QSplitter">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>splitter8</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<widget class="QTextEdit">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>textEdit12</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QTextEdit">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>textEdit13</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<menubar>
|
||||||
|
<property name="name">
|
||||||
|
<cstring>MenuBar</cstring>
|
||||||
|
</property>
|
||||||
|
<item text="&File" name="fileMenu">
|
||||||
|
<separator/>
|
||||||
|
<separator/>
|
||||||
|
<action name="fileExitAction"/>
|
||||||
|
</item>
|
||||||
|
<item text="&Help" name="helpMenu">
|
||||||
|
<action name="helpContentsAction"/>
|
||||||
|
<action name="helpIndexAction"/>
|
||||||
|
<separator/>
|
||||||
|
<action name="helpAboutAction"/>
|
||||||
|
</item>
|
||||||
|
</menubar>
|
||||||
|
<toolbars>
|
||||||
|
</toolbars>
|
||||||
|
<actions>
|
||||||
|
<action>
|
||||||
|
<property name="name">
|
||||||
|
<cstring>fileExitAction</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Exit</string>
|
||||||
|
</property>
|
||||||
|
<property name="menuText">
|
||||||
|
<string>E&xit</string>
|
||||||
|
</property>
|
||||||
|
<property name="accel">
|
||||||
|
<string></string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action>
|
||||||
|
<property name="name">
|
||||||
|
<cstring>helpContentsAction</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Contents</string>
|
||||||
|
</property>
|
||||||
|
<property name="menuText">
|
||||||
|
<string>&Contents...</string>
|
||||||
|
</property>
|
||||||
|
<property name="accel">
|
||||||
|
<string></string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action>
|
||||||
|
<property name="name">
|
||||||
|
<cstring>helpIndexAction</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Index</string>
|
||||||
|
</property>
|
||||||
|
<property name="menuText">
|
||||||
|
<string>&Index...</string>
|
||||||
|
</property>
|
||||||
|
<property name="accel">
|
||||||
|
<string></string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action>
|
||||||
|
<property name="name">
|
||||||
|
<cstring>helpAboutAction</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>About</string>
|
||||||
|
</property>
|
||||||
|
<property name="menuText">
|
||||||
|
<string>&About</string>
|
||||||
|
</property>
|
||||||
|
<property name="accel">
|
||||||
|
<string></string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
</actions>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>fileExitAction</sender>
|
||||||
|
<signal>activated()</signal>
|
||||||
|
<receiver>RecollMain</receiver>
|
||||||
|
<slot>fileExit()</slot>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>helpIndexAction</sender>
|
||||||
|
<signal>activated()</signal>
|
||||||
|
<receiver>RecollMain</receiver>
|
||||||
|
<slot>helpIndex()</slot>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>helpContentsAction</sender>
|
||||||
|
<signal>activated()</signal>
|
||||||
|
<receiver>RecollMain</receiver>
|
||||||
|
<slot>helpContents()</slot>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>helpAboutAction</sender>
|
||||||
|
<signal>activated()</signal>
|
||||||
|
<receiver>RecollMain</receiver>
|
||||||
|
<slot>helpAbout()</slot>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>resTextEdit</sender>
|
||||||
|
<signal>clicked(int,int)</signal>
|
||||||
|
<receiver>RecollMain</receiver>
|
||||||
|
<slot>resTextEdit_clicked(int,int)</slot>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>resTextEdit</sender>
|
||||||
|
<signal>returnPressed()</signal>
|
||||||
|
<receiver>RecollMain</receiver>
|
||||||
|
<slot>resTextEdit_returnPressed()</slot>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>fileExitAction</sender>
|
||||||
|
<signal>activated()</signal>
|
||||||
|
<receiver>RecollMain</receiver>
|
||||||
|
<slot>fileExit()</slot>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
<includes>
|
||||||
|
<include location="local" impldecl="in implementation">recollmain.ui.h</include>
|
||||||
|
</includes>
|
||||||
|
<slots>
|
||||||
|
<slot>fileExit()</slot>
|
||||||
|
<slot>helpIndex()</slot>
|
||||||
|
<slot>helpContents()</slot>
|
||||||
|
<slot>helpAbout()</slot>
|
||||||
|
<slot>resTextEdit_clicked( int par, int car )</slot>
|
||||||
|
<slot>resTextEdit_returnPressed()</slot>
|
||||||
|
</slots>
|
||||||
|
<pixmapinproject/>
|
||||||
|
<layoutdefaults spacing="6" margin="11"/>
|
||||||
|
</UI>
|
||||||
61
src/qtgui/recollmain.ui.h
Normal file
61
src/qtgui/recollmain.ui.h
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
** ui.h extension file, included from the uic-generated form implementation.
|
||||||
|
**
|
||||||
|
** If you want to add, delete, or rename functions or slots, use
|
||||||
|
** Qt Designer to update this file, preserving your code.
|
||||||
|
**
|
||||||
|
** You should not define a constructor or destructor in this file.
|
||||||
|
** Instead, write your code in functions called init() and destroy().
|
||||||
|
** These will automatically be called by the form's constructor and
|
||||||
|
** destructor.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
void RecollMain::fileExit()
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RecollMain::helpIndex()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RecollMain::helpContents()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RecollMain::helpAbout()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RecollMain::resTextEdit_clicked( int par, int car )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Clicked at paragraph %d, char %d\n", par, car);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "qfontdialog.h"
|
||||||
|
|
||||||
|
#define BS 200000
|
||||||
|
void RecollMain::resTextEdit_returnPressed()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ReturnPressed()\n");
|
||||||
|
resTextEdit->setFont( QFontDialog::getFont( 0, resTextEdit->font() ) );
|
||||||
|
const char *fname = "utf8.txt";
|
||||||
|
FILE *fp = fopen(fname, "r");
|
||||||
|
if (fp) {
|
||||||
|
char buf[BS];
|
||||||
|
memset(buf,0, sizeof(buf));
|
||||||
|
int n = fread(buf, 1, BS-1, fp);
|
||||||
|
fclose(fp);
|
||||||
|
QString str = QString::fromUtf8(buf, n);
|
||||||
|
resTextEdit->setTextFormat(RichText);
|
||||||
|
resTextEdit->setText(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,49 +1,29 @@
|
|||||||
|
|
||||||
CXXFLAGS = -Wall -g -I. -I../index -I../utils -I../common -I/usr/local/include
|
CXXFLAGS = -Wall -g -I. -I../index -I../utils -I../common -I/usr/local/include
|
||||||
|
|
||||||
|
BIGLIB=../lib/librcl.a
|
||||||
|
|
||||||
PROGS = qtry qxtry xadump
|
PROGS = qtry qxtry xadump
|
||||||
all: $(PROGS)
|
all: $(PROGS)
|
||||||
|
|
||||||
XADUMP_OBJS= xadump.o transcode.o
|
XADUMP_OBJS= xadump.o $(BIGLIB)
|
||||||
xadump : $(XADUMP_OBJS)
|
xadump : $(XADUMP_OBJS)
|
||||||
$(CXX) $(CXXFLAGS) -o xadump $(XADUMP_OBJS) \
|
$(CXX) $(CXXFLAGS) -o xadump $(XADUMP_OBJS) \
|
||||||
-L/usr/local/lib -lxapian -liconv
|
-L/usr/local/lib -lxapian -liconv
|
||||||
|
|
||||||
QXTRY_OBJS= qxtry.o transcode.o
|
QXTRY_OBJS= qxtry.o $(BIGLIB)
|
||||||
qxtry : $(QXTRY_OBJS)
|
qxtry : $(QXTRY_OBJS)
|
||||||
$(CXX) $(CXXFLAGS) -o qxtry $(QXTRY_OBJS) \
|
$(CXX) $(CXXFLAGS) -o qxtry $(QXTRY_OBJS) \
|
||||||
-L/usr/local/lib -lxapian -liconv
|
-L/usr/local/lib -lxapian -liconv
|
||||||
|
|
||||||
QTRY_OBJS= qtry.o conftree.o rclconfig.o \
|
QTRY_OBJS= qtry.o $(BIGLIB)
|
||||||
rcldb.o transcode.o \
|
|
||||||
textsplit.o unac.o unacpp.o pathut.o
|
|
||||||
|
|
||||||
qtry : $(QTRY_OBJS)
|
qtry : $(QTRY_OBJS)
|
||||||
$(CXX) $(CXXFLAGS) -o qtry $(QTRY_OBJS) \
|
$(CXX) $(CXXFLAGS) -o qtry $(QTRY_OBJS) \
|
||||||
-L/usr/local/lib -lxapian -liconv
|
-L/usr/local/lib -lxapian -liconv
|
||||||
|
|
||||||
transcode.o : ../index/transcode.cpp ../index/transcode.h
|
$(BIGLIB):
|
||||||
$(CXX) $(CXXFLAGS) -c -o transcode.o ../index/transcode.cpp
|
cd ../lib;make
|
||||||
|
|
||||||
conftree.o : ../utils/conftree.cpp ../utils/conftree.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o conftree.o ../utils/conftree.cpp
|
|
||||||
rclconfig.o : ../common/rclconfig.cpp ../common/rclconfig.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o rclconfig.o ../common/rclconfig.cpp
|
|
||||||
unacpp.o : ../common/unacpp.cpp ../common/unacpp.h
|
|
||||||
$(CXX) $(CXXFLAGS) -I../unac -c -o unacpp.o ../common/unacpp.cpp
|
|
||||||
pathut.o : ../utils/pathut.cpp ../utils/pathut.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o pathut.o ../utils/pathut.cpp
|
|
||||||
rcldb.o : ../common/rcldb.cpp ../common/rcldb.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o rcldb.o ../common/rcldb.cpp
|
|
||||||
textsplit.o : ../common/textsplit.cpp ../common/textsplit.h
|
|
||||||
$(CXX) $(CXXFLAGS) -c -o textsplit.o ../common/textsplit.cpp
|
|
||||||
|
|
||||||
|
|
||||||
CFLAGS = -g -I. -I../unac -I/usr/local/include -DUNAC_VERSION=\"1.0.7\"
|
|
||||||
unac.o : ../unac/unac.c ../unac/unac.h
|
|
||||||
$(CC) $(CFLAGS) -c -o unac.o ../unac/unac.c
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o $(PROGS)
|
rm -f *.o $(PROGS)
|
||||||
alldeps:depend
|
alldeps:depend
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char rcsid[] = "@(#$Id: qtry.cpp,v 1.1 2005-01-24 13:17:58 dockes Exp $ (C) 2004 J.F.Dockes";
|
static char rcsid[] = "@(#$Id: qtry.cpp,v 1.2 2005-01-25 14:37:21 dockes Exp $ (C) 2004 J.F.Dockes";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Tests with the query interface
|
// Tests with the query interface
|
||||||
@ -14,6 +14,7 @@ static char rcsid[] = "@(#$Id: qtry.cpp,v 1.1 2005-01-24 13:17:58 dockes Exp $ (
|
|||||||
#include "rclconfig.h"
|
#include "rclconfig.h"
|
||||||
#include "rcldb.h"
|
#include "rcldb.h"
|
||||||
#include "transcode.h"
|
#include "transcode.h"
|
||||||
|
#include "mimehandler.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@ -86,7 +87,11 @@ int main(int argc, char **argv)
|
|||||||
db->setQuery(query);
|
db->setQuery(query);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
Rcl::Doc doc;
|
Rcl::Doc doc;
|
||||||
while (db->getDoc(i++, doc)) {
|
for (i=0;;i++) {
|
||||||
|
doc.erase();
|
||||||
|
if (!db->getDoc(i, doc))
|
||||||
|
break;
|
||||||
|
|
||||||
cout << "Url: " << doc.url << endl;
|
cout << "Url: " << doc.url << endl;
|
||||||
cout << "Mimetype: " << doc.mimetype << endl;
|
cout << "Mimetype: " << doc.mimetype << endl;
|
||||||
cout << "Mtime: " << doc.mtime << endl;
|
cout << "Mtime: " << doc.mtime << endl;
|
||||||
@ -96,8 +101,29 @@ int main(int argc, char **argv)
|
|||||||
cout << "Keywords: " << doc.keywords << endl;
|
cout << "Keywords: " << doc.keywords << endl;
|
||||||
cout << "Abstract: " << doc.abstract << endl;
|
cout << "Abstract: " << doc.abstract << endl;
|
||||||
cout << endl;
|
cout << endl;
|
||||||
|
|
||||||
doc.erase();
|
// Go to the file system to retrieve / convert the document text
|
||||||
|
// for preview:
|
||||||
|
|
||||||
|
// Look for appropriate handler
|
||||||
|
MimeHandlerFunc fun = getMimeHandler(doc.mimetype,
|
||||||
|
config->getMimeConf());
|
||||||
|
if (!fun) {
|
||||||
|
cout << "No mime handler !" << endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
string fn = doc.url.substr(6, string::npos);
|
||||||
|
cout << "Filename: " << fn << endl;
|
||||||
|
|
||||||
|
Rcl::Doc fdoc;
|
||||||
|
if (!fun(config, fn, doc.mimetype, fdoc)) {
|
||||||
|
cout << "Failed to convert/preview document!" << endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
string outencoding = "iso8859-1";
|
||||||
|
string printable;
|
||||||
|
transcode(fdoc.text, printable, "UTF-8", outencoding);
|
||||||
|
cout << printable << endl;
|
||||||
}
|
}
|
||||||
delete db;
|
delete db;
|
||||||
cerr << "Exiting" << endl;
|
cerr << "Exiting" << endl;
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char rcsid[] = "@(#$Id: xadump.cpp,v 1.2 2004-12-17 15:50:48 dockes Exp $ (C) 2004 J.F.Dockes";
|
static char rcsid[] = "@(#$Id: xadump.cpp,v 1.3 2005-01-25 14:37:21 dockes Exp $ (C) 2004 J.F.Dockes";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
@ -17,7 +17,13 @@ using namespace std;
|
|||||||
static string thisprog;
|
static string thisprog;
|
||||||
|
|
||||||
static string usage =
|
static string usage =
|
||||||
" -d <dbdir> -e <output encoding>"
|
" -d <dbdir> -e <output encoding>\n"
|
||||||
|
" -i docid -D : get document data for docid\n"
|
||||||
|
" -t term -E : term existence test\n"
|
||||||
|
" -t term -F : retrieve term frequency data\n"
|
||||||
|
" -t term -P : retrieve postings for term\n"
|
||||||
|
" -i docid -T : term list for doc docid\n"
|
||||||
|
" -T : list all terms\n"
|
||||||
" \n\n"
|
" \n\n"
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -130,7 +136,6 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} catch (const Xapian::Error &e) {
|
} catch (const Xapian::Error &e) {
|
||||||
cout << "Exception: " << e.get_msg() << endl;
|
cout << "Exception: " << e.get_msg() << endl;
|
||||||
} catch (const string &s) {
|
} catch (const string &s) {
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char rcsid[] = "@(#$Id: rcldb.cpp,v 1.6 2005-01-24 13:17:58 dockes Exp $ (C) 2004 J.F.Dockes";
|
static char rcsid[] = "@(#$Id: rcldb.cpp,v 1.7 2005-01-25 14:37:21 dockes Exp $ (C) 2004 J.F.Dockes";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
@ -15,11 +15,12 @@ using namespace std;
|
|||||||
#include "transcode.h"
|
#include "transcode.h"
|
||||||
#include "unacpp.h"
|
#include "unacpp.h"
|
||||||
#include "conftree.h"
|
#include "conftree.h"
|
||||||
|
#include "debuglog.h"
|
||||||
|
|
||||||
#include "xapian.h"
|
#include "xapian.h"
|
||||||
|
|
||||||
// Data for a xapian database. There could actually be 2 different ones for
|
// Data for a xapian database. There could actually be 2 different
|
||||||
// indexing or query as there is not much in common.
|
// ones for indexing or query as there is not much in common.
|
||||||
class Native {
|
class Native {
|
||||||
public:
|
public:
|
||||||
bool isopen;
|
bool isopen;
|
||||||
@ -42,30 +43,30 @@ Rcl::Db::Db()
|
|||||||
|
|
||||||
Rcl::Db::~Db()
|
Rcl::Db::~Db()
|
||||||
{
|
{
|
||||||
cerr << "Rcl::Db::~Db" << endl;
|
LOGDEB(("Rcl::Db::~Db\n"));
|
||||||
if (pdata == 0)
|
if (pdata == 0)
|
||||||
return;
|
return;
|
||||||
Native *ndb = (Native *)pdata;
|
Native *ndb = (Native *)pdata;
|
||||||
cerr << "Db::~Db: isopen " << ndb->isopen << " iswritable " <<
|
LOGDEB(("Db::~Db: isopen %d iswritable %d\n", ndb->isopen,
|
||||||
ndb->iswritable << endl;
|
ndb->iswritable));
|
||||||
|
if (ndb->isopen == false)
|
||||||
|
return;
|
||||||
try {
|
try {
|
||||||
// There is nothing to do for an ro db.
|
LOGDEB(("Rcl::Db::~Db: deleting native database\n"));
|
||||||
if (ndb->isopen == false || ndb->iswritable == false) {
|
if (ndb->iswritable == true)
|
||||||
cerr << "Deleting native database" << endl;
|
ndb->wdb.flush();
|
||||||
delete ndb;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ndb->wdb.flush();
|
|
||||||
delete ndb;
|
delete ndb;
|
||||||
|
return;
|
||||||
} catch (const Xapian::Error &e) {
|
} catch (const Xapian::Error &e) {
|
||||||
cout << "Exception: " << e.get_msg() << endl;
|
cerr << "Exception: " << e.get_msg() << endl;
|
||||||
} catch (const string &s) {
|
} catch (const string &s) {
|
||||||
cout << "Exception: " << s << endl;
|
cerr << "Exception: " << s << endl;
|
||||||
} catch (const char *s) {
|
} catch (const char *s) {
|
||||||
cout << "Exception: " << s << endl;
|
cerr << "Exception: " << s << endl;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
cout << "Caught unknown exception" << endl;
|
cerr << "Caught unknown exception" << endl;
|
||||||
}
|
}
|
||||||
|
LOGERR(("Rcl::Db::~Db: got exception\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Rcl::Db::open(const string& dir, OpenMode mode)
|
bool Rcl::Db::open(const string& dir, OpenMode mode)
|
||||||
@ -73,8 +74,14 @@ bool Rcl::Db::open(const string& dir, OpenMode mode)
|
|||||||
if (pdata == 0)
|
if (pdata == 0)
|
||||||
return false;
|
return false;
|
||||||
Native *ndb = (Native *)pdata;
|
Native *ndb = (Native *)pdata;
|
||||||
cerr << "Db::open: isopen " << ndb->isopen << " iswritable " <<
|
LOGDEB(("Db::open: isopen %d iswritable %d\n", ndb->isopen,
|
||||||
ndb->iswritable << endl;
|
ndb->iswritable));
|
||||||
|
|
||||||
|
if (ndb->isopen) {
|
||||||
|
LOGERR(("Rcl::Db::open: already open\n"));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case DbUpd:
|
case DbUpd:
|
||||||
@ -95,44 +102,46 @@ bool Rcl::Db::open(const string& dir, OpenMode mode)
|
|||||||
ndb->isopen = true;
|
ndb->isopen = true;
|
||||||
return true;
|
return true;
|
||||||
} catch (const Xapian::Error &e) {
|
} catch (const Xapian::Error &e) {
|
||||||
cout << "Exception: " << e.get_msg() << endl;
|
cerr << "Exception: " << e.get_msg() << endl;
|
||||||
} catch (const string &s) {
|
} catch (const string &s) {
|
||||||
cout << "Exception: " << s << endl;
|
cerr << "Exception: " << s << endl;
|
||||||
} catch (const char *s) {
|
} catch (const char *s) {
|
||||||
cout << "Exception: " << s << endl;
|
cerr << "Exception: " << s << endl;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
cout << "Caught unknown exception" << endl;
|
cerr << "Caught unknown exception" << endl;
|
||||||
}
|
}
|
||||||
|
LOGERR(("Rcl::Db::open: got exception\n"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note: xapian has no close call, we delete and recreate the db
|
||||||
bool Rcl::Db::close()
|
bool Rcl::Db::close()
|
||||||
{
|
{
|
||||||
if (pdata == 0)
|
if (pdata == 0)
|
||||||
return false;
|
return false;
|
||||||
Native *ndb = (Native *)pdata;
|
Native *ndb = (Native *)pdata;
|
||||||
cerr << "Db::open: isopen " << ndb->isopen << " iswritable " <<
|
LOGDEB(("Db::close(): isopen %d iswritable %d\n", ndb->isopen,
|
||||||
ndb->iswritable << endl;
|
ndb->iswritable));
|
||||||
if (ndb->isopen == false)
|
if (ndb->isopen == false)
|
||||||
return true;
|
return true;
|
||||||
try {
|
try {
|
||||||
if (ndb->isopen == true && ndb->iswritable == true) {
|
if (ndb->iswritable == true)
|
||||||
ndb->wdb.flush();
|
ndb->wdb.flush();
|
||||||
}
|
|
||||||
delete ndb;
|
delete ndb;
|
||||||
} catch (const Xapian::Error &e) {
|
} catch (const Xapian::Error &e) {
|
||||||
cout << "Exception: " << e.get_msg() << endl;
|
cerr << "Exception: " << e.get_msg() << endl;
|
||||||
return false;
|
return false;
|
||||||
} catch (const string &s) {
|
} catch (const string &s) {
|
||||||
cout << "Exception: " << s << endl;
|
cerr << "Exception: " << s << endl;
|
||||||
return false;
|
return false;
|
||||||
} catch (const char *s) {
|
} catch (const char *s) {
|
||||||
cout << "Exception: " << s << endl;
|
cerr << "Exception: " << s << endl;
|
||||||
return false;
|
return false;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
cout << "Caught unknown exception" << endl;
|
cerr << "Caught unknown exception" << endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdata = new Native;
|
pdata = new Native;
|
||||||
if (pdata)
|
if (pdata)
|
||||||
return true;
|
return true;
|
||||||
@ -165,7 +174,7 @@ static bool splitCb(void *cdata, const std::string &term, int pos)
|
|||||||
data->curpos = pos;
|
data->curpos = pos;
|
||||||
data->doc.add_posting(term, data->basepos + data->curpos, 1);
|
data->doc.add_posting(term, data->basepos + data->curpos, 1);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
cerr << "Error occurred during add_posting" << endl;
|
LOGERR(("Error occurred during add_posting\n"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -242,7 +251,7 @@ bool Rcl::Db::add(const string &fn, const Rcl::Doc &doc)
|
|||||||
newdocument.add_term("T" + doc.mimetype);
|
newdocument.add_term("T" + doc.mimetype);
|
||||||
string pathterm = "P" + fn;
|
string pathterm = "P" + fn;
|
||||||
newdocument.add_term(pathterm);
|
newdocument.add_term(pathterm);
|
||||||
|
const char *fnc = fn.c_str();
|
||||||
if (1 /*dupes == DUPE_replace*/) {
|
if (1 /*dupes == DUPE_replace*/) {
|
||||||
// If this document has already been indexed, update the existing
|
// If this document has already been indexed, update the existing
|
||||||
// entry.
|
// entry.
|
||||||
@ -254,22 +263,22 @@ bool Rcl::Db::add(const string &fn, const Rcl::Doc &doc)
|
|||||||
#if 0
|
#if 0
|
||||||
if (did < updated.size()) {
|
if (did < updated.size()) {
|
||||||
updated[did] = true;
|
updated[did] = true;
|
||||||
//cout << "updated." << endl;
|
LOGDEB1(("%s updated\n", fnc));
|
||||||
} else {
|
} else {
|
||||||
//cout << "added." << endl;
|
LOGDEB1(("%s added\n", fnc));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
// FIXME: is this ever actually needed?
|
// FIXME: is this ever actually needed?
|
||||||
ndb->wdb.add_document(newdocument);
|
ndb->wdb.add_document(newdocument);
|
||||||
//cout << "added (failed re-seek for duplicate)." << endl;
|
LOGDEB1(("%s added (failed re-seek for duplicate).\n", fnc));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
ndb->wdb.add_document(newdocument);
|
ndb->wdb.add_document(newdocument);
|
||||||
// cout << "added." << endl;
|
LOGDEB1(("%s added\n", fnc));
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
cerr << "Got exception while adding doc" << endl;
|
LOGERR(("%s : Got exception while adding doc\n", fnc));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -293,7 +302,7 @@ bool Rcl::Db::needUpdate(const string &filename, const struct stat *stp)
|
|||||||
return true;
|
return true;
|
||||||
Xapian::Document doc = ndb->wdb.get_document(*did);
|
Xapian::Document doc = ndb->wdb.get_document(*did);
|
||||||
string data = doc.get_data();
|
string data = doc.get_data();
|
||||||
//cout << "DOCUMENT EXISTS " << data << endl;
|
//cerr << "DOCUMENT EXISTS " << data << endl;
|
||||||
const char *cp = strstr(data.c_str(), "mtime=");
|
const char *cp = strstr(data.c_str(), "mtime=");
|
||||||
cp += 6;
|
cp += 6;
|
||||||
long mtime = atol(cp);
|
long mtime = atol(cp);
|
||||||
@ -315,17 +324,10 @@ class wsQData {
|
|||||||
vector<string> terms;
|
vector<string> terms;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Callback for the document to word splitting class during indexation
|
// Callback for the query-to-words splitting
|
||||||
static bool splitQCb(void *cdata, const std::string &term, int )
|
static bool splitQCb(void *cdata, const std::string &term, int )
|
||||||
{
|
{
|
||||||
wsQData *data = (wsQData*)cdata;
|
wsQData *data = (wsQData*)cdata;
|
||||||
|
|
||||||
cerr << "splitQCb: term '" << term << "'" << endl;
|
|
||||||
cerr << "splitQCb: term length: " << term.length() << endl;
|
|
||||||
//string printable;
|
|
||||||
//transcode(term, printable, "UTF-8", "ISO8859-1");
|
|
||||||
//cerr << "Adding " << printable << endl;
|
|
||||||
|
|
||||||
data->terms.push_back(term);
|
data->terms.push_back(term);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -339,13 +341,10 @@ bool Rcl::Db::setQuery(const std::string &querystring)
|
|||||||
if (!dumb_string(querystring, noacc)) {
|
if (!dumb_string(querystring, noacc)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// noacc = querystring;
|
|
||||||
splitter.text_to_words(noacc);
|
splitter.text_to_words(noacc);
|
||||||
|
|
||||||
Native *ndb = (Native *)pdata;
|
Native *ndb = (Native *)pdata;
|
||||||
|
|
||||||
// splitData.terms.resize(0);
|
|
||||||
// splitData.terms.push_back(string("le"));
|
|
||||||
ndb->query = Xapian::Query(Xapian::Query::OP_OR, splitData.terms.begin(),
|
ndb->query = Xapian::Query(Xapian::Query::OP_OR, splitData.terms.begin(),
|
||||||
splitData.terms.end());
|
splitData.terms.end());
|
||||||
|
|
||||||
@ -354,15 +353,15 @@ bool Rcl::Db::setQuery(const std::string &querystring)
|
|||||||
|
|
||||||
bool Rcl::Db::getDoc(int i, Doc &doc)
|
bool Rcl::Db::getDoc(int i, Doc &doc)
|
||||||
{
|
{
|
||||||
// cerr << "Rcl::Db::getDoc: " << i << endl;
|
LOGDEB1(("Rcl::Db::getDoc: %d\n", i));
|
||||||
Native *ndb = (Native *)pdata;
|
Native *ndb = (Native *)pdata;
|
||||||
|
|
||||||
Xapian::Enquire enquire(ndb->db);
|
Xapian::Enquire enquire(ndb->db);
|
||||||
enquire.set_query(ndb->query);
|
enquire.set_query(ndb->query);
|
||||||
Xapian::MSet matches = enquire.get_mset(i, 1);
|
Xapian::MSet matches = enquire.get_mset(i, 1);
|
||||||
|
|
||||||
// cerr << "Query `" << ndb->query.get_description() << "'" <<
|
LOGDEB1(("Rcl::Db::getDoc: Query '%s' Estimated results: %d\n",
|
||||||
// "Estimated results: " << matches.get_matches_lower_bound() << endl;
|
ndb->query.get_description(), matches.get_matches_lower_bound()));
|
||||||
|
|
||||||
if (matches.empty())
|
if (matches.empty())
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
#ifndef _DB_H_INCLUDED_
|
#ifndef _DB_H_INCLUDED_
|
||||||
#define _DB_H_INCLUDED_
|
#define _DB_H_INCLUDED_
|
||||||
/* @(#$Id: rcldb.h,v 1.4 2005-01-24 13:17:58 dockes Exp $ (C) 2004 J.F.Dockes */
|
/* @(#$Id: rcldb.h,v 1.5 2005-01-25 14:37:21 dockes Exp $ (C) 2004 J.F.Dockes */
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@ -22,18 +22,18 @@ struct stat;
|
|||||||
namespace Rcl {
|
namespace Rcl {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holder for document attributes and data
|
* Dumb bunch holder for document attributes and data
|
||||||
*/
|
*/
|
||||||
class Doc {
|
class Doc {
|
||||||
public:
|
public:
|
||||||
string url;
|
std::string url;
|
||||||
string mimetype;
|
std::string mimetype;
|
||||||
string mtime; // Modification time as decimal ascii
|
std::string mtime; // Modification time as decimal ascii
|
||||||
string origcharset;
|
std::string origcharset;
|
||||||
string title;
|
std::string title;
|
||||||
string text;
|
std::string text;
|
||||||
string keywords;
|
std::string keywords;
|
||||||
string abstract;
|
std::string abstract;
|
||||||
void erase() {
|
void erase() {
|
||||||
url.erase();
|
url.erase();
|
||||||
mimetype.erase();
|
mimetype.erase();
|
||||||
@ -60,8 +60,8 @@ class Db {
|
|||||||
bool close();
|
bool close();
|
||||||
|
|
||||||
// Update-related functions
|
// Update-related functions
|
||||||
bool add(const string &filename, const Doc &doc);
|
bool add(const std::string &filename, const Doc &doc);
|
||||||
bool needUpdate(const string &filename, const struct stat *stp);
|
bool needUpdate(const std::string &filename, const struct stat *stp);
|
||||||
|
|
||||||
// Query-related functions
|
// Query-related functions
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,9 @@
|
|||||||
|
|
||||||
CXXFLAGS = -I.
|
CXXFLAGS = -I.
|
||||||
|
|
||||||
PROGS = trfstreewalk pathut execmd
|
BIGLIB = ../lib/librcl.a
|
||||||
|
|
||||||
|
PROGS = trfstreewalk trpathut execmd transcode
|
||||||
all: $(PROGS)
|
all: $(PROGS)
|
||||||
|
|
||||||
FSTREEWALK_OBJS= trfstreewalk.o fstreewalk.o pathut.o
|
FSTREEWALK_OBJS= trfstreewalk.o fstreewalk.o pathut.o
|
||||||
@ -10,14 +12,23 @@ trfstreewalk : $(FSTREEWALK_OBJS)
|
|||||||
trfstreewalk.o : fstreewalk.cpp fstreewalk.h
|
trfstreewalk.o : fstreewalk.cpp fstreewalk.h
|
||||||
$(CXX) -o trfstreewalk.o -c $(CXXFLAGS) \
|
$(CXX) -o trfstreewalk.o -c $(CXXFLAGS) \
|
||||||
-DTEST_FSTREEWALK fstreewalk.cpp
|
-DTEST_FSTREEWALK fstreewalk.cpp
|
||||||
|
|
||||||
PATHUT_OBJS= trpathut.o pathut.o
|
PATHUT_OBJS= trpathut.o pathut.o
|
||||||
trpathut : $(PATHUT_OBJS)
|
trpathut : $(PATHUT_OBJS)
|
||||||
$(CXX) -o trpathut $(PATHUT_OBJS)
|
$(CXX) -o trpathut $(PATHUT_OBJS)
|
||||||
trpathut.o : pathut.cpp pathut.h
|
trpathut.o : pathut.cpp pathut.h
|
||||||
$(CXX) -o trpathut.o -c $(CXXFLAGS) \
|
$(CXX) -o trpathut.o -c $(CXXFLAGS) \
|
||||||
-DTEST_PATHUT pathut.cpp
|
-DTEST_PATHUT pathut.cpp
|
||||||
|
|
||||||
execmd: pathut.o
|
execmd: pathut.o
|
||||||
$(CXX) -o execmd $(CXXFLAGS) execmd.cpp pathut.o
|
$(CXX) -o execmd $(CXXFLAGS) execmd.cpp pathut.o
|
||||||
|
|
||||||
|
TRANSCODE_OBJS= trtranscode.o $(BIGLIB)
|
||||||
|
transcode : $(TRANSCODE_OBJS)
|
||||||
|
$(CXX) $(CXXFLAGS) -o transcode $(TRANSCODE_OBJS) \
|
||||||
|
-L/usr/local/lib -liconv
|
||||||
|
trtranscode.o : ../utils/transcode.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -DTEST_TRANSCODE -c -o trtranscode.o \
|
||||||
|
transcode.cpp
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o $(PROGS)
|
rm -f *.o $(PROGS)
|
||||||
|
|||||||
@ -1,7 +1,9 @@
|
|||||||
#ifndef _TRANSCODE_H_INCLUDED_
|
#ifndef _TRANSCODE_H_INCLUDED_
|
||||||
#define _TRANSCODE_H_INCLUDED_
|
#define _TRANSCODE_H_INCLUDED_
|
||||||
/* @(#$Id: transcode.h,v 1.1 2004-12-15 09:43:48 dockes Exp $ (C) 2004 J.F.Dockes */
|
/* @(#$Id: transcode.h,v 1.2 2005-01-25 14:37:21 dockes Exp $ (C) 2004 J.F.Dockes */
|
||||||
|
/**
|
||||||
|
* A very minimal c++ized interface to iconv
|
||||||
|
*/
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
extern bool transcode(const std::string &in, std::string &out,
|
extern bool transcode(const std::string &in, std::string &out,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user