Skip to content

Commit 6d36424

Browse files
committed
Update managers as per RFC
Change-Id: Ied75c954b3acd87b92eeb18d50da6d4ec8683f8c Reviewed-on: http://review.couchbase.org/120917 Tested-by: Build Bot <[email protected]> Reviewed-by: Sergey Avseyev <[email protected]>
1 parent 776b7e4 commit 6d36424

19 files changed

+1346
-482
lines changed

config.m4

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ COUCHBASE_FILES=" \
7070
src/couchbase/bucket/touch.c \
7171
src/couchbase/bucket/unlock.c \
7272
src/couchbase/bucket/view.c \
73-
src/couchbase/bucket_manager.c \
7473
src/couchbase/cert_authenticator.c \
7574
src/couchbase/cluster.c \
7675
src/couchbase/cluster_manager.c \
@@ -79,6 +78,8 @@ COUCHBASE_FILES=" \
7978
src/couchbase/collection.c \
8079
src/couchbase/log_formatter.c \
8180
src/couchbase/lookup_spec.c \
81+
src/couchbase/managers/bucket_manager.c \
82+
src/couchbase/managers/view_index_manager.c \
8283
src/couchbase/mutate_spec.c \
8384
src/couchbase/mutation_state.c \
8485
src/couchbase/n1ql_index.c \
@@ -121,7 +122,6 @@ COUCHBASE_FILES=" \
121122
src/couchbase/search/wildcard_query.c \
122123
src/couchbase/search_index_manager.c \
123124
src/couchbase/search_options.c \
124-
src/couchbase/view_index_manager.c \
125125
transcoding.c \
126126
"
127127

