Shows how to make multi-path requests using subdocument API.
Shows how to make multi-path requests using subdocument API.
#undef NDEBUG
#include <cassert>
#include <cstring>
#include <string>
{
const char *key;
size_t key_len;
lcb_respget_key(resp, &key, &key_len);
fprintf(stderr,
"Got callback for %s (%.*s)..\n",
lcb_strcbtype(cbtype), (
int)key_len, key);
if (rc != LCB_SUCCESS) {
return;
}
const char *value;
size_t nvalue;
lcb_respget_value(resp, &value, &nvalue);
fprintf(stderr, "Value %.*s\n", (int)nvalue, value);
}
{
const char *key;
size_t key_len;
lcb_respstore_key(resp, &key, &key_len);
fprintf(stderr,
"Got callback for %s (%.*s)..\n",
lcb_strcbtype(cbtype), (
int)key_len, key);
if (rc != LCB_SUCCESS) {
return;
}
fprintf(stderr, "OK\n");
}
static void subdoc_callback(
lcb_INSTANCE *,
int type,
const lcb_RESPSUBDOC *resp)
{
const char *key;
size_t key_len;
lcb_respsubdoc_key(resp, &key, &key_len);
fprintf(stderr,
"Got callback for %s (%.*s)..\n",
lcb_strcbtype(type), (
int)key_len, key);
if (rc != LCB_SUCCESS) {
return;
}
size_t total = lcb_respsubdoc_result_size(resp);
for (size_t idx = 0; idx < total; idx++) {
rc = lcb_respsubdoc_result_status(resp, idx);
const char *value;
size_t nvalue;
lcb_respsubdoc_result_value(resp, idx, &value, &nvalue);
printf("[%lu]: 0x%x. %.*s\n", idx, rc, (int)nvalue, value);
}
}
#define DEFAULT_CONNSTR "couchbase://localhost"
int main(int argc, char **argv)
{
lcb_CREATEOPTS *crst = NULL;
const char *connstr, *username, *password;
if (argc > 1) {
connstr = argv[1];
} else {
connstr = DEFAULT_CONNSTR;
}
if (argc > 2) {
username = argv[2];
} else {
username = "Administrator";
}
if (argc > 3) {
password = argv[3];
} else {
password = "password";
}
lcb_createopts_connstr(crst, connstr, strlen(connstr));
lcb_createopts_credentials(crst, username, strlen(username), password, strlen(password));
lcb_createopts_destroy(crst);
assert(rc == LCB_SUCCESS);
assert(rc == LCB_SUCCESS);
assert(rc == LCB_SUCCESS);
lcb_CMDSTORE *scmd;
lcb_cmdstore_key(scmd, "key", 3);
const char *initval = "{\"hello\":\"world\"}";
lcb_cmdstore_value(scmd, initval, strlen(initval));
rc = lcb_store(instance, NULL, scmd);
lcb_cmdstore_destroy(scmd);
assert(rc == LCB_SUCCESS);
lcb_SUBDOCSPECS *specs;
lcb_subdocspecs_create(&specs, 5);
std::string bufs[10];
for (int ii = 0; ii < 5; ii++) {
std::string &path = bufs[ii * 2];
std::string &val = bufs[(ii * 2) + 1];
char pbuf[24], vbuf[24];
snprintf(pbuf, sizeof(pbuf), "pth%d", ii);
snprintf(vbuf, sizeof(vbuf), "\"Value_%d\"", ii);
path = pbuf;
val = vbuf;
lcb_subdocspecs_dict_upsert(specs, ii, 0, path.c_str(), path.size(), val.c_str(), val.size());
}
lcb_CMDSUBDOC *mcmd;
lcb_cmdsubdoc_create(&mcmd);
lcb_cmdsubdoc_key(mcmd, "key", 3);
lcb_cmdsubdoc_specs(mcmd, specs);
rc = lcb_subdoc(instance, NULL, mcmd);
lcb_subdocspecs_destroy(specs);
assert(rc == LCB_SUCCESS);
lcb_subdocspecs_create(&specs, 6);
for (int ii = 0; ii < 5; ii++) {
char pbuf[24];
std::string &path = bufs[ii];
snprintf(pbuf, sizeof(pbuf), "pth%d", ii);
path = pbuf;
lcb_subdocspecs_get(specs, ii, 0, path.c_str(), path.size());
}
lcb_subdocspecs_get(specs, 5, 0, "dummy", 5);
lcb_cmdsubdoc_specs(mcmd, specs);
rc = lcb_subdoc(instance, NULL, mcmd);
lcb_subdocspecs_destroy(specs);
lcb_cmdsubdoc_destroy(mcmd);
assert(rc == LCB_SUCCESS);
lcb_CMDGET *gcmd;
lcb_cmdget_create(&gcmd);
lcb_cmdget_key(gcmd, "key", 3);
rc = lcb_get(instance, NULL, gcmd);
assert(rc == LCB_SUCCESS);
lcb_cmdget_destroy(gcmd);
}
Main header file for Couchbase.
void lcb_destroy(lcb_INSTANCE *instance)
Destroy (and release all allocated resources) an instance of lcb.
LCB_INTERNAL_API const char * lcb_strerror_short(lcb_STATUS error)
Get a shorter textual description of an error message.
lcb_STATUS
Error codes returned by the library.
Definition error.h:213
struct lcb_RESPGET_ lcb_RESPGET
Command for retrieving a single item.
Definition couchbase.h:687
lcb_STATUS lcb_get_bootstrap_status(lcb_INSTANCE *instance)
Gets the initial bootstrap status.
lcb_STATUS lcb_create(lcb_INSTANCE **instance, const lcb_CREATEOPTS *options)
Create an instance of lcb.
struct lcb_st lcb_INSTANCE
Library handle representing a connection to a cluster and its data buckets.
Definition couchbase.h:35
lcb_STATUS lcb_connect(lcb_INSTANCE *instance)
Schedule the initial connection This function will schedule the initial connection for the handle.
@ LCB_TYPE_BUCKET
Handle for data access (default)
Definition couchbase.h:256
lcb_RESPCALLBACK lcb_install_callback(lcb_INSTANCE *instance, int cbtype, lcb_RESPCALLBACK cb)
void(* lcb_RESPCALLBACK)(lcb_INSTANCE *instance, int cbtype, const lcb_RESPBASE *resp)
Callback invoked for responses.
Definition couchbase.h:554
const char * lcb_strcbtype(int cbtype)
Returns the type of the callback as a string.
@ LCB_CALLBACK_GET
lcb_get()
Definition couchbase.h:471
@ LCB_CALLBACK_STORE
lcb_store()
Definition couchbase.h:472
@ LCB_CALLBACK_SDLOOKUP
<for lcb_storedur3()
Definition couchbase.h:487
struct lcb_RESPSTORE_ lcb_RESPSTORE
Schedule a single storage request.
Definition couchbase.h:978
@ LCB_STORE_UPSERT
The default storage mode.
Definition couchbase.h:894
lcb_STATUS lcb_wait(lcb_INSTANCE *instance, lcb_WAITFLAGS flags)
Wait for completion of scheduled operations.
@ LCB_WAIT_DEFAULT
Behave like the old lcb_wait()
Definition couchbase.h:1861