/*
 Copyright (c) 2011, Oracle and/or its affiliates. All rights
 reserved.
 
 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; version 2 of
 the License.
 
 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, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 02110-1301  USA
 */
#ifndef NDBMEMCACHE_NDB_ENGINE_H
#define NDBMEMCACHE_NDB_ENGINE_H

#include "ndbmemcache_config.h"

#include <pthread.h>

#ifndef __cplusplus
#include <stdbool.h>
#endif

#include <memcached/engine.h>
#include <memcached/util.h>
#include <memcached/visibility.h>

#include "atomics.h"

/**
 *  The NDB engine global data.
 
    Inside memcached, a pointer to this is treated as simply an ENGINE_HANDLE_V1 
    pointer.  But inside the NDB engine that pointer is cast up to point to the
    whole private structure. 
    
    This structure also contains a pointer to the default engine's 
    private structure, since all caching is delegated to the default 
    engine.  
 */

 
struct ndb_engine {
  ENGINE_HANDLE_V1 engine;
  SERVER_HANDLE_V1 server;
  GET_SERVER_API get_server_api;
  ENGINE_HANDLE * m_default_engine;
   
  struct {
    const char * connectstring;
    const char * server_role;
    const char * scheduler;
    bool debug_enable;
    bool reconf_enable;
  } startup_options;
  
  struct {
    size_t maxconns;
    size_t nthreads;
    bool cas_enabled;  
    size_t verbose;
  } server_options;
  
  union {
    engine_info info;
    char buffer[sizeof(engine_info) * (LAST_REGISTERED_ENGINE_FEATURE + 1)];
  } info;
  
  ndbmc_atomic32_t npipelines;
  void **pipelines;
  void **schedulers;
   
  bool connected;

  unsigned int cas_hi;
  ndbmc_atomic32_t cas_lo;
};

#ifdef __cplusplus
extern "C" {
#endif

extern size_t global_max_item_size;

#ifdef __cplusplus
};
#endif

#endif
