Skip to content

Commit 35560da

Browse files
committed
WL#11945: remove obsolete routines throwing not_implemented exception
- remove util::xdevapi_exception::Code::not_implemented exception - implement getSession for schema, collection, and table - test-cases
1 parent 55efe3d commit 35560da

11 files changed

+276
-41
lines changed

mysqlx_collection.cc

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ extern "C" {
3838
#include "mysqlx_collection.h"
3939
#include "mysqlx_doc_result.h"
4040
#include "mysqlx_schema.h"
41+
#include "mysqlx_session.h"
4142
#include "util/allocator.h"
4243
#include "util/hash_table.h"
4344
#include "util/json_utils.h"
@@ -157,26 +158,25 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, __construct)
157158
/* {{{ proto mixed mysqlx_collection::getSession() */
158159
MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, getSession)
159160
{
160-
st_mysqlx_collection* object{nullptr};
161-
zval* object_zv{nullptr};
162-
163161
DBG_ENTER("mysqlx_collection::getSession");
164162

165-
if (FAILURE == util::zend::parse_method_parameters(execute_data, getThis(), "O",
166-
&object_zv, mysqlx_collection_class_entry))
163+
zval* object_zv{nullptr};
164+
if (FAILURE == util::zend::parse_method_parameters(
165+
execute_data,
166+
getThis(),
167+
"O",
168+
&object_zv,
169+
mysqlx_collection_class_entry))
167170
{
168171
DBG_VOID_RETURN;
169172
}
170173

171-
MYSQLX_FETCH_COLLECTION_FROM_ZVAL(object, object_zv);
174+
auto& data_object{ util::fetch_data_object<st_mysqlx_collection>(object_zv) };
172175

173176
RETVAL_FALSE;
174177

175-
throw util::xdevapi_exception(util::xdevapi_exception::Code::not_implemented);
176-
177-
if (object->collection) {
178-
179-
}
178+
XMYSQLND_SESSION session{ data_object.collection->data->schema->data->session };
179+
mysqlx_new_session(return_value, session);
180180

181181
DBG_VOID_RETURN;
182182
}

mysqlx_schema.cc

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ extern "C" {
3333
#include "mysqlx_collection.h"
3434
#include "mysqlx_table.h"
3535
#include "mysqlx_schema.h"
36+
#include "mysqlx_session.h"
3637
#include "util/allocator.h"
3738
#include "util/object.h"
3839
#include "util/string_utils.h"
@@ -125,26 +126,25 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_schema, __construct)
125126
/* {{{ proto mixed mysqlx_schema::getSession() */
126127
MYSQL_XDEVAPI_PHP_METHOD(mysqlx_schema, getSession)
127128
{
128-
st_mysqlx_schema* object{nullptr};
129-
zval* object_zv{nullptr};
130-
131129
DBG_ENTER("mysqlx_schema::getSession");
132130

133-
if (FAILURE == util::zend::parse_method_parameters(execute_data, getThis(), "O",
134-
&object_zv, mysqlx_schema_class_entry))
131+
zval* object_zv{nullptr};
132+
if (FAILURE == util::zend::parse_method_parameters(
133+
execute_data,
134+
getThis(),
135+
"O",
136+
&object_zv,
137+
mysqlx_schema_class_entry))
135138
{
136139
DBG_VOID_RETURN;
137140
}
138141

139-
MYSQLX_FETCH_SCHEMA_FROM_ZVAL(object, object_zv);
142+
auto& data_object{ util::fetch_data_object<st_mysqlx_schema>(object_zv) };
140143

141144
RETVAL_FALSE;
142145

143-
throw util::xdevapi_exception(util::xdevapi_exception::Code::not_implemented);
144-
145-
if (object->schema) {
146-
147-
}
146+
XMYSQLND_SESSION session{ data_object.schema->data->session };
147+
mysqlx_new_session(return_value, session);
148148

149149
DBG_VOID_RETURN;
150150
}

mysqlx_session.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,6 +1043,28 @@ mysqlx_new_session(zval * return_value)
10431043
}
10441044
/* }}} */
10451045

1046+
1047+
/* {{{ mysqlx_new_session */
1048+
void
1049+
mysqlx_new_session(zval* return_value, drv::XMYSQLND_SESSION session)
1050+
{
1051+
DBG_ENTER("mysqlx_new_session");
1052+
1053+
if (SUCCESS == object_init_ex(return_value, mysqlx_session_class_entry) && IS_OBJECT == Z_TYPE_P(return_value)) {
1054+
const st_mysqlx_object* const mysqlx_object{ Z_MYSQLX_P(return_value) };
1055+
st_mysqlx_session* const object{ static_cast<st_mysqlx_session*>(mysqlx_object->ptr) };
1056+
if (object) {
1057+
object->session = session;
1058+
} else {
1059+
zval_ptr_dtor(return_value);
1060+
throw util::doc_ref_exception(util::doc_ref_exception::Severity::warning, mysqlx_object->zo.ce);
1061+
}
1062+
}
1063+
1064+
DBG_VOID_RETURN;
1065+
}
1066+
/* }}} */
1067+
10461068
} // namespace devapi
10471069

