Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 484fa7b5 authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi
Browse files

Add dictionary header writing methods.

Bug: 6669677
Change-Id: I392ac4776b55779903cbaa17e683005d80017a41
parent 59418672
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -250,7 +250,7 @@ void DynamicPatriciaTriePolicy::flush(const char *const filePath) {
    }
    DynamicPatriciaTrieWritingHelper writingHelper(&mBufferWithExtendableBuffer,
            &mBigramListPolicy, &mShortcutListPolicy);
    writingHelper.writeToDictFile(filePath, mBuffer->getBuffer(), mHeaderPolicy.getSize());
    writingHelper.writeToDictFile(filePath, &mHeaderPolicy);
}

void DynamicPatriciaTriePolicy::flushWithGC(const char *const filePath) {
+1 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ class DicNodeVector;
class DynamicPatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
 public:
    DynamicPatriciaTriePolicy(const MmappedBuffer *const buffer)
            : mBuffer(buffer), mHeaderPolicy(mBuffer->getBuffer()),
            : mBuffer(buffer), mHeaderPolicy(mBuffer->getBuffer(), buffer->getBufferSize()),
              mBufferWithExtendableBuffer(mBuffer->getBuffer() + mHeaderPolicy.getSize(),
                      mBuffer->getBufferSize() - mHeaderPolicy.getSize()),
              mShortcutListPolicy(&mBufferWithExtendableBuffer),
+8 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include "suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_helper.h"
#include "suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h"
#include "suggest/policyimpl/dictionary/dynamic_patricia_trie_writing_utils.h"
#include "suggest/policyimpl/dictionary/header/header_policy.h"
#include "suggest/policyimpl/dictionary/patricia_trie_reading_utils.h"
#include "suggest/policyimpl/dictionary/shortcut/dynamic_shortcut_list_policy.h"

@@ -137,7 +138,11 @@ bool DynamicPatriciaTrieWritingHelper::removeBigramWords(const int word0Pos, con
}

void DynamicPatriciaTrieWritingHelper::writeToDictFile(const char *const fileName,
        const uint8_t *const headerBuf, const int headerSize) {
        const HeaderPolicy *const headerPolicy) {
    BufferWithExtendableBuffer headerBuffer(0 /* originalBuffer */, 0 /* originalBufferSize */);
    if (!headerPolicy->writeHeaderToBuffer(&headerBuffer, false /* updatesLastUpdatedTime */)) {
        return;
    }
    const int tmpFileNameBufSize = strlen(fileName)
            + strlen(TEMP_FILE_SUFFIX_FOR_WRITING_DICT_FILE) + 1;
    char tmpFileName[tmpFileNameBufSize];
@@ -148,7 +153,8 @@ void DynamicPatriciaTrieWritingHelper::writeToDictFile(const char *const fileNam
        return;
    }
    // Write header.
    if (fwrite(headerBuf, headerSize, 1, file) < 1) {
    if (fwrite(headerBuffer.getBuffer(true /* usesAdditionalBuffer */),
            headerBuffer.getTailPosition(), 1, file) < 1) {
        fclose(file);
        remove(tmpFileName);
        return;
+4 −2
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ class DynamicBigramListPolicy;
class DynamicPatriciaTrieNodeReader;
class DynamicPatriciaTrieReadingHelper;
class DynamicShortcutListPolicy;
class HeaderPolicy;

class DynamicPatriciaTrieWritingHelper {
 public:
@@ -48,8 +49,9 @@ class DynamicPatriciaTrieWritingHelper {
    // Remove a bigram relation from word0Pos to word1Pos.
    bool removeBigramWords(const int word0Pos, const int word1Pos);

    void writeToDictFile(const char *const fileName, const uint8_t *const headerBuf,
            const int headerSize);
    void writeToDictFile(const char *const fileName, const HeaderPolicy *const headerPolicy);

    void writeToDictFileWithGC(const char *const fileName, const HeaderPolicy *const headerPolicy);

 private:
    DISALLOW_IMPLICIT_CONSTRUCTORS(DynamicPatriciaTrieWritingHelper);
+54 −6
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
#include "suggest/policyimpl/dictionary/header/header_policy.h"

#include <cstddef>
#include <cstdio>
#include <ctime>

namespace latinime {

@@ -36,7 +38,7 @@ void HeaderPolicy::readHeaderValueOrQuestionMark(const char *const key, int *out
    }
    std::vector<int> keyCodePointVector;
    insertCharactersIntoVector(key, &keyCodePointVector);
    HeaderReadingUtils::AttributeMap::const_iterator it = mAttributeMap.find(keyCodePointVector);
    HeaderReadWriteUtils::AttributeMap::const_iterator it = mAttributeMap.find(keyCodePointVector);
    if (it == mAttributeMap.end()) {
        // The key was not found.
        outValue[0] = '?';
@@ -85,7 +87,7 @@ int HeaderPolicy::readLastUpdatedTime() const {
bool HeaderPolicy::getAttributeValueAsInt(const char *const key, int *const outValue) const {
    std::vector<int> keyVector;
    insertCharactersIntoVector(key, &keyVector);
    HeaderReadingUtils::AttributeMap::const_iterator it = mAttributeMap.find(keyVector);
    HeaderReadWriteUtils::AttributeMap::const_iterator it = mAttributeMap.find(keyVector);
    if (it == mAttributeMap.end()) {
        // The key was not found.
        return false;
@@ -94,10 +96,56 @@ bool HeaderPolicy::getAttributeValueAsInt(const char *const key, int *const outV
    return true;
}

/* static */ HeaderReadingUtils::AttributeMap HeaderPolicy::createAttributeMapAndReadAllAttributes(
        const uint8_t *const dictBuf) {
    HeaderReadingUtils::AttributeMap attributeMap;
    HeaderReadingUtils::fetchAllHeaderAttributes(dictBuf, &attributeMap);
bool HeaderPolicy::writeHeaderToBuffer(BufferWithExtendableBuffer *const bufferToWrite,
        const bool updatesLastUpdatedTime) const {
    int writingPos = 0;
    if (!HeaderReadWriteUtils::writeDictionaryVersion(bufferToWrite, mDictFormatVersion,
            &writingPos)) {
        return false;
    }
    if (!HeaderReadWriteUtils::writeDictionaryFlags(bufferToWrite, mDictionaryFlags,
            &writingPos)) {
        return false;
    }
    // Temporarily writes a dummy header size.
    int headerSizeFieldPos = writingPos;
    if (!HeaderReadWriteUtils::writeDictionaryHeaderSize(bufferToWrite, 0 /* size */,
            &writingPos)) {
        return false;
    }
    if (updatesLastUpdatedTime) {
        // Set current time as a last updated time.
        HeaderReadWriteUtils::AttributeMap attributeMapTowrite(mAttributeMap);
        std::vector<int> updatedTimekey;
        insertCharactersIntoVector(LAST_UPDATED_TIME_KEY, &updatedTimekey);
        const time_t currentTime = time(NULL);
        std::vector<int> updatedTimeValue;
        char charBuf[LARGEST_INT_DIGIT_COUNT + 1];
        snprintf(charBuf, LARGEST_INT_DIGIT_COUNT + 1, "%ld", currentTime);
        insertCharactersIntoVector(charBuf, &updatedTimeValue);
        attributeMapTowrite[updatedTimekey] = updatedTimeValue;
        if (!HeaderReadWriteUtils::writeHeaderAttributes(bufferToWrite, &attributeMapTowrite,
                &writingPos)) {
            return false;
        }
    } else {
        if (!HeaderReadWriteUtils::writeHeaderAttributes(bufferToWrite, &mAttributeMap,
                &writingPos)) {
            return false;
        }
    }
    // Writes an actual header size.
    if (!HeaderReadWriteUtils::writeDictionaryHeaderSize(bufferToWrite, writingPos,
            &headerSizeFieldPos)) {
        return false;
    }
    return true;
}

/* static */ HeaderReadWriteUtils::AttributeMap
        HeaderPolicy::createAttributeMapAndReadAllAttributes(const uint8_t *const dictBuf) {
    HeaderReadWriteUtils::AttributeMap attributeMap;
    HeaderReadWriteUtils::fetchAllHeaderAttributes(dictBuf, &attributeMap);
    return attributeMap;
}

Loading