diff options
author | Peng Wu <alexepico@gmail.com> | 2016-02-05 16:47:11 +0800 |
---|---|---|
committer | Peng Wu <alexepico@gmail.com> | 2016-02-05 16:53:45 +0800 |
commit | 0d5cec839163b988213108ffcff3141aee7c898b (patch) | |
tree | cfe714d83d7a3fffd2c1761f91c5fa52a5093815 /src/storage/phrase_large_table3_kyotodb.cpp | |
parent | fa4f8cdc44f3825c5532227e90c6d9ed8c6fbe0d (diff) | |
download | libpinyin-0d5cec839163b988213108ffcff3141aee7c898b.tar.gz libpinyin-0d5cec839163b988213108ffcff3141aee7c898b.tar.xz libpinyin-0d5cec839163b988213108ffcff3141aee7c898b.zip |
write load_db/write_db methods
Diffstat (limited to 'src/storage/phrase_large_table3_kyotodb.cpp')
-rw-r--r-- | src/storage/phrase_large_table3_kyotodb.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/storage/phrase_large_table3_kyotodb.cpp b/src/storage/phrase_large_table3_kyotodb.cpp index 66b575e..ce99c99 100644 --- a/src/storage/phrase_large_table3_kyotodb.cpp +++ b/src/storage/phrase_large_table3_kyotodb.cpp @@ -22,6 +22,8 @@ #include "phrase_large_table3_kyotodb.h" #include "phrase_large_table3.h" #include <kchashdb.h> +#include <kcprotodb.h> + using namespace kyotocabinet; @@ -74,6 +76,7 @@ bool PhraseLargeTable3::attach(const char * dbfile, guint32 flags) { /* Use DB::visitor. */ +/* Kyoto Cabinet requires non-NULL pointer for zero length value. */ static const char * empty_vbuf = (char *)UINTPTR_MAX; /* Use CopyVisitor2 to avoid linking problems. */ @@ -97,4 +100,49 @@ public: } }; +/* load_db/store_db method */ +/* use in-memory DBM here, for better performance. */ +bool PhraseLargeTable3::load_db(const char * filename) { + reset(); + + /* create in-memory db. */ + m_db = new ProtoTreeDB; + + if (!m_db->open("-", BasicDB::OREADER|BasicDB::OWRITER|BasicDB::OCREATE)) + return false; + + /* load db into memory. */ + BasicDB * tmp_db = new TreeDB; + if (!tmp_db->open(filename, BasicDB::OREADER)) + return false; + + CopyVisitor2 visitor(m_db); + tmp_db->iterate(&visitor, false); + + tmp_db->close(); + delete tmp_db; + + return true; +} + +bool PhraseLargeTable3::store_db(const char * new_filename){ + int ret = unlink(new_filename); + if ( ret != 0 && errno != ENOENT) + return false; + + BasicDB * tmp_db = new TreeDB; + if (!tmp_db->open(new_filename, BasicDB::OWRITER|BasicDB::OCREATE)) + return false; + + CopyVisitor2 visitor(tmp_db); + m_db->iterate(&visitor, false); + + tmp_db->synchronize(); + tmp_db->close(); + delete tmp_db; + + return true; +} + + }; |