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_metadata.h"
00025
00026 #include <xapian.h>
00027
00028 #include "apitest.h"
00029 #include "testsuite.h"
00030 #include "testutils.h"
00031
00032 #include <string>
00033
00034 using namespace std;
00035
00036
00037 DEFINE_TESTCASE(metadata1, writable) {
00038 Xapian::WritableDatabase db = get_writable_database();
00039
00040 TEST_EQUAL(db.get_metadata("foo"), "");
00041 try {
00042 db.set_metadata("foo", "bar");
00043 } catch (const Xapian::UnimplementedError &) {
00044 SKIP_TEST("Metadata not supported by this backend");
00045 }
00046 TEST_EQUAL(db.get_metadata("foo"), "bar");
00047 db.set_metadata("foo", "baz");
00048 TEST_EQUAL(db.get_doccount(), 0);
00049 TEST_EQUAL(db.get_metadata("foo"), "baz");
00050 db.set_metadata("foo", "");
00051 TEST_EQUAL(db.get_metadata("foo"), "");
00052
00053 TEST_EQUAL(db.get_doccount(), 0);
00054
00055
00056 db.set_metadata("foo", "value of foo");
00057 db.set_metadata(string("foo\0bar", 7), string(1, '\0'));
00058 db.set_metadata(string("foo\0", 4), string("foo\0bar", 7));
00059
00060 TEST_EQUAL(db.get_metadata("foo"), "value of foo");
00061 TEST_EQUAL(db.get_metadata(string("foo\0bar", 7)), string(1, '\0'));
00062 TEST_EQUAL(db.get_metadata(string("foo\0", 4)), string("foo\0bar", 7));
00063
00064 db.commit();
00065
00066 TEST_EQUAL(db.get_metadata("foo"), "value of foo");
00067 TEST_EQUAL(db.get_metadata(string("foo\0bar", 7)), string(1, '\0'));
00068 TEST_EQUAL(db.get_metadata(string("foo\0", 4)), string("foo\0bar", 7));
00069
00070 return true;
00071 }
00072
00073
00074 DEFINE_TESTCASE(metadata2, metadata && !inmemory) {
00075 Xapian::WritableDatabase db = get_writable_database();
00076 Xapian::Database dbr = get_writable_database_as_database();
00077
00078 TEST_EQUAL(db.get_metadata("foo"), "");
00079 db.set_metadata("foo", "bar");
00080 TEST_EQUAL(db.get_metadata("foo"), "bar");
00081 TEST_EQUAL(dbr.get_metadata("foo"), "");
00082 db.commit();
00083 TEST_EQUAL(dbr.get_metadata("foo"), "");
00084 dbr.reopen();
00085 TEST_EQUAL(db.get_metadata("foo"), "bar");
00086 TEST_EQUAL(dbr.get_metadata("foo"), "bar");
00087 TEST_EQUAL(dbr.get_doccount(), 0);
00088
00089 db.add_document(Xapian::Document());
00090 db.set_metadata("foo", "baz");
00091 TEST_EQUAL(db.get_doccount(), 1);
00092 TEST_EQUAL(db.get_metadata("foo"), "baz");
00093 db.commit();
00094
00095 TEST_EQUAL(dbr.get_metadata("foo"), "bar");
00096 dbr.reopen();
00097 TEST_EQUAL(dbr.get_metadata("foo"), "baz");
00098
00099 db.set_metadata("foo", "");
00100 TEST_EQUAL(db.get_metadata("foo"), "");
00101 db.commit();
00102 TEST_EQUAL(dbr.get_metadata("foo"), "baz");
00103 dbr.reopen();
00104 TEST_EQUAL(dbr.get_metadata("foo"), "");
00105
00106 TEST_EQUAL(db.get_doccount(), 1);
00107
00108 return true;
00109 }
00110
00111
00112 DEFINE_TESTCASE(metadata3, metadata) {
00113 Xapian::WritableDatabase db = get_writable_database();
00114
00115 TEST_EXCEPTION(Xapian::InvalidArgumentError, db.get_metadata(""));
00116 TEST_EXCEPTION(Xapian::InvalidArgumentError, db.set_metadata("", "foo"));
00117 TEST_EXCEPTION(Xapian::InvalidArgumentError, db.get_metadata(""));
00118
00119 return true;
00120 }
00121
00122
00123
00124 DEFINE_TESTCASE(metadata4, metadata && !inmemory) {
00125 Xapian::WritableDatabase db = get_writable_database();
00126
00127 db.set_metadata("foo", "foo");
00128 db.commit();
00129
00130 Xapian::Document doc;
00131 doc.add_posting("foo", 1);
00132 db.add_document(doc);
00133
00134 Xapian::Database dbr(get_writable_database_as_database());
00135
00136 return true;
00137 }
00138
00139
00140 DEFINE_TESTCASE(metadata5, writable) {
00141 Xapian::WritableDatabase db = get_writable_database();
00142
00143
00144 Xapian::TermIterator iter;
00145 iter = db.metadata_keys_begin();
00146 TEST_EQUAL(iter, db.metadata_keys_end());
00147
00148
00149
00150 SKIP_TEST_FOR_BACKEND("inmemory");
00151
00152 try {
00153 db.set_metadata("foo", "val");
00154 } catch (const Xapian::UnimplementedError &) {
00155 SKIP_TEST("Metadata not supported by this backend");
00156 }
00157 db.commit();
00158
00159
00160 iter = db.metadata_keys_begin();
00161 TEST(iter != db.metadata_keys_end());
00162 TEST_EQUAL(*iter, "foo");
00163 ++iter;
00164 TEST(iter == db.metadata_keys_end());
00165
00166
00167 Xapian::Document doc;
00168 doc.add_posting("foo", 1);
00169 db.add_document(doc);
00170 db.commit();
00171
00172 iter = db.metadata_keys_begin();
00173 TEST(iter != db.metadata_keys_end());
00174 TEST_EQUAL(*iter, "foo");
00175 ++iter;
00176 TEST(iter == db.metadata_keys_end());
00177
00178
00179
00180 db.set_metadata("foo", "");
00181 db.commit();
00182 iter = db.metadata_keys_begin();
00183 TEST(iter == db.metadata_keys_end());
00184
00185
00186 db.set_metadata("a", "val");
00187 db.set_metadata("foo", "val");
00188 db.set_metadata("foo1", "val");
00189 db.set_metadata("foo2", "val");
00190 db.set_metadata("z", "val");
00191 db.commit();
00192
00193 iter = db.metadata_keys_begin();
00194 TEST(iter != db.metadata_keys_end());
00195 TEST_EQUAL(*iter, "a");
00196 ++iter;
00197 TEST(iter != db.metadata_keys_end());
00198 TEST_EQUAL(*iter, "foo");
00199 ++iter;
00200 TEST(iter != db.metadata_keys_end());
00201 TEST_EQUAL(*iter, "foo1");
00202 ++iter;
00203 TEST(iter != db.metadata_keys_end());
00204 TEST_EQUAL(*iter, "foo2");
00205 ++iter;
00206 TEST(iter != db.metadata_keys_end());
00207 TEST_EQUAL(*iter, "z");
00208 ++iter;
00209 TEST(iter == db.metadata_keys_end());
00210
00211 iter = db.metadata_keys_begin("foo");
00212 TEST(iter != db.metadata_keys_end("foo"));
00213 TEST_EQUAL(*iter, "foo");
00214 ++iter;
00215 TEST(iter != db.metadata_keys_end("foo"));
00216 TEST_EQUAL(*iter, "foo1");
00217 ++iter;
00218 TEST(iter != db.metadata_keys_end("foo"));
00219 TEST_EQUAL(*iter, "foo2");
00220 ++iter;
00221 TEST(iter == db.metadata_keys_end("foo"));
00222
00223 iter = db.metadata_keys_begin("foo1");
00224 TEST(iter != db.metadata_keys_end("foo1"));
00225 TEST_EQUAL(*iter, "foo1");
00226 ++iter;
00227 TEST(iter == db.metadata_keys_end("foo1"));
00228
00229 iter = db.metadata_keys_begin();
00230 TEST(iter != db.metadata_keys_end());
00231 TEST_EQUAL(*iter, "a");
00232
00233
00234 iter.skip_to("");
00235 TEST(iter != db.metadata_keys_end());
00236 TEST_EQUAL(*iter, "a");
00237
00238
00239 iter.skip_to("foo1");
00240 TEST(iter != db.metadata_keys_end());
00241 TEST_EQUAL(*iter, "foo1");
00242
00243
00244 iter.skip_to("foo1");
00245 TEST(iter != db.metadata_keys_end());
00246 TEST_EQUAL(*iter, "foo1");
00247
00248
00249 iter.skip_to("a");
00250 TEST(iter != db.metadata_keys_end());
00251 TEST_REL(*iter, <=, "foo1");
00252
00253
00254 iter.skip_to("foo1");
00255 TEST(iter != db.metadata_keys_end());
00256 TEST_EQUAL(*iter, "foo1");
00257
00258
00259 ++iter;
00260 TEST(iter != db.metadata_keys_end());
00261 TEST_EQUAL(*iter, "foo2");
00262
00263
00264 iter.skip_to("zoo");
00265 TEST(iter == db.metadata_keys_end());
00266
00267 return true;
00268 }
00269
00271 DEFINE_TESTCASE(writeread1, writable && metadata) {
00272 Xapian::WritableDatabase db_w = get_writable_database();
00273 db_w.set_metadata("1", "2");
00274 string longitem(20000, 'j');
00275 db_w.set_metadata("2", longitem);
00276
00277 string readitem = db_w.get_metadata("2");
00278 TEST_EQUAL(readitem, longitem);
00279
00280 return true;
00281 }