summaryrefslogtreecommitdiffstats
path: root/src/storage/phrase_large_table3_kyotodb.cpp
diff options
context:
space:
mode:
authorPeng Wu <alexepico@gmail.com>2016-02-05 16:47:11 +0800
committerPeng Wu <alexepico@gmail.com>2016-02-05 16:53:45 +0800
commit0d5cec839163b988213108ffcff3141aee7c898b (patch)
treecfe714d83d7a3fffd2c1761f91c5fa52a5093815 /src/storage/phrase_large_table3_kyotodb.cpp
parentfa4f8cdc44f3825c5532227e90c6d9ed8c6fbe0d (diff)
downloadlibpinyin-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.cpp48
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;
+}
+
+
};