summaryrefslogtreecommitdiffstats
path: root/src/storage/phrase_large_table3_bdb.cpp
diff options
context:
space:
mode:
authorPeng Wu <alexepico@gmail.com>2016-02-03 10:11:56 +0800
committerPeng Wu <alexepico@gmail.com>2016-02-03 10:14:45 +0800
commitec0ca6fc051ceaad8c8db9b2f3345e34ac853632 (patch)
treecd150a492a17a744263a03d8800bd3464e030a3d /src/storage/phrase_large_table3_bdb.cpp
parent1cdc42439e9ea9a8217909afbf396a03193d7cd9 (diff)
downloadlibpinyin-ec0ca6fc051ceaad8c8db9b2f3345e34ac853632.tar.gz
libpinyin-ec0ca6fc051ceaad8c8db9b2f3345e34ac853632.tar.xz
libpinyin-ec0ca6fc051ceaad8c8db9b2f3345e34ac853632.zip
update phrase_large_table3_bdb.cpp
Diffstat (limited to 'src/storage/phrase_large_table3_bdb.cpp')
-rw-r--r--src/storage/phrase_large_table3_bdb.cpp57
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);