Skip to content

Commit

Permalink
add support of a new binary protocol command for "call"
Browse files Browse the repository at this point in the history
Added support for a new binary protocol command for "call" (used
since 1.7.2).
The old version of "call" has been moved to "call_16".

Closes #101
  • Loading branch information
LeonidVas committed Jul 16, 2020
1 parent 6c098be commit ec19618
Show file tree
Hide file tree
Showing 8 changed files with 122 additions and 22 deletions.
38 changes: 34 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ Place it into project library path in your IDE.
4. [Database queries](#database-queries)
* [Tarantool::select](tarantool#select)
* [Tarantool::insert, replace](#tarantoolinsert-tarantoolreplace)
* [Tarantool::call_16](#tarantoolcall_16)
* [Tarantool::call](#tarantoolcall)
* [Tarantool::evaluate](#tarantoolevaluate)
* [Tarantool::delete](#tarantooldelete)
Expand Down Expand Up @@ -122,6 +123,7 @@ Tarantool {
public array Tarantool::select (mixed $space [, mixed $key = array() [, mixed $index = 0 [, int $limit = PHP_INT_MAX [, int $offset = 0 [, $iterator = Tarantool::ITERATOR_EQ ] ] ] ] ] )
public array Tarantool::insert (mixed $space, array $tuple)
public array Tarantool::replace (mixed $space, array $tuple)
public array Tarantool::call_16 (string $procedure [, mixed args] )
public array Tarantool::call (string $procedure [, mixed args] )
public array Tarantool::evaluate (string $expression [, mixed args] )
public array Tarantool::delete (mixed $space, mixed $key [, mixed $index] )
Expand Down Expand Up @@ -296,17 +298,18 @@ $tnt->insert("test", array(1, 3, "smth completely different"));
$tnt->replace("test", array(1, 3, "smth completely different"));
```

### Tarantool::call
### Tarantool::call_16

``` php
public array Tarantool::call(string $procedure [, mixed args])
public array Tarantool::call_16(string $procedure [, mixed args])
```

_**Description**_: Call stored procedure
_**Description**_: Call stored procedure.
Deprecated. For tarantool >= 1.7.2 use "call" instead.

_**Parameters**_
* `procedure`: String, procedure to call (mandatory)
* `args`: Any value to pass to procdure as arguments (empty by default)
* `args`: Any value to pass to procedure as arguments (empty by default)

_**Return Value**_

Expand All @@ -317,6 +320,33 @@ _**Return Value**_

#### Example

``` php
$tnt->call_16("test_2");
$tnt->call_16("test_3", array(3, 4));
```

### Tarantool::call

``` php
public array Tarantool::call(string $procedure [, mixed args])
```

_**Description**_: Call stored procedure.
Similar to "call_16", but – like "eval", "call" returns a list of values,
unconverted. Since tarantool 1.7.2.

_**Parameters**_
* `procedure`: String, procedure to call (mandatory)
* `args`: Any value to pass to procedure as arguments (empty by default)

_**Return Value**_

**Any value**, that was returned by stored procedure..

**BOOL**: False and raises `Exception` in case of error.

#### Example

``` php
$tnt->call("test_2");
$tnt->call("test_3", array(3, 4));
Expand Down
1 change: 1 addition & 0 deletions src/php_tarantool.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ PHP_METHOD(Tarantool, select);
PHP_METHOD(Tarantool, insert);
PHP_METHOD(Tarantool, replace);
PHP_METHOD(Tarantool, call);
PHP_METHOD(Tarantool, call_16);
PHP_METHOD(Tarantool, eval);
PHP_METHOD(Tarantool, delete);
PHP_METHOD(Tarantool, update);
Expand Down
27 changes: 26 additions & 1 deletion src/tarantool.c
Original file line number Diff line number Diff line change
Expand Up @@ -543,7 +543,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_tarantool_delete, 0, 0, 2)
ZEND_ARG_INFO(0, index)
ZEND_END_ARG_INFO()

/* call, eval */
/* call_16, call, eval */
ZEND_BEGIN_ARG_INFO_EX(arginfo_tarantool_proc_tuple, 0, 0, 1)
ZEND_ARG_INFO(0, proc)
ZEND_ARG_INFO(0, tuple)
Expand Down Expand Up @@ -576,6 +576,7 @@ const zend_function_entry Tarantool_methods[] = {
TNT_MEP(insert, arginfo_tarantool_space_tuple )
TNT_MEP(replace, arginfo_tarantool_space_tuple )
TNT_MEP(call, arginfo_tarantool_proc_tuple )
TNT_MEP(call_16, arginfo_tarantool_proc_tuple )
TNT_MEP(eval, arginfo_tarantool_proc_tuple )
TNT_MEP(delete, arginfo_tarantool_delete )
TNT_MEP(update, arginfo_tarantool_update )
Expand Down Expand Up @@ -1479,6 +1480,30 @@ PHP_METHOD(Tarantool, call) {
TARANTOOL_RETURN_DATA(&body, &header, &body);
}

PHP_METHOD(Tarantool, call_16) {
char *proc;
size_t proc_len;
zval tuple_new;
zval *tuple = NULL;

TARANTOOL_FUNCTION_BEGIN(obj, id, "s|z", &proc, &proc_len, &tuple);
TARANTOOL_CONNECT_ON_DEMAND(obj);

pack_key(tuple, 1, &tuple_new);

long sync = TARANTOOL_G(sync_counter)++;
php_tp_encode_call_16(obj->value, sync, proc, proc_len, &tuple_new);
zval_ptr_dtor(&tuple_new);
if (tarantool_stream_send(obj) == FAILURE)
RETURN_FALSE;

zval header, body;
if (tarantool_step_recv(obj, sync, &header, &body) == FAILURE)
RETURN_FALSE;

TARANTOOL_RETURN_DATA(&body, &header, &body);
}

PHP_METHOD(Tarantool, eval) {
char *code; size_t code_len;
zval *tuple = NULL, tuple_new;
Expand Down
26 changes: 18 additions & 8 deletions src/tarantool_proto.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,29 +172,39 @@ void php_tp_encode_delete(smart_string *str, uint32_t sync,
php_mp_pack(str, tuple);
}

size_t php_tp_sizeof_call(uint32_t sync,
uint32_t proc_len, zval *tuple) {
return php_tp_sizeof_header(TNT_CALL, sync) +
static size_t php_tp_sizeof_call(uint32_t sync, uint32_t proc_len,
enum tnt_request_type type, zval *tuple) {
return php_tp_sizeof_header(type, sync) +
php_mp_sizeof_hash(2) +
php_mp_sizeof_long(TNT_FUNCTION) +
php_mp_sizeof_string(proc_len) +
php_mp_sizeof_long(TNT_TUPLE) +
php_mp_sizeof(tuple) ;
}

void php_tp_encode_call(smart_string *str, uint32_t sync,
char *proc, uint32_t proc_len, zval *tuple) {
size_t packet_size = php_tp_sizeof_call(sync,
proc_len, tuple);
static void php_tp_encode_call_common(smart_string *str, uint32_t sync,
char *proc, uint32_t proc_len,
enum tnt_request_type type, zval *tuple) {
size_t packet_size = php_tp_sizeof_call(sync, proc_len, type, tuple);
smart_string_ensure(str, packet_size + 5);
php_tp_pack_header(str, packet_size, TNT_CALL, sync);
php_tp_pack_header(str, packet_size, type, sync);
php_mp_pack_hash(str, 2);
php_mp_pack_long(str, TNT_FUNCTION);
php_mp_pack_string(str, proc, proc_len);
php_mp_pack_long(str, TNT_TUPLE);
php_mp_pack(str, tuple);
}

void php_tp_encode_call(smart_string *str, uint32_t sync, char *proc,
uint32_t proc_len, zval *tuple) {
php_tp_encode_call_common(str,sync, proc, proc_len, TNT_CALL, tuple);
}

void php_tp_encode_call_16(smart_string *str, uint32_t sync, char *proc,
uint32_t proc_len, zval *tuple) {
php_tp_encode_call_common(str,sync, proc, proc_len, TNT_CALL_16, tuple);
}

size_t php_tp_sizeof_eval(uint32_t sync,
uint32_t proc_len, zval *tuple) {
return php_tp_sizeof_header(TNT_EVAL, sync) +
Expand Down
5 changes: 4 additions & 1 deletion src/tarantool_proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,11 @@ enum tnt_request_type {
TNT_REPLACE = 0x03,
TNT_UPDATE = 0x04,
TNT_DELETE = 0x05,
TNT_CALL = 0x06,
TNT_CALL_16 = 0x06,
TNT_AUTH = 0x07,
TNT_EVAL = 0x08,
TNT_UPSERT = 0x09,
TNT_CALL = 0x0a,
TNT_PING = 0x40
};

Expand Down Expand Up @@ -136,6 +137,8 @@ void php_tp_encode_delete(smart_string *str, uint32_t sync, uint32_t space_no,
uint32_t index_no, zval *tuple);
void php_tp_encode_call(smart_string *str, uint32_t sync, char *proc,
uint32_t proc_len, zval *tuple);
void php_tp_encode_call_16(smart_string *str, uint32_t sync, char *proc,
uint32_t proc_len, zval *tuple);
void php_tp_encode_eval(smart_string *str, uint32_t sync, char *proc,
uint32_t proc_len, zval *tuple);

Expand Down
17 changes: 14 additions & 3 deletions test/DMLTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -234,19 +234,30 @@ public function test_11_update_error() {
);
}

public function test_12_call() {
$result = self::$tarantool->call("test_6", array(true, false, false));
public function test_12_01_call_16() {
$result = self::$tarantool->call_16("test_6", array(true, false, false));
$this->assertEquals(array(array(true), array(false), array(false)), $result);
$this->assertEquals(
array(
'0' => array(
'0' => array('k1' => 'v2', 'k2' => 'v')
)
),
self::$tarantool->call_16("test_2")
);
$this->assertEquals(
self::$tarantool->call_16("test_3", array(3, 4)), array('0' => array('0' => 7)));
}

public function test_12_02_call() {
$result = self::$tarantool->call("test_6", array(true, false, false));
$this->assertEquals(array(true, false, false), $result);
$this->assertEquals(
array('0' => array('k1' => 'v2', 'k2' => 'v')),
self::$tarantool->call("test_2")
);
$this->assertEquals(
self::$tarantool->call("test_3", array(3, 4)), array('0' => array('0' => 7)));
self::$tarantool->call("test_3", array(3, 4)), array('0' => 7));
}

public function test_13_eval() {
Expand Down
23 changes: 19 additions & 4 deletions test/MsgPackTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,36 @@ public static function doSetUpBeforeClass()
self::$tarantool->ping();
}

public function test_00_msgpack_call() {
$resp = self::$tarantool->call('test_4', [
public function test_00_01_msgpack_call() {
$resp = self::$tarantool->call_16('test_4', [
'4TL2tLIXqMqyGQm_kiE7mRrS96I5E8nqU', 'B627', 0, [
'browser_stats_first_session_hits' => 1
]
]);
$this->assertEquals($resp[0][0], 2);
$resp = self::$tarantool->call('test_4', [
$resp = self::$tarantool->call_16('test_4', [
'4TL2tLIXqMqyGQm_kiE7mRrS96I5E8nqU', 'B627', 0, [
'browser_stats_first_session_hit' => 1
]
]);
$this->assertEquals($resp[0][0], 2);
}

public function test_00_02_msgpack_call() {
$resp = self::$tarantool->call('test_4', [
'4TL2tLIXqMqyGQm_kiE7mRrS96I5E8nqU', 'B627', 0, [
'browser_stats_first_session_hits' => 1
]
]);
$this->assertEquals($resp[0], 2);
$resp = self::$tarantool->call('test_4', [
'4TL2tLIXqMqyGQm_kiE7mRrS96I5E8nqU', 'B627', 0, [
'browser_stats_first_session_hit' => 1
]
]);
$this->assertEquals($resp[0], 2);
}

public function test_01_msgpack_array_key() {
$this->expectException(TarantoolException::class);
$this->expectExceptionMessage('Bad key type for PHP Array');
Expand Down Expand Up @@ -81,6 +96,6 @@ public function test_05_msgpack_string_keys() {
public function test_06_msgpack_array_reference() {
$data = array('key1' => 'value1');
$link = &$data['key1'];
self::$tarantool->call('test_4', [$data]);
self::$tarantool->call_16('test_4', [$data]);
}
}
7 changes: 6 additions & 1 deletion test/RandomTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,14 @@ public function test_02_very_big_response() {

public function test_03_another_big_response() {
for ($i = 100; $i <= 5200; $i += 100) {
$result = self::$tarantool->call('test_5', array($i));
$result = self::$tarantool->call_16('test_5', array($i));
$this->assertEquals($i, count($result));
}

for ($i = 100; $i <= 5200; $i += 100) {
$result = self::$tarantool->call('test_5', array($i));
$this->assertEquals($i, count($result[0]));
}
}

/**
Expand Down

0 comments on commit ec19618

Please sign in to comment.