// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
#include <errno.h>
#include <node.h>
#include <v8.h>

#include "bdb_common.h"
#include "bdb_db.h"
#include "bdb_env.h"

// Node Macros require these
using v8::Persistent;
using v8::String;

v8::Persistent<v8::String> status_code_sym;
v8::Persistent<v8::String> err_message_sym;
v8::Persistent<v8::String> data_sym;
v8::Persistent<v8::String> key_sym;
v8::Persistent<v8::String> val_sym;

extern "C" {
  void init(v8::Handle<v8::Object> target) {
    v8::HandleScope scope;

    status_code_sym = NODE_PSYMBOL("code");
    err_message_sym = NODE_PSYMBOL("message");
    data_sym = NODE_PSYMBOL("data");
    key_sym = NODE_PSYMBOL("key");
    val_sym = NODE_PSYMBOL("value");

    NODE_DEFINE_CONSTANT(target, DB_APPEND);
    NODE_DEFINE_CONSTANT(target, DB_AUTO_COMMIT);
    NODE_DEFINE_CONSTANT(target, DB_BTREE);
    NODE_DEFINE_CONSTANT(target, DB_BUFFER_SMALL);
    NODE_DEFINE_CONSTANT(target, DBC_BULK);
    NODE_DEFINE_CONSTANT(target, DB_CDB_ALLDB);
    NODE_DEFINE_CONSTANT(target, DB_CHKSUM);
    NODE_DEFINE_CONSTANT(target, DB_CONSUME);
    NODE_DEFINE_CONSTANT(target, DB_CONSUME_WAIT);
    NODE_DEFINE_CONSTANT(target, DB_CURRENT);
    NODE_DEFINE_CONSTANT(target, DB_CREATE);
    NODE_DEFINE_CONSTANT(target, DB_DIRECT_DB);
    NODE_DEFINE_CONSTANT(target, DB_DUP);
    NODE_DEFINE_CONSTANT(target, DB_ENCRYPT);
    NODE_DEFINE_CONSTANT(target, DB_EXCL);
    NODE_DEFINE_CONSTANT(target, DB_FAILCHK);
    NODE_DEFINE_CONSTANT(target, DB_FIRST);
    NODE_DEFINE_CONSTANT(target, DB_FORCE);
    NODE_DEFINE_CONSTANT(target, DB_FORCESYNC);
    NODE_DEFINE_CONSTANT(target, DB_FOREIGN_CONFLICT);
    NODE_DEFINE_CONSTANT(target, DB_GET_BOTH);
    NODE_DEFINE_CONSTANT(target, DB_GET_BOTH_RANGE);
    NODE_DEFINE_CONSTANT(target, DB_HASH);
    NODE_DEFINE_CONSTANT(target, DB_HOTBACKUP_IN_PROGRESS);
    NODE_DEFINE_CONSTANT(target, DB_IGNORE_LEASE);
    NODE_DEFINE_CONSTANT(target, DB_IMMUTABLE_KEY);
    NODE_DEFINE_CONSTANT(target, DB_INIT_CDB);
    NODE_DEFINE_CONSTANT(target, DB_INIT_LOCK);
    NODE_DEFINE_CONSTANT(target, DB_INIT_LOG);
    NODE_DEFINE_CONSTANT(target, DB_INIT_MPOOL);
    NODE_DEFINE_CONSTANT(target, DB_INIT_REP);
    NODE_DEFINE_CONSTANT(target, DB_INIT_TXN);
    NODE_DEFINE_CONSTANT(target, DB_JOIN_ITEM);
    NODE_DEFINE_CONSTANT(target, DB_KEYFIRST);
    NODE_DEFINE_CONSTANT(target, DB_KEYLAST);
    NODE_DEFINE_CONSTANT(target, DB_LAST);
    NODE_DEFINE_CONSTANT(target, DB_LOCKDOWN);
    NODE_DEFINE_CONSTANT(target, DB_LOCK_DEADLOCK);
    NODE_DEFINE_CONSTANT(target, DB_LOCK_DEFAULT);
    NODE_DEFINE_CONSTANT(target, DB_LOCK_EXPIRE);
    NODE_DEFINE_CONSTANT(target, DB_LOCK_MAXLOCKS);
    NODE_DEFINE_CONSTANT(target, DB_LOCK_MAXWRITE);
    NODE_DEFINE_CONSTANT(target, DB_LOCK_MINLOCKS);
    NODE_DEFINE_CONSTANT(target, DB_LOCK_MINWRITE);
    NODE_DEFINE_CONSTANT(target, DB_LOCK_OLDEST);
    NODE_DEFINE_CONSTANT(target, DB_LOCK_RANDOM);
    NODE_DEFINE_CONSTANT(target, DB_LOCK_YOUNGEST);
    NODE_DEFINE_CONSTANT(target, DB_LOCK_NOTGRANTED);
    NODE_DEFINE_CONSTANT(target, DB_MULTIPLE);
    NODE_DEFINE_CONSTANT(target, DB_MULTIPLE_KEY);
    NODE_DEFINE_CONSTANT(target, DB_MULTIVERSION);
    NODE_DEFINE_CONSTANT(target, DB_NEXT);
    NODE_DEFINE_CONSTANT(target, DB_NEXT_DUP);
    NODE_DEFINE_CONSTANT(target, DB_NEXT_NODUP);
    NODE_DEFINE_CONSTANT(target, DB_NODUPDATA);
    NODE_DEFINE_CONSTANT(target, DB_NOMMAP);
    NODE_DEFINE_CONSTANT(target, DB_NOOVERWRITE);
    NODE_DEFINE_CONSTANT(target, DB_NOPANIC);
    NODE_DEFINE_CONSTANT(target, DB_NOTFOUND);
    NODE_DEFINE_CONSTANT(target, DB_OLD_VERSION);
    NODE_DEFINE_CONSTANT(target, DB_OVERWRITE);
    NODE_DEFINE_CONSTANT(target, DB_OVERWRITE_DUP);
    NODE_DEFINE_CONSTANT(target, DB_PANIC_ENVIRONMENT);
    NODE_DEFINE_CONSTANT(target, DB_PREV);
    NODE_DEFINE_CONSTANT(target, DB_PREV_DUP);
    NODE_DEFINE_CONSTANT(target, DB_PREV_NODUP);
    NODE_DEFINE_CONSTANT(target, DB_PRIVATE);
    NODE_DEFINE_CONSTANT(target, DB_QUEUE);
    NODE_DEFINE_CONSTANT(target, DB_RDONLY);
    NODE_DEFINE_CONSTANT(target, DB_READ_COMMITTED);
    NODE_DEFINE_CONSTANT(target, DB_READ_UNCOMMITTED);
    NODE_DEFINE_CONSTANT(target, DB_RECNO);
    NODE_DEFINE_CONSTANT(target, DB_RECOVER);
    NODE_DEFINE_CONSTANT(target, DB_RECOVER_FATAL);
    NODE_DEFINE_CONSTANT(target, DB_REGION_INIT);
    NODE_DEFINE_CONSTANT(target, DB_REGISTER);
    NODE_DEFINE_CONSTANT(target, DB_REP_HANDLE_DEAD);
    NODE_DEFINE_CONSTANT(target, DB_REP_LEASE_EXPIRED);
    NODE_DEFINE_CONSTANT(target, DB_REP_LOCKOUT);
    NODE_DEFINE_CONSTANT(target, DB_RMW);
    NODE_DEFINE_CONSTANT(target, DB_RUNRECOVERY);
    NODE_DEFINE_CONSTANT(target, DB_SECONDARY_BAD);
    NODE_DEFINE_CONSTANT(target, DB_SET);
    NODE_DEFINE_CONSTANT(target, DB_SET_RANGE);
    NODE_DEFINE_CONSTANT(target, DB_SET_RECNO);
    NODE_DEFINE_CONSTANT(target, DB_SYSTEM_MEM);
    NODE_DEFINE_CONSTANT(target, DB_THREAD);
    NODE_DEFINE_CONSTANT(target, DB_TIME_NOTGRANTED);
    NODE_DEFINE_CONSTANT(target, DB_TRUNCATE);
    NODE_DEFINE_CONSTANT(target, DB_TXN_BULK);
    NODE_DEFINE_CONSTANT(target, DB_TXN_NOSYNC);
    NODE_DEFINE_CONSTANT(target, DB_TXN_NOWAIT);
    NODE_DEFINE_CONSTANT(target, DB_TXN_SNAPSHOT);
    NODE_DEFINE_CONSTANT(target, DB_TXN_SYNC);
    NODE_DEFINE_CONSTANT(target, DB_TXN_WAIT);
    NODE_DEFINE_CONSTANT(target, DB_TXN_WRITE_NOSYNC);
    NODE_DEFINE_CONSTANT(target, DB_UNKNOWN);
    NODE_DEFINE_CONSTANT(target, DB_USE_ENVIRON);
    NODE_DEFINE_CONSTANT(target, DB_USE_ENVIRON_ROOT);
    NODE_DEFINE_CONSTANT(target, DB_WRITECURSOR);
    NODE_DEFINE_CONSTANT(target, DB_VERSION_MISMATCH);
    NODE_DEFINE_CONSTANT(target, DB_YIELDCPU);
    NODE_DEFINE_CONSTANT(target, EACCES);
    NODE_DEFINE_CONSTANT(target, EAGAIN);
    NODE_DEFINE_CONSTANT(target, EEXIST);
    NODE_DEFINE_CONSTANT(target, EINVAL);
    NODE_DEFINE_CONSTANT(target, ENOENT);
    NODE_DEFINE_CONSTANT(target, ENOSPC);

    DbEnv::Initialize(target);
    Db::Initialize(target);
  }
}
