The C client library, libcouchbase, is a
callback oriented client which makes it very easy to write high
performance programs. There are a few ways you can drive IO with
the library. The simplest is to use the synchronous interface over
the asynch internals of the library. More advanced programs will
want to either call the libcouchbase_wait()
function after generating some operations, or drive the event loop
themselves.
To connect, you must configure the connection options and then create an instance of the connection to the cluster:
struct lcb_create_st create_options; lcb_t instance; lcb_error_t err; memset(&create_options, 0, sizeof(create_options)); create_options.v.v0.host = "myserver:8091"; create_options.v.v0.user = "mybucket"; create_options.v.v0.passwd = "secret"; create_options.v.v0.bucket = "mybucket"; err = lcb_create(&instance, &create_options); if (err != LCB_SUCCESS) { fprintf(stderr, "Failed to create libcouchbase instance: %s\n", lcb_strerror(NULL, err)); return 1; } /* Set up the handler to catch all errors! */ lcb_set_error_callback(instance, error_callback); /* * Initiate the connect sequence in libcouchbase */ if ((err = lcb_connect(instance)) != LCB_SUCCESS) { fprintf(stderr, "Failed to initiate connect: %s\n", lcb_strerror(NULL, err)); return 1; } /* Run the event loop and wait until we've connected */ lcb_wait(instance);
Callbacks are used by the library and are simple functions to handle the result of operations. For example:
struct lcb_create_st create_options; lcb_t instance; lcb_error_t err; memset(&create_options, 0, sizeof(create_options)); create_options.v.v0.host = "myserver:8091"; create_options.v.v0.user = "mybucket"; create_options.v.v0.passwd = "secret"; create_options.v.v0.bucket = "mybucket"; err = lcb_create(&instance, &create_options); if (err != LCB_SUCCESS) { fprintf(stderr, "Failed to create libcouchbase instance: %s\n", lcb_strerror(NULL, err)); return 1; } /* Set up the handler to catch all errors! */ lcb_set_error_callback(instance, error_callback); /* * Initiate the connect sequence in libcouchbase */ if ((err = lcb_connect(instance)) != LCB_SUCCESS) { fprintf(stderr, "Failed to initiate connect: %s\n", lcb_strerror(NULL, err)); return 1; } /* Run the event loop and wait until we've connected */ lcb_wait(instance);
Callbacks can be set up for all of your operations called in libcouchbase. In the API, you'll note the use of a "cookie". This is opaque data from your application which is associated with the request. Underlying libcouchbase will not inspect the field, or send it to the server.
Putting the connect logic and the get callback all together into a complete program with the include headers would be:
#include <libcouchbase/couchbase.h> #include <stdlib.h> #include <stdio.h> static void error_callback(lcb_t instance, lcb_error_t err, const char *errinfo) { fprintf(stderr, "Error %s: %s", lcb_strerror(instance, err), errinfo ? errinfo : ""); exit(EXIT_FAILURE); } static void get_callback(lcb_t instance, const void *cookie, lcb_error_t error, const lcb_get_resp_t *resp) { if (error != LCB_SUCCESS) { fprintf(stderr, "Failed to retrieve \""); fwrite(resp->v.v0.key, 1, resp->v.v0.nkey, stderr); fprintf(stderr, "\": %s\n", lcb_strerror(instance, error)); } else { fprintf(stderr, "Data for key: \""); fwrite(resp->v.v0.key, 1, resp->v.v0.nkey, stderr); fprintf(stderr, "\" is : "); fwrite(resp->v.v0.bytes, 1, resp->v.v0.nbytes, stderr); } } int main(void) { struct lcb_create_st create_options; lcb_t instance; lcb_error_t err; memset(&create_options, 0, sizeof(create_options)); create_options.v.v0.host = "myserver:8091"; create_options.v.v0.user = "mybucket"; create_options.v.v0.passwd = "secret"; create_options.v.v0.bucket = "mybucket"; err = lcb_create(&instance, &create_options); if (err != LCB_SUCCESS) { fprintf(stderr, "Failed to create libcouchbase instance: %s\n", lcb_strerror(NULL, err)); return 1; } /* Set up the handler to catch all errors! */ lcb_set_error_callback(instance, error_callback); /* * Initiate the connect sequence in libcouchbase */ if ((err = lcb_connect(instance)) != LCB_SUCCESS) { fprintf(stderr, "Failed to initiate connect: %s\n", lcb_strerror(NULL, err)); return 1; } /* Run the event loop and wait until we've connected */ lcb_wait(instance); /* * Set up a callback for our get requests */ lcb_set_get_callback(instance, get_callback); lcb_get_cmd_t cmd; const lcb_get_cmd_t * const commands[1] = { &cmd }; memset(&cmd, 0, sizeof(cmd)); cmd.v.v0.key = "foo"; cmd.v.v0.nkey = 3; err = lcb_get(instance, NULL, 1, commands); if (err != LCB_SUCCESS) { fprintf(stderr, "Failed to get: %s\n", lcb_strerror(NULL, err)); return 1; } lcb_wait(instance); lcb_destroy(instance); exit(EXIT_SUCCESS); }
To compile this sample program, you must link to
libcouchbase:
shell> gcc -o hellocb -lcouchbase hellocb.c