diff options
author | Peng Wu <alexepico@gmail.com> | 2016-02-19 14:22:48 +0800 |
---|---|---|
committer | Peng Wu <alexepico@gmail.com> | 2016-02-19 14:22:48 +0800 |
commit | aa7c854dbe00e9ad2cb42db54c22130d59b48409 (patch) | |
tree | 97f44647a80fbe02044ed8ad5b48544179eaee2e /src/storage/phrase_large_table3_kyotodb.cpp | |
parent | 00a5bc60af4476c8964ff7bb1d845f5b4b29baca (diff) | |
download | libpinyin-aa7c854dbe00e9ad2cb42db54c22130d59b48409.tar.gz libpinyin-aa7c854dbe00e9ad2cb42db54c22130d59b48409.tar.xz libpinyin-aa7c854dbe00e9ad2cb42db54c22130d59b48409.zip |
write mask_out method
Diffstat (limited to 'src/storage/phrase_large_table3_kyotodb.cpp')
-rw-r--r-- | src/storage/phrase_large_table3_kyotodb.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/storage/phrase_large_table3_kyotodb.cpp b/src/storage/phrase_large_table3_kyotodb.cpp index 1ccc794..5327b2e 100644 --- a/src/storage/phrase_large_table3_kyotodb.cpp +++ b/src/storage/phrase_large_table3_kyotodb.cpp @@ -67,6 +67,7 @@ bool PhraseLargeTable3::attach(const char * dbfile, guint32 flags) { return false; m_db = new TreeDB; + m_entry = new PhraseTableEntry; return m_db->open(dbfile, mode); } @@ -120,6 +121,8 @@ bool PhraseLargeTable3::load_db(const char * filename) { tmp_db->close(); delete tmp_db; + m_entry = new PhraseTableEntry; + return true; } @@ -267,4 +270,56 @@ int PhraseLargeTable3::remove_index(int phrase_length, return ERROR_OK; } + +class MaskOutVisitor : public DB::Visitor { +private: + BasicDB * m_db; + phrase_token_t m_mask; + phrase_token_t m_value; + + PhraseTableEntry m_entry; +public: + MaskOutVisitor(BasicDB * db, phrase_token_t mask, phrase_token_t value) { + m_db = db; + m_mask = mask; + m_value = value; + } + + virtual const char* visit_full(const char* kbuf, size_t ksiz, + const char* vbuf, size_t vsiz, size_t* sp) { + m_entry.m_chunk.set_content(0, vbuf, vsiz); + m_entry.mask_out(m_mask, m_value); + + vbuf = (char *) m_entry.m_chunk.begin(); + vsiz = m_entry.m_chunk.size(); + assert(m_db->set(kbuf, ksiz, vbuf, vsiz)); + return NOP; + } + + virtual const char* visit_empty(const char* kbuf, size_t ksiz, size_t* sp) { + m_db->set(kbuf, ksiz, empty_vbuf, 0); + return NOP; + } +}; + +/* mask out method */ +/* assume it is in-memory dbm. */ +bool PhraseLargeTable3::mask_out(phrase_token_t mask, + phrase_token_t value) { + /* use copy and sweep algorithm here. */ + BasicDB * tmp_db = new ProtoTreeDB; + if (!tmp_db->open("-", BasicDB::OREADER|BasicDB::OWRITER|BasicDB::OCREATE)) + return false; + + MaskOutVisitor visitor(tmp_db, mask, value); + m_db->iterate(&visitor, false); + + reset(); + + m_db = tmp_db; + m_entry = new PhraseTableEntry; + + return true; +} + }; |