Skip to content

Commit 53973cf

Browse files
committed
PCBC-560: Positional, named and raw parameters for Analytics
Change-Id: Ibaac54b05cda879e9af61f3303fed4b61cea6e7a Reviewed-on: http://review.couchbase.org/99880 Tested-by: Build Bot <[email protected]> Reviewed-by: Sergey Avseyev <[email protected]>
1 parent d3e6cf0 commit 53973cf

File tree

4 files changed

+159
-6
lines changed

4 files changed

+159
-6
lines changed

api/couchbase.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3651,6 +3651,50 @@ final private function __construct() {}
36513651
* @example examples/api/couchbase.AnalyticsQuery.php
36523652
*/
36533653
public static function fromString($statement) {}
3654+
3655+
/**
3656+
* Specify array of positional parameters
3657+
*
3658+
* Previously specified positional parameters will be replaced.
3659+
* Note: carefully choose type of quotes for the query string, because PHP also uses `$`
3660+
* (dollar sign) for variable interpolation. If you are using double quotes, make sure
3661+
* that N1QL parameters properly escaped.
3662+
*
3663+
* @param array $params
3664+
* @return AnalyticsQuery
3665+
*
3666+
* @example examples/api/couchbase.AnalyticsQuery.php
3667+
*/
3668+
public function positionalParams($params) {}
3669+
3670+
/**
3671+
* Specify associative array of named parameters
3672+
*
3673+
* The supplied array of key/value pairs will be merged with already existing named parameters.
3674+
* Note: carefully choose type of quotes for the query string, because PHP also uses `$`
3675+
* (dollar sign) for variable interpolation. If you are using double quotes, make sure
3676+
* that N1QL parameters properly escaped.
3677+
*
3678+
* @param array $params
3679+
* @return AnalyticsQuery
3680+
*
3681+
* @example examples/api/couchbase.AnalyticsQuery.php
3682+
*/
3683+
public function namedParams($params) {}
3684+
3685+
/**
3686+
* Specify custom parameter for query
3687+
*
3688+
* This function exists as escape hatch for cases when the Server has
3689+
* implemented some new query feature, while the SDK hasn't yet exposed
3690+
* the API on query object yet. The key must be a string, and param is
3691+
* JSON-serializable object.
3692+
*
3693+
* @param string $key
3694+
* @param mixed $param
3695+
* @return AnalyticsQuery
3696+
*/
3697+
public function rawParam($key, $value) {}
36543698
}
36553699

36563700
}

examples/api/couchbase.AnalyticsQuery.php

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,18 @@
33
$cluster->authenticateAs('Administrator', 'password');
44
$bucket = $cluster->openBucket('default');
55

6-
$query = \Couchbase\AnalyticsQuery::fromString('SELECT "Hello, beer!" AS greeting;');
6+
$query = \Couchbase\AnalyticsQuery::fromString('
7+
SELECT "Hello, " || $name || "!" AS greeting,
8+
"¡Hola, " || ? || "!" AS saludo
9+
');
10+
$query->namedParams(['name' => 'Beer']);
11+
$query->positionalParams(['Cerveza']);
12+
$res = $bucket->query($query);
713
var_dump($res->rows[0]);
8-
//=> object(stdClass)#4 (1) {
14+
//=> object(stdClass)#5 (2) {
915
// ["greeting"]=>
10-
// string(12) "Hello, beer!"
16+
// string(12) "Hello, Beer!"
17+
// ["saludo"]=>
18+
// string(16) "¡Hola, Cerveza!"
1119
// }
20+

src/couchbase/analytics_query.c

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,120 @@ PHP_METHOD(AnalyticsQuery, fromString)
4343
pcbc_analytics_query_init(return_value, statement, statement_len TSRMLS_CC);
4444
} /* }}} */
4545

