blob: c20940b652a09d228d04f4b083dabb5ec4a7ff09 [file] [log] [blame]
// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef MOZC_STORAGE_LRU_STORAGE_H_
#define MOZC_STORAGE_LRU_STORAGE_H_
#include <map>
#include <string>
#include <vector>
#include "base/port.h"
#include "base/scoped_ptr.h"
namespace mozc {
class Mmap;
namespace storage {
class LRUStorage {
public:
LRUStorage();
~LRUStorage();
bool Open(const char *filename);
void Close();
// Try to open exisiting database
// If the file is broken or cannot open, tries to recreate
// new file
bool OpenOrCreate(const char *filename,
size_t new_value_size,
size_t new_size,
uint32 new_seed);
// Lookup key
const char *Lookup(const string &key,
uint32 *last_access_time) const;
const char *Lookup(const string &key) const;
// Returns all values.
// The order is new to old (*values->begin() is the newest).
bool GetAllValues(vector<string> *values) const;
// clear all LRU cache;
// mapped file is also initialized
bool Clear();
// Merge from other data
bool Merge(const char *filename);
bool Merge(const LRUStorage &storage);
// update timestamp
bool Touch(const string &key);
// Insert key and values
bool Insert(const string &key,
const char *value);
// if key is found, insert value,
// otherwise return
bool TryInsert(const string &key,
const char *value);
size_t value_size() const;
size_t size() const;
size_t used_size() const;
uint32 seed() const;
const string &filename() const;
// Write one entry at |i| th index.
// i must be 0 <= i < size.
// This data will not update the index of the storage.
void Write(size_t i,
uint64 fp,
const string &value,
uint32 last_access_time);
// Read one entry from |i| th index.
// i must be 0 <= i < size.
void Read(size_t i,
uint64 *fp,
string *value,
uint32 *last_access_time) const;
// Create Instance from file. Call Open internally
static LRUStorage *Create(const char *filename);
// Create Instance from file. Call OpenOrCreate internally
static LRUStorage *Create(const char *filename,
size_t value_size,
size_t size,
uint32 seed);
// Create an empty LRU db file
static bool CreateStorageFile(const char *filename,
size_t value_size,
size_t size,
uint32 seed);
private:
class LRUList;
class Node;
// load from memory buffer
bool Open(char *ptr, size_t ptr_size);
size_t value_size_;
size_t size_;
uint32 seed_;
char *last_item_;
char *begin_;
char *end_;
string filename_;
map<uint64, Node *> map_;
scoped_ptr<LRUList> lru_list_;
scoped_ptr<Mmap> mmap_;
DISALLOW_COPY_AND_ASSIGN(LRUStorage);
};
} // namespace storage
} // namespace mozc
#endif // MOZC_STORAGE_LRU_STORAGE_H_