libcouchbase 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libcouchbase/.gitignore +2 -0
  3. data/ext/libcouchbase/CMakeLists.txt +5 -7
  4. data/ext/libcouchbase/README.markdown +2 -2
  5. data/ext/libcouchbase/RELEASE_NOTES.markdown +49 -0
  6. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +11 -0
  7. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +2 -0
  8. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +2 -1
  9. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
  10. data/ext/libcouchbase/cmake/config-cmake.h.in +2 -0
  11. data/ext/libcouchbase/cmake/defs.mk.in +0 -2
  12. data/ext/libcouchbase/cmake/source_files.cmake +34 -14
  13. data/ext/libcouchbase/configure.pl +1 -1
  14. data/ext/libcouchbase/contrib/genhash/genhash.h +6 -0
  15. data/ext/libcouchbase/include/libcouchbase/auth.h +10 -0
  16. data/ext/libcouchbase/include/libcouchbase/couchbase.h +10 -0
  17. data/ext/libcouchbase/include/libcouchbase/error.h +7 -0
  18. data/ext/libcouchbase/include/libcouchbase/n1ql.h +13 -1
  19. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +1 -1
  20. data/ext/libcouchbase/include/libcouchbase/subdoc.h +9 -0
  21. data/ext/libcouchbase/include/libcouchbase/views.h +7 -1
  22. data/ext/libcouchbase/include/libcouchbase/visibility.h +1 -0
  23. data/ext/libcouchbase/include/memcached/protocol_binary.h +21 -1132
  24. data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
  25. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +3 -2
  26. data/ext/libcouchbase/src/README.md +0 -2
  27. data/ext/libcouchbase/src/auth-priv.h +1 -0
  28. data/ext/libcouchbase/src/auth.cc +10 -0
  29. data/ext/libcouchbase/src/bootstrap.cc +216 -0
  30. data/ext/libcouchbase/src/bootstrap.h +50 -39
  31. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +455 -0
  32. data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
  33. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +528 -0
  34. data/ext/libcouchbase/src/bucketconfig/bc_http.h +50 -25
  35. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.cc +115 -0
  36. data/ext/libcouchbase/src/bucketconfig/clconfig.h +407 -386
  37. data/ext/libcouchbase/src/bucketconfig/confmon.cc +378 -0
  38. data/ext/libcouchbase/src/cbft.cc +22 -27
  39. data/ext/libcouchbase/src/cntl.cc +24 -24
  40. data/ext/libcouchbase/src/connspec.cc +30 -1
  41. data/ext/libcouchbase/src/connspec.h +17 -0
  42. data/ext/libcouchbase/src/dns-srv.cc +143 -0
  43. data/ext/libcouchbase/src/{dump.c → dump.cc} +8 -11
  44. data/ext/libcouchbase/src/getconfig.cc +73 -0
  45. data/ext/libcouchbase/src/handler.cc +84 -85
  46. data/ext/libcouchbase/src/hostlist.cc +0 -1
  47. data/ext/libcouchbase/src/hostlist.h +6 -1
  48. data/ext/libcouchbase/src/http/http-priv.h +125 -112
  49. data/ext/libcouchbase/src/http/http.cc +9 -29
  50. data/ext/libcouchbase/src/http/http.h +1 -34
  51. data/ext/libcouchbase/src/http/http_io.cc +22 -26
  52. data/ext/libcouchbase/src/instance.cc +102 -28
  53. data/ext/libcouchbase/src/internal.h +47 -29
  54. data/ext/libcouchbase/src/jsparse/parser.cc +146 -202
  55. data/ext/libcouchbase/src/jsparse/parser.h +91 -98
  56. data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
  57. data/ext/libcouchbase/src/lcbht/lcbht.h +174 -163
  58. data/ext/libcouchbase/src/lcbio/connect.cc +562 -0
  59. data/ext/libcouchbase/src/lcbio/connect.h +9 -2
  60. data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
  61. data/ext/libcouchbase/src/lcbio/iotable.h +61 -16
  62. data/ext/libcouchbase/src/lcbio/ioutils.h +1 -1
  63. data/ext/libcouchbase/src/lcbio/manager.c +2 -2
  64. data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
  65. data/ext/libcouchbase/src/mc/mcreq.h +9 -2
  66. data/ext/libcouchbase/src/mcserver/mcserver.cc +723 -0
  67. data/ext/libcouchbase/src/mcserver/mcserver.h +160 -70
  68. data/ext/libcouchbase/src/mcserver/negotiate.cc +118 -152
  69. data/ext/libcouchbase/src/mcserver/negotiate.h +85 -74
  70. data/ext/libcouchbase/src/mctx-helper.h +51 -0
  71. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +1 -2
  72. data/ext/libcouchbase/src/n1ql/n1ql.cc +56 -32
  73. data/ext/libcouchbase/src/{newconfig.c → newconfig.cc} +42 -70
  74. data/ext/libcouchbase/src/nodeinfo.cc +4 -8
  75. data/ext/libcouchbase/src/operations/{cbflush.c → cbflush.cc} +7 -15
  76. data/ext/libcouchbase/src/operations/{counter.c → counter.cc} +0 -0
  77. data/ext/libcouchbase/src/operations/{durability-cas.c → durability-cas.cc} +92 -76
  78. data/ext/libcouchbase/src/operations/{durability-seqno.c → durability-seqno.cc} +55 -49
  79. data/ext/libcouchbase/src/operations/durability.cc +643 -0
  80. data/ext/libcouchbase/src/operations/durability_internal.h +212 -124
  81. data/ext/libcouchbase/src/operations/{get.c → get.cc} +24 -26
  82. data/ext/libcouchbase/src/operations/{observe-seqno.c → observe-seqno.cc} +5 -8
  83. data/ext/libcouchbase/src/operations/{observe.c → observe.cc} +69 -94
  84. data/ext/libcouchbase/src/operations/{pktfwd.c → pktfwd.cc} +0 -0
  85. data/ext/libcouchbase/src/operations/{remove.c → remove.cc} +0 -0
  86. data/ext/libcouchbase/src/operations/{stats.c → stats.cc} +66 -78
  87. data/ext/libcouchbase/src/operations/{store.c → store.cc} +27 -32
  88. data/ext/libcouchbase/src/operations/subdoc.cc +38 -18
  89. data/ext/libcouchbase/src/operations/{touch.c → touch.cc} +0 -0
  90. data/ext/libcouchbase/src/packetutils.h +200 -137
  91. data/ext/libcouchbase/src/probes.d +1 -1
  92. data/ext/libcouchbase/src/{retrychk.c → retrychk.cc} +3 -4
  93. data/ext/libcouchbase/src/retryq.cc +394 -0
  94. data/ext/libcouchbase/src/retryq.h +116 -104
  95. data/ext/libcouchbase/src/settings.h +2 -1
  96. data/ext/libcouchbase/src/ssl/ssl_c.c +1 -0
  97. data/ext/libcouchbase/src/ssl/ssl_e.c +0 -1
  98. data/ext/libcouchbase/src/trace.h +8 -8
  99. data/ext/libcouchbase/src/vbucket/vbucket.c +0 -1
  100. data/ext/libcouchbase/src/views/{docreq.c → docreq.cc} +48 -54
  101. data/ext/libcouchbase/src/views/docreq.h +24 -30
  102. data/ext/libcouchbase/src/views/viewreq.cc +318 -0
  103. data/ext/libcouchbase/src/views/viewreq.h +43 -13
  104. data/ext/libcouchbase/src/{wait.c → wait.cc} +12 -17
  105. data/ext/libcouchbase/tests/basic/t_connstr.cc +89 -50
  106. data/ext/libcouchbase/tests/basic/t_jsparse.cc +27 -78
  107. data/ext/libcouchbase/tests/basic/t_packet.cc +35 -42
  108. data/ext/libcouchbase/tests/htparse/t_basic.cc +58 -78
  109. data/ext/libcouchbase/tests/iotests/t_confmon.cc +94 -111
  110. data/ext/libcouchbase/tests/iotests/t_sched.cc +1 -2
  111. data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
  112. data/ext/libcouchbase/tools/cbc-pillowfight.cc +1 -1
  113. data/lib/libcouchbase/version.rb +1 -1
  114. metadata +36 -39
  115. data/ext/libcouchbase/include/memcached/vbucket.h +0 -42
  116. data/ext/libcouchbase/src/bootstrap.c +0 -269
  117. data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +0 -495
  118. data/ext/libcouchbase/src/bucketconfig/bc_file.c +0 -347
  119. data/ext/libcouchbase/src/bucketconfig/bc_http.c +0 -630
  120. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +0 -150
  121. data/ext/libcouchbase/src/bucketconfig/confmon.c +0 -474
  122. data/ext/libcouchbase/src/getconfig.c +0 -100
  123. data/ext/libcouchbase/src/lcbht/lcbht.c +0 -282
  124. data/ext/libcouchbase/src/lcbio/connect.c +0 -557
  125. data/ext/libcouchbase/src/mcserver/mcserver.c +0 -784
  126. data/ext/libcouchbase/src/operations/durability.c +0 -668
  127. data/ext/libcouchbase/src/packetutils.c +0 -60
  128. data/ext/libcouchbase/src/retryq.c +0 -424
  129. data/ext/libcouchbase/src/simplestring.c +0 -211
  130. data/ext/libcouchbase/src/simplestring.h +0 -228
  131. data/ext/libcouchbase/src/ssobuf.h +0 -82
  132. data/ext/libcouchbase/src/views/viewreq.c +0 -358
  133. data/ext/libcouchbase/tests/basic/t_string.cc +0 -112
