Skip to content

Commit 7626844

Browse files
committed
Allow JSON columns on C/C++
Data can be retrieved as getString().
1 parent fcad606 commit 7626844

File tree

7 files changed

+60
-2
lines changed

7 files changed

+60
-2
lines changed

cppconn/datatype.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ class DataType
5959
GEOMETRY,
6060
ENUM,
6161
SET,
62-
SQLNULL
62+
SQLNULL,
63+
JSON
6364
};
6465
};
6566

driver/mysql_ps_resultset.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,6 +1033,7 @@ MySQL_Prepared_ResultSet::getString(const uint32_t columnIndex) const
10331033
case sql::DataType::LONGVARBINARY:
10341034
case sql::DataType::SET:
10351035
case sql::DataType::ENUM:
1036+
case sql::DataType::JSON:
10361037
CPP_INFO("It's a string");
10371038
return sql::SQLString(static_cast<char *>(result_bind->rbind[columnIndex - 1].buffer), *result_bind->rbind[columnIndex - 1].length);
10381039
default:

driver/mysql_resultbind.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ allocate_buffer_for_field(const MYSQL_FIELD * const field)
8585
case MYSQL_TYPE_BLOB:
8686
case MYSQL_TYPE_STRING:
8787
case MYSQL_TYPE_VAR_STRING:
88+
case MYSQL_TYPE_JSON:
8889
return st_buffer_size_type(new char[field->max_length + 1], field->max_length + 1, field->type);
8990

9091
case MYSQL_TYPE_DECIMAL:

driver/mysql_resultset.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -926,7 +926,7 @@ MySQL_ResultSet::next()
926926
sql::SQLException e(proxy_p->error(), proxy_p->sqlstate(), proxy_p->errNo());
927927
throw e;
928928
}
929-
if (ret = (row != NULL)) {
929+
if ((ret = (row != NULL))) {
930930
++row_position;
931931
} else {
932932
row_position = 0;

driver/mysql_util.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,8 @@ mysql_type_to_datatype(const MYSQL_FIELD * const field)
431431
return sql::DataType::SET;
432432
case MYSQL_TYPE_GEOMETRY:
433433
return sql::DataType::GEOMETRY;
434+
case MYSQL_TYPE_JSON:
435+
return sql::DataType::JSON;
434436
default:
435437
return sql::DataType::UNKNOWN;
436438
}
@@ -496,6 +498,8 @@ mysql_string_type_to_datatype(const sql::SQLString & name)
496498
return sql::DataType::SET;
497499
} else if (!name.compare("geometry")) {
498500
return sql::DataType::GEOMETRY;
501+
} else if (!name.compare("json")) {
502+
return sql::DataType::JSON;
499503
} else {
500504
return sql::DataType::UNKNOWN;
501505
}

test/unit/classes/resultset.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,49 @@ void resultset::getResultSetType()
10471047
}
10481048
}
10491049

1050+
void resultset::JSON_support()
1051+
{
1052+
std::stringstream msg;
1053+
1054+
logMsg("resultset::JSON_support - MySQL_ResultSet::*");
1055+
try
1056+
{
1057+
stmt.reset(con->createStatement());
1058+
stmt->execute("DROP TABLE IF EXISTS test");
1059+
stmt->execute("CREATE TABLE test(id INT, jval JSON)");
1060+
stmt->execute("INSERT INTO test(id, jval) VALUES(1, '[1]')");
1061+
1062+
#ifdef INCLUDE_NOT_IMPLEMENTED_METHODS
1063+
doNotImplemented();
1064+
#endif
1065+
1066+
pstmt.reset(con->prepareStatement("SELECT * FROM test"));
1067+
res.reset(pstmt->executeQuery());
1068+
res->next();
1069+
1070+
msg.str();
1071+
msg << "... PS: id = " << res->getInt(1);
1072+
msg << "... PS: jval = " << res->getString(2);
1073+
logMsg(msg.str());
1074+
1075+
res.reset(stmt->executeQuery("SELECT * FROM test"));
1076+
res->next();
1077+
1078+
msg.str();
1079+
msg << "... Statement: id = " << res->getInt(1);
1080+
msg << "... Statement: jval = " << res->getString(2);
1081+
logMsg(msg.str());
1082+
1083+
stmt->execute("DROP TABLE IF EXISTS test");
1084+
}
1085+
catch (sql::SQLException &e)
1086+
{
1087+
logErr(e.what());
1088+
logErr("SQLState: " + std::string(e.getSQLState()));
1089+
fail(e.what(), __FILE__, __LINE__);
1090+
}
1091+
}
1092+
10501093

10511094
} /* namespace resultset */
10521095
} /* namespace testsuite */

test/unit/classes/resultset.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class resultset : public unit_fixture
5656
TEST_CASE(getTypes);
5757
TEST_CASE(getResultSetType);
5858
TEST_CASE(getTypesMinorIssues);
59+
TEST_CASE(JSON_support);
5960

6061
#ifdef INCLUDE_NOT_IMPLEMENTED_METHODS
6162
TEST_CASE(notImplemented);
@@ -109,6 +110,13 @@ class resultset : public unit_fixture
109110
*/
110111
void fetchBitAsInt();
111112

113+
/**
114+
* Test for resultset::getString() on JSON type columns
115+
*
116+
* Test of the assorted methods to fetch JSON strings
117+
*/
118+
void JSON_support();
119+
112120

113121
};
114122

0 commit comments

Comments
 (0)