--- a/src/rcldb/synfamily.cpp
+++ b/src/rcldb/synfamily.cpp
@@ -19,8 +19,7 @@
#include "autoconfig.h"
#include "debuglog.h"
-#include "rcldb.h"
-#include "rcldb_p.h"
+#include "xmacros.h"
#include "synfamily.h"
#include <iostream>
@@ -148,4 +147,145 @@
}
#else // TEST_SYNFAMILY
+#include "autoconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <strings.h>
+
+#include <iostream>
+#include <string>
+#include <vector>
+using namespace std;
+
+#include "xapian.h"
+
+#include "smallut.h"
+#include "pathut.h"
+#include "xmacros.h"
+#include "synfamily.h"
+
+static string thisprog;
+static int op_flags;
+#define OPT_a 0x4
+#define OPT_c 0x8
+#define OPT_D 0x1
+#define OPT_d 0x10
+#define OPT_L 0x2
+#define OPT_l 0x20
+#define OPT_s 0x40
+#define OPT_e 0x80
+static string usage =
+ " -d <dbdir> {-s|-a|-c} database dir and synfamily: stem accents case\n"
+ " -l : list members\n"
+ " -L <member>: list entries for given member\n"
+ " -e <member> <key> : list expansion for given member and key\n"
+ " -D <member>: delete member\n"
+ " \n\n"
+ ;
+static void Usage(void)
+{
+ cerr << thisprog << ": usage:\n" << usage;
+ exit(1);
+}
+
+int main(int argc, char **argv)
+{
+ string dbdir(path_tildexpand("~/.recoll/xapiandb"));
+ string outencoding = "UTF-8";
+ string member;
+ string key;
+
+ thisprog = argv[0];
+ argc--; argv++;
+
+ while (argc > 0 && **argv == '-') {
+ (*argv)++;
+ if (!(**argv))
+ /* Cas du "adb - core" */
+ Usage();
+ while (**argv)
+ switch (*(*argv)++) {
+ case 'a': op_flags |= OPT_a; break;
+ case 'c': op_flags |= OPT_c; break;
+ case 'D': op_flags |= OPT_D; break;
+ case 'd': op_flags |= OPT_d; if (argc < 2) Usage();
+ dbdir = *(++argv); argc--;
+ goto b1;
+ case 'e': op_flags |= OPT_e; if (argc < 3) Usage();
+ member = *(++argv);argc--;
+ key = *(++argv); argc--;
+ goto b1;
+ case 'l': op_flags |= OPT_l; break;
+ case 'L': op_flags |= OPT_L; if (argc < 2) Usage();
+ member = *(++argv); argc--;
+ goto b1;
+ case 's': op_flags |= OPT_s; break;
+ default: Usage(); break;
+ }
+ b1: argc--; argv++;
+ }
+
+ if (argc != 0)
+ Usage();
+
+ // We do stem only for now
+ string familyname;
+ if (op_flags & (OPT_a|OPT_c)) {
+ cerr << "Accents and case not ready" << endl;
+ return 1;
+ } else {
+ op_flags |= OPT_s;
+ familyname = Rcl::synFamStem;
+ }
+ if ((op_flags & (OPT_l|OPT_L|OPT_D|OPT_e)) == 0)
+ Usage();
+
+ string ermsg;
+ try {
+ if ((op_flags & (OPT_D)) == 0) { // Need write ?
+ Xapian::Database db(dbdir);
+ Rcl::XapSynFamily fam(db, familyname);
+ if (op_flags & OPT_l) {
+ vector<string> members;
+ if (!fam.getMembers(members)) {
+ cerr << "getMembers error" << endl;
+ return 1;
+ }
+ string out;
+ stringsToString(members, out);
+ cout << "Family: " << familyname << " Members: " << out << endl;
+ } else if (op_flags & OPT_L) {
+ fam.listMap(member);
+ } else if (op_flags & OPT_e) {
+ vector<string> exp;
+ if (!fam.synExpand(member, key, exp)) {
+ cerr << "expand error" << endl;
+ return 1;
+ }
+ string out;
+ stringsToString(exp, out);
+ cout << "Family: " << familyname << " Key: " << key
+ << " Expansion: " << out << endl;
+ } else {
+ Usage();
+ }
+
+ } else {
+ Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OPEN);
+ Rcl::XapWritableSynFamily fam(db, familyname);
+ if (op_flags & OPT_D) {
+ } else {
+ Usage();
+ }
+ }
+ } XCATCHERROR (ermsg);
+ if (!ermsg.empty()) {
+ cerr << "Xapian Exception: " << ermsg << endl;
+ return 1;
+ }
+ return 0;
+}
+
#endif // TEST_SYNFAMILY