diff options
Diffstat (limited to 'connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx')
-rw-r--r-- | connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx | 101 |
1 files changed, 53 insertions, 48 deletions
diff --git a/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx b/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx index 11e1d6996c70..79961b53d16b 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx @@ -23,41 +23,61 @@ #include <com/sun/star/sdbc/XRow.hpp> #include <rtl/ustrbuf.hxx> +#include <sal/log.hxx> using namespace connectivity::mysqlc; using namespace com::sun::star::uno; using namespace com::sun::star::lang; using namespace com::sun::star::sdbc; -MYSQL_FIELD* OResultSetMetaData::getField(sal_Int32 column) const +OResultSetMetaData::OResultSetMetaData(OConnection& rConn, MYSQL_RES* pResult) + : m_rConnection(rConn) { - return mysql_fetch_field_direct(m_pRes, column - 1); + MYSQL_FIELD* fields = mysql_fetch_field(pResult); + unsigned nFieldCount = mysql_num_fields(pResult); + for (unsigned i = 0; i < nFieldCount; ++i) + { + MySqlFieldInfo fieldInfo{ + OUString{ fields[i].name, static_cast<sal_Int32>(fields[i].name_length), + m_rConnection.getConnectionEncoding() }, // column name + static_cast<sal_Int32>(fields[i].length), // length + mysqlc_sdbc_driver::mysqlToOOOType(fields[i].type, fields[i].charsetnr), // type + fields[i].type, // mysql_type + fields[i].charsetnr, // charset number + fields[i].flags, + OUString{ fields[i].db, static_cast<sal_Int32>(fields[i].db_length), + m_rConnection.getConnectionEncoding() }, // schema name + OUString{ fields[i].table, static_cast<sal_Int32>(fields[i].table_length), + m_rConnection.getConnectionEncoding() }, // table name + OUString{ fields[i].catalog, static_cast<sal_Int32>(fields[i].catalog_length), + m_rConnection.getConnectionEncoding() }, // catalog + static_cast<sal_Int32>(fields[i].decimals), + static_cast<sal_Int32>(fields[i].max_length) + }; + m_fields.push_back(std::move(fieldInfo)); + } } sal_Int32 SAL_CALL OResultSetMetaData::getColumnDisplaySize(sal_Int32 column) { - MYSQL_FIELD* pField = getField(column); - return pField->length; + checkColumnIndex(column); + return m_fields.at(column - 1).length; } sal_Int32 SAL_CALL OResultSetMetaData::getColumnType(sal_Int32 column) { checkColumnIndex(column); - MYSQL_FIELD* pField = getField(column); - - return mysqlc_sdbc_driver::mysqlToOOOType(pField->type, pField->charsetnr); + return m_fields.at(column - 1).type; } -sal_Int32 SAL_CALL OResultSetMetaData::getColumnCount() { return mysql_num_fields(m_pRes); } +sal_Int32 SAL_CALL OResultSetMetaData::getColumnCount() { return m_fields.size(); } sal_Bool SAL_CALL OResultSetMetaData::isCaseSensitive(sal_Int32 column) { - checkColumnIndex(column); // MYSQL_FIELD::charsetnr is the collation identifier // _ci postfix means it's insensitive - MYSQL_FIELD* pField = getField(column); - rtl::OUStringBuffer sql{ "SHOW COLLATION WHERE Id =" }; - sql.append(rtl::OUString::number(pField->charsetnr)); + OUStringBuffer sql{ "SHOW COLLATION WHERE Id =" }; + sql.append(OUString::number(m_fields.at(column - 1).charsetNumber)); Reference<XStatement> stmt = m_rConnection.createStatement(); Reference<XResultSet> rs = stmt->executeQuery(sql.makeStringAndClear()); @@ -74,54 +94,43 @@ sal_Bool SAL_CALL OResultSetMetaData::isCaseSensitive(sal_Int32 column) rtl::OUString SAL_CALL OResultSetMetaData::getSchemaName(sal_Int32 column) { checkColumnIndex(column); - MYSQL_FIELD* pField = getField(column); - - return rtl::OStringToOUString(pField->db, m_rConnection.getConnectionEncoding()); + return m_fields.at(column - 1).schemaName; } rtl::OUString SAL_CALL OResultSetMetaData::getColumnName(sal_Int32 column) { checkColumnIndex(column); - - MYSQL_FIELD* pField = getField(column); - return rtl::OStringToOUString(pField->name, m_rConnection.getConnectionEncoding()); + return m_fields.at(column - 1).columnName; } rtl::OUString SAL_CALL OResultSetMetaData::getTableName(sal_Int32 column) { checkColumnIndex(column); - MYSQL_FIELD* pField = getField(column); - return rtl::OStringToOUString(pField->table, m_rConnection.getConnectionEncoding()); + return m_fields.at(column - 1).tableName; } rtl::OUString SAL_CALL OResultSetMetaData::getCatalogName(sal_Int32 column) { checkColumnIndex(column); - MYSQL_FIELD* pField = getField(column); - return rtl::OStringToOUString(pField->catalog, m_rConnection.getConnectionEncoding()); + return m_fields.at(column - 1).catalogName; } rtl::OUString SAL_CALL OResultSetMetaData::getColumnTypeName(sal_Int32 column) { checkColumnIndex(column); - MYSQL_FIELD* pField = getField(column); - - return mysqlc_sdbc_driver::mysqlTypeToStr(pField); + return mysqlc_sdbc_driver::mysqlTypeToStr(m_fields.at(column - 1).mysql_type, + m_fields.at(column - 1).flags); } rtl::OUString SAL_CALL OResultSetMetaData::getColumnLabel(sal_Int32 column) { checkColumnIndex(column); - MYSQL_FIELD* pField = getField(column); - return rtl::OStringToOUString(pField->name, m_rConnection.getConnectionEncoding()); + return getColumnName(column); } -rtl::OUString SAL_CALL OResultSetMetaData::getColumnServiceName(sal_Int32 column) +OUString SAL_CALL OResultSetMetaData::getColumnServiceName(sal_Int32 /*column*/) { - checkColumnIndex(column); - - rtl::OUString aRet = rtl::OUString(); - return aRet; + return OUString{}; } sal_Bool SAL_CALL OResultSetMetaData::isCurrency(sal_Int32 /*column*/) @@ -132,47 +141,43 @@ sal_Bool SAL_CALL OResultSetMetaData::isCurrency(sal_Int32 /*column*/) sal_Bool SAL_CALL OResultSetMetaData::isAutoIncrement(sal_Int32 column) { checkColumnIndex(column); - - MYSQL_FIELD* pField = getField(column); - return pField->flags & AUTO_INCREMENT_FLAG; + return (m_fields.at(column - 1).flags & AUTO_INCREMENT_FLAG) != 0; } sal_Bool SAL_CALL OResultSetMetaData::isSigned(sal_Int32 column) { checkColumnIndex(column); - - MYSQL_FIELD* pField = getField(column); - return !(pField->flags & UNSIGNED_FLAG); + return !(m_fields.at(column - 1).flags & UNSIGNED_FLAG); } sal_Int32 SAL_CALL OResultSetMetaData::getPrecision(sal_Int32 column) { checkColumnIndex(column); - MYSQL_FIELD* pField = getField(column); - return pField->max_length - pField->decimals; + return m_fields.at(column - 1).max_length - m_fields.at(column - 1).decimals; } sal_Int32 SAL_CALL OResultSetMetaData::getScale(sal_Int32 column) { checkColumnIndex(column); - MYSQL_FIELD* pField = getField(column); - return pField->decimals; + return m_fields.at(column - 1).decimals; } sal_Int32 SAL_CALL OResultSetMetaData::isNullable(sal_Int32 column) { checkColumnIndex(column); - MYSQL_FIELD* pField = getField(column); - return !(pField->flags & NOT_NULL_FLAG); + return (m_fields.at(column - 1).flags & NOT_NULL_FLAG) ? 0 : 1; } -sal_Bool SAL_CALL OResultSetMetaData::isSearchable(sal_Int32 /*column*/) { return true; } +sal_Bool SAL_CALL OResultSetMetaData::isSearchable(sal_Int32 column) +{ + checkColumnIndex(column); + return true; +} sal_Bool SAL_CALL OResultSetMetaData::isReadOnly(sal_Int32 column) { checkColumnIndex(column); - MYSQL_FIELD* pField = getField(column); - return !(pField->db && strlen(pField->db)); + return m_fields.at(column - 1).schemaName.isEmpty(); } sal_Bool SAL_CALL OResultSetMetaData::isDefinitelyWritable(sal_Int32 column) @@ -189,7 +194,7 @@ sal_Bool SAL_CALL OResultSetMetaData::isWritable(sal_Int32 column) void OResultSetMetaData::checkColumnIndex(sal_Int32 columnIndex) { - unsigned nColCount = mysql_num_fields(m_pRes); + auto nColCount = m_fields.size(); if (columnIndex < 1 || columnIndex > static_cast<sal_Int32>(nColCount)) { rtl::OUStringBuffer buf; |