10481070
} // namespace mysqlx

mysqlx_session.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ struct st_mysqlx_session : public util::custom_allocable
3636

3737

3838
enum_func_status mysqlx_new_session(zval * return_value);
39+
void mysqlx_new_session(zval* return_value, drv::XMYSQLND_SESSION session);
3940
void mysqlx_register_session_class(INIT_FUNC_ARGS, zend_object_handlers * mysqlx_std_object_handlers);
4041
void mysqlx_unregister_session_class(SHUTDOWN_FUNC_ARGS);
4142

mysqlx_table.cc

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ extern "C" {
3030
#include "mysqlx_exception.h"
3131
#include "mysqlx_schema_object.h"
3232
#include "mysqlx_schema.h"
33+
#include "mysqlx_session.h"
3334
#include "mysqlx_table__delete.h"
3435
#include "mysqlx_table__insert.h"
3536
#include "mysqlx_table__select.h"
@@ -117,26 +118,25 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_table, __construct)
117118
/* {{{ proto mixed mysqlx_table::getSession() */
118119
MYSQL_XDEVAPI_PHP_METHOD(mysqlx_table, getSession)
119120
{
120-
st_mysqlx_table* object{nullptr};
121-
zval* object_zv{nullptr};
122-
123121
DBG_ENTER("mysqlx_table::getSession");
124122

125-
if (FAILURE == util::zend::parse_method_parameters(execute_data, getThis(), "O",
126-
&object_zv, mysqlx_table_class_entry))
123+
zval* object_zv{nullptr};
124+
if (FAILURE == util::zend::parse_method_parameters(
125+
execute_data,
126+
getThis(),
127+
"O",
128+
&object_zv,
129+
mysqlx_table_class_entry))
127130
{
128131
DBG_VOID_RETURN;
129132
}
130133

131-
MYSQLX_FETCH_TABLE_FROM_ZVAL(object, object_zv);
134+
auto& data_object{ util::fetch_data_object<st_mysqlx_table>(object_zv) };
132135

133136
RETVAL_FALSE;
134137

135-
throw util::xdevapi_exception(util::xdevapi_exception::Code::not_implemented);
136-
137-
if (object->table) {
138-
139-
}
138+
XMYSQLND_SESSION session{ data_object.table->data->schema->data->session };
139+
mysqlx_new_session(return_value, session);
140140

141141
DBG_VOID_RETURN;
142142
}
@@ -291,7 +291,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_table, getSchema)
291291
XMYSQLND_SESSION session;
292292
zval* object_zv{nullptr};
293293

294-
DBG_ENTER("mysqlx_collection::getSchema");
294+
DBG_ENTER("mysqlx_table::getSchema");
295295