@@ -70,7 +70,7 @@ lcb_get_node(lcb_t instance, lcb_GETNODETYPE type, unsigned ix)
70
70
 
71
71
  if (type & LCB_NODE_HTCONFIG) {
72
72
  if (type & LCB_NODE_CONNECTED) {
73
- const lcb_host_t *host = lcb_confmon_get_rest_host(instance->confmon);
73
+ const lcb_host_t *host = lcb::clconfig::http_get_host(instance->confmon);
74
74
  if (host) {
75
75
  return mk_scratch_host(instance, host);
76
76
  } else {
@@ -101,20 +101,16 @@ lcb_get_node(lcb_t instance, lcb_GETNODETYPE type, unsigned ix)
101
101
  return ensure_scratch(instance).append(hp).c_str();
102
102
  }
103
103
  } else if (type & (LCB_NODE_DATA|LCB_NODE_VIEWS)) {
104
- const mc_SERVER *server;
105
104
  ix %= LCBT_NSERVERS(instance);
106
- server = LCBT_GET_SERVER(instance, ix);
105
+ const lcb::Server *server = instance->get_server(ix);
107
106
 
108
- if ((type & LCB_NODE_CONNECTED) && server->connctx == NULL) {
109
- return return_badhost(type);
110
- }
111
- if (server->curhost == NULL) {
107
+ if ((type & LCB_NODE_CONNECTED) && !server->is_connected()) {
112
108
  return return_badhost(type);
113
109
  }
114
110
 
115
111
  /* otherwise, return the actual host:port of the server */
116
112
  if (type & LCB_NODE_DATA) {
117
- return mk_scratch_host(instance, server->curhost);
113
+ return mk_scratch_host(instance, &server->get_host());
118
114
  } else {
119
115
  return lcbvb_get_hostport(vbc, ix, LCBVB_SVCTYPE_VIEWS, mode);
120
116
  }
@@ -15,11 +15,10 @@
15
15
  */
16
16
 
17
17
  #include "internal.h"
18
- #include "simplestring.h"
19
18
  #include <http/http.h>
20
19
 
21
20
  static void
22
- flush_cb(lcb_t instance, int cbtype, const lcb_RESPBASE *rb)
21
+ flush_cb(lcb_t instance, int, const lcb_RESPBASE *rb)
23
22
  {
24
23
  const lcb_RESPHTTP *resp = (const lcb_RESPHTTP *)rb;
25
24
  lcb_RESPCBFLUSH fresp = { 0 };
@@ -35,37 +34,30 @@ flush_cb(lcb_t instance, int cbtype, const lcb_RESPBASE *rb)
35
34
  if (callback) {
36
35
  callback(instance, LCB_CALLBACK_CBFLUSH, (lcb_RESPBASE*)&fresp);
37
36
  }
38
- (void)cbtype;
39
37
  }
40
38
 
41
39
  LIBCOUCHBASE_API
42
40
  lcb_error_t
43
- lcb_cbflush3(lcb_t instance, const void *cookie, const lcb_CMDBASE *cmd)
41
+ lcb_cbflush3(lcb_t instance, const void *cookie, const lcb_CMDBASE *)
44
42
  {
45
43
  lcb_http_request_t htr;
46
44
  lcb_CMDHTTP htcmd = { 0 };
47
- lcb_string urlpath;
48
45
  lcb_error_t rc;
49
46
 
50
- (void)cmd;
51
-
52
- lcb_string_init(&urlpath);
53
- lcb_string_appendz(&urlpath, "/pools/default/buckets/");
54
- lcb_string_appendz(&urlpath, LCBT_SETTING(instance, bucket));
55
- lcb_string_appendz(&urlpath, "/controller/doFlush");
56
-
47
+ std::string urlpath("/pools/default/buckets/");
48
+ urlpath.append(LCBT_SETTING(instance, bucket));
49
+ urlpath.append("/controller/doFlush");
57
50
 
58
51
  htcmd.type = LCB_HTTP_TYPE_MANAGEMENT;
59
52
  htcmd.method = LCB_HTTP_METHOD_POST;
60
53
  htcmd.reqhandle = &htr;
61
- LCB_CMD_SET_KEY(&htcmd, urlpath.base, urlpath.nused);
54
+ LCB_CMD_SET_KEY(&htcmd, urlpath.c_str(), urlpath.size());
62
55
 
63
56
  rc = lcb_http3(instance, cookie, &htcmd);
64
- lcb_string_release(&urlpath);
65
57
 
66
58
  if (rc != LCB_SUCCESS) {
67
59
  return rc;
68
60
  }
69
- lcb_htreq_setcb(htr, flush_cb);
61
+ htr->set_callback(flush_cb);
70
62
  return LCB_SUCCESS;
71
63
  }
@@ -16,16 +16,50 @@
16
16
  */
17
17
 
18
18
  #define LCBDUR_PRIV_SYMS
19
+
19
20
  #include <libcouchbase/couchbase.h>
20
21
  #include <libcouchbase/api3.h>
21
22
  #include "internal.h"
22
23
  #include "durability_internal.h"
23
24
 
24
- #define DSET_HT(dset) (dset)->impldata
25
+ using namespace lcb::durability;
26
+
27
+ namespace {
28
+ struct CasDurset : public Durset {
29
+ CasDurset(lcb_t instance_, const lcb_durability_opts_t *options)
30
+ : Durset(instance_, options), ht(NULL) {
31
+ }
32
+
33
+ virtual ~CasDurset();
34
+
35
+ void update(lcb_error_t err, const lcb_RESPOBSERVE *resp);
36
+ Item& find(const char *s, size_t n) {
37
+ if (entries.size() == 1) {
38
+ return entries.back();
39
+ } else {
40
+ return *reinterpret_cast<Item*>(genhash_find(ht, s, n));
41
+ }
42
+ }
43
+
44
+ // Override
45
+ lcb_error_t prepare_schedule();
46
+ lcb_error_t poll_impl();
47
+
48
+ genhash_t *ht;
49
+ };
50
+ }
51
+
52
+
53
+ Durset*
54
+ Durset::createCasDurset(lcb_t instance, const lcb_durability_opts_t *options) {
55
+ return new CasDurset(instance, options);
56
+ }
57
+
58
+
25
59
 
26
60
  /* Called when the criteria is to ensure the key exists somewhow */
27
61
  static int
28
- check_positive_durability(lcb_DURITEM *ent, const lcb_RESPOBSERVE *res)
62
+ check_positive_durability(Item& ent, const lcb_RESPOBSERVE *res)
29
63
  {
30
64
  switch (res->status) {
31
65
  case LCB_OBSERVE_NOT_FOUND:
@@ -33,131 +67,122 @@ check_positive_durability(lcb_DURITEM *ent, const lcb_RESPOBSERVE *res)
33
67
  /* If we get NOT_FOUND from the master, this means the key
34
68
  * simply does not exists (and we don't have to continue polling) */
35
69
  if (res->ismaster) {
36
- RESFLD(ent, rc) = LCB_KEY_ENOENT;
37
- lcbdur_ent_finish(ent);
70
+ ent.finish(LCB_KEY_ENOENT);
38
71
  }
39
- return 0;
72
+ return Item::NO_CHANGES;
40
73
 
41
74
  case LCB_OBSERVE_PERSISTED:
42
- return LCBDUR_UPDATE_PERSISTED | LCBDUR_UPDATE_REPLICATED;
75
+ return Item::UPDATE_PERSISTED | Item::UPDATE_REPLICATED;
43
76
 
44
77
  case LCB_OBSERVE_FOUND:
45
- return LCBDUR_UPDATE_REPLICATED;
78
+ return Item::UPDATE_REPLICATED;
46
79
 
47
80
  default:
48
- RESFLD(ent, rc) = LCB_EINTERNAL;
49
- lcbdur_ent_finish(ent);
50
- return 0;
81
+ ent.finish(LCB_EINTERNAL);
82
+ return Item::NO_CHANGES;
51
83
  }
52
84
  }
53
85
 
54
86
  /* Called when the criteria is to ensure that the key is deleted somehow */
55
87
  static int
56
- check_negative_durability(lcb_DURITEM *ent, const lcb_RESPOBSERVE *res)
88
+ check_negative_durability(Item& ent, const lcb_RESPOBSERVE *res)
57
89
  {
58
90
  switch (res->status) {
59
91
  case LCB_OBSERVE_PERSISTED:
60
92
  case LCB_OBSERVE_FOUND:
61
93
  /* Still there! */
62
- return 0;
94
+ return Item::NO_CHANGES;
63
95
 
64
96
  case LCB_OBSERVE_LOGICALLY_DELETED:
65
97
  /* removed from cache, but not actually deleted from disk */
66
- return LCBDUR_UPDATE_REPLICATED;
98
+ return Item::UPDATE_REPLICATED;
67
99
 
68
100
  case LCB_OBSERVE_NOT_FOUND:
69
101
  /* No knowledge of key. */
70
- return LCBDUR_UPDATE_PERSISTED | LCBDUR_UPDATE_REPLICATED;
102
+ return Item::UPDATE_PERSISTED | Item::UPDATE_REPLICATED;
71
103
 
72
104
  default:
73
- RESFLD(ent, rc) = LCB_EINTERNAL;
74
- lcbdur_ent_finish(ent);
75
- return 0;
105
+ ent.finish(LCB_EINTERNAL);
106
+ return Item::NO_CHANGES;
76
107
  }
77
108
  }
78
109
 
110
+ void lcbdur_cas_update(lcb_t, void *dset, lcb_error_t err,
111
+ const lcb_RESPOBSERVE *resp)
112
+ {
113
+ reinterpret_cast<CasDurset*>(dset)->update(err, resp);
114
+ }
115
+
79
116
  /* Observe callback. Called internally by observe.c */
80
117
  void
81
- lcbdur_cas_update(lcb_t instance,
82
- lcb_DURSET *dset, lcb_error_t err, const lcb_RESPOBSERVE *resp)
118
+ CasDurset::update(lcb_error_t err, const lcb_RESPOBSERVE *resp)
83
119
  {
84
- lcb_DURITEM *ent;
85
- int flags;
86
-
87
120
  if (resp->key == NULL) {
88
121
  /* Last observe response for requests. Start polling after interval */
89
- lcbdur_reqs_done(dset);
122
+ on_poll_done();
90
123
  return;
91
124
  }
92
125
 
93
- if (DSET_COUNT(dset) == 1) {
94
- ent = DSET_ENTRIES(dset);
95
- } else {
96
- ent = genhash_find(DSET_HT(dset), resp->key, resp->nkey);
97
- }
126
+ Item& ent = find(reinterpret_cast<const char *>(resp->key), resp->nkey);
98
127
 
99
- if (ent->done) {
128
+ if (ent.done) {
100
129
  /* ignore subsequent errors */
101
130
  return;
102
131
  }
103
132
 
104
133
  if (err != LCB_SUCCESS) {
105
- RESFLD(ent, rc) = err;
134
+ ent.res().rc = err;
106
135
  return;
107
136
  }
108
137
 
109
- RESFLD(ent, nresponses)++;
138
+ ent.res().nresponses++;
110
139
  if (resp->cas && resp->ismaster) {
111
- RESFLD(ent, cas) = resp->cas;
140
+ ent.res().cas = resp->cas;
112
141
 
113
- if (ent->reqcas && ent->reqcas != resp->cas) {
114
- RESFLD(ent, rc) = LCB_KEY_EEXISTS;
115
- lcbdur_ent_finish(ent);
142
+ if (ent.reqcas && ent.reqcas != resp->cas) {
143
+ ent.finish(LCB_KEY_EEXISTS);
116
144
  return;
117
145
  }
118
146
  }
119
147
 
120
- if (DSET_OPTFLD(ent->parent, check_delete)) {
148
+ int flags;
149
+ if (opts.check_delete) {
121
150
  flags = check_negative_durability(ent, resp);
122
151
  } else {
123
152
  flags = check_positive_durability(ent, resp);
124
153
  }
125
154
 
126
- lcbdur_update_item(ent, flags, resp->ttp);
127
- (void)instance;
155
+ ent.update(flags, resp->ttp);
128
156
  }
129
157
 
130
- static lcb_error_t
131
- cas_poll(lcb_DURSET *dset)
158
+ lcb_error_t
159
+ CasDurset::poll_impl()
132
160
  {
133
161
  lcb_MULTICMD_CTX *mctx;
134
- size_t ii;
135
162
  lcb_error_t err;
136
- lcb_t instance = dset->instance;
137
163
 
138
- mctx = lcb_observe_ctx_dur_new(dset->instance);
164
+ mctx = lcb_observe_ctx_dur_new(instance);
139
165
  if (!mctx) {
140
166
  return LCB_CLIENT_ENOMEM;
141
167
  }
142
168
 
143
- for (ii = 0; ii < DSET_COUNT(dset); ii++) {
169
+ for (size_t ii = 0; ii < entries.size(); ii++) {
144
170
  lcb_CMDOBSERVE cmd = { 0 };
145
- lcb_U16 servers[4];
146
- size_t nservers = 0;
171
+ uint16_t servers[4];
147
172
 
148
- struct lcb_DURITEM_st *ent = DSET_ENTRIES(dset) + ii;
149
- if (ent->done) {
173
+ Item& ent = entries[ii];
174
+ if (ent.done) {
150
175
  continue;
151
176
  }
152
177
 
153
- lcbdur_prepare_item(ent, servers, &nservers);
178
+ size_t nservers = ent.prepare(servers);
154
179
  if (nservers == 0) {
155
- RESFLD(ent, rc) = LCB_NO_MATCHING_SERVER;
180
+ ent.res().rc = LCB_NO_MATCHING_SERVER;
156
181
  continue;
157
182
  }
158
183
 
159
- LCB_KREQ_SIMPLE(&cmd.key, RESFLD(ent, key), RESFLD(ent, nkey));
160
- LCB_CMD__SETVBID(&cmd, ent->vbid);
184
+ LCB_KREQ_SIMPLE(&cmd.key, ent.res().key, ent.res().nkey);
185
+ LCB_CMD__SETVBID(&cmd, ent.vbid);
161
186
  cmd.servers_ = servers;
162
187
  cmd.nservers_ = nservers;
163
188
 
@@ -169,38 +194,36 @@ cas_poll(lcb_DURSET *dset)
169
194
  }
170
195
 
171
196
  lcb_sched_enter(instance);
172
- err = mctx->done(mctx, dset);
197
+ err = mctx->done(mctx, this);
173
198
  mctx = NULL;
174
199
 
175
200
  if (err == LCB_SUCCESS) {
176
201
  lcb_sched_leave(instance);
177
- dset->waiting = 1;
202
+ waiting = 1;
178
203
  } else {
179
204
  lcb_sched_fail(instance);
180
205
  }
181
206
  return err;
182
207
  }
183
208
 
184
- static lcb_error_t
185
- cas_schedule(lcb_DURSET *dset)
209
+ lcb_error_t
210
+ CasDurset::prepare_schedule()
186
211
  {
187
- size_t ii;
188
-
189
- if (DSET_COUNT(dset) < 2) {
212
+ Durset::prepare_schedule();
213
+ if (entries.size() < 2) {
190
214
  return LCB_SUCCESS;
191
215
  }
192
216
 
193
- DSET_HT(dset) = lcb_hashtable_nc_new(DSET_COUNT(dset));
194
- if (!DSET_HT(dset)) {
217
+ ht = lcb_hashtable_nc_new(entries.size());
218
+ if (!ht) {
195
219
  return LCB_CLIENT_ENOMEM;
196
220
  }
197
221
 
198
- for (ii = 0; ii < DSET_COUNT(dset); ++ii) {
222
+ for (size_t ii = 0; ii < entries.size(); ++ii) {
199
223
  int mt;
200
- lcb_DURITEM *ent = DSET_ENTRIES(dset) + ii;
224
+ Item &ent = entries[ii];
201
225
 
202
- mt = genhash_update(DSET_HT(dset),
203
- RESFLD(ent, key), RESFLD(ent, nkey), ent, 0);
226
+ mt = genhash_update(ht, ent.res().key, ent.res().nkey, &ent, 0);
204
227
  if (mt != NEW) {
205
228
  return LCB_DUPLICATE_COMMANDS;
206
229
  }
@@ -208,17 +231,10 @@ cas_schedule(lcb_DURSET *dset)
208
231
  return LCB_SUCCESS;
209
232
  }
210
233
 
211
- static void
212
- cas_clean(lcb_DURSET *dset)
234
+ CasDurset::~CasDurset()
213
235
  {
214
- if (DSET_HT(dset)) {
215
- genhash_free(DSET_HT(dset));
236
+ if (ht) {
237
+ genhash_free(ht);
238
+ ht = NULL;
216
239
  }
217
240
  }
218
-
219
- lcbdur_PROCS lcbdur_cas_procs = {
220
- cas_poll,
221
- NULL, /* ent_add */
222
- cas_schedule,
223
- cas_clean
224
- };
@@ -20,32 +20,51 @@
20
20
  #include <libcouchbase/api3.h>
21
21
  #include "durability_internal.h"
22
22
 
23
+ using namespace lcb::durability;
24
+
25
+ namespace {
26
+ class SeqnoDurset : public Durset {
27
+ public:
28
+ SeqnoDurset(lcb_t instance_, const lcb_durability_opts_t *options)
29
+ : Durset(instance_, options) {
30
+ }
31
+
32
+ // Override
33
+ lcb_error_t poll_impl();
34
+
35
+ // Override
36
+ lcb_error_t after_add(Item& item, const lcb_CMDENDURE *cmd);
37
+
38
+ void update(const lcb_RESPOBSEQNO *resp);
39
+ };
40
+ }
41
+
42
+ Durset *
43
+ Durset::createSeqnoDurset(lcb_t instance, const lcb_durability_opts_t *options) {
44
+ return new SeqnoDurset(instance, options);
45
+ }
46
+
23
47
  #define ENT_SEQNO(ent) (ent)->reqseqno
24
48
 
25
49
  static void
26
- seqno_callback(lcb_t instance, int ign, const lcb_RESPBASE *rb)
50
+ seqno_callback(lcb_t, int, const lcb_RESPBASE *rb)
27
51
  {
28
52
  const lcb_RESPOBSEQNO *resp = (const lcb_RESPOBSEQNO*)rb;
29
- char *pp = resp->cookie;
30
- lcb_DURITEM *ent;
31
53
  int flags = 0;
32
- lcb_U64 seqno_mem, seqno_disk;
54
+ Item *ent = static_cast<Item*>(reinterpret_cast<CallbackCookie*>(resp->cookie));
33
55
 
34
- pp -= offsetof(lcb_DURITEM, callback);
35
- ent = (lcb_DURITEM *)pp;
36
56
  /* Now, process the response */
37
-
38
57
  if (resp->rc != LCB_SUCCESS) {
39
- RESFLD(ent, rc) = resp->rc;
58
+ ent->res().rc = resp->rc;
40
59
  goto GT_TALLY;
41
60
  }
42
61
 
62
+ lcb_U64 seqno_mem, seqno_disk;
43
63
  if (resp->old_uuid) {
44
64
  /* Failover! */
45
65
  seqno_mem = seqno_disk = resp->old_seqno;
46
66
  if (seqno_mem < ENT_SEQNO(ent)) {
47
- RESFLD(ent, rc) = LCB_MUTATION_LOST;
48
- lcbdur_ent_finish(ent);
67
+ ent->finish(LCB_MUTATION_LOST);
49
68
  goto GT_TALLY;
50
69
  }
51
70
  } else {
@@ -57,57 +76,52 @@ seqno_callback(lcb_t instance, int ign, const lcb_RESPBASE *rb)
57
76
  goto GT_TALLY;
58
77
  }
59
78
 
60
- flags = LCBDUR_UPDATE_REPLICATED;
79
+ flags = Item::UPDATE_REPLICATED;
61
80
  if (seqno_disk >= ENT_SEQNO(ent)) {
62
- flags |= LCBDUR_UPDATE_PERSISTED;
81
+ flags |= Item::UPDATE_PERSISTED;
63
82
  }
64
83
 
65
- lcbdur_update_item(ent, flags, resp->server_index);
84
+ ent->update(flags, resp->server_index);
66
85
 
67
86
  GT_TALLY:
68
87
  if (!--ent->parent->waiting) {
69
88
  /* avoid ssertion (wait==0)! */
70
89
  ent->parent->waiting = 1;
71
- lcbdur_reqs_done(ent->parent);
90
+ ent->parent->on_poll_done();
72
91
  }
73
-
74
- (void)ign; (void)instance;
75
92
  }
76
93
 
77
- static lcb_error_t
78
- seqno_poll(lcb_DURSET *dset)
94
+ lcb_error_t
95
+ SeqnoDurset::poll_impl()
79
96
  {
80
97
  lcb_error_t ret_err = LCB_EINTERNAL; /* This should never be returned */
81
- size_t ii;
82
- int has_ops = 0;
83
- lcb_t instance = dset->instance;
98
+ bool has_ops = false;
84
99
 
85
100
  lcb_sched_enter(instance);
86
- for (ii = 0; ii < DSET_COUNT(dset); ii++) {
87
- lcb_DURITEM *ent = DSET_ENTRIES(dset) + ii;
88
- size_t jj, nservers = 0;
101
+ for (size_t ii = 0; ii < entries.size(); ii++) {
102
+ Item& ent = entries[ii];
89
103
  lcb_U16 servers[4];
90
104
  lcb_CMDOBSEQNO cmd = { 0 };
91
105
 
92
- if (ent->done) {
106
+ if (ent.done) {
93
107
  continue;
94
108
  }
95
109
 
96
- cmd.uuid = ent->uuid;
97
- cmd.vbid = ent->vbid;
110
+ cmd.uuid = ent.uuid;
111
+ cmd.vbid = ent.vbid;
98
112
  cmd.cmdflags = LCB_CMD_F_INTERNAL_CALLBACK;
99
- ent->callback = seqno_callback;
113
+ ent.callback = seqno_callback;
100
114
 
101
- lcbdur_prepare_item(ent, servers, &nservers);
102
- for (jj = 0; jj < nservers; jj++) {
115
+ size_t nservers = ent.prepare(servers);
116
+ for (size_t jj = 0; jj < nservers; jj++) {
103
117
  lcb_error_t err;
104
118
  cmd.server_index = servers[jj];
105
- err = lcb_observe_seqno3(instance, &ent->callback, &cmd);
119
+ err = lcb_observe_seqno3(instance, &ent.callback, &cmd);
106
120
  if (err == LCB_SUCCESS) {
107
- dset->waiting++;
108
- has_ops = 1;
121
+ waiting++;
122
+ has_ops = true;
109
123
  } else {
110
- RESFLD(ent, rc) = ret_err = err;
124
+ ent.res().rc = ret_err = err;
111
125
  }
112
126
  }
113
127
  }
@@ -119,8 +133,8 @@ seqno_poll(lcb_DURSET *dset)
119
133
  }
120
134
  }
121
135
 
122
- static lcb_error_t
123
- seqno_ent_add(lcb_DURSET *dset, lcb_DURITEM *item, const lcb_CMDENDURE *cmd)
136
+ lcb_error_t
137
+ SeqnoDurset::after_add(Item &item, const lcb_CMDENDURE *cmd)
124
138
  {
125
139
  const lcb_MUTATION_TOKEN *stok = NULL;
126
140
 
@@ -129,29 +143,21 @@ seqno_ent_add(lcb_DURSET *dset, lcb_DURITEM *item, const lcb_CMDENDURE *cmd)
129
143
  }
130
144
 
131
145
  if (stok == NULL) {
132
- lcb_t instance = dset->instance;
133
146
  if (!instance->dcpinfo) {
134
147
  return LCB_DURABILITY_NO_MUTATION_TOKENS;
135
148
  }
136
- if (item->vbid >= LCBT_VBCONFIG(instance)->nvb) {
149
+ if (item.vbid >= LCBT_VBCONFIG(instance)->nvb) {
137
150
  return LCB_EINVAL;
138
151
  }
139
- stok = instance->dcpinfo + item->vbid;
152
+ stok = instance->dcpinfo + item.vbid;
140
153
  if (LCB_MUTATION_TOKEN_ID(stok) == 0) {
141
154
  return LCB_DURABILITY_NO_MUTATION_TOKENS;
142
155
  }
143
156
  }
144
157
 
145
158
  /* Set the fields */
146
- memset(item->sinfo, 0, sizeof(item->sinfo[0]) * 4);
147
- item->uuid = LCB_MUTATION_TOKEN_ID(stok);
148
- ENT_SEQNO(item) = LCB_MUTATION_TOKEN_SEQ(stok);
159
+ memset(item.sinfo, 0, sizeof(item.sinfo[0]) * 4);
160
+ item.uuid = LCB_MUTATION_TOKEN_ID(stok);
161
+ ENT_SEQNO(&item) = LCB_MUTATION_TOKEN_SEQ(stok);
149
162
  return LCB_SUCCESS;
150
163
  }
151
-
152
- lcbdur_PROCS lcbdur_seqno_procs = {
153
- seqno_poll,
154
- seqno_ent_add,
155
- NULL, /*schedule*/
156
- NULL /*clean*/
157
- };