couchbase 1.2.0.z.beta5 → 1.2.0
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.
- data/RELEASE_NOTES.markdown +513 -0
- data/couchbase.gemspec +0 -1
- data/ext/couchbase_ext/arguments.c +50 -147
- data/ext/couchbase_ext/arithmetic.c +6 -17
- data/ext/couchbase_ext/bucket.c +97 -111
- data/ext/couchbase_ext/couchbase_ext.c +10 -0
- data/ext/couchbase_ext/couchbase_ext.h +20 -9
- data/ext/couchbase_ext/delete.c +6 -8
- data/ext/couchbase_ext/extconf.rb +6 -0
- data/ext/couchbase_ext/get.c +7 -9
- data/ext/couchbase_ext/http.c +20 -19
- data/ext/couchbase_ext/multithread_plugin.c +1201 -0
- data/ext/couchbase_ext/observe.c +10 -10
- data/ext/couchbase_ext/stats.c +6 -8
- data/ext/couchbase_ext/store.c +8 -10
- data/ext/couchbase_ext/timer.c +1 -1
- data/ext/couchbase_ext/touch.c +6 -8
- data/ext/couchbase_ext/unlock.c +6 -8
- data/ext/couchbase_ext/utils.c +75 -5
- data/ext/couchbase_ext/version.c +6 -8
- data/lib/couchbase/version.rb +1 -1
- data/lib/couchbase/view.rb +6 -2
- data/lib/ext/multi_json_fix.rb +3 -0
- data/lib/rack/session/couchbase.rb +8 -5
- data/tasks/compile.rake +1 -1
- data/tasks/test.rake +0 -1
- data/tasks/util.rake +1 -1
- data/test/setup.rb +5 -2
- data/test/test_async.rb +2 -2
- metadata +11 -29
- data/HISTORY.markdown +0 -268
data/ext/couchbase_ext/observe.c
CHANGED
@@ -22,13 +22,13 @@ cb_observe_callback(lcb_t handle, const void *cookie, lcb_error_t error, const l
|
|
22
22
|
{
|
23
23
|
struct cb_context_st *ctx = (struct cb_context_st *)cookie;
|
24
24
|
struct cb_bucket_st *bucket = ctx->bucket;
|
25
|
-
VALUE key, res, *rv = ctx->rv;
|
25
|
+
VALUE key, res, *rv = ctx->rv, exc;
|
26
26
|
|
27
27
|
if (resp->v.v0.key) {
|
28
28
|
key = STR_NEW((const char*)resp->v.v0.key, resp->v.v0.nkey);
|
29
|
-
|
30
|
-
if (
|
31
|
-
cb_gc_protect(bucket,
|
29
|
+
exc = cb_check_error(error, "failed to execute observe request", key);
|
30
|
+
if (exc != Qnil) {
|
31
|
+
ctx->exception = cb_gc_protect(bucket, exc);
|
32
32
|
}
|
33
33
|
res = rb_class_new_instance(0, NULL, cb_cResult);
|
34
34
|
rb_ivar_set(res, cb_id_iv_completed, Qfalse);
|
@@ -54,7 +54,7 @@ cb_observe_callback(lcb_t handle, const void *cookie, lcb_error_t error, const l
|
|
54
54
|
}
|
55
55
|
if (bucket->async) { /* asynchronous */
|
56
56
|
if (ctx->proc != Qnil) {
|
57
|
-
cb_proc_call(ctx->proc, 1, res);
|
57
|
+
cb_proc_call(bucket, ctx->proc, 1, res);
|
58
58
|
}
|
59
59
|
} else { /* synchronous */
|
60
60
|
if (NIL_P(ctx->exception)) {
|
@@ -70,12 +70,12 @@ cb_observe_callback(lcb_t handle, const void *cookie, lcb_error_t error, const l
|
|
70
70
|
if (bucket->async && ctx->proc != Qnil) {
|
71
71
|
res = rb_class_new_instance(0, NULL, cb_cResult);
|
72
72
|
rb_ivar_set(res, cb_id_iv_completed, Qtrue);
|
73
|
-
cb_proc_call(ctx->proc, 1, res);
|
73
|
+
cb_proc_call(bucket, ctx->proc, 1, res);
|
74
74
|
}
|
75
75
|
ctx->nqueries--;
|
76
76
|
cb_gc_unprotect(bucket, ctx->proc);
|
77
77
|
if (bucket->async) {
|
78
|
-
|
78
|
+
free(ctx);
|
79
79
|
}
|
80
80
|
}
|
81
81
|
(void)handle;
|
@@ -130,7 +130,7 @@ cb_bucket_observe(int argc, VALUE *argv, VALUE self)
|
|
130
130
|
params.type = cb_cmd_observe;
|
131
131
|
params.bucket = bucket;
|
132
132
|
cb_params_build(¶ms, RARRAY_LEN(args), args);
|
133
|
-
ctx =
|
133
|
+
ctx = calloc(1, sizeof(struct cb_context_st));
|
134
134
|
if (ctx == NULL) {
|
135
135
|
rb_raise(cb_eClientNoMemoryError, "failed to allocate memory for context");
|
136
136
|
}
|
@@ -145,7 +145,7 @@ cb_bucket_observe(int argc, VALUE *argv, VALUE self)
|
|
145
145
|
cb_params_destroy(¶ms);
|
146
146
|
exc = cb_check_error(err, "failed to schedule observe request", Qnil);
|
147
147
|
if (exc != Qnil) {
|
148
|
-
|
148
|
+
free(ctx);
|
149
149
|
rb_exc_raise(exc);
|
150
150
|
}
|
151
151
|
bucket->nbytes += params.npayload;
|
@@ -158,7 +158,7 @@ cb_bucket_observe(int argc, VALUE *argv, VALUE self)
|
|
158
158
|
lcb_wait(bucket->handle);
|
159
159
|
}
|
160
160
|
exc = ctx->exception;
|
161
|
-
|
161
|
+
free(ctx);
|
162
162
|
if (exc != Qnil) {
|
163
163
|
cb_gc_unprotect(bucket, exc);
|
164
164
|
rb_exc_raise(exc);
|
data/ext/couchbase_ext/stats.c
CHANGED
@@ -28,9 +28,7 @@ cb_stat_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb_
|
|
28
28
|
exc = cb_check_error(error, "failed to fetch stats", node);
|
29
29
|
if (exc != Qnil) {
|
30
30
|
rb_ivar_set(exc, cb_id_iv_operation, cb_sym_stats);
|
31
|
-
|
32
|
-
ctx->exception = cb_gc_protect(bucket, exc);
|
33
|
-
}
|
31
|
+
ctx->exception = cb_gc_protect(bucket, exc);
|
34
32
|
}
|
35
33
|
if (node != Qnil) {
|
36
34
|
key = STR_NEW((const char*)resp->v.v0.key, resp->v.v0.nkey);
|
@@ -43,7 +41,7 @@ cb_stat_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb_
|
|
43
41
|
rb_ivar_set(res, cb_id_iv_node, node);
|
44
42
|
rb_ivar_set(res, cb_id_iv_key, key);
|
45
43
|
rb_ivar_set(res, cb_id_iv_value, val);
|
46
|
-
cb_proc_call(ctx->proc, 1, res);
|
44
|
+
cb_proc_call(bucket, ctx->proc, 1, res);
|
47
45
|
}
|
48
46
|
} else { /* synchronous */
|
49
47
|
if (NIL_P(exc)) {
|
@@ -58,7 +56,7 @@ cb_stat_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb_
|
|
58
56
|
} else {
|
59
57
|
cb_gc_unprotect(bucket, ctx->proc);
|
60
58
|
if (bucket->async) {
|
61
|
-
|
59
|
+
free(ctx);
|
62
60
|
}
|
63
61
|
}
|
64
62
|
(void)handle;
|
@@ -126,7 +124,7 @@ cb_bucket_stats(int argc, VALUE *argv, VALUE self)
|
|
126
124
|
params.type = cb_cmd_stats;
|
127
125
|
params.bucket = bucket;
|
128
126
|
cb_params_build(¶ms, RARRAY_LEN(args), args);
|
129
|
-
ctx =
|
127
|
+
ctx = calloc(1, sizeof(struct cb_context_st));
|
130
128
|
if (ctx == NULL) {
|
131
129
|
rb_raise(cb_eClientNoMemoryError, "failed to allocate memory for context");
|
132
130
|
}
|
@@ -141,7 +139,7 @@ cb_bucket_stats(int argc, VALUE *argv, VALUE self)
|
|
141
139
|
exc = cb_check_error(err, "failed to schedule stat request", Qnil);
|
142
140
|
cb_params_destroy(¶ms);
|
143
141
|
if (exc != Qnil) {
|
144
|
-
|
142
|
+
free(ctx);
|
145
143
|
rb_exc_raise(exc);
|
146
144
|
}
|
147
145
|
bucket->nbytes += params.npayload;
|
@@ -154,7 +152,7 @@ cb_bucket_stats(int argc, VALUE *argv, VALUE self)
|
|
154
152
|
lcb_wait(bucket->handle);
|
155
153
|
}
|
156
154
|
exc = ctx->exception;
|
157
|
-
|
155
|
+
free(ctx);
|
158
156
|
if (exc != Qnil) {
|
159
157
|
cb_gc_unprotect(bucket, exc);
|
160
158
|
rb_exc_raise(exc);
|
data/ext/couchbase_ext/store.c
CHANGED
@@ -26,14 +26,14 @@ storage_observe_callback(VALUE args, VALUE cookie)
|
|
26
26
|
|
27
27
|
if (ctx->proc != Qnil) {
|
28
28
|
rb_ivar_set(res, cb_id_iv_operation, ctx->operation);
|
29
|
-
cb_proc_call(ctx->proc, 1, res);
|
29
|
+
cb_proc_call(bucket, ctx->proc, 1, res);
|
30
30
|
}
|
31
31
|
if (!RTEST(ctx->observe_options)) {
|
32
32
|
ctx->nqueries--;
|
33
33
|
if (ctx->nqueries == 0) {
|
34
34
|
cb_gc_unprotect(bucket, ctx->proc);
|
35
35
|
if (bucket->async) {
|
36
|
-
|
36
|
+
free(ctx);
|
37
37
|
}
|
38
38
|
}
|
39
39
|
}
|
@@ -75,9 +75,7 @@ cb_storage_callback(lcb_t handle, const void *cookie, lcb_storage_t operation,
|
|
75
75
|
if (exc != Qnil) {
|
76
76
|
rb_ivar_set(exc, cb_id_iv_cas, cas);
|
77
77
|
rb_ivar_set(exc, cb_id_iv_operation, ctx->operation);
|
78
|
-
|
79
|
-
ctx->exception = cb_gc_protect(bucket, exc);
|
80
|
-
}
|
78
|
+
ctx->exception = cb_gc_protect(bucket, exc);
|
81
79
|
}
|
82
80
|
|
83
81
|
if (bucket->async) { /* asynchronous */
|
@@ -95,7 +93,7 @@ cb_storage_callback(lcb_t handle, const void *cookie, lcb_storage_t operation,
|
|
95
93
|
rb_ivar_set(res, cb_id_iv_key, key);
|
96
94
|
rb_ivar_set(res, cb_id_iv_operation, ctx->operation);
|
97
95
|
rb_ivar_set(res, cb_id_iv_cas, cas);
|
98
|
-
cb_proc_call(ctx->proc, 1, res);
|
96
|
+
cb_proc_call(bucket, ctx->proc, 1, res);
|
99
97
|
}
|
100
98
|
} else { /* synchronous */
|
101
99
|
rb_hash_aset(*rv, key, cas);
|
@@ -106,7 +104,7 @@ cb_storage_callback(lcb_t handle, const void *cookie, lcb_storage_t operation,
|
|
106
104
|
if (ctx->nqueries == 0) {
|
107
105
|
cb_gc_unprotect(bucket, ctx->proc);
|
108
106
|
if (bucket->async) {
|
109
|
-
|
107
|
+
free(ctx);
|
110
108
|
}
|
111
109
|
}
|
112
110
|
}
|
@@ -134,7 +132,7 @@ cb_bucket_store(lcb_storage_t cmd, int argc, VALUE *argv, VALUE self)
|
|
134
132
|
params.bucket = bucket;
|
135
133
|
params.cmd.store.operation = cmd;
|
136
134
|
cb_params_build(¶ms, RARRAY_LEN(args), args);
|
137
|
-
ctx =
|
135
|
+
ctx = calloc(1, sizeof(struct cb_context_st));
|
138
136
|
if (ctx == NULL) {
|
139
137
|
rb_raise(cb_eClientNoMemoryError, "failed to allocate memory for context");
|
140
138
|
}
|
@@ -150,7 +148,7 @@ cb_bucket_store(lcb_storage_t cmd, int argc, VALUE *argv, VALUE self)
|
|
150
148
|
cb_params_destroy(¶ms);
|
151
149
|
exc = cb_check_error(err, "failed to schedule set request", Qnil);
|
152
150
|
if (exc != Qnil) {
|
153
|
-
|
151
|
+
free(ctx);
|
154
152
|
rb_exc_raise(exc);
|
155
153
|
}
|
156
154
|
bucket->nbytes += params.npayload;
|
@@ -163,7 +161,7 @@ cb_bucket_store(lcb_storage_t cmd, int argc, VALUE *argv, VALUE self)
|
|
163
161
|
lcb_wait(bucket->handle);
|
164
162
|
}
|
165
163
|
exc = ctx->exception;
|
166
|
-
|
164
|
+
free(ctx);
|
167
165
|
if (exc != Qnil) {
|
168
166
|
cb_gc_unprotect(bucket, exc);
|
169
167
|
rb_exc_raise(exc);
|
data/ext/couchbase_ext/timer.c
CHANGED
data/ext/couchbase_ext/touch.c
CHANGED
@@ -32,9 +32,7 @@ cb_touch_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb
|
|
32
32
|
exc = cb_check_error(error, "failed to touch value", key);
|
33
33
|
if (exc != Qnil) {
|
34
34
|
rb_ivar_set(exc, cb_id_iv_operation, cb_sym_touch);
|
35
|
-
|
36
|
-
ctx->exception = cb_gc_protect(bucket, exc);
|
37
|
-
}
|
35
|
+
ctx->exception = cb_gc_protect(bucket, exc);
|
38
36
|
}
|
39
37
|
}
|
40
38
|
|
@@ -44,7 +42,7 @@ cb_touch_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb
|
|
44
42
|
rb_ivar_set(res, cb_id_iv_error, exc);
|
45
43
|
rb_ivar_set(res, cb_id_iv_operation, cb_sym_touch);
|
46
44
|
rb_ivar_set(res, cb_id_iv_key, key);
|
47
|
-
cb_proc_call(ctx->proc, 1, res);
|
45
|
+
cb_proc_call(bucket, ctx->proc, 1, res);
|
48
46
|
}
|
49
47
|
} else { /* synchronous */
|
50
48
|
rb_hash_aset(*rv, key, (error == LCB_SUCCESS) ? Qtrue : Qfalse);
|
@@ -52,7 +50,7 @@ cb_touch_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb
|
|
52
50
|
if (ctx->nqueries == 0) {
|
53
51
|
cb_gc_unprotect(bucket, ctx->proc);
|
54
52
|
if (bucket->async) {
|
55
|
-
|
53
|
+
free(ctx);
|
56
54
|
}
|
57
55
|
}
|
58
56
|
(void)handle;
|
@@ -144,7 +142,7 @@ cb_bucket_touch(int argc, VALUE *argv, VALUE self)
|
|
144
142
|
params.type = cb_cmd_touch;
|
145
143
|
params.bucket = bucket;
|
146
144
|
cb_params_build(¶ms, RARRAY_LEN(args), args);
|
147
|
-
ctx =
|
145
|
+
ctx = calloc(1, sizeof(struct cb_context_st));
|
148
146
|
if (ctx == NULL) {
|
149
147
|
rb_raise(cb_eClientNoMemoryError, "failed to allocate memory for context");
|
150
148
|
}
|
@@ -160,7 +158,7 @@ cb_bucket_touch(int argc, VALUE *argv, VALUE self)
|
|
160
158
|
cb_params_destroy(¶ms);
|
161
159
|
exc = cb_check_error(err, "failed to schedule touch request", Qnil);
|
162
160
|
if (exc != Qnil) {
|
163
|
-
|
161
|
+
free(ctx);
|
164
162
|
rb_exc_raise(exc);
|
165
163
|
}
|
166
164
|
bucket->nbytes += params.npayload;
|
@@ -173,7 +171,7 @@ cb_bucket_touch(int argc, VALUE *argv, VALUE self)
|
|
173
171
|
lcb_wait(bucket->handle);
|
174
172
|
}
|
175
173
|
exc = ctx->exception;
|
176
|
-
|
174
|
+
free(ctx);
|
177
175
|
if (exc != Qnil) {
|
178
176
|
rb_exc_raise(cb_gc_unprotect(bucket, exc));
|
179
177
|
}
|
data/ext/couchbase_ext/unlock.c
CHANGED
@@ -32,9 +32,7 @@ cb_unlock_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lc
|
|
32
32
|
exc = cb_check_error(error, "failed to unlock value", key);
|
33
33
|
if (exc != Qnil) {
|
34
34
|
rb_ivar_set(exc, cb_id_iv_operation, cb_sym_unlock);
|
35
|
-
|
36
|
-
ctx->exception = cb_gc_protect(bucket, exc);
|
37
|
-
}
|
35
|
+
ctx->exception = cb_gc_protect(bucket, exc);
|
38
36
|
}
|
39
37
|
}
|
40
38
|
|
@@ -44,7 +42,7 @@ cb_unlock_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lc
|
|
44
42
|
rb_ivar_set(res, cb_id_iv_error, exc);
|
45
43
|
rb_ivar_set(res, cb_id_iv_operation, cb_sym_unlock);
|
46
44
|
rb_ivar_set(res, cb_id_iv_key, key);
|
47
|
-
cb_proc_call(ctx->proc, 1, res);
|
45
|
+
cb_proc_call(bucket, ctx->proc, 1, res);
|
48
46
|
}
|
49
47
|
} else { /* synchronous */
|
50
48
|
rb_hash_aset(*rv, key, (error == LCB_SUCCESS) ? Qtrue : Qfalse);
|
@@ -52,7 +50,7 @@ cb_unlock_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lc
|
|
52
50
|
if (ctx->nqueries == 0) {
|
53
51
|
cb_gc_unprotect(bucket, ctx->proc);
|
54
52
|
if (bucket->async) {
|
55
|
-
|
53
|
+
free(ctx);
|
56
54
|
}
|
57
55
|
}
|
58
56
|
(void)handle;
|
@@ -134,7 +132,7 @@ cb_bucket_unlock(int argc, VALUE *argv, VALUE self)
|
|
134
132
|
params.type = cb_cmd_unlock;
|
135
133
|
params.bucket = bucket;
|
136
134
|
cb_params_build(¶ms, RARRAY_LEN(args), args);
|
137
|
-
ctx =
|
135
|
+
ctx = calloc(1, sizeof(struct cb_context_st));
|
138
136
|
if (ctx == NULL) {
|
139
137
|
rb_raise(cb_eClientNoMemoryError, "failed to allocate memory for context");
|
140
138
|
}
|
@@ -150,7 +148,7 @@ cb_bucket_unlock(int argc, VALUE *argv, VALUE self)
|
|
150
148
|
cb_params_destroy(¶ms);
|
151
149
|
exc = cb_check_error(err, "failed to schedule unlock request", Qnil);
|
152
150
|
if (exc != Qnil) {
|
153
|
-
|
151
|
+
free(ctx);
|
154
152
|
rb_exc_raise(exc);
|
155
153
|
}
|
156
154
|
bucket->nbytes += params.npayload;
|
@@ -163,7 +161,7 @@ cb_bucket_unlock(int argc, VALUE *argv, VALUE self)
|
|
163
161
|
lcb_wait(bucket->handle);
|
164
162
|
}
|
165
163
|
exc = ctx->exception;
|
166
|
-
|
164
|
+
free(ctx);
|
167
165
|
if (exc != Qnil) {
|
168
166
|
rb_exc_raise(cb_gc_unprotect(bucket, exc));
|
169
167
|
}
|
data/ext/couchbase_ext/utils.c
CHANGED
@@ -31,13 +31,65 @@ cb_gc_unprotect(struct cb_bucket_st *bucket, VALUE val)
|
|
31
31
|
return val;
|
32
32
|
}
|
33
33
|
|
34
|
+
struct proc_params_st
|
35
|
+
{
|
36
|
+
struct cb_bucket_st *bucket;
|
37
|
+
VALUE recv;
|
38
|
+
ID mid;
|
39
|
+
int argc;
|
40
|
+
VALUE *argv;
|
41
|
+
VALUE exc;
|
42
|
+
};
|
43
|
+
|
44
|
+
static VALUE
|
45
|
+
do_async_error_notify(VALUE ptr)
|
46
|
+
{
|
47
|
+
struct proc_params_st *p = (struct proc_params_st *)ptr;
|
48
|
+
return rb_funcall(p->bucket->on_error_proc, cb_id_call, 1, p->exc);
|
49
|
+
}
|
50
|
+
|
51
|
+
void
|
52
|
+
cb_async_error_notify(struct cb_bucket_st *bucket, VALUE exc)
|
53
|
+
{
|
54
|
+
if (bucket->on_error_proc != Qnil) {
|
55
|
+
struct proc_params_st params;
|
56
|
+
int fail;
|
57
|
+
params.bucket = bucket;
|
58
|
+
params.exc = exc;
|
59
|
+
rb_protect(do_async_error_notify, (VALUE)¶ms, &fail);
|
60
|
+
if (fail) {
|
61
|
+
rb_warning("Couchbase::Bucket#on_error shouldn't raise exceptions");
|
62
|
+
}
|
63
|
+
} else {
|
64
|
+
if (NIL_P(bucket->exception)) {
|
65
|
+
bucket->exception = exc;
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
static VALUE
|
71
|
+
func_call_failed(VALUE ptr, VALUE exc)
|
72
|
+
{
|
73
|
+
struct proc_params_st *p = (struct proc_params_st *)ptr;
|
74
|
+
cb_async_error_notify(p->bucket, exc);
|
75
|
+
return Qnil;
|
76
|
+
}
|
77
|
+
|
78
|
+
static VALUE
|
79
|
+
do_func_call(VALUE ptr)
|
80
|
+
{
|
81
|
+
struct proc_params_st *p = (struct proc_params_st *)ptr;
|
82
|
+
return rb_funcall2(p->recv, p->mid, p->argc, p->argv);
|
83
|
+
}
|
84
|
+
|
34
85
|
VALUE
|
35
|
-
cb_proc_call(VALUE recv, int argc, ...)
|
86
|
+
cb_proc_call(struct cb_bucket_st *bucket, VALUE recv, int argc, ...)
|
36
87
|
{
|
37
88
|
VALUE *argv;
|
38
89
|
va_list ar;
|
39
90
|
int arity;
|
40
91
|
int ii;
|
92
|
+
struct proc_params_st params;
|
41
93
|
|
42
94
|
arity = FIX2INT(rb_funcall(recv, cb_id_arity, 0));
|
43
95
|
if (arity < 0) {
|
@@ -57,7 +109,14 @@ cb_proc_call(VALUE recv, int argc, ...)
|
|
57
109
|
} else {
|
58
110
|
argv = NULL;
|
59
111
|
}
|
60
|
-
|
112
|
+
params.bucket = bucket;
|
113
|
+
params.recv = recv;
|
114
|
+
params.mid = cb_id_call;
|
115
|
+
params.argc = arity;
|
116
|
+
params.argv = argv;
|
117
|
+
return rb_rescue2(do_func_call, (VALUE)¶ms,
|
118
|
+
func_call_failed, (VALUE)¶ms,
|
119
|
+
rb_eException, (VALUE)0);
|
61
120
|
}
|
62
121
|
|
63
122
|
VALUE
|
@@ -408,8 +467,8 @@ cb_decode_value(VALUE blob, uint32_t flags, VALUE force_format)
|
|
408
467
|
void
|
409
468
|
cb_strip_key_prefix(struct cb_bucket_st *bucket, VALUE key)
|
410
469
|
{
|
411
|
-
if (bucket->
|
412
|
-
rb_str_update(key, 0, RSTRING_LEN(bucket->key_prefix_val),
|
470
|
+
if (RTEST(bucket->key_prefix_val)) {
|
471
|
+
rb_str_update(key, 0, RSTRING_LEN(bucket->key_prefix_val), cb_vStrEmpty);
|
413
472
|
}
|
414
473
|
}
|
415
474
|
|
@@ -418,7 +477,7 @@ cb_unify_key(struct cb_bucket_st *bucket, VALUE key, int apply_prefix)
|
|
418
477
|
{
|
419
478
|
VALUE ret = Qnil, tmp;
|
420
479
|
|
421
|
-
if (bucket->
|
480
|
+
if (RTEST(bucket->key_prefix_val) && apply_prefix) {
|
422
481
|
ret = rb_str_dup(bucket->key_prefix_val);
|
423
482
|
}
|
424
483
|
switch (TYPE(key)) {
|
@@ -476,3 +535,14 @@ cb_first_value_i(VALUE key, VALUE value, VALUE arg)
|
|
476
535
|
(void)key;
|
477
536
|
return ST_STOP;
|
478
537
|
}
|
538
|
+
|
539
|
+
#ifndef HAVE_RB_HASH_LOOKUP2
|
540
|
+
VALUE
|
541
|
+
rb_hash_lookup2(VALUE hash, VALUE key, VALUE dflt)
|
542
|
+
{
|
543
|
+
if (RTEST(rb_funcall2(hash, cb_id_has_key_p, 1, &key))) {
|
544
|
+
dflt = rb_hash_aref(hash, key);
|
545
|
+
}
|
546
|
+
return dflt;
|
547
|
+
}
|
548
|
+
#endif
|
data/ext/couchbase_ext/version.c
CHANGED
@@ -28,9 +28,7 @@ cb_version_callback(lcb_t handle, const void *cookie, lcb_error_t error, const l
|
|
28
28
|
exc = cb_check_error(error, "failed to get version", node);
|
29
29
|
if (exc != Qnil) {
|
30
30
|
rb_ivar_set(exc, cb_id_iv_operation, cb_sym_version);
|
31
|
-
|
32
|
-
ctx->exception = cb_gc_protect(bucket, exc);
|
33
|
-
}
|
31
|
+
ctx->exception = cb_gc_protect(bucket, exc);
|
34
32
|
}
|
35
33
|
|
36
34
|
if (node != Qnil) {
|
@@ -42,7 +40,7 @@ cb_version_callback(lcb_t handle, const void *cookie, lcb_error_t error, const l
|
|
42
40
|
rb_ivar_set(res, cb_id_iv_operation, cb_sym_version);
|
43
41
|
rb_ivar_set(res, cb_id_iv_node, node);
|
44
42
|
rb_ivar_set(res, cb_id_iv_value, val);
|
45
|
-
cb_proc_call(ctx->proc, 1, res);
|
43
|
+
cb_proc_call(bucket, ctx->proc, 1, res);
|
46
44
|
}
|
47
45
|
} else { /* synchronous */
|
48
46
|
if (NIL_P(exc)) {
|
@@ -53,7 +51,7 @@ cb_version_callback(lcb_t handle, const void *cookie, lcb_error_t error, const l
|
|
53
51
|
ctx->nqueries--;
|
54
52
|
cb_gc_unprotect(bucket, ctx->proc);
|
55
53
|
if (bucket->async) {
|
56
|
-
|
54
|
+
free(ctx);
|
57
55
|
}
|
58
56
|
}
|
59
57
|
|
@@ -107,7 +105,7 @@ cb_bucket_version(int argc, VALUE *argv, VALUE self)
|
|
107
105
|
params.type = cb_cmd_version;
|
108
106
|
params.bucket = bucket;
|
109
107
|
cb_params_build(¶ms, RARRAY_LEN(args), args);
|
110
|
-
ctx =
|
108
|
+
ctx = calloc(1, sizeof(struct cb_context_st));
|
111
109
|
if (ctx == NULL) {
|
112
110
|
rb_raise(cb_eClientNoMemoryError, "failed to allocate memory for context");
|
113
111
|
}
|
@@ -122,7 +120,7 @@ cb_bucket_version(int argc, VALUE *argv, VALUE self)
|
|
122
120
|
exc = cb_check_error(err, "failed to schedule version request", Qnil);
|
123
121
|
cb_params_destroy(¶ms);
|
124
122
|
if (exc != Qnil) {
|
125
|
-
|
123
|
+
free(ctx);
|
126
124
|
rb_exc_raise(exc);
|
127
125
|
}
|
128
126
|
bucket->nbytes += params.npayload;
|
@@ -135,7 +133,7 @@ cb_bucket_version(int argc, VALUE *argv, VALUE self)
|
|
135
133
|
lcb_wait(bucket->handle);
|
136
134
|
}
|
137
135
|
exc = ctx->exception;
|
138
|
-
|
136
|
+
free(ctx);
|
139
137
|
if (exc != Qnil) {
|
140
138
|
cb_gc_unprotect(bucket, exc);
|
141
139
|
rb_exc_raise(exc);
|