summaryrefslogtreecommitdiffstats
path: root/src/storage/phrase_large_table3_kyotodb.cpp
diff options
context:
space:
mode:
authorPeng Wu <alexepico@gmail.com>2016-02-05 16:17:56 +0800
committerPeng Wu <alexepico@gmail.com>2016-02-05 16:17:56 +0800
commit21f1ccd98393aa1d4e63766cf4edf633b1d49d3c (patch)
tree89b8a26362a21c0d16e1eb3574590bf7da896315 /src/storage/phrase_large_table3_kyotodb.cpp
parent94f9dcccec57f245c765eeac3a4fcd716ac733ec (diff)
downloadlibpinyin-21f1ccd98393aa1d4e63766cf4edf633b1d49d3c.tar.gz
libpinyin-21f1ccd98393aa1d4e63766cf4edf633b1d49d3c.tar.xz
libpinyin-21f1ccd98393aa1d4e63766cf4edf633b1d49d3c.zip
write attach method
Diffstat (limited to 'src/storage/phrase_large_table3_kyotodb.cpp')
-rw-r--r--src/storage/phrase_large_table3_kyotodb.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/storage/phrase_large_table3_kyotodb.cpp b/src/storage/phrase_large_table3_kyotodb.cpp
index 32d8a8d..66b575e 100644
--- a/src/storage/phrase_large_table3_kyotodb.cpp
+++ b/src/storage/phrase_large_table3_kyotodb.cpp
@@ -20,7 +20,10 @@
*/
#include "phrase_large_table3_kyotodb.h"
+#include "phrase_large_table3.h"
+#include <kchashdb.h>
+using namespace kyotocabinet;
namespace pinyin{
@@ -45,4 +48,53 @@ void PhraseLargeTable3::reset() {
}
}
+
+/* attach method */
+bool PhraseLargeTable3::attach(const char * dbfile, guint32 flags) {
+ reset();
+ uint32_t mode = 0;
+
+ if (flags & ATTACH_READONLY)
+ mode |= BasicDB::OREADER;
+ if (flags & ATTACH_READWRITE) {
+ assert( !( flags & ATTACH_READONLY ) );
+ mode |= BasicDB::OREADER | BasicDB::OWRITER;
+ }
+ if (flags & ATTACH_CREATE)
+ mode |= BasicDB::OCREATE;
+
+ if (!dbfile)
+ return false;
+
+ m_db = new TreeDB;
+
+ return m_db->open(dbfile, mode);
+}
+
+
+/* Use DB::visitor. */
+
+static const char * empty_vbuf = (char *)UINTPTR_MAX;
+
+/* Use CopyVisitor2 to avoid linking problems. */
+class CopyVisitor2 : public DB::Visitor {
+private:
+ BasicDB * m_db;
+public:
+ CopyVisitor2(BasicDB * db) {
+ m_db = db;
+ }
+
+ virtual const char* visit_full(const char* kbuf, size_t ksiz,
+ const char* vbuf, size_t vsiz, size_t* sp) {
+ 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;
+ }
+};
+
};