diff options
author | Peng Wu <alexepico@gmail.com> | 2016-02-03 10:11:56 +0800 |
---|---|---|
committer | Peng Wu <alexepico@gmail.com> | 2016-02-03 10:14:45 +0800 |
commit | ec0ca6fc051ceaad8c8db9b2f3345e34ac853632 (patch) | |
tree | cd150a492a17a744263a03d8800bd3464e030a3d /src/storage | |
parent | 1cdc42439e9ea9a8217909afbf396a03193d7cd9 (diff) | |
download | libpinyin-ec0ca6fc051ceaad8c8db9b2f3345e34ac853632.tar.gz libpinyin-ec0ca6fc051ceaad8c8db9b2f3345e34ac853632.tar.xz libpinyin-ec0ca6fc051ceaad8c8db9b2f3345e34ac853632.zip |
update phrase_large_table3_bdb.cpp
Diffstat (limited to 'src/storage')
-rw-r--r-- | src/storage/phrase_large_table3_bdb.cpp | 57 |
1 files changed, 18 insertions, 39 deletions
diff --git a/src/storage/phrase_large_table3_bdb.cpp b/src/storage/phrase_large_table3_bdb.cpp index ef76bd7..fe27494 100644 --- a/src/storage/phrase_large_table3_bdb.cpp +++ b/src/storage/phrase_large_table3_bdb.cpp @@ -200,8 +200,13 @@ int PhraseLargeTable3::search(int phrase_length, if (ret != 0) return result; + /* continue searching. */ + result |= SEARCH_CONTINUED; + m_entry->m_chunk.set_chunk(db_data.data, db_data.size, NULL); - result = m_entry->search(tokens); + + result = m_entry->search(tokens) | result; + return result; } @@ -234,57 +239,31 @@ int PhraseLargeTable3::add_index(int phrase_length, if (ret != 0) return ERROR_FILE_CORRUPTION; - /* recursively set header with continued information. */ + /* recursively add keys for continued information. */ for (size_t len = phrase_length - 1; len > 0; --len) { memset(&db_key, 0, sizeof(DBT)); db_key.data = (void *) phrase; db_key.size = len * sizeof(ucs4_t); memset(&db_data, 0, sizeof(DBT)); + ret = m_db->get(m_db, NULL, &db_key, &db_data, 0); - if (ret != 0) { - /* new entry with only header. */ - table_entry_header_t header = SEARCH_CONTINUED; - entry.m_chunk.set_chunk(&header, - sizeof(table_entry_header_t), - NULL); - - /* store header. */ - memset(&db_data, 0, sizeof(DBT)); - db_data.data = entry.m_chunk.begin(); - db_data.size = entry.m_chunk.size(); - ret = m_db->put(m_db, NULL, &db_key, &db_data, 0); - if (ret != 0) - return ERROR_FILE_CORRUPTION; - } else { - /* found entry, verify the header. */ - entry.m_chunk.set_chunk(db_data.data, db_data.size, NULL); - table_entry_header_t header = entry.get_header(); - if (header & SEARCH_CONTINUED) - return ERROR_OK; - - /* set the header. */ - entry.set_header(header | SEARCH_CONTINUED); - - /* store header. */ - memset(&db_data, 0, sizeof(DBT)); - db_data.data = entry.m_chunk.begin(); - db_data.size = entry.m_chunk.size(); - ret = m_db->put(m_db, NULL, &db_key, &db_data, 0); - if (ret != 0) - return ERROR_FILE_CORRUPTION; - -#if 0 - /* actually the previous headers are set. */ + /* found entry. */ + if (0 == ret) return ERROR_OK; -#endif - } + + /* new entry with empty content. */ + memset(&db_data, 0, sizeof(DBT)); + + ret = m_db->put(m_db, NULL, &db_key, &db_data, 0); + if (ret != 0) + return ERROR_FILE_CORRUPTION; } return ERROR_OK; } - /* continued information is already set. */ + /* already have keys. */ m_entry->m_chunk.set_chunk(db_data.data, db_data.size, NULL); int result = m_entry->add_index(token); |