// 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_
