/*************************************************************************************************
 * IDL for bindings of scripting languages
 *                                                               Copyright (C) 2009-2012 FAL Labs
 * This file is part of Kyoto Cabinet.
 * This program is free software: you can redistribute it and/or modify it under the terms of
 * the GNU General Public License as published by the Free Software Foundation, either version
 * 3 of the License, or any later version.
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License along with this program.
 * If not, see <http://www.gnu.org/licenses/>.
 *************************************************************************************************/


/**
 * namespace of Kyoto Cabinet
 */
module kyotocabinet {
  //----------------------------------------------------------------
  // prediction
  //----------------------------------------------------------------
  interface List;
  interface Map;
  interface Error;
  interface Visitor;
  interface FileProcessor;
  interface Logger;
  interface Cursor;
  interface DB;
  //----------------------------------------------------------------
  // list of strings (substituted by the native mechanism)
  //----------------------------------------------------------------
  interface List {
    string get(in long index);
  };
  //----------------------------------------------------------------
  // map of strings (substituted by the native mechanism)
  //----------------------------------------------------------------
  interface Map {
    string get(in string key);
  };
  //----------------------------------------------------------------
  // error information
  //----------------------------------------------------------------
  interface Error {
    const long SUCCESS = 0;
    const long NOIMPL = 1;
    const long INVALID = 2;
    const long NOREPOS = 3;
    const long NOPERM = 4;
    const long BROKEN = 5;
    const long DUPREC = 6;
    const long NOREC = 7;
    const long LOGIC = 8;
    const long SYSTEM = 9;
    const long MISC = 15;
    long code();
    string name();
    string message();
  };
  //----------------------------------------------------------------
  // record visitor
  //----------------------------------------------------------------
  interface Visitor {
    const string NOP = "";
    const string REMOVE = "";
    string visit_full(in string key, in string value);
    string visit_empty(in string key);
  };
  //----------------------------------------------------------------
  // file processor
  //----------------------------------------------------------------
  interface FileProcessor {
    boolean process(in string path, in long long count, in long long size);
  };
  //----------------------------------------------------------------
  // event logger
  //----------------------------------------------------------------
  interface Logger {
    const long INFO = 0;
    const long WARN = 1;
    const long ERROR = 2;
    void log(in string file, in long line, in string func, in long kind, in string message);
  };
  //----------------------------------------------------------------
  // meta operation trigger
  //----------------------------------------------------------------
  interface MetaTrigger {
    const long OPEN = 0;
    const long CLOSE = 1;
    const long CLEAR = 2;
    const long ITERATE = 3;
    const long SYNCHRONIZE = 4;
    const long OCCUPY = 5;
    const long BEGINTRAN = 6;
    const long COMMITTRAN = 7;
    const long ABORTTRAN = 8;
    const long MISC = 15;
    void trigger(in long kind, in string message);
  };
  //----------------------------------------------------------------
  // cursor
  //----------------------------------------------------------------
  interface Cursor {
    boolean accept(inout Visitor visitor, in boolean writable, in boolean step);
    boolean set_value(in string value, in boolean step);
    boolean remove();
    string get_key(in boolean step);
    string get_value(in boolean step);
    boolean jump();
    boolean jump_(in string key);
    boolean jump_back();
    boolean jump_back_(in string key);
    boolean step();
    boolean step_back();
    DB db();
    Error error();
  };
  //----------------------------------------------------------------
  // common database operations
  //----------------------------------------------------------------
  interface DB {
    const long OREADER = 1 << 0;
    const long OWRITER = 1 << 1;
    const long OCREATE = 1 << 2;
    const long OTRUNCATE = 1 << 3;
    const long OAUTOTRAN = 1 << 4;
    const long OAUTOSYNC = 1 << 5;
    const long ONOLOCK = 1 << 6;
    const long OTRYLOCK = 1 << 7;
    const long ONOREPAIR = 1 << 8;
    Error error();
    boolean open(in string path, in long mode);
    boolean close();
    boolean accept(in string key, inout Visitor visitor, in boolean writable);
    boolean accept_bulk(in List keys, inout Visitor visitor, in boolean writable);
    boolean iterate(inout Visitor visitor, in boolean writable);
    boolean scan_parallel(inout Visitor visitor, in long thnum);
    boolean set(in string key, in string value);
    boolean add(in string key, in string value);
    boolean replace(in string key, in string value);
    boolean append(in string key, in string value);
    long long increment(in string key, in long long num, in long long orig);
    double increment_double(in string key, in double num, in double orig);
    boolean cas(in string key, in string oval, in string nval);
    boolean remove(in string key);
    string get(in string key);
    long check(in string key);
    string seize(in string key);
    long long set_bulk(in Map recs);
    long long remove_bulk(in List keys);
    Map get_bulk(in List keys);
    boolean clear();
    boolean synchronize(in boolean hard, inout FileProcessor proc);
    boolean occupy(in boolean writable, inout FileProcessor proc);
    boolean copy(in string dest);
    boolean begin_transaction(in boolean hard);
    boolean end_transaction(in boolean commit);
    boolean dump_snapshot(in string dest);
    boolean load_snapshot(in string src);
    long long count();
    long long size();
    string path();
    Map status();
    Cursor cursor();
    boolean tune_logger(inout Logger logger);
    boolean tune_meta_trigger(inout MetaTrigger trigger);
  };
  //----------------------------------------------------------------
  // prototype hash database
  //----------------------------------------------------------------
  interface ProtoHashDB :DB {
  };
  //----------------------------------------------------------------
  // prototype tree database
  //----------------------------------------------------------------
  interface ProtoTreeDB :DB {
  };
  //----------------------------------------------------------------
  // stash database
  //----------------------------------------------------------------
  interface StashDB :DB {
    boolean tune_buckets(in long long bnum);
  };
  //----------------------------------------------------------------
  // cache hash database
  //----------------------------------------------------------------
  interface CacheDB :DB {
    boolean tune_options(in long opts);
    boolean tune_buckets(in long long bnum);
    boolean cap_count(in long long count);
    boolean cap_size(in long long size);
  };
  //----------------------------------------------------------------
  // cache tree database
  //----------------------------------------------------------------
  interface GrassDB :DB {
    boolean tune_options(in long opts);
    boolean tune_buckets(in long long bnum);
    boolean tune_page(in long psiz);
    boolean tune_page_cache(in long long pccap);
  };
  //----------------------------------------------------------------
  // file hash database
  //----------------------------------------------------------------
  interface HashDB :DB {
    const long TSMALL = 1 << 0;
    const long TLINEAR = 1 << 1;
    const long TCOMPRESS = 1 << 2;
    boolean tune_alignment(in long apow);
    boolean tune_fbp(in long fpow);
    boolean tune_options(in long opts);
    boolean tune_buckets(in long long bnum);
    boolean tune_map(in long long msiz);
    boolean tune_defrag(in long dfunit);
  };
  //----------------------------------------------------------------
  // file tree database
  //----------------------------------------------------------------
  interface TreeDB :DB {
    const long TSMALL = 1 << 0;
    const long TLINEAR = 1 << 1;
    const long TCOMPRESS = 1 << 2;
    boolean tune_alignment(in long apow);
    boolean tune_fbp(in long fpow);
    boolean tune_options(in long opts);
    boolean tune_buckets(in long long bnum);
    boolean tune_page(in long psiz);
    boolean tune_map(in long long msiz);
    boolean tune_defrag(in long dfunit);
    boolean tune_page_cache(in long long pccap);
  };
  //----------------------------------------------------------------
  // directory hash database
  //----------------------------------------------------------------
  interface DirDB :DB {
    const long TCOMPRESS = 1 << 2;
    boolean tune_options(in long opts);
  };
  //----------------------------------------------------------------
  // directory tree database
  //----------------------------------------------------------------
  interface ForestDB :DB {
    const long TCOMPRESS = 1 << 2;
    boolean tune_options(in long opts);
    boolean tune_buckets(in long long bnum);
    boolean tune_page(in long psiz);
    boolean tune_page_cache(in long long pccap);
  };
  //----------------------------------------------------------------
  // polymorphic database
  //----------------------------------------------------------------
  interface PolyDB :DB {
    List match_prefix(in string prefix, in long long max);
    List match_regex(in string regex, in long long max);
    List match_similar(in string origin, in long long range, in boolean utf, in long long max);
  };
};



/* END OF FILE */
