Shows N1QL query API. Also because queries executed in a loop, the sample might be used as simple benchmark (more sofisticated shipped with cbc tools, as cbc-n1qlback)
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <libcouchbase/ixmgmt.h>
static void check(
lcb_STATUS err,
const char *msg)
{
if (err != LCB_SUCCESS) {
exit(EXIT_FAILURE);
}
}
{
switch (err) {
case LCB_SUCCESS:
return 32;
case LCB_ERR_DOCUMENT_EXISTS:
return 33;
default:
return 31;
}
}
static void ln2space(const void *buf, size_t nbuf)
{
size_t ii;
char *str = (char *)buf;
for (ii = 0; ii < nbuf; ii++) {
if (str[ii] == '\n') {
str[ii] = ' ';
}
}
}
{
const char *row;
size_t nrow;
lcb_respquery_row(resp, &row, &nrow);
ln2space(row, nrow);
fprintf(stderr,
"[\x1b[%dmQUERY\x1b[0m] %s, (%d) %.*s\n", err2color(rc),
lcb_strerror_short(rc), (
int)nrow,
(int)nrow, row);
if (lcb_respquery_is_final(resp)) {
fprintf(stderr, "\n");
}
}
static void idx_callback(
lcb_INSTANCE *instance,
int type,
const lcb_RESPN1XMGMT *resp)
{
const char *row;
size_t nrow;
lcb_respquery_row(inner, &row, &nrow);
ln2space(row, nrow);
fprintf(stderr,
"[\x1b[%dmINDEX\x1b[0m] %s, (%d) %.*s\n", err2color(resp->rc),
lcb_strerror_short(resp->rc),
(int)nrow, (int)nrow, row);
}
{
const char *key;
size_t nkey;
lcb_respstore_key(resp, &key, &nkey);
(int)nkey, key);
}
{
const char *key;
size_t nkey;
rc = lcb_respget_status(resp);
lcb_respget_key(resp, &key, &nkey);
(int)nkey, key);
}
static int running = 1;
static void sigint_handler(int unused)
{
running = 0;
}
int main(int argc, char *argv[])
{
char *bucket = NULL;
const char *key = "user:king_arthur";
const char *val = "{"
" \"email\": \"kingarthur@couchbase.com\","
" \"interests\": [\"Holy Grail\", \"African Swallows\"]"
"}";
if (argc < 2) {
fprintf(stderr, "Usage: %s couchbase://host/bucket [ password [ username ] ]\n", argv[0]);
exit(EXIT_FAILURE);
}
{
lcb_CREATEOPTS *options = NULL;
lcb_createopts_connstr(options, argv[1], strlen(argv[1]));
if (argc > 3) {
lcb_createopts_credentials(options, argv[3], strlen(argv[3]), argv[2], strlen(argv[2]));
}
check(
lcb_create(&instance, options),
"create couchbase handle");
lcb_createopts_destroy(options);
}
{
lcb_CMDSTORE *cmd;
lcb_cmdstore_key(cmd, key, strlen(key));
lcb_cmdstore_value(cmd, val, strlen(val));
check(lcb_store(instance, NULL, cmd), "schedule STORE operation");
lcb_cmdstore_destroy(cmd);
}
{
lcb_CMDGET *cmd;
lcb_cmdget_create(&cmd);
lcb_cmdget_key(cmd, key, strlen(key));
check(lcb_get(instance, NULL, cmd), "schedule GET operation");
lcb_cmdget_destroy(cmd);
}
{
check(lcb_n1x_create(instance, NULL, &cmd), "schedule N1QL index creation operation");
}
struct sigaction action;
sigemptyset(&action.sa_mask);
action.sa_handler = sigint_handler;
action.sa_flags = 0;
sigaction(SIGINT, &action, NULL);
while (running) {
char query[1024] = {0};
const char *param = "\"African Swallows\"";
snprintf(query, sizeof(query), "SELECT * FROM `%s` WHERE $1 in interests LIMIT 1", bucket);
"set QUERY 'pretty' option");
lcb_cmdquery_callback(cmd, row_callback);
check(
lcb_query(instance, NULL, cmd),
"schedule QUERY operation");
}
return 0;
}