diff options
Diffstat (limited to 'connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx')
-rw-r--r-- | connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx | 312 |
1 files changed, 152 insertions, 160 deletions
diff --git a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx index 77e20700b135..c3c073f276b2 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx @@ -22,6 +22,7 @@ #include <com/sun/star/sdbc/Deferrability.hpp> #include <com/sun/star/lang/XInitialization.hpp> #include <comphelper/sequence.hxx> +#include <o3tl/string_view.hxx> #include <sal/log.hxx> #include <rtl/ustrbuf.hxx> @@ -32,7 +33,6 @@ using namespace connectivity::mysqlc; using namespace com::sun::star::uno; using namespace com::sun::star::lang; -using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; static std::string wild("%"); @@ -41,8 +41,6 @@ static void lcl_setRows_throw(const Reference<XResultSet>& _xResultSet, sal_Int3 const std::vector<std::vector<Any>>& _rRows) { Reference<XInitialization> xIni(_xResultSet, UNO_QUERY); - Sequence<Any> aArgs(2); - aArgs[0] <<= _nType; Sequence<Sequence<Any>> aRows(_rRows.size()); @@ -55,7 +53,7 @@ static void lcl_setRows_throw(const Reference<XResultSet>& _xResultSet, sal_Int3 } ++pRowsIter; } - aArgs[1] <<= aRows; + Sequence<Any> aArgs{ Any(_nType), Any(aRows) }; xIni->initialize(aArgs); } @@ -160,11 +158,11 @@ sal_Int32 SAL_CALL ODatabaseMetaData::getMaxIndexLength() { return 256; } sal_Bool SAL_CALL ODatabaseMetaData::supportsNonNullableColumns() { return true; } -OUString SAL_CALL ODatabaseMetaData::getCatalogTerm() { return "n/a"; } +OUString SAL_CALL ODatabaseMetaData::getCatalogTerm() { return u"n/a"_ustr; } -OUString SAL_CALL ODatabaseMetaData::getIdentifierQuoteString() { return "\""; } +OUString SAL_CALL ODatabaseMetaData::getIdentifierQuoteString() { return u"`"_ustr; } -OUString SAL_CALL ODatabaseMetaData::getExtraNameCharacters() { return "#@"; } +OUString SAL_CALL ODatabaseMetaData::getExtraNameCharacters() { return u"#@"_ustr; } sal_Bool SAL_CALL ODatabaseMetaData::supportsDifferentTableCorrelationNames() { return true; } @@ -351,7 +349,7 @@ OUString SAL_CALL ODatabaseMetaData::getURL() OUString SAL_CALL ODatabaseMetaData::getUserName() { Reference<XStatement> statement = m_rConnection.createStatement(); - Reference<XResultSet> rs = statement->executeQuery("select user()"); + Reference<XResultSet> rs = statement->executeQuery(u"select user()"_ustr); Reference<XRow> xRow(rs, UNO_QUERY_THROW); (void)rs->next(); // the first and only result // e.g. root@localhost @@ -365,9 +363,9 @@ OUString SAL_CALL ODatabaseMetaData::getUserName() return userWithConnection; } -OUString SAL_CALL ODatabaseMetaData::getDriverName() { return "MySQL Connector/OO.org"; } +OUString SAL_CALL ODatabaseMetaData::getDriverName() { return u"MySQL Connector/OO.org"_ustr; } -OUString SAL_CALL ODatabaseMetaData::getDriverVersion() { return "0.9.2"; } +OUString SAL_CALL ODatabaseMetaData::getDriverVersion() { return u"0.9.2"_ustr; } OUString SAL_CALL ODatabaseMetaData::getDatabaseProductVersion() { @@ -375,11 +373,11 @@ OUString SAL_CALL ODatabaseMetaData::getDatabaseProductVersion() m_rConnection.getConnectionEncoding()); } -OUString SAL_CALL ODatabaseMetaData::getDatabaseProductName() { return "MySQL"; } +OUString SAL_CALL ODatabaseMetaData::getDatabaseProductName() { return u"MySQL"_ustr; } -OUString SAL_CALL ODatabaseMetaData::getProcedureTerm() { return "procedure"; } +OUString SAL_CALL ODatabaseMetaData::getProcedureTerm() { return u"procedure"_ustr; } -OUString SAL_CALL ODatabaseMetaData::getSchemaTerm() { return "database"; } +OUString SAL_CALL ODatabaseMetaData::getSchemaTerm() { return u"database"_ustr; } sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMajorVersion() { @@ -402,7 +400,7 @@ sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMinorVersion() OUString SAL_CALL ODatabaseMetaData::getSQLKeywords() { - return "ACCESSIBLE, ADD, ALL," + return u"ACCESSIBLE, ADD, ALL," "ALTER, ANALYZE, AND, AS, ASC, ASENSITIVE, BEFORE," "BETWEEN, BIGINT, BINARY, BLOB, BOTH, BY, CALL," "CASCADE, CASE, CHANGE, CHAR, CHARACTER, CHECK," @@ -444,43 +442,43 @@ OUString SAL_CALL ODatabaseMetaData::getSQLKeywords() "VARCHARACTER, VARYING, WHEN, WHERE, WHILE, WITH," "WRITE, X509, XOR, YEAR_MONTH, ZEROFILL" "GENERAL, IGNORE_SERVER_IDS, MASTER_HEARTBEAT_PERIOD," - "MAXVALUE, RESIGNAL, SIGNAL, SLOW"; + "MAXVALUE, RESIGNAL, SIGNAL, SLOW"_ustr; } -OUString SAL_CALL ODatabaseMetaData::getSearchStringEscape() { return "\\"; } +OUString SAL_CALL ODatabaseMetaData::getSearchStringEscape() { return u"\\"_ustr; } OUString SAL_CALL ODatabaseMetaData::getStringFunctions() { - return "ASCII,BIN,BIT_LENGTH,CHAR,CHARACTER_LENGTH,CHAR_LENGTH,CONCAT," + return u"ASCII,BIN,BIT_LENGTH,CHAR,CHARACTER_LENGTH,CHAR_LENGTH,CONCAT," "CONCAT_WS,CONV,ELT,EXPORT_SET,FIELD,FIND_IN_SET,HEX,INSERT," "INSTR,LCASE,LEFT,LENGTH,LOAD_FILE,LOCATE,LOCATE,LOWER,LPAD," "LTRIM,MAKE_SET,MATCH,MID,OCT,OCTET_LENGTH,ORD,POSITION," "QUOTE,REPEAT,REPLACE,REVERSE,RIGHT,RPAD,RTRIM,SOUNDEX," "SPACE,STRCMP,SUBSTRING,SUBSTRING,SUBSTRING,SUBSTRING," - "SUBSTRING_INDEX,TRIM,UCASE,UPPER"; + "SUBSTRING_INDEX,TRIM,UCASE,UPPER"_ustr; } OUString SAL_CALL ODatabaseMetaData::getTimeDateFunctions() { - return "DAYOFWEEK,WEEKDAY,DAYOFMONTH,DAYOFYEAR,MONTH,DAYNAME," + return u"DAYOFWEEK,WEEKDAY,DAYOFMONTH,DAYOFYEAR,MONTH,DAYNAME," "MONTHNAME,QUARTER,WEEK,YEAR,HOUR,MINUTE,SECOND,PERIOD_ADD," "PERIOD_DIFF,TO_DAYS,FROM_DAYS,DATE_FORMAT,TIME_FORMAT," "CURDATE,CURRENT_DATE,CURTIME,CURRENT_TIME,NOW,SYSDATE," "CURRENT_TIMESTAMP,UNIX_TIMESTAMP,FROM_UNIXTIME," - "SEC_TO_TIME,TIME_TO_SEC"; + "SEC_TO_TIME,TIME_TO_SEC"_ustr; } OUString SAL_CALL ODatabaseMetaData::getSystemFunctions() { - return "DATABASE,USER,SYSTEM_USER," - "SESSION_USER,PASSWORD,ENCRYPT,LAST_INSERT_ID,VERSION"; + return u"DATABASE,USER,SYSTEM_USER," + "SESSION_USER,PASSWORD,ENCRYPT,LAST_INSERT_ID,VERSION"_ustr; } OUString SAL_CALL ODatabaseMetaData::getNumericFunctions() { - return "ABS,ACOS,ASIN,ATAN,ATAN2,BIT_COUNT,CEILING,COS," + return u"ABS,ACOS,ASIN,ATAN,ATAN2,BIT_COUNT,CEILING,COS," "COT,DEGREES,EXP,FLOOR,LOG,LOG10,MAX,MIN,MOD,PI,POW," - "POWER,RADIANS,RAND,ROUND,SIN,SQRT,TAN,TRUNCATE"; + "POWER,RADIANS,RAND,ROUND,SIN,SQRT,TAN,TRUNCATE"_ustr; } sal_Bool SAL_CALL ODatabaseMetaData::supportsExtendedSQLGrammar() { return false; } @@ -555,9 +553,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTableTypes() const char* const table_types[] = { "TABLE", "VIEW" }; sal_Int32 const requiredVersion[] = { 0, 50000 }; - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); @@ -565,9 +564,8 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTableTypes() { if (m_rConnection.getMysqlVersion() >= requiredVersion[i]) { - std::vector<Any> aRow{ Any() }; - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(table_types[i], encoding))); - rRows.push_back(aRow); + rRows.push_back( + { { Any(), Any(mysqlc_sdbc_driver::convert(table_types[i], encoding)) } }); } } lcl_setRows_throw(xResultSet, 5, rRows); @@ -576,9 +574,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTableTypes() Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTypeInfo() { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; @@ -586,32 +585,19 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTypeInfo() unsigned int i = 0; while (mysqlc_types[i].typeName) { - std::vector<Any> aRow{ Any() }; - - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].typeName, encoding))); - aRow.push_back(makeAny(mysqlc_types[i].dataType)); - aRow.push_back(makeAny(mysqlc_types[i].precision)); - aRow.push_back( - makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].literalPrefix, encoding))); - aRow.push_back( - makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].literalSuffix, encoding))); - aRow.push_back( - makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].createParams, encoding))); - aRow.push_back(makeAny(mysqlc_types[i].nullable)); - aRow.push_back(makeAny(mysqlc_types[i].caseSensitive)); - aRow.push_back(makeAny(mysqlc_types[i].searchable)); - aRow.push_back(makeAny(mysqlc_types[i].isUnsigned)); - aRow.push_back(makeAny(mysqlc_types[i].fixedPrecScale)); - aRow.push_back(makeAny(mysqlc_types[i].autoIncrement)); - aRow.push_back( - makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].localTypeName, encoding))); - aRow.push_back(makeAny(mysqlc_types[i].minScale)); - aRow.push_back(makeAny(mysqlc_types[i].maxScale)); - aRow.push_back(makeAny(sal_Int32(0))); - aRow.push_back(makeAny(sal_Int32(0))); - aRow.push_back(makeAny(sal_Int32(10))); + rRows.push_back( + { { Any(), Any(mysqlc_sdbc_driver::convert(mysqlc_types[i].typeName, encoding)), + Any(mysqlc_types[i].dataType), Any(mysqlc_types[i].precision), + Any(mysqlc_sdbc_driver::convert(mysqlc_types[i].literalPrefix, encoding)), + Any(mysqlc_sdbc_driver::convert(mysqlc_types[i].literalSuffix, encoding)), + Any(mysqlc_sdbc_driver::convert(mysqlc_types[i].createParams, encoding)), + Any(mysqlc_types[i].nullable), Any(mysqlc_types[i].caseSensitive), + Any(mysqlc_types[i].searchable), Any(mysqlc_types[i].isUnsigned), + Any(mysqlc_types[i].fixedPrecScale), Any(mysqlc_types[i].autoIncrement), + Any(mysqlc_sdbc_driver::convert(mysqlc_types[i].localTypeName, encoding)), + Any(mysqlc_types[i].minScale), Any(mysqlc_types[i].maxScale), Any(sal_Int32(0)), + Any(sal_Int32(0)), Any(sal_Int32(10)) } }); - rRows.push_back(aRow); i++; } @@ -621,27 +607,26 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTypeInfo() Reference<XResultSet> SAL_CALL ODatabaseMetaData::getCatalogs() { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); return xResultSet; } Reference<XResultSet> SAL_CALL ODatabaseMetaData::getSchemas() { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; - OUString sSql - = m_rConnection.getMysqlVersion() > 49999 - ? OUString{ "SELECT SCHEMA_NAME AS TABLE_SCHEM, CATALOG_NAME AS TABLE_CATALOG " - "FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY SCHEMA_NAME" } - : OUString{ "SHOW DATABASES" }; - Reference<XStatement> statement = m_rConnection.createStatement(); - Reference<XInterface> executed = statement->executeQuery(sSql); + Reference<XInterface> executed = statement->executeQuery( + u"SELECT SCHEMA_NAME AS TABLE_SCHEM, CATALOG_NAME AS TABLE_CATALOG FROM INFORMATION_SCHEMA.SCHEMATA \ + WHERE SCHEMA_NAME NOT IN ('information_schema', 'mysql', 'performance_schema') \ + ORDER BY SCHEMA_NAME"_ustr); Reference<XResultSet> rs(executed, UNO_QUERY_THROW); Reference<XResultSetMetaDataSupplier> supp(executed, UNO_QUERY_THROW); Reference<XResultSetMetaData> rs_meta = supp->getMetaData(); @@ -651,20 +636,12 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getSchemas() while (rs->next()) { std::vector<Any> aRow{ Any() }; - bool informationSchema = false; for (sal_uInt32 i = 1; i <= columns; i++) { OUString columnStringValue = xRow->getString(i); - if (i == 1) - { // TABLE_SCHEM - informationSchema = columnStringValue.equalsIgnoreAsciiCase("information_schema"); - } - aRow.push_back(makeAny(columnStringValue)); - } - if (!informationSchema) - { - rRows.push_back(aRow); + aRow.push_back(Any(columnStringValue)); } + rRows.push_back(aRow); } lcl_setRows_throw(xResultSet, 1, rRows); @@ -676,12 +653,12 @@ Reference<XResultSet> const OUString& table, const OUString& columnNamePattern) { - OUString query("SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA AS " + OUString query(u"SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA AS " "TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, NULL AS GRANTOR, " "GRANTEE, PRIVILEGE_TYPE AS PRIVILEGE, IS_GRANTABLE FROM " "INFORMATION_SCHEMA.COLUMN_PRIVILEGES WHERE TABLE_SCHEMA LIKE " "'?' AND TABLE_NAME='?' AND COLUMN_NAME LIKE '?' ORDER BY " - "COLUMN_NAME, PRIVILEGE_TYPE"); + "COLUMN_NAME, PRIVILEGE_TYPE"_ustr); query = query.replaceFirst("?", schema); query = query.replaceFirst("?", table); @@ -750,34 +727,35 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getColumns(const Any& /*catalo Reference<XResultSet> rs = statement->executeQuery(query); Reference<XRow> xRow(rs, UNO_QUERY_THROW); - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> aRows; while (rs->next()) { std::vector<Any> aRow{ Any() }; // 0. element is unused // catalog name - aRow.push_back(makeAny(xRow->getString(1))); + aRow.emplace_back(xRow->getString(1)); // schema name - aRow.push_back(makeAny(xRow->getString(2))); + aRow.emplace_back(xRow->getString(2)); // table name - aRow.push_back(makeAny(xRow->getString(3))); + aRow.emplace_back(xRow->getString(3)); // column name - aRow.push_back(makeAny(xRow->getString(4))); + aRow.emplace_back(xRow->getString(4)); // data type OUString sDataType = xRow->getString(5); - aRow.push_back(makeAny(mysqlc_sdbc_driver::mysqlStrToOOOType(sDataType))); + aRow.emplace_back(mysqlc_sdbc_driver::mysqlStrToOOOType(sDataType)); // type name - aRow.push_back(makeAny(sDataType)); // TODO + aRow.emplace_back(sDataType); // TODO // column size sal_Int32 nColumnSize = 0; OUString sColumnType = xRow->getString(14); sal_Int32 nCharMaxLen = xRow->getShort(6); bool bIsCharMax = !xRow->wasNull(); if (sDataType.equalsIgnoreAsciiCase("year")) - nColumnSize = sColumnType.copy(6, 1).toInt32(); // 'year(' length is 5 + nColumnSize = o3tl::toInt32(sColumnType.subView(6, 1)); // 'year(' length is 5 else if (sDataType.equalsIgnoreAsciiCase("date")) nColumnSize = 10; else if (sDataType.equalsIgnoreAsciiCase("time")) @@ -789,34 +767,34 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getColumns(const Any& /*catalo nColumnSize = xRow->getShort(7); // numeric precision else nColumnSize = nCharMaxLen; - aRow.push_back(makeAny(nColumnSize)); - aRow.push_back(Any()); // buffer length - unused + aRow.emplace_back(nColumnSize); + aRow.emplace_back(); // buffer length - unused // decimal digits (scale) - aRow.push_back(makeAny(xRow->getShort(8))); + aRow.emplace_back(xRow->getShort(8)); // num_prec_radix - aRow.push_back(makeAny(sal_Int32(10))); + aRow.emplace_back(sal_Int32(10)); // nullable OUString sIsNullable = xRow->getString(13); if (xRow->wasNull()) - aRow.push_back(makeAny(ColumnValue::NULLABLE_UNKNOWN)); + aRow.emplace_back(ColumnValue::NULLABLE_UNKNOWN); else if (sIsNullable.equalsIgnoreAsciiCase("YES")) - aRow.push_back(makeAny(ColumnValue::NULLABLE)); + aRow.emplace_back(ColumnValue::NULLABLE); else - aRow.push_back(makeAny(ColumnValue::NO_NULLS)); + aRow.emplace_back(ColumnValue::NO_NULLS); // remarks - aRow.push_back(makeAny(xRow->getString(9))); + aRow.emplace_back(xRow->getString(9)); // default - aRow.push_back(makeAny(xRow->getString(10))); + aRow.emplace_back(xRow->getString(10)); - aRow.push_back(Any{}); // sql_data_type - unused - aRow.push_back(Any{}); // sql_datetime_sub - unused + aRow.emplace_back(); // sql_data_type - unused + aRow.emplace_back(); // sql_datetime_sub - unused // character octet length - aRow.push_back(makeAny(xRow->getString(11))); + aRow.emplace_back(xRow->getString(11)); // ordinal position - aRow.push_back(makeAny(xRow->getString(12))); + aRow.emplace_back(xRow->getString(12)); // is nullable - aRow.push_back(makeAny(sIsNullable)); + aRow.emplace_back(sIsNullable); aRows.push_back(aRow); } lcl_setRows_throw(xResultSet, 1, aRows); @@ -832,25 +810,20 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTables(const Any& /*catalog "SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA AS TABLE_SCHEM, TABLE_NAME," "IF(STRCMP(TABLE_TYPE,'BASE TABLE'), TABLE_TYPE, 'TABLE') AS TABLE_TYPE, TABLE_COMMENT AS " "REMARKS " - "FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE '?' AND TABLE_NAME LIKE '?' " + "FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema', 'mysql', " + "'performance_schema') AND TABLE_SCHEMA LIKE '?' AND TABLE_NAME LIKE '?' " }; if (types.getLength() == 1) { - buffer.append("AND TABLE_TYPE LIKE '"); - buffer.append(types[0]); - buffer.append("'"); + buffer.append("AND TABLE_TYPE LIKE '" + types[0] + "'"); } else if (types.getLength() > 1) { - buffer.append("AND (TABLE_TYPE LIKE '"); - buffer.append(types[0]); - buffer.append("'"); + buffer.append("AND (TABLE_TYPE LIKE '" + types[0] + "'"); for (sal_Int32 i = 1; i < types.getLength(); ++i) { - buffer.append(" OR TABLE_TYPE LIKE '"); - buffer.append(types[i]); - buffer.append("'"); + buffer.append(" OR TABLE_TYPE LIKE '" + types[i] + "'"); } buffer.append(")"); } @@ -881,9 +854,10 @@ Reference<XResultSet> const OUString& /*schemaPattern*/, const OUString& /*procedureNamePattern*/) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; // TODO IMPL SAL_WARN("connectivity.mysqlc", "method not implemented"); @@ -895,9 +869,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getVersionColumns(const Any& / const OUString& /* schema */, const OUString& /* table */) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; lcl_setRows_throw(xResultSet, 16, rRows); return xResultSet; @@ -907,9 +882,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getExportedKeys(const Any& /*c const OUString& /*schema */, const OUString& /*table */) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; // TODO implement SAL_WARN("connectivity.mysqlc", "method not implemented"); @@ -921,11 +897,12 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getImportedKeys(const Any& /*c const OUString& schema, const OUString& table) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); - OUString query("SELECT refi.CONSTRAINT_CATALOG," // 1: foreign catalog + OUString query(u"SELECT refi.CONSTRAINT_CATALOG," // 1: foreign catalog " k.COLUMN_NAME," // 2: foreign column name " refi.UNIQUE_CONSTRAINT_CATALOG," // 3: primary catalog FIXME " k.REFERENCED_TABLE_SCHEMA," // 4: primary schema @@ -940,7 +917,7 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getImportedKeys(const Any& /*c "refi.CONSTRAINT_NAME " " and k.TABLE_NAME = refi.TABLE_NAME " " WHERE k.REFERENCED_TABLE_SCHEMA LIKE " - "'?' AND refi.TABLE_NAME='?'"); + "'?' AND refi.TABLE_NAME='?'"_ustr); query = query.replaceFirst("?", schema); // TODO what if schema is NULL? query = query.replaceFirst("?", table); @@ -954,34 +931,34 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getImportedKeys(const Any& /*c std::vector<Any> aRow{ Any() }; // 0. element is unused // primary key catalog - aRow.push_back(makeAny(xRow->getString(3))); + aRow.push_back(Any(xRow->getString(3))); // primary key schema - aRow.push_back(makeAny(xRow->getString(4))); + aRow.push_back(Any(xRow->getString(4))); // primary key table - aRow.push_back(makeAny(xRow->getString(5))); + aRow.push_back(Any(xRow->getString(5))); // primary column name - aRow.push_back(makeAny(xRow->getString(6))); + aRow.push_back(Any(xRow->getString(6))); // fk table catalog - aRow.push_back(makeAny(xRow->getString(1))); + aRow.push_back(Any(xRow->getString(1))); // fk schema - aRow.push_back(makeAny(xRow->getString(11))); + aRow.push_back(Any(xRow->getString(11))); // fk table - aRow.push_back(makeAny(xRow->getString(10))); + aRow.push_back(Any(xRow->getString(10))); // fk column name - aRow.push_back(makeAny(xRow->getString(2))); + aRow.push_back(Any(xRow->getString(2))); // KEY_SEQ - aRow.push_back(makeAny(sal_Int32{ 0 })); // TODO + aRow.push_back(Any(sal_Int32{ 0 })); // TODO // update rule - aRow.push_back(makeAny(xRow->getShort(7))); + aRow.push_back(Any(xRow->getShort(7))); // delete rule - aRow.push_back(makeAny(xRow->getShort(8))); + aRow.push_back(Any(xRow->getShort(8))); // foreign key name - aRow.push_back(makeAny(xRow->getString(9))); + aRow.push_back(Any(xRow->getString(9))); // primary key name - aRow.push_back(makeAny(OUString{})); // TODO + aRow.push_back(Any(OUString{})); // TODO // deferrability - aRow.push_back(makeAny(Deferrability::NONE)); + aRow.push_back(Any(Deferrability::NONE)); aRows.push_back(aRow); } lcl_setRows_throw(xResultSet, 1, aRows); @@ -992,12 +969,12 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getPrimaryKeys(const Any& /*ca const OUString& schema, const OUString& table) { - OUString query("SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA " + OUString query(u"SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA " "AS TABLE_SCHEM, TABLE_NAME, " "COLUMN_NAME, SEQ_IN_INDEX AS KEY_SEQ," "INDEX_NAME AS PK_NAME FROM INFORMATION_SCHEMA.STATISTICS " "WHERE TABLE_SCHEMA LIKE '?' AND TABLE_NAME LIKE '?' AND INDEX_NAME='PRIMARY' " - "ORDER BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX"); + "ORDER BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX"_ustr); // TODO use prepared stmt instead // TODO escape schema, table name ? @@ -1015,9 +992,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getIndexInfo(const Any& /*cata sal_Bool /*unique*/, sal_Bool /*approximate*/) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; // TODO SAL_WARN("connectivity.mysqlc", "method not implemented"); @@ -1031,9 +1009,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getBestRowIdentifier(const Any sal_Int32 /*scope*/, sal_Bool /*nullable*/) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; // TODO SAL_WARN("connectivity.mysqlc", "method not implemented"); @@ -1042,11 +1021,23 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getBestRowIdentifier(const Any } Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTablePrivileges( - const Any& /*catalog*/, const OUString& /*schemaPattern*/, const OUString& /*tableNamePattern*/) + const Any& /* catalog */, const OUString& schemaPattern, const OUString& tableNamePattern) { - // TODO - SAL_WARN("connectivity.mysqlc", "method not implemented"); - throw SQLException("getTablePrivileges method not implemented", *this, "IM001", 0, Any()); + OUString query(u"SELECT TABLE_SCHEMA TABLE_CAT, " + "NULL TABLE_SCHEM, " + "TABLE_NAME, " + "NULL GRANTOR," + "GRANTEE, " + "PRIVILEGE_TYPE PRIVILEGE, " + "IS_GRANTABLE " + "FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES " + "WHERE TABLE_SCHEMA LIKE '?' " + "AND TABLE_NAME='?'"_ustr); + query = query.replaceFirst("?", schemaPattern); + query = query.replaceFirst("?", tableNamePattern); + Reference<XStatement> statement = m_rConnection.createStatement(); + Reference<XResultSet> rs = statement->executeQuery(query); + return rs; } Reference<XResultSet> SAL_CALL ODatabaseMetaData::getCrossReference( @@ -1054,9 +1045,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getCrossReference( const OUString& /*primaryTable_*/, const Any& /*foreignCatalog*/, const OUString& /*foreignSchema*/, const OUString& /*foreignTable*/) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; // TODO SAL_WARN("connectivity.mysqlc", "method not implemented"); |