summaryrefslogtreecommitdiffstats
path: root/src/storage/phrase_large_table3_kyotodb.cpp
diff options
context:
space:
mode:
authorPeng Wu <alexepico@gmail.com>2016-02-19 13:11:57 +0800
committerPeng Wu <alexepico@gmail.com>2016-02-19 13:11:57 +0800
commit00a5bc60af4476c8964ff7bb1d845f5b4b29baca (patch)
treea67f390b5ea228f72fdf99294243d3b5bedb5d9e /src/storage/phrase_large_table3_kyotodb.cpp
parent92ae893fe9811be579ceecd3dcec4adc88e4a5bb (diff)
downloadlibpinyin-00a5bc60af4476c8964ff7bb1d845f5b4b29baca.tar.gz
libpinyin-00a5bc60af4476c8964ff7bb1d845f5b4b29baca.tar.xz
libpinyin-00a5bc60af4476c8964ff7bb1d845f5b4b29baca.zip
write remove_index method
Diffstat (limited to 'src/storage/phrase_large_table3_kyotodb.cpp')
-rw-r--r--src/storage/phrase_large_table3_kyotodb.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/storage/phrase_large_table3_kyotodb.cpp b/src/storage/phrase_large_table3_kyotodb.cpp
index d993e56..1ccc794 100644
--- a/src/storage/phrase_large_table3_kyotodb.cpp
+++ b/src/storage/phrase_large_table3_kyotodb.cpp
@@ -235,4 +235,36 @@ int PhraseLargeTable3::add_index(int phrase_length,
return result;
}
+int PhraseLargeTable3::remove_index(int phrase_length,
+ /* in */ const ucs4_t phrase[],
+ /* in */ phrase_token_t token) {
+ assert(NULL != m_db);
+ assert(NULL != m_entry);
+
+ const char * kbuf = (char *) phrase;
+ const size_t ksiz = phrase_length * sizeof(ucs4_t);
+ char * vbuf = NULL;
+ int32_t vsiz = m_db->check(kbuf, ksiz);
+ if (vsiz < (signed) sizeof(ucs4_t))
+ return ERROR_REMOVE_ITEM_DONOT_EXISTS;
+
+ /* contains at least one token. */
+ 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->remove_index(token);
+ if (ERROR_OK != result)
+ return result;
+
+ /* for safety. */
+ vbuf = (char *) m_entry->m_chunk.begin();
+ vsiz = m_entry->m_chunk.size();
+ if (!m_db->set(kbuf, ksiz, vbuf, vsiz))
+ return ERROR_FILE_CORRUPTION;
+
+ return ERROR_OK;
+}
+
};