#ifndef LCB_DURABILITY_INTERNAL_H
#define LCB_DURABILITY_INTERNAL_H
#include "simplestring.h"
#include "ssobuf.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
const mc_SERVER *server;
lcb_U16 persisted;
lcb_U16 exists;
} lcbdur_SERVINFO;
typedef struct lcb_DURITEM_st {
lcb_U64 reqcas;
lcb_U64 reqseqno;
lcb_U64 uuid;
lcb_RESPENDURE result;
struct lcb_DURSET_st *parent;
lcb_RESPCALLBACK callback;
lcb_U16 vbid;
lcb_U8 done;
lcbdur_SERVINFO sinfo[4];
} lcb_DURITEM;
struct lcbdur_PROCS_st;
enum {
LCBDUR_STATE_OBSPOLL = 0,
LCBDUR_STATE_INIT,
LCBDUR_STATE_TIMEOUT,
LCBDUR_STATE_IGNORE
};
typedef struct lcb_DURSET_st {
lcb_MULTICMD_CTX mctx;
lcb_DURABILITYOPTSv0 opts;
LCB_SSOBUF_DECLARE(lcb_DURITEM) entries_;
unsigned nremaining;
int waiting;
unsigned refcnt;
unsigned next_state;
lcb_error_t lasterr;
int is_durstore;
lcb_string kvbufs;
const void *cookie;
hrtime_t ns_timeout;
void *timer;
lcb_t instance;
void *impldata;
} lcb_DURSET;
typedef struct lcbdur_PROCS_st {
lcb_error_t (*poll)(lcb_DURSET *dset);
lcb_error_t (*ent_add)(lcb_DURSET*,lcb_DURITEM*,const lcb_CMDENDURE*);
lcb_error_t (*schedule)(lcb_DURSET*);
void (*clean)(lcb_DURSET*);
} lcbdur_PROCS;
void
lcbdur_cas_update(lcb_t instance, lcb_DURSET *dset, lcb_error_t err,
const lcb_RESPOBSERVE *resp);
void
lcbdur_update_seqno(lcb_t instance, lcb_DURSET *dset,
const lcb_RESPOBSEQNO *resp);
void
lcbdurctx_set_durstore(lcb_MULTICMD_CTX *ctx, int enabled);
lcb_MULTICMD_CTX *
lcb_observe_ctx_dur_new(lcb_t instance);
#ifdef LCBDUR_PRIV_SYMS
extern lcbdur_PROCS lcbdur_cas_procs;
extern lcbdur_PROCS lcbdur_seqno_procs;
#define RESFLD(e, f) (e)->result.f
#define ENT_CAS(e) (e)->request.options.cas
#define DSET_OPTFLD(ds, opt) (ds)->opts.opt
#define DSET_COUNT(ds) (ds)->entries_.count
#define DSET_ENTRIES(ds) LCB_SSOBUF_ARRAY(&(ds)->entries_, lcb_DURITEM)
#define DSET_PROCS(ds) ((ds)->opts.pollopts == LCB_DURABILITY_MODE_CAS \
? (&lcbdur_cas_procs) : (&lcbdur_seqno_procs))
#define ENT_NUMINFO(ent) 4
int lcbdur_ent_check_done(lcb_DURITEM *ent);
void lcbdur_ent_finish(lcb_DURITEM *ent);
void lcbdur_reqs_done(lcb_DURSET *dset);
void
lcbdur_prepare_item(lcb_DURITEM *item, lcb_U16 *ixarray, size_t *nitems);
#define LCBDUR_UPDATE_PERSISTED 1
#define LCBDUR_UPDATE_REPLICATED 2
void
lcbdur_update_item(lcb_DURITEM *item, int flags, int ix);
lcbdur_SERVINFO *
lcbdur_ent_getinfo(lcb_DURITEM *item, int srvix);
void lcbdur_switch_state(lcb_DURSET *dset, unsigned int state);
#define lcbdur_ref(dset) (dset)->refcnt++;
void lcbdur_unref(lcb_DURSET *dset);
#endif
#ifdef __cplusplus
}
#endif
#endif