Skip to content

Commit a94d280

Browse files
committed
JSCBC-1335: Add CAS to Append & Prepend Options
Motivation ---------- AppendOptions and PrependOptions were missing CAS because the C++ core was missing it. Changes ------- - Add CAS to AppendOptions and PrependOptions - Update C++ core & relevant changes to the wrapper-side Results ------- All relevant FIT tests pass Change-Id: Ib45f268e489f81d928f14c39da4c332255d2b1b7 Reviewed-on: https://review.couchbase.org/c/couchnode/+/225081 Tested-by: Mateusz <[email protected]> Reviewed-by: Jared Casey <[email protected]>
1 parent 6f76987 commit a94d280

7 files changed

+33
-6
lines changed

Diff for: deps/couchbase-cxx-client

Diff for: lib/binarycollection.ts

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Collection } from './collection'
22
import { CounterResult, MutationResult } from './crudoptypes'
33
import { DurabilityLevel } from './generaltypes'
4-
import { NodeCallback } from './utilities'
4+
import { CasInput, NodeCallback } from './utilities'
55

66
/**
77
* @category Key-Value
@@ -108,6 +108,12 @@ export interface AppendOptions {
108108
*/
109109
durabilityReplicateTo?: number
110110

111+
/**
112+
* If specified, indicates that operation should be failed if the CAS
113+
* has changed from this value, indicating that the document has changed.
114+
*/
115+
cas?: CasInput
116+
111117
/**
112118
* The timeout for this operation, represented in milliseconds.
113119
*/
@@ -137,6 +143,12 @@ export interface PrependOptions {
137143
*/
138144
durabilityReplicateTo?: number
139145

146+
/**
147+
* If specified, indicates that operation should be failed if the CAS
148+
* has changed from this value, indicating that the document has changed.
149+
*/
150+
cas?: CasInput
151+
140152
/**
141153
* The timeout for this operation, represented in milliseconds.
142154
*/

Diff for: lib/binding.ts

+4
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ export interface CppPrependRequest {
440440
value: Buffer
441441
partition: number
442442
opaque: number
443+
cas: CppCasInput
443444
durability_level: CppDurabilityLevel
444445
timeout?: CppMilliseconds
445446
// retries
@@ -450,6 +451,7 @@ export interface CppPrependWithLegacyDurabilityRequest {
450451
value: Buffer
451452
partition: number
452453
opaque: number
454+
cas: CppCasInput
453455
timeout?: CppMilliseconds
454456
// retries
455457
// parent_span
@@ -564,6 +566,7 @@ export interface CppAppendRequest {
564566
value: Buffer
565567
partition: number
566568
opaque: number
569+
cas: CppCasInput
567570
durability_level: CppDurabilityLevel
568571
timeout?: CppMilliseconds
569572
// retries
@@ -574,6 +577,7 @@ export interface CppAppendWithLegacyDurabilityRequest {
574577
value: Buffer
575578
partition: number
576579
opaque: number
580+
cas: CppCasInput
577581
timeout?: CppMilliseconds
578582
// retries
579583
// parent_span

Diff for: lib/collection.ts

+4
Original file line numberDiff line numberDiff line change
@@ -2385,6 +2385,7 @@ export class Collection {
23852385
const durabilityLevel = options.durabilityLevel
23862386
const persistTo = options.durabilityPersistTo
23872387
const replicateTo = options.durabilityReplicateTo
2388+
const cas = options.cas
23882389
const timeout = options.timeout || this.cluster.kvTimeout
23892390

23902391
return PromiseHelper.wrap((wrapCallback) => {
@@ -2395,6 +2396,7 @@ export class Collection {
23952396
const appendReq = {
23962397
id: this._cppDocId(key),
23972398
value,
2399+
cas: cas || zeroCas,
23982400
timeout,
23992401
partition: 0,
24002402
opaque: 0,
@@ -2459,6 +2461,7 @@ export class Collection {
24592461
const durabilityLevel = options.durabilityLevel
24602462
const persistTo = options.durabilityPersistTo
24612463
const replicateTo = options.durabilityReplicateTo
2464+
const cas = options.cas
24622465
const timeout = options.timeout || this.cluster.kvTimeout
24632466

24642467
return PromiseHelper.wrap((wrapCallback) => {
@@ -2469,6 +2472,7 @@ export class Collection {
24692472
const prependReq = {
24702473
id: this._cppDocId(key),
24712474
value,
2475+
cas: cas || zeroCas,
24722476
timeout,
24732477
partition: 0,
24742478
opaque: 0,

Diff for: src/connection.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -472,15 +472,15 @@ Napi::Value Connection::jsScan(const Napi::CallbackInfo &info)
472472
bucketName,
473473
[barrier](
474474
std::error_code ec,
475-
const couchbase::core::topology::configuration &config) mutable {
475+
std::shared_ptr<couchbase::core::topology::configuration> config) mutable {
476476
if (ec) {
477477
return barrier->set_value(tl::unexpected(ec));
478478
}
479-
if (!config.vbmap || config.vbmap->empty()) {
479+
if (!config->vbmap || config->vbmap->empty()) {
480480
return barrier->set_value(tl::unexpected(
481481
couchbase::errc::common::feature_not_available));
482482
}
483-
barrier->set_value(config.vbmap.value());
483+
barrier->set_value(config->vbmap.value());
484484
});
485485
auto vbucket_map = f.get();
486486
if (!vbucket_map.has_value()) {

Diff for: src/jstocbpp_autogen.hpp

+8
Original file line numberDiff line numberDiff line change
@@ -1692,6 +1692,7 @@ struct js_to_cbpp_t<couchbase::core::operations::prepend_request> {
16921692
js_to_cbpp<std::vector<std::byte>>(cppObj.value, jsObj.Get("value"));
16931693
js_to_cbpp<std::uint16_t>(cppObj.partition, jsObj.Get("partition"));
16941694
js_to_cbpp<std::uint32_t>(cppObj.opaque, jsObj.Get("opaque"));
1695+
js_to_cbpp<couchbase::cas>(cppObj.cas, jsObj.Get("cas"));
16951696
js_to_cbpp<couchbase::durability_level>(cppObj.durability_level,
16961697
jsObj.Get("durability_level"));
16971698
js_to_cbpp<std::optional<std::chrono::milliseconds>>(
@@ -1712,6 +1713,7 @@ struct js_to_cbpp_t<couchbase::core::operations::prepend_request> {
17121713
resObj.Set("partition",
17131714
cbpp_to_js<std::uint16_t>(env, cppObj.partition));
17141715
resObj.Set("opaque", cbpp_to_js<std::uint32_t>(env, cppObj.opaque));
1716+
resObj.Set("cas", cbpp_to_js<couchbase::cas>(env, cppObj.cas));
17151717
resObj.Set("durability_level", cbpp_to_js<couchbase::durability_level>(
17161718
env, cppObj.durability_level));
17171719
resObj.Set("timeout",
@@ -1737,6 +1739,7 @@ struct js_to_cbpp_t<
17371739
js_to_cbpp<std::vector<std::byte>>(cppObj.value, jsObj.Get("value"));
17381740
js_to_cbpp<std::uint16_t>(cppObj.partition, jsObj.Get("partition"));
17391741
js_to_cbpp<std::uint32_t>(cppObj.opaque, jsObj.Get("opaque"));
1742+
js_to_cbpp<couchbase::cas>(cppObj.cas, jsObj.Get("cas"));
17401743
js_to_cbpp<std::optional<std::chrono::milliseconds>>(
17411744
cppObj.timeout, jsObj.Get("timeout"));
17421745
// retries
@@ -1759,6 +1762,7 @@ struct js_to_cbpp_t<
17591762
resObj.Set("partition",
17601763
cbpp_to_js<std::uint16_t>(env, cppObj.partition));
17611764
resObj.Set("opaque", cbpp_to_js<std::uint32_t>(env, cppObj.opaque));
1765+
resObj.Set("cas", cbpp_to_js<couchbase::cas>(env, cppObj.cas));
17621766
resObj.Set("timeout",
17631767
cbpp_to_js<std::optional<std::chrono::milliseconds>>(
17641768
env, cppObj.timeout));
@@ -2267,6 +2271,7 @@ struct js_to_cbpp_t<couchbase::core::operations::append_request> {
22672271
js_to_cbpp<std::vector<std::byte>>(cppObj.value, jsObj.Get("value"));
22682272
js_to_cbpp<std::uint16_t>(cppObj.partition, jsObj.Get("partition"));
22692273
js_to_cbpp<std::uint32_t>(cppObj.opaque, jsObj.Get("opaque"));
2274+
js_to_cbpp<couchbase::cas>(cppObj.cas, jsObj.Get("cas"));
22702275
js_to_cbpp<couchbase::durability_level>(cppObj.durability_level,
22712276
jsObj.Get("durability_level"));
22722277
js_to_cbpp<std::optional<std::chrono::milliseconds>>(
@@ -2287,6 +2292,7 @@ struct js_to_cbpp_t<couchbase::core::operations::append_request> {
22872292
resObj.Set("partition",
22882293
cbpp_to_js<std::uint16_t>(env, cppObj.partition));
22892294
resObj.Set("opaque", cbpp_to_js<std::uint32_t>(env, cppObj.opaque));
2295+
resObj.Set("cas", cbpp_to_js<couchbase::cas>(env, cppObj.cas));
22902296
resObj.Set("durability_level", cbpp_to_js<couchbase::durability_level>(
22912297
env, cppObj.durability_level));
22922298
resObj.Set("timeout",
@@ -2312,6 +2318,7 @@ struct js_to_cbpp_t<
23122318
js_to_cbpp<std::vector<std::byte>>(cppObj.value, jsObj.Get("value"));
23132319
js_to_cbpp<std::uint16_t>(cppObj.partition, jsObj.Get("partition"));
23142320
js_to_cbpp<std::uint32_t>(cppObj.opaque, jsObj.Get("opaque"));
2321+
js_to_cbpp<couchbase::cas>(cppObj.cas, jsObj.Get("cas"));
23152322
js_to_cbpp<std::optional<std::chrono::milliseconds>>(
23162323
cppObj.timeout, jsObj.Get("timeout"));
23172324
// retries
@@ -2335,6 +2342,7 @@ struct js_to_cbpp_t<
23352342
resObj.Set("partition",
23362343
cbpp_to_js<std::uint16_t>(env, cppObj.partition));
23372344
resObj.Set("opaque", cbpp_to_js<std::uint32_t>(env, cppObj.opaque));
2345+
resObj.Set("cas", cbpp_to_js<couchbase::cas>(env, cppObj.cas));
23382346
resObj.Set("timeout",
23392347
cbpp_to_js<std::optional<std::chrono::milliseconds>>(
23402348
env, cppObj.timeout));

Diff for: tools/gen-bindings-json.py

-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
CXX_DEPS_INCLUDE_PATHS = {
3434
'asio': ['-I{0}/asio/{1}/asio/asio/include'],
35-
'fmt': ['-I{0}/fmt/{1}/fmt/include'],
3635
'gsl': ['-I{0}/gsl/{1}/gsl/include'],
3736
'json': ['-I{0}/json/{1}/json/include',
3837
'-I{0}/json/{1}/json/external/PEGTL/include'

0 commit comments

Comments
 (0)