00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef OM_HGUARD_FLINT_DATABASE_H
00025 #define OM_HGUARD_FLINT_DATABASE_H
00026
00027 #include "database.h"
00028 #include "flint_positionlist.h"
00029 #include "flint_postlist.h"
00030 #include "flint_record.h"
00031 #include "flint_spelling.h"
00032 #include "flint_synonym.h"
00033 #include "flint_termlisttable.h"
00034 #include "flint_values.h"
00035 #include "flint_version.h"
00036 #include "../flint_lock.h"
00037
00038 #include "flint_types.h"
00039
00040 #include <map>
00041
00042 class FlintTermList;
00043 class FlintAllDocsPostList;
00044 class RemoteConnection;
00045
00049 class FlintDatabase : public Xapian::Database::Internal {
00050 friend class FlintWritableDatabase;
00051 friend class FlintTermList;
00052 friend class FlintPostList;
00053 friend class FlintAllTermsList;
00054 friend class FlintAllDocsPostList;
00055 private:
00058 std::string db_dir;
00059
00062 bool readonly;
00063
00068 FlintVersion version_file;
00069
00076 mutable FlintPostListTable postlist_table;
00077
00080 FlintPositionListTable position_table;
00081
00084 FlintTermListTable termlist_table;
00085
00088 FlintValueTable value_table;
00089
00092 mutable FlintSynonymTable synonym_table;
00093
00096 mutable FlintSpellingTable spelling_table;
00097
00106 FlintRecordTable record_table;
00107
00109 FlintLock lock;
00110
00112 mutable totlen_t total_length;
00113
00115 mutable Xapian::docid lastdocid;
00116
00119 unsigned int max_changesets;
00120
00122 void read_metainfo();
00123
00127 bool database_exists();
00128
00132 void create_and_open_tables(unsigned int blocksize);
00133
00139 void open_tables_consistent();
00140
00148 void get_database_write_lock(bool creating);
00149
00155 void open_tables(flint_revision_number_t revision);
00156
00162 flint_revision_number_t get_revision_number() const;
00163
00169 flint_revision_number_t get_next_revision_number() const;
00170
00181 void set_revision_number(flint_revision_number_t new_revision);
00182
00186 void reopen();
00187
00190 void close();
00191
00197 void modifications_failed(flint_revision_number_t old_revision,
00198 flint_revision_number_t new_revision,
00199 const std::string & msg);
00200
00209 void apply();
00210
00213 void cancel();
00214
00217 void send_whole_database(RemoteConnection & conn, double end_time);
00218
00221 void get_changeset_revisions(const string & path,
00222 flint_revision_number_t * startrev,
00223 flint_revision_number_t * endrev) const;
00224 public:
00244 FlintDatabase(const string &db_dir_, int action = XAPIAN_DB_READONLY,
00245 unsigned int block_size = 0u);
00246
00247 ~FlintDatabase();
00248
00251 Xapian::doccount get_doccount() const;
00252 Xapian::docid get_lastdocid() const;
00253 totlen_t get_total_length() const;
00254 Xapian::doclength get_avlength() const;
00255 Xapian::termcount get_doclength(Xapian::docid did) const;
00256 Xapian::doccount get_termfreq(const string & tname) const;
00257 Xapian::termcount get_collection_freq(const string & tname) const;
00258 bool term_exists(const string & tname) const;
00259 bool has_positions() const;
00260
00261 LeafPostList * open_post_list(const string & tname) const;
00262 Xapian::Document::Internal * open_document(Xapian::docid did, bool lazy) const;
00263
00264 PositionList * open_position_list(Xapian::docid did, const string & term) const;
00265 TermList * open_term_list(Xapian::docid did) const;
00266 TermList * open_allterms(const string & prefix) const;
00267
00268 TermList * open_spelling_termlist(const string & word) const;
00269 TermList * open_spelling_wordlist() const;
00270 Xapian::doccount get_spelling_frequency(const string & word) const;
00271
00272 TermList * open_synonym_termlist(const string & term) const;
00273 TermList * open_synonym_keylist(const string & prefix) const;
00274
00275 string get_metadata(const string & key) const;
00276 TermList * open_metadata_keylist(const std::string &prefix) const;
00277 void write_changesets_to_fd(int fd,
00278 const string & start_revision,
00279 bool need_whole_db,
00280 Xapian::ReplicationInfo * info);
00281 string get_revision_info() const;
00282 string get_uuid() const;
00284
00285 };
00286
00289 class FlintWritableDatabase : public FlintDatabase {
00291 mutable map<string, pair<Xapian::termcount_diff, Xapian::termcount_diff> >
00292 freq_deltas;
00293
00295 mutable map<Xapian::docid, Xapian::termcount> doclens;
00296
00298 mutable map<string, map<Xapian::docid,
00299 pair<char, Xapian::termcount> > > mod_plists;
00300
00304 mutable Xapian::doccount change_count;
00305
00307 Xapian::doccount flush_threshold;
00308
00315 mutable Xapian::Document::Internal * modify_shortcut_document;
00316
00319 mutable Xapian::docid modify_shortcut_docid;
00320
00322 void flush_postlist_changes() const;
00323
00325 void close();
00326
00333 void add_freq_delta(const string & tname,
00334 Xapian::termcount_diff tf_delta,
00335 Xapian::termcount_diff cf_delta);
00336
00343 void insert_mod_plist(Xapian::docid did,
00344 const string & tname,
00345 Xapian::termcount wdf);
00346
00358 void update_mod_plist(Xapian::docid did,
00359 const string & tname,
00360 char type,
00361 Xapian::termcount wdf);
00362
00364
00367 void commit();
00368
00370 void cancel();
00371
00372 Xapian::docid add_document(const Xapian::Document & document);
00373 Xapian::docid add_document_(Xapian::docid did, const Xapian::Document & document);
00374
00375
00376
00377
00378
00379 #ifndef _MSC_VER
00380 using Xapian::Database::Internal::delete_document;
00381 using Xapian::Database::Internal::replace_document;
00382 #endif
00383 void delete_document(Xapian::docid did);
00384 void replace_document(Xapian::docid did, const Xapian::Document & document);
00385
00386 Xapian::Document::Internal * open_document(Xapian::docid did,
00387 bool lazy = false) const;
00388
00390
00391 public:
00403 FlintWritableDatabase(const string &dir, int action, int block_size);
00404
00405 ~FlintWritableDatabase();
00406
00409 Xapian::termcount get_doclength(Xapian::docid did) const;
00410 Xapian::doccount get_termfreq(const string & tname) const;
00411 Xapian::termcount get_collection_freq(const string & tname) const;
00412 bool term_exists(const string & tname) const;
00413
00414 LeafPostList * open_post_list(const string & tname) const;
00415 TermList * open_allterms(const string & prefix) const;
00416
00417 void add_spelling(const string & word, Xapian::termcount freqinc) const;
00418 void remove_spelling(const string & word, Xapian::termcount freqdec) const;
00419 TermList * open_spelling_wordlist() const;
00420
00421 TermList * open_synonym_keylist(const string & prefix) const;
00422 void add_synonym(const string & word, const string & synonym) const;
00423 void remove_synonym(const string & word, const string & synonym) const;
00424 void clear_synonyms(const string & word) const;
00425
00426 void set_metadata(const string & key, const string & value);
00427 void invalidate_doc_object(Xapian::Document::Internal * obj) const;
00429 };
00430
00431 #endif