diff options
author | Peng Wu <alexepico@gmail.com> | 2016-02-05 16:17:56 +0800 |
---|---|---|
committer | Peng Wu <alexepico@gmail.com> | 2016-02-05 16:17:56 +0800 |
commit | 21f1ccd98393aa1d4e63766cf4edf633b1d49d3c (patch) | |
tree | 89b8a26362a21c0d16e1eb3574590bf7da896315 /src/storage/phrase_large_table3_kyotodb.cpp | |
parent | 94f9dcccec57f245c765eeac3a4fcd716ac733ec (diff) | |
download | libpinyin-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.cpp | 52 |
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; + } +}; + }; |