Skip to content

Commit 1b1e537

Browse files
committed
PCBC-777: workaround for query positional parameters
libcouchbase 3.2.0 introduced change in how positional parameters handled for queries (see CCBC-1429). This patch reshapes parameters for 3.2.0 and prepares codes for future fix in libcouchbase. Change-Id: Ic3986b48ad3dc4d94114d339a57cac741f3f7676 Reviewed-on: http://review.couchbase.org/c/php-couchbase/+/158291 Tested-by: Build Bot <[email protected]> Reviewed-by: Sergey Avseyev <[email protected]>
1 parent 9392728 commit 1b1e537

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

config.m4

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ if test "$PHP_COUCHBASE" != "no"; then
1818
elif test -x "$PKG_CONFIG" && $PKG_CONFIG --exists libcouchbase; then
1919
LIBCOUCHBASE_VERSION=`$PKG_CONFIG libcouchbase --modversion`
2020

21-
if $PKG_CONFIG libcouchbase --atleast-version 3.1.3; then
21+
if $PKG_CONFIG libcouchbase --atleast-version 3.2.0; then
2222
LIBCOUCHBASE_CFLAGS=`$PKG_CONFIG libcouchbase --cflags`
2323
LIBCOUCHBASE_LIBS=`$PKG_CONFIG libcouchbase --libs`
2424
AC_MSG_RESULT(from pkgconfig: version $LIBCOUCHBASE_VERSION found)
2525
else
26-
AC_MSG_ERROR([libcouchbase version $LIBCOUCHBASE_VERSION found, must be upgraded to version >= 3.1.3])
26+
AC_MSG_ERROR([libcouchbase version $LIBCOUCHBASE_VERSION found, must be upgraded to version >= 3.2.0])
2727
fi
2828

2929
dnl fallback on standard directory
@@ -50,14 +50,14 @@ if test "$PHP_COUCHBASE" != "no"; then
5050

5151
dnl found in directory
5252
else
53-
AC_MSG_CHECKING([for libcouchbase version >= 3.1.3])
53+
AC_MSG_CHECKING([for libcouchbase version >= 3.2.0])
5454
LCB_VERSION=$($EGREP "define LCB_VERSION " $LIBCOUCHBASE_DIR/include/libcouchbase/configuration.h | $SED -e 's/[[^0-9x]]//g')
5555
AC_MSG_RESULT([$LCB_VERSION])
5656
if test "x$LCB_VERSION" = "x0x000000"; then
5757
AC_MSG_ERROR([seems like libcouchbase is not installed from official tarball or git clone. Do not use github tags to download releases.])
5858
fi
59-
if test $(printf %d $LCB_VERSION) -lt $(printf %d 0x030103); then
60-
AC_MSG_ERROR([libcouchbase greater or equal to 3.1.3 required])
59+
if test $(printf %d $LCB_VERSION) -lt $(printf %d 0x030200); then
60+
AC_MSG_ERROR([libcouchbase greater or equal to 3.2.0 required])
6161
fi
6262

6363
PHP_ADD_INCLUDE($LIBCOUCHBASE_DIR/include)

src/couchbase/bucket/cbas.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,8 @@ static const zend_function_entry pcbc_analytics_options_methods[] = {
324324
};
325325
// clang-format on
326326

327-
void do_analytics_query(zval *return_value, lcb_INSTANCE *lcb, zend_string *statement, zval *options, zend_string *scope)
327+
void do_analytics_query(zval *return_value, lcb_INSTANCE *lcb, zend_string *statement, zval *options,
328+
zend_string *scope)
328329
{
329330
lcb_CMDANALYTICS *cmd;
330331
lcb_cmdanalytics_create(&cmd);
@@ -352,6 +353,7 @@ void do_analytics_query(zval *return_value, lcb_INSTANCE *lcb, zend_string *stat
352353
}
353354
prop = pcbc_read_property(pcbc_analytics_options_ce, options, ("positional_params"), 0, &ret);
354355
if (Z_TYPE_P(prop) == IS_ARRAY) {
356+
#if LCB_VERSION > 0x030200
355357
HashTable *ht = HASH_OF(prop);
356358
zval *entry;
357359
ZEND_HASH_FOREACH_VAL(ht, entry)
@@ -361,6 +363,26 @@ void do_analytics_query(zval *return_value, lcb_INSTANCE *lcb, zend_string *stat
361363
}
362364
}
363365
ZEND_HASH_FOREACH_END();
366+
#else
367+
smart_str buf = {0};
368+
HashTable *ht = HASH_OF(prop);
369+
zval *entry;
370+
smart_str_appendc(&buf, '[');
371+
ZEND_HASH_FOREACH_VAL(ht, entry)
372+
{
373+
if (Z_TYPE_P(entry) == IS_STRING) {
374+
smart_str_appendl(&buf, Z_STRVAL_P(entry), Z_STRLEN_P(entry));
375+
smart_str_appendc(&buf, ',');
376+
}
377+
}
378+
if (ZSTR_LEN(buf.s) > 1) {
379+
ZSTR_LEN(buf.s) = ZSTR_LEN(buf.s) - 1; /* remove last comma */
380+
}
381+
smart_str_appendc(&buf, ']');
382+
lcb_cmdanalytics_positional_param(cmd, ZSTR_VAL(buf.s), ZSTR_LEN(buf.s));
383+
smart_str_free(&buf);
384+
ZEND_HASH_FOREACH_END();
385+
#endif
364386
}
365387
prop = pcbc_read_property(pcbc_analytics_options_ce, options, ("raw_params"), 0, &ret);
366388
if (Z_TYPE_P(prop) == IS_ARRAY) {

src/couchbase/bucket/n1ql.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,7 @@ void do_query(zval *return_value, lcb_INSTANCE *lcb, zend_string *statement, zva
620620
}
621621
prop = pcbc_read_property(pcbc_query_options_ce, options, ("positional_params"), 0, &ret);
622622
if (Z_TYPE_P(prop) == IS_ARRAY) {
623+
#if LCB_VERSION > 0x030200
623624
HashTable *ht = HASH_OF(prop);
624625
zval *entry;
625626
ZEND_HASH_FOREACH_VAL(ht, entry)
@@ -629,6 +630,26 @@ void do_query(zval *return_value, lcb_INSTANCE *lcb, zend_string *statement, zva
629630
}
630631
}
631632
ZEND_HASH_FOREACH_END();
633+
#else
634+
smart_str buf = {0};
635+
HashTable *ht = HASH_OF(prop);
636+
zval *entry;
637+
smart_str_appendc(&buf, '[');
638+
ZEND_HASH_FOREACH_VAL(ht, entry)
639+
{
640+
if (Z_TYPE_P(entry) == IS_STRING) {
641+
smart_str_appendl(&buf, Z_STRVAL_P(entry), Z_STRLEN_P(entry));
642+
smart_str_appendc(&buf, ',');
643+
}
644+
}
645+
if (ZSTR_LEN(buf.s) > 1) {
646+
ZSTR_LEN(buf.s) = ZSTR_LEN(buf.s) - 1; /* remove last comma */
647+
}
648+
smart_str_appendc(&buf, ']');
649+
lcb_cmdquery_positional_param(cmd, ZSTR_VAL(buf.s), ZSTR_LEN(buf.s));
650+
smart_str_free(&buf);
651+
ZEND_HASH_FOREACH_END();
652+
#endif
632653
}
633654
prop = pcbc_read_property(pcbc_query_options_ce, options, ("raw_params"), 0, &ret);
634655
if (Z_TYPE_P(prop) == IS_ARRAY) {

0 commit comments

Comments
 (0)