Skip to content

Commit ad564df

Browse files
committed
Bug#34833655: MySQL command services component API fails on Windows
Added a service to access the field metadata info. Added a test for it. Change-Id: I9f7b45e70150bc81e5b35cb85a1818f6e9d89eb5
1 parent 899faa1 commit ad564df

File tree

5 files changed

+101
-5
lines changed

5 files changed

+101
-5
lines changed

Diff for: components/test/test_mysql_command_services.cc

+33-5
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ REQUIRES_SERVICE_PLACEHOLDER_AS(mysql_command_query_result,
4343
cmd_query_result_srv);
4444
REQUIRES_SERVICE_PLACEHOLDER_AS(mysql_command_field_info, cmd_field_info_srv);
4545
REQUIRES_SERVICE_PLACEHOLDER_AS(mysql_command_error_info, cmd_error_info_srv);
46+
REQUIRES_SERVICE_PLACEHOLDER_AS(mysql_command_field_metadata,
47+
cmd_field_meta_srv);
4648

4749
BEGIN_COMPONENT_PROVIDES(test_mysql_command_services)
4850
END_COMPONENT_PROVIDES();
@@ -59,6 +61,7 @@ REQUIRES_SERVICE_AS(udf_registration, udf_srv),
5961
REQUIRES_SERVICE_AS(mysql_command_query_result, cmd_query_result_srv),
6062
REQUIRES_SERVICE_AS(mysql_command_field_info, cmd_field_info_srv),
6163
REQUIRES_SERVICE_AS(mysql_command_error_info, cmd_error_info_srv),
64+
REQUIRES_SERVICE_AS(mysql_command_field_metadata, cmd_field_meta_srv),
6265
END_COMPONENT_REQUIRES();
6366

6467
MYSQL_H mysql_h = nullptr;
@@ -121,21 +124,46 @@ static char *test_mysql_command_services_udf(UDF_INIT *, UDF_ARGS *args,
121124
goto err;
122125
}
123126

