#include "perl-couchbase.h"
#include "plcb-util.h"
#include <libcouchbase/n1ql.h>

MODULE = Couchbase::N1QL::Params PACKAGE = Couchbase::N1QL::Params PREFIX = N1P_

PROTOTYPES: DISABLE

SV *
N1P_new(SV *)
    PREINIT:
    HV *stash;

    CODE:
    lcb_N1QLPARAMS *pp = lcb_n1p_new();
    RETVAL = newRV_noinc(newSVuv(PTR2UV(pp)));
    stash = gv_stashpv("Couchbase::N1QL::Params", GV_ADD);
    sv_bless(RETVAL, stash);
    OUTPUT: RETVAL

void
N1P_DESTROY(lcb_N1QLPARAMS *params)
    CODE:
    lcb_n1p_free(params);

void
N1P_setquery(lcb_N1QLPARAMS *params, const char *query, int type)
    PREINIT:
    lcb_error_t rc;
    CODE:
    rc = lcb_n1p_setquery(params, query, -1, type);
    if (rc != LCB_SUCCESS) {
        die("Couldn't set query `%s`: %s (0x%x)", query, lcb_strerror(NULL, rc), rc);
    }

void
N1P_namedparam(lcb_N1QLPARAMS *params, const char *name, const char *value)
    PREINIT:
    lcb_error_t rc;
    CODE:
    rc = lcb_n1p_namedparamz(params, name, value);
    if (rc != LCB_SUCCESS) {
        die("Couldn't set named param %s=%s: %s (0x%x)", name, value, lcb_strerror(NULL, rc), rc);
    }

void
N1P_posparam(lcb_N1QLPARAMS *params, const char *value)
    PREINIT:
    lcb_error_t rc;
    CODE:
    rc =lcb_n1p_posparam(params, value, -1);
    if (rc != LCB_SUCCESS) {
        die("Couldn't add positional argument %s: %s (0x%x)", value, lcb_strerror(NULL, rc), rc);
    }

void
N1P_setopt(lcb_N1QLPARAMS *params, const char *option, const char *value)
    PREINIT:
    lcb_error_t rc;
    CODE:
    rc = lcb_n1p_setoptz(params, option, value);
    if (rc != LCB_SUCCESS) {
        die("Couldn't set option %s=%s: %s (0x%x)", option, value, lcb_strerror(NULL, rc), rc);
    }