diff options
author | Peng Wu <alexepico@gmail.com> | 2016-02-19 13:11:57 +0800 |
---|---|---|
committer | Peng Wu <alexepico@gmail.com> | 2016-02-19 13:11:57 +0800 |
commit | 00a5bc60af4476c8964ff7bb1d845f5b4b29baca (patch) | |
tree | a67f390b5ea228f72fdf99294243d3b5bedb5d9e /src/storage/phrase_large_table3_kyotodb.cpp | |
parent | 92ae893fe9811be579ceecd3dcec4adc88e4a5bb (diff) | |
download | libpinyin-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.cpp | 32 |
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; +} + }; |