124-
for (uint64_t i = 0; i < row_count; i++) {
125-
if (cmd_query_result_srv->fetch_row(mysql_res, &row)) {
127+
if (field_count > 0) {
128+
if (cmd_field_info_srv->fetch_field(mysql_res, &field_h)) {
126129
result = nullptr;
127130
goto err;
128131
}
129-
if (cmd_field_info_srv->fetch_field(mysql_res, &field_h)) {
132+
if (cmd_field_info_srv->fetch_fields(mysql_res, &fields_h)) {
130133
result = nullptr;
131134
goto err;
132135
}
133-
if (cmd_field_info_srv->fetch_fields(mysql_res, &fields_h)) {
136+
137+
const char *field_name = nullptr, *table_name = nullptr,
138+
*db_name = nullptr;
139+
if (cmd_field_meta_srv->get(field_h, MYSQL_COMMAND_FIELD_METADATA_NAME,
140+
&field_name) ||
141+
!field_name) {
142+
result = nullptr;
143+
goto err;
144+
}
145+
if (cmd_field_meta_srv->get(
146+
field_h, MYSQL_COMMAND_FIELD_METADATA_TABLE_NAME, &table_name)) {
147+
result = nullptr;
148+
goto err;
149+
}
150+
if (cmd_field_meta_srv->get(
151+
field_h, MYSQL_COMMAND_FIELD_METADATA_TABLE_DB_NAME, &db_name)) {
152+
result = nullptr;
153+
goto err;
154+
}
155+
}
156+
157+
for (uint64_t i = 0; i < row_count; i++) {
158+
if (cmd_query_result_srv->fetch_row(mysql_res, &row)) {
134159
result = nullptr;
135160
goto err;
136161
}
137162
ulong *length = nullptr;
138-
cmd_query_result_srv->fetch_lengths(mysql_res, &length);
163+
if (cmd_query_result_srv->fetch_lengths(mysql_res, &length)) {
164+
result = nullptr;
165+
goto err;
166+
}
139167
for (unsigned int j = 0; j < num_column; j++) {
140168
result_set += row[j];
141169
}

Diff for: include/mysql/components/services/mysql_command_services.h

+38
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,44 @@ DECLARE_BOOL_METHOD(fetch_fields,
394394
DECLARE_BOOL_METHOD(field_count, (MYSQL_H mysql_h, unsigned int *num_fields));
395395
END_SERVICE_DEFINITION(mysql_command_field_info)
396396

397+
#define MYSQL_COMMAND_FIELD_METADATA_NAME 0
398+
#define MYSQL_COMMAND_FIELD_METADATA_TABLE_NAME 1
399+
#define MYSQL_COMMAND_FIELD_METADATA_TABLE_DB_NAME 2
400+
401+
/**
402+
@ingroup group_components_services_inventory
403+
404+
Fetch the metadata of a service.
405+
406+
Usually used as follows:
407+
408+
*/
409+
BEGIN_SERVICE_DEFINITION(mysql_command_field_metadata)
410+
/**
411+
Retrieves the metadata for the field.
412+
413+
@param[in] mysql_field_h A valid mysql field handle object.
414+
@param[in] metadata A metadata ID to fetch. Can be one of:
415+
416+
--------------+-------------------------------------------+--------------------------------+
417+
Type | Option |Explanation |
418+
--------------+-------------------------------------------+--------------------------------+
419+
const char * |MYSQL_COMMAND_FIELD_METADATA_NAME |The field name. |
420+
--------------+-------------------------------------------+--------------------------------+
421+
const char * |MYSQL_COMMAND_FIELD_METADATA_TABLE_NAME |The table name. |
422+
--------------+-------------------------------------------+--------------------------------+
423+
const char * |MYSQL_COMMAND_FIELD_METADATA_TABLE_DB_NAME |The table database
424+
name. |
425+
--------------+-------------------------------------------+--------------------------------+
426+
427+
@param[out] data A buffer to receive the data fetched.
428+
@retval true failure
429+
@retval false success
430+
*/
431+
DECLARE_BOOL_METHOD(get,
432+
(MYSQL_FIELD_H mysql_field_h, int metadata, void *data));
433+
END_SERVICE_DEFINITION(mysql_command_field_metadata)
434+
397435
/**
398436
@ingroup group_components_services_inventory
399437

Diff for: sql/server_component/mysql_command_services_imp.cc

+22
Original file line numberDiff line numberDiff line change
@@ -1105,3 +1105,25 @@ DEFINE_BOOL_METHOD(mysql_command_services_imp::sql_state,
11051105
}
11061106
return false;
11071107
}
1108+
1109+
DEFINE_BOOL_METHOD(mysql_command_services_imp::field_metadata_get,
1110+
(MYSQL_FIELD_H field_h, int metadata, void *data))
1111+
try {
1112+
MYSQL_FIELD *fld = reinterpret_cast<MYSQL_FIELD *>(field_h);
1113+
1114+
switch (metadata) {
1115+
case MYSQL_COMMAND_FIELD_METADATA_NAME:
1116+
*reinterpret_cast<const char **>(data) = fld->name;
1117+
return false;
1118+
case MYSQL_COMMAND_FIELD_METADATA_TABLE_NAME:
1119+
*reinterpret_cast<const char **>(data) = fld->table;
1120+
return false;
1121+
case MYSQL_COMMAND_FIELD_METADATA_TABLE_DB_NAME:
1122+
*reinterpret_cast<const char **>(data) = fld->db;
1123+
return false;
1124+
}
1125+
return true;
1126+
} catch (...) {
1127+
mysql_components_handle_std_exception(__func__);
1128+
return true;
1129+
}

Diff for: sql/server_component/mysql_command_services_imp.h

+4
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ class mysql_command_services_imp {
127127
static DEFINE_BOOL_METHOD(sql_error, (MYSQL_H mysql_h, char **errmsg));
128128
static DEFINE_BOOL_METHOD(sql_state,
129129
(MYSQL_H mysql_h, char **sqlstate_errmsg));
130+
131+
/* mysql_command_field_metadata service APIs */
132+
static DEFINE_BOOL_METHOD(field_metadata_get,
133+
(MYSQL_FIELD_H field_h, int metadata, void *data));
130134
};
131135

132136
/** This is a wrapper class of all the mysql_text_consumer services refs */

Diff for: sql/server_component/server_component.cc

+4
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,9 @@ mysql_command_services_imp::fetch_field, mysql_command_services_imp::num_fields,
484484
mysql_command_services_imp::fetch_fields,
485485
mysql_command_services_imp::field_count END_SERVICE_IMPLEMENTATION();
486486

487+
BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_command_field_metadata)
488+
mysql_command_services_imp::field_metadata_get END_SERVICE_IMPLEMENTATION();
489+
487490
BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_command_error_info)
488491
mysql_command_services_imp::sql_errno, mysql_command_services_imp::sql_error,
489492
mysql_command_services_imp::sql_state END_SERVICE_IMPLEMENTATION();
@@ -696,6 +699,7 @@ PROVIDES_SERVICE(mysql_server_path_filter, dynamic_loader_scheme_file),
696699
PROVIDES_SERVICE(mysql_server, mysql_text_consumer_get_string_v1),
697700
PROVIDES_SERVICE(mysql_server, mysql_text_consumer_client_capabilities_v1),
698701
PROVIDES_SERVICE(mysql_server, mysql_status_variable_string),
702+
PROVIDES_SERVICE(mysql_server, mysql_command_field_metadata),
699703
END_COMPONENT_PROVIDES();
700704

701705
static BEGIN_COMPONENT_REQUIRES(mysql_server) END_COMPONENT_REQUIRES();

0 commit comments

Comments
 (0)