11#include <time.h>
22#include <stdio.h>
33#include <limits.h>
4+ #include <string.h>
45
56#include "php_tarantool.h"
67#include "tarantool_internal.h"
@@ -548,12 +549,19 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_tarantool_delete, 0, 0, 2)
548549 ZEND_ARG_INFO (0 , index )
549550ZEND_END_ARG_INFO ()
550551
551- /* call, eval */
552+ /* eval */
552553ZEND_BEGIN_ARG_INFO_EX (arginfo_tarantool_proc_tuple , 0 , 0 , 1 )
553554 ZEND_ARG_INFO (0 , proc )
554555 ZEND_ARG_INFO (0 , tuple )
555556ZEND_END_ARG_INFO ()
556557
558+ /* call */
559+ ZEND_BEGIN_ARG_INFO_EX (arginfo_tarantool_proc_call , 0 , 0 , 1 )
560+ ZEND_ARG_INFO (0 , proc )
561+ ZEND_ARG_INFO (0 , tuple )
562+ ZEND_ARG_INFO (0 , opts )
563+ ZEND_END_ARG_INFO ()
564+
557565ZEND_BEGIN_ARG_INFO_EX (arginfo_tarantool_update , 0 , 0 , 3 )
558566 ZEND_ARG_INFO (0 , space )
559567 ZEND_ARG_INFO (0 , key )
@@ -580,7 +588,7 @@ const zend_function_entry Tarantool_methods[] = {
580588 TNT_MEP (select , arginfo_tarantool_select )
581589 TNT_MEP (insert , arginfo_tarantool_space_tuple )
582590 TNT_MEP (replace , arginfo_tarantool_space_tuple )
583- TNT_MEP (call , arginfo_tarantool_proc_tuple )
591+ TNT_MEP (call , arginfo_tarantool_proc_call )
584592 TNT_MEP (eval , arginfo_tarantool_proc_tuple )
585593 TNT_MEP (delete , arginfo_tarantool_delete )
586594 TNT_MEP (update , arginfo_tarantool_update )
@@ -1485,17 +1493,69 @@ PHP_METHOD(Tarantool, delete) {
14851493 TARANTOOL_RETURN_DATA (& body , & header , & body );
14861494}
14871495
1496+ /**
1497+ * "call" options.
1498+ */
1499+ struct call_opts {
1500+ bool call_16 ;
1501+ };
1502+
1503+ /**
1504+ * Initialization value for "call" options.
1505+ */
1506+ static const struct call_opts call_opts_default = {
1507+ .call_16 = true
1508+ };
1509+
1510+ static int parse_call_opts (zval * opts , struct call_opts * res ) {
1511+ HashTable * ht = HASH_OF (opts );
1512+ if (ht == NULL ) {
1513+ THROW_EXC ("call(): bad type of \"options\"."
1514+ " Should be an array." );
1515+ return FAILURE ;
1516+ }
1517+
1518+ zval * call_16_zval = zend_hash_str_find (ht , "call_16" ,
1519+ strlen ("call_16" ));
1520+ if (call_16_zval != NULL ) {
1521+ if (Z_TYPE_P (call_16_zval ) == IS_TRUE ) {
1522+ res -> call_16 = true;
1523+ } else if (Z_TYPE_P (call_16_zval ) == IS_FALSE ) {
1524+ res -> call_16 = false;
1525+ } else {
1526+ THROW_EXC ("call(): bad type of call_16 option."
1527+ " Should be a boolean." );
1528+ return FAILURE ;
1529+ }
1530+ }
1531+
1532+ return SUCCESS ;
1533+ }
1534+
14881535PHP_METHOD (Tarantool , call ) {
14891536 char * proc ; size_t proc_len ;
14901537 zval * tuple = NULL , tuple_new ;
1538+ zval * opts = NULL ;
14911539
1492- TARANTOOL_FUNCTION_BEGIN (obj , id , "s|z" , & proc , & proc_len , & tuple );
1540+ TARANTOOL_FUNCTION_BEGIN (obj , id , "s|zz" , & proc , & proc_len ,
1541+ & tuple , & opts );
14931542 TARANTOOL_CONNECT_ON_DEMAND (obj );
14941543
1544+ struct call_opts call_opts = call_opts_default ;
1545+ if (opts != NULL && parse_call_opts (opts , & call_opts ) == FAILURE ) {
1546+ RETURN_FALSE ;
1547+ }
1548+
14951549 pack_key (tuple , 1 , & tuple_new );
14961550
14971551 long sync = TARANTOOL_G (sync_counter )++ ;
1498- php_tp_encode_call (obj -> value , sync , proc , proc_len , & tuple_new );
1552+ if (call_opts .call_16 ) {
1553+ php_tp_encode_call_16 (obj -> value , sync , proc , proc_len ,
1554+ & tuple_new );
1555+ } else {
1556+ php_tp_encode_call (obj -> value , sync , proc , proc_len ,
1557+ & tuple_new );
1558+ }
14991559 zval_ptr_dtor (& tuple_new );
15001560 if (tarantool_stream_send (obj ) == FAILURE )
15011561 RETURN_FALSE ;
0 commit comments