00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023
00024 #include "api_closedb.h"
00025
00026 #include <xapian.h>
00027
00028 #include "apitest.h"
00029 #include "testutils.h"
00030
00031 using namespace std;
00032
00033 #define COUNT_CLOSEDEXC(CODE) \
00034 try { CODE; } catch (const Xapian::DatabaseError &) { ++closedexc_count; }
00035
00036 #define IF_NOT_CLOSEDEXC(CODE) \
00037 do { \
00038 hadexc = false; \
00039 try { \
00040 CODE; \
00041 } catch (const Xapian::DatabaseError &) { \
00042 ++closedexc_count; \
00043 hadexc = true; \
00044 } \
00045 } while (false); if (hadexc)
00046
00047
00048 struct closedb1_iterators {
00049 Xapian::Database db;
00050 Xapian::Document doc1;
00051 Xapian::PostingIterator pl1;
00052 Xapian::PostingIterator pl2;
00053 Xapian::PostingIterator plend;
00054
00055 void setup(Xapian::Database db_) {
00056 db = db_;
00057
00058
00059 pl1 = db.postlist_begin("paragraph");
00060 pl2 = db.postlist_begin("paragraph");
00061 ++pl2;
00062 plend = db.postlist_end("paragraph");
00063 }
00064
00065 int perform() {
00066 int closedexc_count = 0;
00067 bool hadexc;
00068
00069
00070 IF_NOT_CLOSEDEXC(doc1 = db.get_document(1)) {
00071 COUNT_CLOSEDEXC(TEST_EQUAL(doc1.get_data().substr(0, 33),
00072 "This is a test document used with"));
00073 COUNT_CLOSEDEXC(doc1.termlist_begin());
00074 }
00075
00076
00077
00078 COUNT_CLOSEDEXC(db.postlist_begin("paragraph"));
00079 COUNT_CLOSEDEXC(db.get_document(1).get_value(1));
00080
00081
00082 COUNT_CLOSEDEXC(db.reopen());
00083
00084 TEST_NOT_EQUAL(pl1, plend);
00085
00086 COUNT_CLOSEDEXC(db.postlist_begin("paragraph"));
00087
00088 COUNT_CLOSEDEXC(TEST_EQUAL(*pl1, 1));
00089 COUNT_CLOSEDEXC(TEST_EQUAL(pl1.get_doclength(), 28));
00090
00091
00092
00093 bool advanced = false;
00094 try {
00095 ++pl1;
00096 advanced = true;
00097 } catch (const Xapian::DatabaseError &) {}
00098
00099 if (advanced) {
00100 COUNT_CLOSEDEXC(TEST_EQUAL(*pl1, 2));
00101 COUNT_CLOSEDEXC(TEST_EQUAL(pl1.get_doclength(), 81));
00102 }
00103
00104 return closedexc_count;
00105 }
00106 };
00107
00108
00109 DEFINE_TESTCASE(closedb1, backend) {
00110 Xapian::Database db(get_database("apitest_simpledata"));
00111 closedb1_iterators iters;
00112
00113
00114 iters.setup(db);
00115 int closedexc_count = iters.perform();
00116 TEST_EQUAL(closedexc_count, 0);
00117
00118
00119 iters.setup(db);
00120
00121
00122 db.close();
00123
00124
00125 TEST_EXCEPTION(Xapian::DatabaseError, db.reopen());
00126
00127
00128 closedexc_count = iters.perform();
00129 TEST_NOT_EQUAL(closedexc_count, 0);
00130
00131
00132 db.close();
00133
00134 return true;
00135 }
00136
00137
00138 DEFINE_TESTCASE(closedb2, writable && !inmemory && !remote) {
00139 Xapian::WritableDatabase dbw1(get_named_writable_database("apitest_closedb2"));
00140 TEST_EXCEPTION(Xapian::DatabaseLockError,
00141 Xapian::WritableDatabase db(get_named_writable_database_path("apitest_closedb2"),
00142 Xapian::DB_OPEN));
00143 dbw1.close();
00144 Xapian::WritableDatabase dbw2 = get_named_writable_database("apitest_closedb2");
00145 TEST_EXCEPTION(Xapian::DatabaseError, dbw1.postlist_begin("paragraph"));
00146 TEST_EQUAL(dbw2.postlist_begin("paragraph"), dbw2.postlist_end("paragraph"));
00147
00148 return true;
00149 }
00150
00152 DEFINE_TESTCASE(closedb3, backend) {
00153 Xapian::Database db(get_database("etext"));
00154 db.close();
00155 try {
00156 TEST(db.has_positions());
00157 } catch (const Xapian::DatabaseError &) {
00158 }
00159 try {
00160 TEST_EQUAL(db.get_doccount(), 566);
00161 } catch (const Xapian::DatabaseError &) {
00162 }
00163 return true;
00164 }
00165
00167 DEFINE_TESTCASE(closedb4, writable && !inmemory) {
00168 Xapian::WritableDatabase wdb(get_writable_database());
00169 wdb.add_document(Xapian::Document());
00170 TEST_EQUAL(wdb.get_doccount(), 1);
00171 wdb.close();
00172 Xapian::Database db(get_writable_database_as_database());
00173 TEST_EQUAL(db.get_doccount(), 1);
00174 return true;
00175 }
00176
00178 DEFINE_TESTCASE(closedb5, transactions && !remote) {
00179
00180
00181 {
00182 Xapian::WritableDatabase wdb = get_writable_database();
00183 wdb.begin_transaction();
00184 wdb.add_document(Xapian::Document());
00185 TEST_EQUAL(wdb.get_doccount(), 1);
00186 wdb.close();
00187 Xapian::Database db = get_writable_database_as_database();
00188 TEST_EQUAL(db.get_doccount(), 0);
00189 }
00190
00191 {
00192
00193 Xapian::WritableDatabase wdb = get_writable_database();
00194 wdb.begin_transaction(false);
00195 wdb.add_document(Xapian::Document());
00196 TEST_EQUAL(wdb.get_doccount(), 1);
00197 wdb.close();
00198 Xapian::Database db = get_writable_database_as_database();
00199 TEST_EQUAL(db.get_doccount(), 0);
00200 }
00201 return true;
00202 }