diff options
author | Peng Wu <alexepico@gmail.com> | 2016-01-28 16:06:34 +0800 |
---|---|---|
committer | Peng Wu <alexepico@gmail.com> | 2016-01-28 16:06:34 +0800 |
commit | f9c65e5be707abd028638636bda46062aa9fff23 (patch) | |
tree | 6d8480b30f83f87d67d58f43b913629aafa23101 /src/storage/phrase_large_table3_bdb.cpp | |
parent | 2c93495fd59031b4a6bbe04dad6399d263129e72 (diff) | |
download | libpinyin-f9c65e5be707abd028638636bda46062aa9fff23.tar.gz libpinyin-f9c65e5be707abd028638636bda46062aa9fff23.tar.xz libpinyin-f9c65e5be707abd028638636bda46062aa9fff23.zip |
write class PhraseLargeTable3 in progress
Diffstat (limited to 'src/storage/phrase_large_table3_bdb.cpp')
-rw-r--r-- | src/storage/phrase_large_table3_bdb.cpp | 96 |
1 files changed, 95 insertions, 1 deletions
diff --git a/src/storage/phrase_large_table3_bdb.cpp b/src/storage/phrase_large_table3_bdb.cpp index 002c16f..ef76bd7 100644 --- a/src/storage/phrase_large_table3_bdb.cpp +++ b/src/storage/phrase_large_table3_bdb.cpp @@ -191,7 +191,7 @@ int PhraseLargeTable3::search(int phrase_length, DBT db_key; memset(&db_key, 0, sizeof(DBT)); - db_key.data = (void *)phrase; + db_key.data = (void *) phrase; db_key.size = phrase_length * sizeof(ucs4_t); DBT db_data; @@ -205,4 +205,98 @@ 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); + + /* load phrase table entry. */ + DBT db_key; + memset(&db_key, 0, sizeof(DBT)); + db_key.data = (void *) phrase; + db_key.size = phrase_length * sizeof(ucs4_t); + + DBT db_data; + memset(&db_data, 0, sizeof(DBT)); + int ret = m_db->get(m_db, NULL, &db_key, &db_data, 0); + + if (ret != 0) { + /* new entry. */ + PhraseTableEntry entry; + entry.add_index(token); + + 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; + + /* recursively set header with 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. */ + return ERROR_OK; +#endif + } + } + + return ERROR_OK; + } + + /* continued information is already set. */ + m_entry->m_chunk.set_chunk(db_data.data, db_data.size, NULL); + int result = m_entry->add_index(token); + + /* store the entry. */ + memset(&db_data, 0, sizeof(DBT)); + db_data.data = m_entry->m_chunk.begin(); + db_data.size = m_entry->m_chunk.size(); + ret = m_db->put(m_db, NULL, &db_key, &db_data, 0); + if (ret != 0) + return ERROR_FILE_CORRUPTION; + + return result; +} + }; |