summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPeng Wu <alexepico@gmail.com>2016-02-18 15:12:23 +0800
committerPeng Wu <alexepico@gmail.com>2016-02-18 15:12:23 +0800
commit3858d216e817e6536e0db00e243efd21fd8e351f (patch)
tree3b9f1b52ea5cf81843655a112ea6be47a23d782c /src
parente4040fc2362e077cbe92eb2deaa18f1c2c11dc40 (diff)
write add_index method
Diffstat (limited to 'src')
-rw-r--r--src/storage/phrase_large_table3_kyotodb.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/storage/phrase_large_table3_kyotodb.cpp b/src/storage/phrase_large_table3_kyotodb.cpp
index fd7d476..9d2bfe3 100644
--- a/src/storage/phrase_large_table3_kyotodb.cpp
+++ b/src/storage/phrase_large_table3_kyotodb.cpp
@@ -173,5 +173,65 @@ int PhraseLargeTable3::search(int phrase_length,
return result;
}
+/* add_index/remove_index method */
+int PhraseLargeTable3::add_index(int phrase_length,
+ /* in */ const ucs4_t phrase[],
+ /* in */ phrase_token_t token) {
+ assert(NULL != m_db);
+ assert(NULL != m_entry);
+
+ bool retval = false;
+
+ /* load phrase table entry. */
+ const char * kbuf = (char *) phrase;
+ size_t ksiz = phrase_length * sizeof(ucs4_t);
+ int32_t vsiz = m_db->check(kbuf, ksiz);
+ char * vbuf = NULL;
+ if (-1 == vsiz) {
+ /* new entry. */
+ PhraseTableEntry entry;
+ entry.add_index(token);
+
+ vbuf = (char *) entry.m_chunk.begin();
+ vsiz = entry.m_chunk.size();
+ retval = m_db->set(kbuf, ksiz, vbuf, vsiz);
+ if (!retval)
+ return ERROR_FILE_CORRUPTION;
+
+ /* recursively add keys for continued information. */
+ for (size_t len = phrase_length - 1; len > 0; --len) {
+ ksiz = len * sizeof(ucs4_t);
+
+ vsiz = m_db->check(kbuf, ksiz);
+ /* found entry. */
+ if (-1 != vsiz)
+ return ERROR_OK;
+
+ /* new entry with empty content. */
+ retval = m_db->set(kbuf, ksiz, empty_vbuf, 0);
+ if (!retval)
+ return ERROR_FILE_CORRUPTION;
+ }
+
+ return ERROR_OK;
+ }
+
+ /* already have keys. */
+ m_entry->m_chunk.set_size(vsiz);
+ /* m_chunk may re-allocate here. */
+ vbuf = (char *) m_entry->m_chunk.begin();
+ assert(vsiz == m_db->get(kbuf, ksiz, vbuf, vsiz));
+
+ int result = m_entry->add_index(token);
+
+ /* store the entry. */
+ vbuf = (char *) m_entry->m_chunk.begin();
+ vsiz = m_entry->m_chunk.size();
+ retval = m_db->set(kbuf, ksiz, vbuf, vsiz);
+ if (!retval)
+ return ERROR_FILE_CORRUPTION;
+
+ return result;
+}
};