diff options
| author | Peng Wu <alexepico@gmail.com> | 2016-02-18 15:12:23 +0800 |
|---|---|---|
| committer | Peng Wu <alexepico@gmail.com> | 2016-02-18 15:12:23 +0800 |
| commit | 3858d216e817e6536e0db00e243efd21fd8e351f (patch) | |
| tree | 3b9f1b52ea5cf81843655a112ea6be47a23d782c /src | |
| parent | e4040fc2362e077cbe92eb2deaa18f1c2c11dc40 (diff) | |
write add_index method
Diffstat (limited to 'src')
| -rw-r--r-- | src/storage/phrase_large_table3_kyotodb.cpp | 60 |
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; +} }; |