296296
if (FAILURE == util::zend::parse_method_parameters(
297297
execute_data,

tests/collection.phpt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,21 @@ mysqlx Collection
77

88
$session = create_test_db();
99
$schema = $session->getSchema($db);
10-
$coll = $schema->getCollection("test_collection");
10+
$coll = $schema->getCollection($test_collection_name);
1111

1212
fill_db_collection($coll);
1313

14-
expect_eq($coll->getName(),'test_collection');
15-
expect_eq($coll->name, 'test_collection');
14+
expect_eq($coll->getName(),$test_collection_name);
15+
expect_eq($coll->name, $test_collection_name);
1616
expect_true($coll->existsInDatabase());
1717
expect_eq($coll->count(), 16);
1818

1919
try {
2020
$schema = $coll->getSchema();
2121
expect_eq($schema->getName(),$db);
2222
expect_true($schema->existsInDatabase());
23-
$coll2 = $schema->getCollection('test_collection');
24-
expect_eq($coll2->getName(),'test_collection');
23+
$coll2 = $schema->getCollection($test_collection_name);
24+
expect_eq($coll2->getName(),$test_collection_name);
2525
expect_true($coll2->existsInDatabase());
2626
} catch(Exception $ex) {
2727
test_step_failed();

tests/session/from_collection.phpt

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
--TEST--
2+
mysqlx get session from collection
3+
--SKIPIF--
4+
--INI--
5+
error_reporting=E_ALL
6+
--FILE--
7+
<?php
8+
require_once(__DIR__."/../connect.inc");
9+
10+
function assert_test_collection($coll, $exists, $expected_items_count) {
11+
global $test_collection_name;
12+
expect_eq($coll->getName(), $test_collection_name);
13+
expect_eq($coll->name, $test_collection_name);
14+
expect_eq($coll->existsInDatabase(), $exists);
15+
expect_eq($coll->count(), $expected_items_count);
16+
}
17+
18+
function assert_collection_ok($coll) {
19+
assert_test_collection($coll, true, 16);
20+
}
21+
22+
function assert_collection_fail($coll) {
23+
assert_test_collection($coll, false, 0);
24+
}
25+
26+
$session0 = create_test_db();
27+
$schema0 = $session0->getSchema($db);
28+
expect_true($schema0->existsInDatabase());
29+
$coll0 = $schema0->getCollection($test_collection_name);
30+
fill_db_collection($coll0);
31+
assert_collection_ok($coll0);
32+
33+
$session1 = $coll0->getSession();
34+
$schema1 = $session1->getSchema($db);
35+
expect_true($schema1->existsInDatabase());
36+
$coll1 = $schema1->getCollection($test_collection_name);
37+
assert_collection_ok($coll1);
38+
39+
$session2 = $coll1->getSession();
40+
$schema2 = $session2->getSchema($db);
41+
expect_true($schema2->existsInDatabase());
42+
$coll2 = $schema2->getCollection($test_collection_name);
43+
assert_collection_ok($coll2);
44+
45+
$session0->close();
46+
47+
$schema3 = $session2->getSchema($db);
48+
expect_false($schema3->existsInDatabase());
49+
$coll3 = $schema3->getCollection($test_collection_name);
50+
assert_collection_fail($coll3);
51+
52+
$session4 = $coll2->getSession();
53+
$schema4 = $session4->getSchema($db);
54+
expect_false($schema4->existsInDatabase());
55+
$coll4 = $schema4->getCollection($test_collection_name);
56+
assert_collection_fail($coll4);
57+
58+
$session5 = $coll4->getSession();
59+
$schema5 = $session5->getSchema($db);
60+
expect_false($schema5->existsInDatabase());
61+
$coll5 = $schema5->getCollection($test_collection_name);
62+
assert_collection_fail($coll5);
63+
64+
verify_expectations();
65+
print "done!\n";
66+
?>
67+
--CLEAN--
68+
<?php
69+
require_once(__DIR__."/../connect.inc");
70+
clean_test_db();
71+
?>
72+
--EXPECTF--
73+
done!%A

tests/session/from_schema.phpt

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
--TEST--
2+
mysqlx get session from schema
3+
--SKIPIF--
4+
--INI--
5+
error_reporting=E_ALL
6+
--FILE--
7+
<?php
8+
require_once(__DIR__."/../connect.inc");
9+
10+
function assert_test_schema($schema, $exists) {
11+
global $test_schema_name;
12+
global $test_table_name;
13+
global $test_collection_name;
14+
15+
expect_eq($schema->getName(), $test_schema_name);
16+
expect_eq($schema->name, $test_schema_name);
17+
expect_eq($schema->existsInDatabase(), $exists);
18+
19+
$table = $schema->getTable($test_table_name);
20+
expect_eq($table->existsInDatabase(), $exists);
21+
22+
$coll = $schema->getCollection($test_collection_name);
23+
expect_eq($coll->existsInDatabase(), $exists);
24+
}
25+
26+
function assert_schema_ok($schema) {
27+
assert_test_schema($schema, true);
28+
}
29+
30+
function assert_schema_fail($schema) {
31+
assert_test_schema($schema, false);
32+
}
33+
34+
$session0 = create_test_db();
35+
$schema0 = $session0->getSchema($db);
36+
assert_schema_ok($schema0);
37+
38+
$session1 = $schema0->getSession();
39+
$schema1 = $session1->getSchema($db);
40+
assert_schema_ok($schema1);
41+
42+
$session2 = $schema1->getSession();
43+
$schema2 = $session2->getSchema($db);
44+
assert_schema_ok($schema2);
45+
46+
$session0->close();
47+
48+
$schema3 = $session2->getSchema($db);
49+
assert_schema_fail($schema3);
50+
51+
$session4 = $schema2->getSession();
52+
$schema4 = $session4->getSchema($db);
53+
assert_schema_fail($schema4);
54+
55+
$session5 = $schema3->getSession();
56+
$schema5 = $session5->getSchema($db);
57+
assert_schema_fail($schema5);
58+
59+
verify_expectations();
60+
print "done!\n";
61+
?>
62+
--CLEAN--
63+
<?php
64+
require_once(__DIR__."/../connect.inc");
65+
clean_test_db();
66+
?>
67+
--EXPECTF--
68+
done!%A

0 commit comments

Comments
 (0)