46+
PHP_METHOD(AnalyticsQuery, rawParam)
47+
{
48+
zval *value;
49+
zval *options;
50+
char *name = NULL;
51+
pcbc_str_arg_size name_len = 0;
52+
int rv;
53+
54+
rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &name, &name_len, &value);
55+
if (rv == FAILURE) {
56+
RETURN_NULL();
57+
}
58+
59+
PCBC_READ_PROPERTY(options, pcbc_analytics_query_ce, getThis(), "options", 0);
60+
PCBC_ADDREF_P(value);
61+
add_assoc_zval_ex(options, name, name_len, value);
62+
63+
RETURN_ZVAL(getThis(), 1, 0);
64+
}
65+
66+
PHP_METHOD(AnalyticsQuery, positionalParams)
67+
{
68+
zval *params;
69+
zval *options;
70+
int rv;
71+
72+
rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &params);
73+
if (rv == FAILURE) {
74+
RETURN_NULL();
75+
}
76+
77+
PCBC_READ_PROPERTY(options, pcbc_analytics_query_ce, getThis(), "options", 0);
78+
PCBC_ADDREF_P(params);
79+
add_assoc_zval(options, "args", params);
80+
81+
RETURN_ZVAL(getThis(), 1, 0);
82+
}
83+
84+
PHP_METHOD(AnalyticsQuery, namedParams)
85+
{
86+
zval *params;
87+
zval *options;
88+
int rv;
89+
90+
rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &params);
91+
if (rv == FAILURE) {
92+
RETURN_NULL();
93+
}
94+
95+
PCBC_READ_PROPERTY(options, pcbc_analytics_query_ce, getThis(), "options", 0);
96+
{
97+
#if PHP_VERSION_ID >= 70000
98+
HashTable *ht;
99+
zend_ulong num_key;
100+
zend_string *string_key = NULL;
101+
zval *entry;
102+
103+
ht = HASH_OF(params);
104+
ZEND_HASH_FOREACH_KEY_VAL(ht, num_key, string_key, entry)
105+
{
106+
if (string_key) {
107+
char *prefixed_key = NULL;
108+
spprintf(&prefixed_key, 0, "$%s", ZSTR_VAL(string_key));
109+
add_assoc_zval(options, prefixed_key, entry);
110+
PCBC_ADDREF_P(entry);
111+
efree(prefixed_key);
112+
}
113+
}
114+
ZEND_HASH_FOREACH_END();
115+
#else
116+
HashPosition pos;
117+
zval **entry;
118+
119+
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(params), &pos);
120+
while (zend_hash_get_current_data_ex(Z_ARRVAL_P(params), (void **)&entry, &pos) == SUCCESS) {
121+
if (zend_hash_get_current_key_type_ex(Z_ARRVAL_P(params), &pos) == HASH_KEY_IS_STRING) {
122+
char *key = NULL, *prefixed_key = NULL;
123+
uint key_len = 0;
124+
zend_hash_get_current_key_ex(Z_ARRVAL_P(params), &key, &key_len, NULL, 0, &pos);
125+
spprintf(&prefixed_key, 0, "$%s", key);
126+
add_assoc_zval(options, prefixed_key, *entry);
127+
PCBC_ADDREF_P(*entry);
128+
efree(prefixed_key);
129+
}
130+
zend_hash_move_forward_ex(Z_ARRVAL_P(params), &pos);
131+
}
132+
#endif
133+
}
134+
RETURN_ZVAL(getThis(), 1, 0);
135+
}
136+
46137
ZEND_BEGIN_ARG_INFO_EX(ai_AnalyticsQuery_none, 0, 0, 0)
47138
ZEND_END_ARG_INFO()
48139

49140
ZEND_BEGIN_ARG_INFO_EX(ai_AnalyticsQuery_fromString, 0, 0, 1)
50141
ZEND_ARG_INFO(0, statement)
51142
ZEND_END_ARG_INFO()
52143

144+
ZEND_BEGIN_ARG_INFO_EX(ai_AnalyticsQuery_params, 0, 0, 1)
145+
ZEND_ARG_INFO(0, params)
146+
ZEND_END_ARG_INFO()
147+
148+
ZEND_BEGIN_ARG_INFO_EX(ai_AnalyticsQuery_rawParam, 0, 0, 2)
149+
ZEND_ARG_INFO(0, name)
150+
ZEND_ARG_INFO(0, value)
151+
ZEND_END_ARG_INFO()
152+
53153
// clang-format off
54154
zend_function_entry analytics_query_methods[] = {
55155
PHP_ME(AnalyticsQuery, __construct, ai_AnalyticsQuery_none, ZEND_ACC_PRIVATE | ZEND_ACC_FINAL | ZEND_ACC_CTOR)
56156
PHP_ME(AnalyticsQuery, fromString, ai_AnalyticsQuery_fromString, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
157+
PHP_ME(AnalyticsQuery, positionalParams, ai_AnalyticsQuery_params, ZEND_ACC_PUBLIC)
158+
PHP_ME(AnalyticsQuery, namedParams, ai_AnalyticsQuery_params, ZEND_ACC_PUBLIC)
159+
PHP_ME(AnalyticsQuery, rawParam, ai_AnalyticsQuery_rawParam, ZEND_ACC_PUBLIC)
57160
PHP_FE_END
58161
};
59162
// clang-format on

src/couchbase/bucket.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,9 @@ PHP_METHOD(Bucket, unlock);
3636
PHP_METHOD(Bucket, remove);
3737
PHP_METHOD(Bucket, touch);
3838
PHP_METHOD(Bucket, counter);
39-
PHP_METHOD(Bucket, n1ql_request);
40-
PHP_METHOD(Bucket, fts_request);
4139
PHP_METHOD(Bucket, n1ix_list);
4240
PHP_METHOD(Bucket, n1ix_create);
4341
PHP_METHOD(Bucket, n1ix_drop);
44-
PHP_METHOD(Bucket, http_request);
4542
PHP_METHOD(Bucket, durability);
4643
PHP_METHOD(Bucket, ping);
4744
PHP_METHOD(Bucket, diag);

0 commit comments

Comments
 (0)