config.w32

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ if (PHP_COUCHBASE != "no") {
2525
"password_authenticator.c " +
2626
"cluster_options.c " +
2727
"bucket.c " +
28-
"bucket_manager.c " +
2928
"cluster.c " +
3029
"cluster_manager.c " +
3130
"collection.c " +
@@ -37,7 +36,6 @@ if (PHP_COUCHBASE != "no") {
3736
"pool.c " +
3837
"query_index_manager.c " +
3938
"result.c " +
40-
"view_index_manager.c " +
4139
"search_index_manager.c " +
4240
"search_options.c ";
4341
src_couchbase_bucket_sources =
@@ -56,6 +54,9 @@ if (PHP_COUCHBASE != "no") {
5654
"touch.c " +
5755
"unlock.c " +
5856
"view.c ";
57+
src_couchbase_managers_sources =
58+
"bucket_manager.c " +
59+
"view_index_manager.c ";
5960
src_couchbase_query_index_manager_sources =
6061
"n1ix_create.c " +
6162
"n1ix_drop.c " +
@@ -99,6 +100,7 @@ if (PHP_COUCHBASE != "no") {
99100
ADD_SOURCES(configure_module_dirname + "\\src\\couchbase", src_couchbase_sources, "couchbase");
100101
ADD_SOURCES(configure_module_dirname + "\\src\\couchbase\\search", src_couchbase_search_sources, "couchbase");
101102
ADD_SOURCES(configure_module_dirname + "\\src\\couchbase\\bucket", src_couchbase_bucket_sources, "couchbase");
103+
ADD_SOURCES(configure_module_dirname + "\\src\\couchbase\\managers", src_couchbase_managers_sources, "couchbase");
102104
ADD_SOURCES(configure_module_dirname + "\\src\\couchbase\\query_index_manager", src_couchbase_query_index_manager_sources, "couchbase");
103105
ADD_SOURCES(configure_module_dirname + "\\src\\couchbase\\cluster_manager", src_couchbase_cluster_manager_sources, "couchbase");
104106
AC_DEFINE('HAVE_COUCHBASELIB', 1, 'Have Couchbase library');

couchbase.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,10 @@ PHP_MINIT_FUNCTION(CouchbasePool);
186186
PHP_MINIT_FUNCTION(CouchbaseException);
187187
PHP_MINIT_FUNCTION(Collection);
188188
PHP_MINIT_FUNCTION(Cluster);
189+
PHP_MINIT_FUNCTION(BucketManager);
189190
PHP_MINIT_FUNCTION(ClusterManager);
190191
PHP_MINIT_FUNCTION(UserSettings);
191192
PHP_MINIT_FUNCTION(Bucket);
192-
PHP_MINIT_FUNCTION(BucketManager);
193193
PHP_MINIT_FUNCTION(QueryIndexManager);
194194
PHP_MINIT_FUNCTION(Authenticator);
195195
PHP_MINIT_FUNCTION(CertAuthenticator);
@@ -266,10 +266,10 @@ PHP_MINIT_FUNCTION(couchbase)
266266
PHP_MINIT(CouchbaseException)(INIT_FUNC_ARGS_PASSTHRU);
267267
PHP_MINIT(Cluster)(INIT_FUNC_ARGS_PASSTHRU);
268268
PHP_MINIT(Collection)(INIT_FUNC_ARGS_PASSTHRU);
269+
PHP_MINIT(BucketManager)(INIT_FUNC_ARGS_PASSTHRU);
269270
PHP_MINIT(ClusterManager)(INIT_FUNC_ARGS_PASSTHRU);
270271
PHP_MINIT(UserSettings)(INIT_FUNC_ARGS_PASSTHRU);
271272
PHP_MINIT(Bucket)(INIT_FUNC_ARGS_PASSTHRU);
272-
PHP_MINIT(BucketManager)(INIT_FUNC_ARGS_PASSTHRU);
273273
PHP_MINIT(QueryIndexManager)(INIT_FUNC_ARGS_PASSTHRU);
274274
PHP_MINIT(Authenticator)(INIT_FUNC_ARGS_PASSTHRU);
275275
PHP_MINIT(CertAuthenticator)(INIT_FUNC_ARGS_PASSTHRU);

couchbase.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -303,11 +303,6 @@ typedef struct {
303303
zend_object std;
304304
} pcbc_bucket_t;
305305

306-
typedef struct {
307-
pcbc_connection_t *conn;
308-
zend_object std;
309-
} pcbc_bucket_manager_t;
310-
311306
typedef struct {
312307
pcbc_connection_t *conn;
313308
zend_object std;
@@ -336,14 +331,15 @@ int pcbc_decode_value(zval *return_value, pcbc_bucket_t *bucket, const char *byt
336331
int pcbc_encode_value(pcbc_bucket_t *bucket, zval *value, void **bytes, lcb_size_t *nbytes, lcb_uint32_t *flags,
337332
uint8_t *datatype TSRMLS_DC);
338333

339-
void pcbc_http_request(zval *return_value, lcb_INSTANCE *conn, lcb_CMDHTTP *cmd, int json_response TSRMLS_DC);
334+
void pcbc_http_request(zval *return_value, lcb_INSTANCE *conn, lcb_CMDHTTP *cmd, int json_response,
335+
void(httpcb)(zval *, zval *) TSRMLS_DC);
340336

341337
void pcbc_query_index_manager_init(zval *return_value, zval *cluster TSRMLS_DC);
342338

343339
void pcbc_mutation_state_export_for_n1ql(zval *obj, zval *scan_vectors TSRMLS_DC);
344340
void pcbc_mutation_state_export_for_search(zval *mutation_state, zval *scan_vectors TSRMLS_DC);
345341

346-
void pcbc_search_index_manager_init(zval *return_value, pcbc_bucket_manager_t *bucket_manager TSRMLS_DC);
342+
void pcbc_search_index_manager_init(zval *return_value, zval *cluster TSRMLS_DC);
347343

348344
void pcbc_crypto_register(pcbc_bucket_t *obj, const char *name, int name_len, zval *provider TSRMLS_DC);
349345
void pcbc_crypto_unregister(pcbc_bucket_t *obj, const char *name, int name_len TSRMLS_DC);

integration/BucketManager.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
$options = new \Couchbase\ClusterOptions();
4+
$options->credentials('Administrator', 'password');
5+
$cluster = new \Couchbase\Cluster('couchbase://localhost', $options);
6+
7+
$bucket_name = 'newbucket';
8+
9+
$need_cleanup = false;
10+
$all_buckets = $cluster->buckets()->getAllBuckets();
11+
printf("There are %d buckets on the cluster\n", count($all_buckets));
12+
foreach ($all_buckets as $bucket) {
13+
printf(" * %s (%d MB)\n", $bucket->name(), $bucket->ramQuotaMb());
14+
if ($bucket->name() == $bucket_name) {
15+
$need_cleanup = true;
16+
}
17+
}
18+
19+
if ($need_cleanup) {
20+
$start = microtime(true);
21+
$cluster->buckets()->removeBucket($bucket_name);
22+
printf("Bucket \"%s\" removed in %f seconds\n", $bucket_name, microtime(true) - $start);
23+
}
24+
25+
$settings = new \Couchbase\BucketSettings();
26+
$settings->setName($bucket_name);
27+
$settings->setRamQuotaMb(100);
28+
$settings->enableFlush(true);
29+
$start = microtime(true);
30+
$cluster->buckets()->createBucket($settings);
31+
printf("New bucket \"%s\" created in %f seconds\n", $bucket_name, microtime(true) - $start);
32+
33+
sleep(1);
34+
35+
$settings = $cluster->buckets()->getBucket($bucket_name);
36+
printf("Bucket \"%s\" settings:\n", $bucket_name);
37+
printf(" * RAM quota: %d\n", $settings->ramQuotaMb());
38+
printf(" * number of replicas: %d\n", $settings->numReplicas());
39+
printf(" * flush enabled: %s\n", $settings->flushEnabled() ? "yes" : "no");
40+
printf(" * max TTL: %s\n", $settings->maxTtl());
41+
printf(" * compression mode: %s\n", $settings->compressionMode());
42+
printf(" * replicas indexed: %s\n", $settings->replicaIndexes() ? "yes" : "no");
43+
printf(" * ejection method: %s\n", $settings->ejectionMethod());
44+
45+
$start = microtime(true);
46+
$cluster->buckets()->flush($bucket_name);
47+
printf("Bucket \"%s\" flushed in %f seconds\n", $bucket_name, microtime(true) - $start);

integration/ViewIndexManager.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
$options = new \Couchbase\ClusterOptions();
4+
$options->credentials('Administrator', 'password');
5+
$cluster = new \Couchbase\Cluster('couchbase://localhost', $options);
6+
7+
$bucket = $cluster->bucket('beer-sample');
8+
$design_documents = $bucket->viewIndexes()->getAllDesignDocuments();
9+
printf("There are %d design documents in the bucket\n", count($design_documents));
10+
foreach ($design_documents as $ddoc) {
11+
printf(" * %s\n", $ddoc->name());
12+
foreach ($ddoc->views() as $view) {
13+
printf(" * %s\n", $view->name());
14+
}
15+
}
16+
17+
if (count($design_documents) > 0) {
18+
$design_document_name = $design_documents[0]->name();
19+
$design_document = $bucket->viewIndexes()->getDesignDocument($design_document_name);
20+
printf("Design document \"%s\" contains %d views\n", $design_document->name(), count($design_document->views()));
21+
22+
$start = microtime(true);
23+
$bucket->viewindexes()->dropDesignDocument($design_document_name);
24+
printf("Design document \"%s\" removed, in %f seconds\n", $design_document_name, microtime(true)-$start);
25+
}
26+
27+
$view = new \Couchbase\View();
28+
$view->setName("example");
29+
$view->setMap("function (doc, meta) { emit(meta.id, null); }");
30+
$view->setReduce("_count");
31+
$design_document = new \Couchbase\DesignDocument();
32+
$design_document->setName('_design/test');
33+
$design_document->setViews([$view->name() => $view]);
34+
35+
$start = microtime(true);
36+
$bucket->viewindexes()->upsertDesignDocument($design_document);
37+
printf("Design document \"%s\" created, in %f seconds\n", $design_document->name(), microtime(true)-$start);

package.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@
8686
<file role="src" name="src/couchbase/bucket/touch.c" />
8787
<file role="src" name="src/couchbase/bucket/unlock.c" />
8888
<file role="src" name="src/couchbase/bucket/view.c" />
89-
<file role="src" name="src/couchbase/bucket_manager.c" />
9089
<file role="src" name="src/couchbase/cert_authenticator.c" />
9190
<file role="src" name="src/couchbase/cluster.c" />
9291
<file role="src" name="src/couchbase/cluster_options.c" />
@@ -96,6 +95,8 @@
9695
<file role="src" name="src/couchbase/crypto.c" />
9796
<file role="src" name="src/couchbase/log_formatter.c" />
9897
<file role="src" name="src/couchbase/lookup_spec.c" />
98+
<file role="src" name="src/couchbase/managers/bucket_manager.c" />
99+
<file role="src" name="src/couchbase/managers/view_index_manager.c" />
99100
<file role="src" name="src/couchbase/mutate_spec.c" />
100101
<file role="src" name="src/couchbase/mutation_state.c" />
101102
<file role="src" name="src/couchbase/n1ql_index.c" />
@@ -138,7 +139,6 @@
138139
<file role="src" name="src/couchbase/search/wildcard_query.c" />
139140
<file role="src" name="src/couchbase/search_index_manager.c" />
140141
<file role="src" name="src/couchbase/search_options.c" />
141-
<file role="src" name="src/couchbase/view_index_manager.c" />
142142
<file role="src" name="transcoding.c" />
143143
</dir>
144144
</contents>

src/couchbase/bucket.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
zend_class_entry *pcbc_bucket_ce;
2222
extern zend_class_entry *pcbc_scope_ce;
23+
extern zend_class_entry *pcbc_view_index_manager_ce;
2324

2425
PHP_METHOD(Bucket, ping);
2526
PHP_METHOD(Bucket, diagnostics);
@@ -163,18 +164,14 @@ PHP_METHOD(Bucket, name)
163164
RETURN_NULL();
164165
}
165166

166-
void pcbc_view_index_manager_init(zval *return_value, zval *bucket TSRMLS_DC);
167-
168167
PHP_METHOD(Bucket, viewIndexes)
169168
{
170-
int rv;
171-
172-
rv = zend_parse_parameters_none();
173-
if (rv == FAILURE) {
169+
if (zend_parse_parameters_none_throw() == FAILURE) {
174170
RETURN_NULL();
175171
}
176172

177-
pcbc_view_index_manager_init(return_value, getThis() TSRMLS_CC);
173+
object_init_ex(return_value, pcbc_view_index_manager_ce);
174+
zend_update_property(pcbc_view_index_manager_ce, return_value, ZEND_STRL("bucket"), getThis() TSRMLS_CC);
178175
}
179176

180177
PHP_METHOD(Bucket, defaultCollection)
@@ -266,6 +263,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(ai_Bucket_scope, 0, 1, \\Couchbase\\Scope
266263
ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
267264
ZEND_END_ARG_INFO()
268265

266+
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(ai_Bucket_viewIndexes, 0, 1, \\Couchbase\\ViewIndexManager, 0)
267+
ZEND_END_ARG_INFO()
268+
269269
// clang-format off
270270
zend_function_entry bucket_methods[] = {
271271
PHP_ME(Bucket, __construct, ai_Bucket_none, ZEND_ACC_PRIVATE | ZEND_ACC_FINAL | ZEND_ACC_CTOR)
@@ -279,7 +279,7 @@ zend_function_entry bucket_methods[] = {
279279
PHP_ME(Bucket, defaultCollection, ai_Bucket_defaultCollection, ZEND_ACC_PUBLIC)
280280
PHP_ME(Bucket, defaultScope, ai_Bucket_defaultScope, ZEND_ACC_PUBLIC)
281281
PHP_ME(Bucket, scope, ai_Bucket_scope, ZEND_ACC_PUBLIC)
282-
PHP_ME(Bucket, viewIndexes, ai_Bucket_none, ZEND_ACC_PUBLIC)
282+
PHP_ME(Bucket, viewIndexes, ai_Bucket_viewIndexes, ZEND_ACC_PUBLIC)
283283
PHP_FE_END
284284
};
285285
// clang-format on

src/couchbase/bucket/http.c

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818

1919
#define LOGARGS(instance, lvl) LCB_LOG_##lvl, instance, "pcbc/http", __FILE__, __LINE__
2020

21+
extern zend_class_entry *pcbc_default_exception_ce;
22+
extern zend_class_entry *pcbc_http_exception_ce;
23+
2124
typedef struct {
2225
opcookie_res header;
2326
zval bytes;
@@ -58,7 +61,7 @@ void http_callback(lcb_INSTANCE *instance, int cbtype, const lcb_RESPHTTP *resp)
5861
opcookie_push(cookie, &result->header);
5962
}
6063

61-
static lcb_STATUS proc_http_results(zval *return_value, opcookie *cookie TSRMLS_DC)
64+
static lcb_STATUS proc_http_results(zval *return_value, opcookie *cookie, void(httpcb)(zval *, zval *) TSRMLS_DC)
6265
{
6366
opcookie_http_res *res;
6467
lcb_STATUS err = LCB_SUCCESS;
@@ -71,7 +74,42 @@ static lcb_STATUS proc_http_results(zval *return_value, opcookie *cookie TSRMLS_
7174
FOREACH_OPCOOKIE_RES(opcookie_http_res, res, cookie)
7275
{
7376
if (has_value == 0) {
74-
ZVAL_ZVAL(return_value, &res->bytes, 1, 0);
77+
if (Z_TYPE(res->bytes) == IS_ARRAY) {
78+
HashTable *marr = Z_ARRVAL(res->bytes);
79+
zval *mval;
80+
mval = zend_symtable_str_find(marr, ZEND_STRL("errors"));
81+
if (mval && Z_TYPE_P(mval) == IS_ARRAY) {
82+
smart_str buf = {0};
83+
zend_string *string_key = NULL;
84+
zval *entry;
85+
ZEND_HASH_FOREACH_STR_KEY_VAL(HASH_OF(mval), string_key, entry)
86+
{
87+
smart_str_append_ex(&buf, string_key, 0);
88+
if (Z_TYPE_P(entry) == IS_STRING) {
89+
smart_str_appends(&buf, ": ");
90+
smart_str_append_ex(&buf, Z_STR_P(entry), 0);
91+
}
92+
smart_str_appends(&buf, ", ");
93+
}
94+
ZEND_HASH_FOREACH_END();
95+
if (buf.s && ZSTR_LEN(buf.s) > 2) {
96+
ZSTR_LEN(buf.s) -= 2;
97+
ZSTR_VAL(buf.s)[ZSTR_LEN(buf.s)] = '\0';
98+
}
99+
object_init_ex(return_value, pcbc_http_exception_ce);
100+
zend_update_property_str(pcbc_default_exception_ce, return_value, ZEND_STRL("message"),
101+
buf.s TSRMLS_CC);
102+
smart_str_free(&buf);
103+
err = LCB_ERR_HTTP;
104+
}
105+
}
106+
if (err == LCB_SUCCESS) {
107+
if (httpcb) {
108+
httpcb(return_value, &res->bytes);
109+
} else {
110+
ZVAL_ZVAL(return_value, &res->bytes, 1, 0);
111+
}
112+
}
75113
has_value = 1;
76114
} else {
77115
err = LCB_ERR_GENERIC;
@@ -88,7 +126,8 @@ static lcb_STATUS proc_http_results(zval *return_value, opcookie *cookie TSRMLS_
88126
return err;
89127
}
90128

91-
void pcbc_http_request(zval *return_value, lcb_INSTANCE *conn, lcb_CMDHTTP *cmd, int json_response TSRMLS_DC)
129+
void pcbc_http_request(zval *return_value, lcb_INSTANCE *conn, lcb_CMDHTTP *cmd, int json_response,
130+
void(httpcb)(zval *, zval *) TSRMLS_DC)
92131
{
93132
lcb_STATUS err;
94133
opcookie *cookie;
@@ -99,10 +138,15 @@ void pcbc_http_request(zval *return_value, lcb_INSTANCE *conn, lcb_CMDHTTP *cmd,
99138
lcb_cmdhttp_destroy(cmd);
100139
if (err == LCB_SUCCESS) {
101140
lcb_wait(conn, LCB_WAIT_DEFAULT);
102-
err = proc_http_results(return_value, cookie TSRMLS_CC);
141+
err = proc_http_results(return_value, cookie, httpcb TSRMLS_CC);
103142
}
104143
opcookie_destroy(cookie);
105-
if (err != LCB_SUCCESS) {
144+
145+
if (Z_TYPE_P(return_value) == IS_OBJECT &&
146+
instanceof_function(Z_OBJCE_P(return_value), pcbc_default_exception_ce TSRMLS_CC)) {
147+
zend_throw_exception_object(return_value TSRMLS_CC);
148+
RETURN_NULL();
149+
} else if (err != LCB_SUCCESS) {
106150
throw_lcb_exception(err, NULL);
107151
}
108152
}

0 commit comments

Comments
 (0)