forked from couchbaselabs/devguide-examples
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathupdating.c
86 lines (70 loc) · 2.42 KB
/
updating.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <libcouchbase/couchbase.h>
#include <libcouchbase/api3.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
lcb_error_t rc;
lcb_cas_t cas;
} my_OPINFO;
static void update_callback(lcb_t instance, int cbtype, const lcb_RESPBASE *resp)
{
my_OPINFO *info = resp->cookie;
info->rc = resp->rc;
info->cas = resp->cas;
}
int main(int argc, char **argv)
{
lcb_t instance;
struct lcb_create_st crst = {};
lcb_error_t rc;
lcb_CMDSTORE cmd = {0};
const char *key, *value;
my_OPINFO info;
crst.version = 3;
crst.v.v3.connstr = "couchbase://127.0.0.1/default";
crst.v.v3.username = "testuser";
crst.v.v3.passwd = "password";
/* See connecting.c for error checking */
lcb_create(&instance, &crst);
lcb_connect(instance);
lcb_wait(instance);
rc = lcb_get_bootstrap_status(instance);
if (rc != LCB_SUCCESS) {
printf("Unable to bootstrap cluster: %s\n", lcb_strerror_short(rc));
exit(1);
}
/* Set global storage callback */
lcb_install_callback3(instance, LCB_CALLBACK_STORE, update_callback);
key = "docid";
value = "{\"property\":\"value\"}";
LCB_CMD_SET_KEY(&cmd, key, strlen(key));
LCB_CMD_SET_VALUE(&cmd, value, strlen(value));
lcb_sched_enter(instance);
/* Schedule unconditional upsert (LCB_SET). Should always succeed */
cmd.operation = LCB_SET;
rc = lcb_store3(instance, &info, &cmd);
if (rc != LCB_SUCCESS) {
printf("Couldn't schedule store operation: %s\n", lcb_strerror_short(rc));
exit(EXIT_FAILURE);
}
lcb_sched_leave(instance);
lcb_wait(instance);
printf("Upsert for %s got code %s (0 is success)\n", key, lcb_strerror_short(info.rc));
/* Preserve the operation structure, just changing the operation type */
lcb_sched_enter(instance);
/* Do an insert (LCB_ADD). This will fail since the item already exists */
cmd.operation = LCB_ADD;
lcb_store3(instance, &info, &cmd);
lcb_sched_leave(instance);
lcb_wait(instance);
printf("Insert for %s got code %s (0 is success). Failure expected\n", key, lcb_strerror_short(info.rc));
/* Do a replace (LCB_REPLACE) */
cmd.operation = LCB_REPLACE;
lcb_sched_enter(instance);
lcb_store3(instance, &info, &cmd);
lcb_sched_leave(instance);
lcb_wait(instance);
printf("Replace for %s got code %s\n", key, lcb_strerror_short(info.rc));
lcb_destroy(instance);
return 0;
}