bump product version to 7.2.5.1
[LibreOffice.git] / connectivity / source / drivers / mysqlc / mysqlc_databasemetadata.cxx
blob77e20700b135f776024d1382077c4b2b0f4d9ef6
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
19 #include "mysqlc_databasemetadata.hxx"
20 #include <com/sun/star/sdbc/ResultSetType.hpp>
21 #include <com/sun/star/sdbc/TransactionIsolation.hpp>
22 #include <com/sun/star/sdbc/Deferrability.hpp>
23 #include <com/sun/star/lang/XInitialization.hpp>
24 #include <comphelper/sequence.hxx>
26 #include <sal/log.hxx>
27 #include <rtl/ustrbuf.hxx>
28 #include "mysqlc_general.hxx"
29 #include "mysqlc_driver.hxx"
30 #include "mysqlc_preparedstatement.hxx"
32 using namespace connectivity::mysqlc;
33 using namespace com::sun::star::uno;
34 using namespace com::sun::star::lang;
35 using namespace com::sun::star::beans;
36 using namespace com::sun::star::sdbc;
38 static std::string wild("%");
40 static void lcl_setRows_throw(const Reference<XResultSet>& _xResultSet, sal_Int32 _nType,
41 const std::vector<std::vector<Any>>& _rRows)
43 Reference<XInitialization> xIni(_xResultSet, UNO_QUERY);
44 Sequence<Any> aArgs(2);
45 aArgs[0] <<= _nType;
47 Sequence<Sequence<Any>> aRows(_rRows.size());
49 Sequence<Any>* pRowsIter = aRows.getArray();
50 for (const auto& rRow : _rRows)
52 if (!rRow.empty())
54 (*pRowsIter) = comphelper::containerToSequence(rRow);
56 ++pRowsIter;
58 aArgs[1] <<= aRows;
59 xIni->initialize(aArgs);
62 ODatabaseMetaData::ODatabaseMetaData(OConnection& _rCon, MYSQL* pMySql)
63 : m_rConnection(_rCon)
64 , m_pMySql(pMySql)
68 ODatabaseMetaData::~ODatabaseMetaData() {}
70 OUString SAL_CALL ODatabaseMetaData::getCatalogSeparator() { return OUString(); }
72 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxBinaryLiteralLength() { return 16777208L; }
74 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxRowSize()
76 return 2147483647L - 8; // Max buffer size - HEADER
79 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxCatalogNameLength() { return 32; }
81 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxCharLiteralLength() { return 16777208; }
83 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnNameLength() { return 64; }
85 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInIndex() { return 16; }
87 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxCursorNameLength() { return 64; }
89 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxConnections()
91 SAL_WARN("connectivity.mysqlc", "method not implemented");
92 // TODO
93 // SELECT @@max_connections
94 return 100;
97 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInTable() { return 512; }
99 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxStatementLength()
101 SAL_WARN("connectivity.mysqlc", "method not implemented");
102 // TODO
103 // "SHOW VARIABLES LIKE 'max_allowed_packet'"
104 return 32767;
107 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxTableNameLength() { return 64; }
109 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxTablesInSelect() { return 256; }
111 sal_Bool SAL_CALL ODatabaseMetaData::doesMaxRowSizeIncludeBlobs() { return true; }
113 sal_Bool SAL_CALL ODatabaseMetaData::storesLowerCaseQuotedIdentifiers()
115 SAL_WARN("connectivity.mysqlc", "method not implemented");
116 // TODO
117 return false;
120 sal_Bool SAL_CALL ODatabaseMetaData::storesLowerCaseIdentifiers()
122 SAL_WARN("connectivity.mysqlc", "method not implemented");
123 //TODO;
124 return false;
127 sal_Bool SAL_CALL ODatabaseMetaData::storesMixedCaseQuotedIdentifiers()
129 SAL_WARN("connectivity.mysqlc", "method not implemented");
130 // TODO
131 return false;
134 sal_Bool SAL_CALL ODatabaseMetaData::storesMixedCaseIdentifiers()
136 // TODO
137 SAL_WARN("connectivity.mysqlc", "method not implemented");
138 return false;
141 sal_Bool SAL_CALL ODatabaseMetaData::storesUpperCaseQuotedIdentifiers()
143 // TODO
144 SAL_WARN("connectivity.mysqlc", "method not implemented");
145 return false;
148 sal_Bool SAL_CALL ODatabaseMetaData::storesUpperCaseIdentifiers()
150 // TODO
151 SAL_WARN("connectivity.mysqlc", "method not implemented");
152 return false;
155 sal_Bool SAL_CALL ODatabaseMetaData::supportsAlterTableWithAddColumn() { return true; }
157 sal_Bool SAL_CALL ODatabaseMetaData::supportsAlterTableWithDropColumn() { return true; }
159 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxIndexLength() { return 256; }
161 sal_Bool SAL_CALL ODatabaseMetaData::supportsNonNullableColumns() { return true; }
163 OUString SAL_CALL ODatabaseMetaData::getCatalogTerm() { return "n/a"; }
165 OUString SAL_CALL ODatabaseMetaData::getIdentifierQuoteString() { return "\""; }
167 OUString SAL_CALL ODatabaseMetaData::getExtraNameCharacters() { return "#@"; }
169 sal_Bool SAL_CALL ODatabaseMetaData::supportsDifferentTableCorrelationNames() { return true; }
171 sal_Bool SAL_CALL ODatabaseMetaData::isCatalogAtStart() { return true; }
173 sal_Bool SAL_CALL ODatabaseMetaData::dataDefinitionIgnoredInTransactions() { return false; }
175 sal_Bool SAL_CALL ODatabaseMetaData::dataDefinitionCausesTransactionCommit() { return true; }
177 sal_Bool SAL_CALL ODatabaseMetaData::supportsDataManipulationTransactionsOnly() { return false; }
179 sal_Bool SAL_CALL ODatabaseMetaData::supportsDataDefinitionAndDataManipulationTransactions()
181 return false;
184 sal_Bool SAL_CALL ODatabaseMetaData::supportsPositionedDelete() { return false; }
186 sal_Bool SAL_CALL ODatabaseMetaData::supportsPositionedUpdate() { return false; }
188 sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenStatementsAcrossRollback() { return false; }
190 sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenStatementsAcrossCommit() { return false; }
192 sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenCursorsAcrossCommit() { return false; }
194 sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenCursorsAcrossRollback() { return false; }
196 sal_Bool SAL_CALL ODatabaseMetaData::supportsTransactionIsolationLevel(sal_Int32 /*level*/)
198 return true;
201 sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInDataManipulation() { return true; }
203 sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92FullSQL() { return false; }
205 sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92EntryLevelSQL() { return true; }
207 sal_Bool SAL_CALL ODatabaseMetaData::supportsIntegrityEnhancementFacility() { return false; }
209 sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInIndexDefinitions() { return true; }
211 sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInTableDefinitions() { return true; }
213 sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInTableDefinitions() { return false; }
215 sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInIndexDefinitions() { return false; }
217 sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInDataManipulation() { return false; }
219 sal_Bool SAL_CALL ODatabaseMetaData::supportsOuterJoins() { return true; }
221 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxStatements() { return 0; }
223 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxProcedureNameLength() { return 64; }
225 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxSchemaNameLength() { return 64; }
227 sal_Bool SAL_CALL ODatabaseMetaData::supportsTransactions() { return true; }
229 sal_Bool SAL_CALL ODatabaseMetaData::allProceduresAreCallable() { return false; }
231 sal_Bool SAL_CALL ODatabaseMetaData::supportsStoredProcedures()
233 return m_rConnection.getMysqlVersion() >= 50000;
236 sal_Bool SAL_CALL ODatabaseMetaData::supportsSelectForUpdate()
238 return m_rConnection.getMysqlVersion() >= 40000;
241 sal_Bool SAL_CALL ODatabaseMetaData::allTablesAreSelectable() { return false; }
243 sal_Bool SAL_CALL ODatabaseMetaData::isReadOnly() { return false; }
245 sal_Bool SAL_CALL ODatabaseMetaData::usesLocalFiles() { return false; }
247 sal_Bool SAL_CALL ODatabaseMetaData::usesLocalFilePerTable() { return false; }
249 sal_Bool SAL_CALL ODatabaseMetaData::supportsTypeConversion() { return true; }
251 sal_Bool SAL_CALL ODatabaseMetaData::nullPlusNonNullIsNull() { return true; }
253 sal_Bool SAL_CALL ODatabaseMetaData::supportsColumnAliasing() { return true; }
255 sal_Bool SAL_CALL ODatabaseMetaData::supportsTableCorrelationNames() { return true; }
257 sal_Bool SAL_CALL ODatabaseMetaData::supportsConvert(sal_Int32 /*fromType*/, sal_Int32 /*toType*/)
259 // TODO
260 SAL_WARN("connectivity.mysqlc", "method not implemented");
261 return false;
264 sal_Bool SAL_CALL ODatabaseMetaData::supportsExpressionsInOrderBy() { return true; }
266 sal_Bool SAL_CALL ODatabaseMetaData::supportsGroupBy() { return true; }
268 sal_Bool SAL_CALL ODatabaseMetaData::supportsGroupByBeyondSelect() { return true; }
270 sal_Bool SAL_CALL ODatabaseMetaData::supportsGroupByUnrelated() { return true; }
272 sal_Bool SAL_CALL ODatabaseMetaData::supportsMultipleTransactions() { return true; }
274 sal_Bool SAL_CALL ODatabaseMetaData::supportsMultipleResultSets() { return true; }
276 sal_Bool SAL_CALL ODatabaseMetaData::supportsLikeEscapeClause() { return true; }
278 sal_Bool SAL_CALL ODatabaseMetaData::supportsOrderByUnrelated() { return true; }
280 sal_Bool SAL_CALL ODatabaseMetaData::supportsUnion()
282 return m_rConnection.getMysqlVersion() >= 40000;
285 sal_Bool SAL_CALL ODatabaseMetaData::supportsUnionAll()
287 return m_rConnection.getMysqlVersion() >= 40000;
290 sal_Bool SAL_CALL ODatabaseMetaData::supportsMixedCaseIdentifiers() { return false; }
292 sal_Bool SAL_CALL ODatabaseMetaData::supportsMixedCaseQuotedIdentifiers() { return false; }
294 sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedAtEnd() { return false; }
296 sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedAtStart()
298 return m_rConnection.getMysqlVersion() > 40001 && m_rConnection.getMysqlVersion() < 40011;
301 sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedHigh() { return false; }
303 sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedLow() { return !nullsAreSortedHigh(); }
305 sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInProcedureCalls()
307 return m_rConnection.getMysqlVersion() >= 32200;
310 sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInPrivilegeDefinitions()
312 return m_rConnection.getMysqlVersion() >= 32200;
315 sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInProcedureCalls() { return false; }
317 sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInPrivilegeDefinitions() { return false; }
319 sal_Bool SAL_CALL ODatabaseMetaData::supportsCorrelatedSubqueries()
321 return m_rConnection.getMysqlVersion() >= 40100;
324 sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInComparisons()
326 return m_rConnection.getMysqlVersion() >= 40100;
329 sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInExists()
331 return m_rConnection.getMysqlVersion() >= 40100;
334 sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInIns()
336 return m_rConnection.getMysqlVersion() >= 40100;
339 sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInQuantifieds()
341 return m_rConnection.getMysqlVersion() >= 40100;
344 sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92IntermediateSQL() { return false; }
346 OUString SAL_CALL ODatabaseMetaData::getURL()
348 return m_rConnection.getConnectionSettings().connectionURL;
351 OUString SAL_CALL ODatabaseMetaData::getUserName()
353 Reference<XStatement> statement = m_rConnection.createStatement();
354 Reference<XResultSet> rs = statement->executeQuery("select user()");
355 Reference<XRow> xRow(rs, UNO_QUERY_THROW);
356 (void)rs->next(); // the first and only result
357 // e.g. root@localhost
358 OUString userWithConnection = xRow->getString(1);
359 sal_Int32 nIndexOfAt = userWithConnection.indexOf("@");
360 if (nIndexOfAt > 0)
362 OUString user = userWithConnection.copy(0, nIndexOfAt);
363 return user;
365 return userWithConnection;
368 OUString SAL_CALL ODatabaseMetaData::getDriverName() { return "MySQL Connector/OO.org"; }
370 OUString SAL_CALL ODatabaseMetaData::getDriverVersion() { return "0.9.2"; }
372 OUString SAL_CALL ODatabaseMetaData::getDatabaseProductVersion()
374 return OStringToOUString(mysql_get_server_info(m_pMySql),
375 m_rConnection.getConnectionEncoding());
378 OUString SAL_CALL ODatabaseMetaData::getDatabaseProductName() { return "MySQL"; }
380 OUString SAL_CALL ODatabaseMetaData::getProcedureTerm() { return "procedure"; }
382 OUString SAL_CALL ODatabaseMetaData::getSchemaTerm() { return "database"; }
384 sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMajorVersion()
386 // TODO
387 SAL_WARN("connectivity.mysqlc", "method not implemented");
388 return MARIADBC_VERSION_MAJOR;
391 sal_Int32 SAL_CALL ODatabaseMetaData::getDefaultTransactionIsolation()
393 return TransactionIsolation::REPEATABLE_READ;
396 sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMinorVersion()
398 // TODO
399 SAL_WARN("connectivity.mysqlc", "method not implemented");
400 return MARIADBC_VERSION_MINOR;
403 OUString SAL_CALL ODatabaseMetaData::getSQLKeywords()
405 return "ACCESSIBLE, ADD, ALL,"
406 "ALTER, ANALYZE, AND, AS, ASC, ASENSITIVE, BEFORE,"
407 "BETWEEN, BIGINT, BINARY, BLOB, BOTH, BY, CALL,"
408 "CASCADE, CASE, CHANGE, CHAR, CHARACTER, CHECK,"
409 "COLLATE, COLUMN, CONDITION, CONNECTION, CONSTRAINT,"
410 "CONTINUE, CONVERT, CREATE, CROSS, CURRENT_DATE,"
411 "CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CURSOR,"
412 "DATABASE, DATABASES, DAY_HOUR, DAY_MICROSECOND,"
413 "DAY_MINUTE, DAY_SECOND, DEC, DECIMAL, DECLARE,"
414 "DEFAULT, DELAYED, DELETE, DESC, DESCRIBE,"
415 "DETERMINISTIC, DISTINCT, DISTINCTROW, DIV, DOUBLE,"
416 "DROP, DUAL, EACH, ELSE, ELSEIF, ENCLOSED,"
417 "ESCAPED, EXISTS, EXIT, EXPLAIN, FALSE, FETCH,"
418 "FLOAT, FLOAT4, FLOAT8, FOR, FORCE, FOREIGN, FROM,"
419 "FULLTEXT, GRANT, GROUP, HAVING, HIGH_PRIORITY,"
420 "HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IF,"
421 "IGNORE, IN, INDEX, INFILE, INNER, INOUT,"
422 "INSENSITIVE, INSERT, INT, INT1, INT2, INT3, INT4,"
423 "INT8, INTEGER, INTERVAL, INTO, IS, ITERATE, JOIN,"
424 "KEY, KEYS, KILL, LEADING, LEAVE, LEFT, LIKE,"
425 "LOCALTIMESTAMP, LOCK, LONG, LONGBLOB, LONGTEXT,"
426 "LOOP, LOW_PRIORITY, MATCH, MEDIUMBLOB, MEDIUMINT,"
427 "MEDIUMTEXT, MIDDLEINT, MINUTE_MICROSECOND,"
428 "MINUTE_SECOND, MOD, MODIFIES, NATURAL, NOT,"
429 "NO_WRITE_TO_BINLOG, NULL, NUMERIC, ON, OPTIMIZE,"
430 "OPTION, OPTIONALLY, OR, ORDER, OUT, OUTER,"
431 "OUTFILE, PRECISION, PRIMARY, PROCEDURE, PURGE,"
432 "RANGE, READ, READS, READ_ONLY, READ_WRITE, REAL,"
433 "REFERENCES, REGEXP, RELEASE, RENAME, REPEAT,"
434 "REPLACE, REQUIRE, RESTRICT, RETURN, REVOKE, RIGHT,"
435 "RLIKE, SCHEMA, SCHEMAS, SECOND_MICROSECOND, SELECT,"
436 "SENSITIVE, SEPARATOR, SET, SHOW, SMALLINT, SPATIAL,"
437 "SPECIFIC, SQL, SQLEXCEPTION, SQLSTATE, SQLWARNING,"
438 "SQL_BIG_RESULT, SQL_CALC_FOUND_ROWS, SQL_SMALL_RESULT,"
439 "SSL, STARTING, STRAIGHT_JOIN, TABLE, TERMINATED,"
440 "THEN, TINYBLOB, TINYINT, TINYTEXT, TO, TRAILING,"
441 "TRIGGER, TRUE, UNDO, UNION, UNIQUE, UNLOCK,"
442 "UNSIGNED, UPDATE, USAGE, USE, USING, UTC_DATE,"
443 "UTC_TIME, UTC_TIMESTAMP, VALUES, VARBINARY, VARCHAR,"
444 "VARCHARACTER, VARYING, WHEN, WHERE, WHILE, WITH,"
445 "WRITE, X509, XOR, YEAR_MONTH, ZEROFILL"
446 "GENERAL, IGNORE_SERVER_IDS, MASTER_HEARTBEAT_PERIOD,"
447 "MAXVALUE, RESIGNAL, SIGNAL, SLOW";
450 OUString SAL_CALL ODatabaseMetaData::getSearchStringEscape() { return "\\"; }
452 OUString SAL_CALL ODatabaseMetaData::getStringFunctions()
454 return "ASCII,BIN,BIT_LENGTH,CHAR,CHARACTER_LENGTH,CHAR_LENGTH,CONCAT,"
455 "CONCAT_WS,CONV,ELT,EXPORT_SET,FIELD,FIND_IN_SET,HEX,INSERT,"
456 "INSTR,LCASE,LEFT,LENGTH,LOAD_FILE,LOCATE,LOCATE,LOWER,LPAD,"
457 "LTRIM,MAKE_SET,MATCH,MID,OCT,OCTET_LENGTH,ORD,POSITION,"
458 "QUOTE,REPEAT,REPLACE,REVERSE,RIGHT,RPAD,RTRIM,SOUNDEX,"
459 "SPACE,STRCMP,SUBSTRING,SUBSTRING,SUBSTRING,SUBSTRING,"
460 "SUBSTRING_INDEX,TRIM,UCASE,UPPER";
463 OUString SAL_CALL ODatabaseMetaData::getTimeDateFunctions()
465 return "DAYOFWEEK,WEEKDAY,DAYOFMONTH,DAYOFYEAR,MONTH,DAYNAME,"
466 "MONTHNAME,QUARTER,WEEK,YEAR,HOUR,MINUTE,SECOND,PERIOD_ADD,"
467 "PERIOD_DIFF,TO_DAYS,FROM_DAYS,DATE_FORMAT,TIME_FORMAT,"
468 "CURDATE,CURRENT_DATE,CURTIME,CURRENT_TIME,NOW,SYSDATE,"
469 "CURRENT_TIMESTAMP,UNIX_TIMESTAMP,FROM_UNIXTIME,"
470 "SEC_TO_TIME,TIME_TO_SEC";
473 OUString SAL_CALL ODatabaseMetaData::getSystemFunctions()
475 return "DATABASE,USER,SYSTEM_USER,"
476 "SESSION_USER,PASSWORD,ENCRYPT,LAST_INSERT_ID,VERSION";
479 OUString SAL_CALL ODatabaseMetaData::getNumericFunctions()
481 return "ABS,ACOS,ASIN,ATAN,ATAN2,BIT_COUNT,CEILING,COS,"
482 "COT,DEGREES,EXP,FLOOR,LOG,LOG10,MAX,MIN,MOD,PI,POW,"
483 "POWER,RADIANS,RAND,ROUND,SIN,SQRT,TAN,TRUNCATE";
486 sal_Bool SAL_CALL ODatabaseMetaData::supportsExtendedSQLGrammar() { return false; }
488 sal_Bool SAL_CALL ODatabaseMetaData::supportsCoreSQLGrammar() { return true; }
490 sal_Bool SAL_CALL ODatabaseMetaData::supportsMinimumSQLGrammar() { return true; }
492 sal_Bool SAL_CALL ODatabaseMetaData::supportsFullOuterJoins() { return false; }
494 sal_Bool SAL_CALL ODatabaseMetaData::supportsLimitedOuterJoins() { return true; }
496 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInGroupBy() { return 64; }
498 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInOrderBy() { return 64; }
500 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInSelect() { return 256; }
502 sal_Int32 SAL_CALL ODatabaseMetaData::getMaxUserNameLength() { return 16; }
504 sal_Bool SAL_CALL ODatabaseMetaData::supportsResultSetType(sal_Int32 setType)
506 return setType == ResultSetType::SCROLL_SENSITIVE;
509 sal_Bool SAL_CALL ODatabaseMetaData::supportsResultSetConcurrency(sal_Int32 /*setType*/,
510 sal_Int32 /*concurrency*/)
512 return false;
515 sal_Bool SAL_CALL ODatabaseMetaData::ownUpdatesAreVisible(sal_Int32 /*setType*/) { return false; }
517 sal_Bool SAL_CALL ODatabaseMetaData::ownDeletesAreVisible(sal_Int32 /*setType*/) { return false; }
519 sal_Bool SAL_CALL ODatabaseMetaData::ownInsertsAreVisible(sal_Int32 /*setType*/) { return false; }
521 sal_Bool SAL_CALL ODatabaseMetaData::othersUpdatesAreVisible(sal_Int32 /*setType*/)
523 return false;
526 sal_Bool SAL_CALL ODatabaseMetaData::othersDeletesAreVisible(sal_Int32 /*setType*/)
528 return false;
531 sal_Bool SAL_CALL ODatabaseMetaData::othersInsertsAreVisible(sal_Int32 /*setType*/)
533 return false;
536 sal_Bool SAL_CALL ODatabaseMetaData::updatesAreDetected(sal_Int32 /*setType*/) { return false; }
538 sal_Bool SAL_CALL ODatabaseMetaData::deletesAreDetected(sal_Int32 /*setType*/) { return false; }
540 sal_Bool SAL_CALL ODatabaseMetaData::insertsAreDetected(sal_Int32 /*setType*/) { return false; }
542 sal_Bool SAL_CALL ODatabaseMetaData::supportsBatchUpdates() { return false; }
544 Reference<XConnection> SAL_CALL ODatabaseMetaData::getConnection() { return &m_rConnection; }
547 Here follow all methods which return(a resultset
548 the first methods is an example implementation how to use this resultset
549 of course you could implement it on your and you should do this because
550 the general way is more memory expensive
553 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTableTypes()
555 const char* const table_types[] = { "TABLE", "VIEW" };
556 sal_Int32 const requiredVersion[] = { 0, 50000 };
558 Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
559 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
560 UNO_QUERY);
561 std::vector<std::vector<Any>> rRows;
562 rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding();
564 for (sal_uInt32 i = 0; i < 2; i++)
566 if (m_rConnection.getMysqlVersion() >= requiredVersion[i])
568 std::vector<Any> aRow{ Any() };
569 aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(table_types[i], encoding)));
570 rRows.push_back(aRow);
573 lcl_setRows_throw(xResultSet, 5, rRows);
574 return xResultSet;
577 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTypeInfo()
579 Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
580 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
581 UNO_QUERY);
583 std::vector<std::vector<Any>> rRows;
585 rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding();
586 unsigned int i = 0;
587 while (mysqlc_types[i].typeName)
589 std::vector<Any> aRow{ Any() };
591 aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].typeName, encoding)));
592 aRow.push_back(makeAny(mysqlc_types[i].dataType));
593 aRow.push_back(makeAny(mysqlc_types[i].precision));
594 aRow.push_back(
595 makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].literalPrefix, encoding)));
596 aRow.push_back(
597 makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].literalSuffix, encoding)));
598 aRow.push_back(
599 makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].createParams, encoding)));
600 aRow.push_back(makeAny(mysqlc_types[i].nullable));
601 aRow.push_back(makeAny(mysqlc_types[i].caseSensitive));
602 aRow.push_back(makeAny(mysqlc_types[i].searchable));
603 aRow.push_back(makeAny(mysqlc_types[i].isUnsigned));
604 aRow.push_back(makeAny(mysqlc_types[i].fixedPrecScale));
605 aRow.push_back(makeAny(mysqlc_types[i].autoIncrement));
606 aRow.push_back(
607 makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].localTypeName, encoding)));
608 aRow.push_back(makeAny(mysqlc_types[i].minScale));
609 aRow.push_back(makeAny(mysqlc_types[i].maxScale));
610 aRow.push_back(makeAny(sal_Int32(0)));
611 aRow.push_back(makeAny(sal_Int32(0)));
612 aRow.push_back(makeAny(sal_Int32(10)));
614 rRows.push_back(aRow);
615 i++;
618 lcl_setRows_throw(xResultSet, 14, rRows);
619 return xResultSet;
622 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getCatalogs()
624 Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
625 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
626 UNO_QUERY);
627 return xResultSet;
630 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getSchemas()
632 Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
633 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
634 UNO_QUERY);
635 std::vector<std::vector<Any>> rRows;
637 OUString sSql
638 = m_rConnection.getMysqlVersion() > 49999
639 ? OUString{ "SELECT SCHEMA_NAME AS TABLE_SCHEM, CATALOG_NAME AS TABLE_CATALOG "
640 "FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY SCHEMA_NAME" }
641 : OUString{ "SHOW DATABASES" };
643 Reference<XStatement> statement = m_rConnection.createStatement();
644 Reference<XInterface> executed = statement->executeQuery(sSql);
645 Reference<XResultSet> rs(executed, UNO_QUERY_THROW);
646 Reference<XResultSetMetaDataSupplier> supp(executed, UNO_QUERY_THROW);
647 Reference<XResultSetMetaData> rs_meta = supp->getMetaData();
649 Reference<XRow> xRow(rs, UNO_QUERY_THROW);
650 sal_uInt32 columns = rs_meta->getColumnCount();
651 while (rs->next())
653 std::vector<Any> aRow{ Any() };
654 bool informationSchema = false;
655 for (sal_uInt32 i = 1; i <= columns; i++)
657 OUString columnStringValue = xRow->getString(i);
658 if (i == 1)
659 { // TABLE_SCHEM
660 informationSchema = columnStringValue.equalsIgnoreAsciiCase("information_schema");
662 aRow.push_back(makeAny(columnStringValue));
664 if (!informationSchema)
666 rRows.push_back(aRow);
670 lcl_setRows_throw(xResultSet, 1, rRows);
671 return xResultSet;
674 Reference<XResultSet>
675 SAL_CALL ODatabaseMetaData::getColumnPrivileges(const Any& /*catalog*/, const OUString& schema,
676 const OUString& table,
677 const OUString& columnNamePattern)
679 OUString query("SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA AS "
680 "TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, NULL AS GRANTOR, "
681 "GRANTEE, PRIVILEGE_TYPE AS PRIVILEGE, IS_GRANTABLE FROM "
682 "INFORMATION_SCHEMA.COLUMN_PRIVILEGES WHERE TABLE_SCHEMA LIKE "
683 "'?' AND TABLE_NAME='?' AND COLUMN_NAME LIKE '?' ORDER BY "
684 "COLUMN_NAME, PRIVILEGE_TYPE");
686 query = query.replaceFirst("?", schema);
687 query = query.replaceFirst("?", table);
688 query = query.replaceFirst("?", columnNamePattern);
690 Reference<XStatement> statement = m_rConnection.createStatement();
691 Reference<XResultSet> rs = statement->executeQuery(query);
692 return rs;
695 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getColumns(const Any& /*catalog*/,
696 const OUString& schemaPattern,
697 const OUString& tableNamePattern,
698 const OUString& columnNamePattern)
700 OUStringBuffer queryBuf("SELECT TABLE_CATALOG, " // 1
701 "TABLE_SCHEMA, " // 2
702 "TABLE_NAME, " // 3
703 "COLUMN_NAME, " // 4
704 "DATA_TYPE, " // 5
705 // TYPE_NAME missing
706 "CHARACTER_MAXIMUM_LENGTH, " // 6
707 "NUMERIC_PRECISION, " // 7
708 // buffer length missing
709 "NUMERIC_SCALE AS DECIMAL_DIGITS, " // 8
710 // NUM_PREC_RADIX missing
711 // NULLABLE missing
712 "COLUMN_COMMENT AS REMARKS, " // 9
713 "COLUMN_DEFAULT AS COLUMN_DEF," // 10
714 "CHARACTER_OCTET_LENGTH, " // 11
715 "ORDINAL_POSITION, " // 12
716 "IS_NULLABLE, " // 13
717 "COLUMN_TYPE " // 14
718 "FROM INFORMATION_SCHEMA.COLUMNS "
719 "WHERE (1 = 1) ");
720 if (!tableNamePattern.isEmpty())
722 OUString sAppend;
723 if (tableNamePattern.match("%"))
724 sAppend = "AND TABLE_NAME LIKE '%' ";
725 else
726 sAppend = "AND TABLE_NAME = '%' ";
727 queryBuf.append(sAppend.replaceAll("%", tableNamePattern));
729 if (!schemaPattern.isEmpty())
731 OUString sAppend;
732 if (schemaPattern.match("%"))
733 sAppend = "AND TABLE_SCHEMA LIKE '%' ";
734 else
735 sAppend = "AND TABLE_SCHEMA = '%' ";
736 queryBuf.append(sAppend.replaceAll("%", schemaPattern));
738 if (!columnNamePattern.isEmpty())
740 OUString sAppend;
741 if (columnNamePattern.match("%"))
742 sAppend = "AND COLUMN_NAME LIKE '%' ";
743 else
744 sAppend = "AND COLUMN_NAME = '%' ";
745 queryBuf.append(sAppend.replaceAll("%", columnNamePattern));
748 OUString query = queryBuf.makeStringAndClear();
749 Reference<XStatement> statement = m_rConnection.createStatement();
750 Reference<XResultSet> rs = statement->executeQuery(query);
751 Reference<XRow> xRow(rs, UNO_QUERY_THROW);
753 Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
754 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
755 UNO_QUERY);
756 std::vector<std::vector<Any>> aRows;
757 while (rs->next())
759 std::vector<Any> aRow{ Any() }; // 0. element is unused
761 // catalog name
762 aRow.push_back(makeAny(xRow->getString(1)));
763 // schema name
764 aRow.push_back(makeAny(xRow->getString(2)));
765 // table name
766 aRow.push_back(makeAny(xRow->getString(3)));
767 // column name
768 aRow.push_back(makeAny(xRow->getString(4)));
769 // data type
770 OUString sDataType = xRow->getString(5);
771 aRow.push_back(makeAny(mysqlc_sdbc_driver::mysqlStrToOOOType(sDataType)));
772 // type name
773 aRow.push_back(makeAny(sDataType)); // TODO
774 // column size
775 sal_Int32 nColumnSize = 0;
776 OUString sColumnType = xRow->getString(14);
777 sal_Int32 nCharMaxLen = xRow->getShort(6);
778 bool bIsCharMax = !xRow->wasNull();
779 if (sDataType.equalsIgnoreAsciiCase("year"))
780 nColumnSize = sColumnType.copy(6, 1).toInt32(); // 'year(' length is 5
781 else if (sDataType.equalsIgnoreAsciiCase("date"))
782 nColumnSize = 10;
783 else if (sDataType.equalsIgnoreAsciiCase("time"))
784 nColumnSize = 8;
785 else if (sDataType.equalsIgnoreAsciiCase("datetime")
786 || sDataType.equalsIgnoreAsciiCase("timestamp"))
787 nColumnSize = 19;
788 else if (!bIsCharMax)
789 nColumnSize = xRow->getShort(7); // numeric precision
790 else
791 nColumnSize = nCharMaxLen;
792 aRow.push_back(makeAny(nColumnSize));
793 aRow.push_back(Any()); // buffer length - unused
794 // decimal digits (scale)
795 aRow.push_back(makeAny(xRow->getShort(8)));
796 // num_prec_radix
797 aRow.push_back(makeAny(sal_Int32(10)));
798 // nullable
799 OUString sIsNullable = xRow->getString(13);
800 if (xRow->wasNull())
801 aRow.push_back(makeAny(ColumnValue::NULLABLE_UNKNOWN));
802 else if (sIsNullable.equalsIgnoreAsciiCase("YES"))
803 aRow.push_back(makeAny(ColumnValue::NULLABLE));
804 else
805 aRow.push_back(makeAny(ColumnValue::NO_NULLS));
806 // remarks
807 aRow.push_back(makeAny(xRow->getString(9)));
808 // default
809 aRow.push_back(makeAny(xRow->getString(10)));
811 aRow.push_back(Any{}); // sql_data_type - unused
812 aRow.push_back(Any{}); // sql_datetime_sub - unused
814 // character octet length
815 aRow.push_back(makeAny(xRow->getString(11)));
816 // ordinal position
817 aRow.push_back(makeAny(xRow->getString(12)));
818 // is nullable
819 aRow.push_back(makeAny(sIsNullable));
820 aRows.push_back(aRow);
822 lcl_setRows_throw(xResultSet, 1, aRows);
823 return xResultSet;
826 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTables(const Any& /*catalog*/,
827 const OUString& schemaPattern,
828 const OUString& tableNamePattern,
829 const Sequence<OUString>& types)
831 OUStringBuffer buffer{
832 "SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA AS TABLE_SCHEM, TABLE_NAME,"
833 "IF(STRCMP(TABLE_TYPE,'BASE TABLE'), TABLE_TYPE, 'TABLE') AS TABLE_TYPE, TABLE_COMMENT AS "
834 "REMARKS "
835 "FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE '?' AND TABLE_NAME LIKE '?' "
838 if (types.getLength() == 1)
840 buffer.append("AND TABLE_TYPE LIKE '");
841 buffer.append(types[0]);
842 buffer.append("'");
844 else if (types.getLength() > 1)
846 buffer.append("AND (TABLE_TYPE LIKE '");
847 buffer.append(types[0]);
848 buffer.append("'");
849 for (sal_Int32 i = 1; i < types.getLength(); ++i)
851 buffer.append(" OR TABLE_TYPE LIKE '");
852 buffer.append(types[i]);
853 buffer.append("'");
855 buffer.append(")");
858 buffer.append(" ORDER BY TABLE_TYPE, TABLE_SCHEMA, TABLE_NAME");
859 OUString query = buffer.makeStringAndClear();
861 // TODO use prepared stmt instead
862 // TODO escape schema, table name ?
863 query = query.replaceFirst("?", schemaPattern);
864 query = query.replaceFirst("?", tableNamePattern);
866 Reference<XStatement> statement = m_rConnection.createStatement();
867 Reference<XResultSet> rs = statement->executeQuery(query);
868 return rs;
871 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getProcedureColumns(
872 const Any& /* catalog */, const OUString& /* schemaPattern */,
873 const OUString& /* procedureNamePattern */, const OUString& /* columnNamePattern */)
875 // Currently there is no information available
876 return nullptr;
879 Reference<XResultSet>
880 SAL_CALL ODatabaseMetaData::getProcedures(const Any& /*catalog*/,
881 const OUString& /*schemaPattern*/,
882 const OUString& /*procedureNamePattern*/)
884 Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
885 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
886 UNO_QUERY);
887 std::vector<std::vector<Any>> rRows;
888 // TODO IMPL
889 SAL_WARN("connectivity.mysqlc", "method not implemented");
890 lcl_setRows_throw(xResultSet, 7, rRows);
891 return xResultSet;
894 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getVersionColumns(const Any& /* catalog */,
895 const OUString& /* schema */,
896 const OUString& /* table */)
898 Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
899 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
900 UNO_QUERY);
901 std::vector<std::vector<Any>> rRows;
902 lcl_setRows_throw(xResultSet, 16, rRows);
903 return xResultSet;
906 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getExportedKeys(const Any& /*catalog */,
907 const OUString& /*schema */,
908 const OUString& /*table */)
910 Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
911 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
912 UNO_QUERY);
913 std::vector<std::vector<Any>> rRows;
914 // TODO implement
915 SAL_WARN("connectivity.mysqlc", "method not implemented");
916 lcl_setRows_throw(xResultSet, 8, rRows);
917 return xResultSet;
920 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getImportedKeys(const Any& /*catalog*/,
921 const OUString& schema,
922 const OUString& table)
924 Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
925 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
926 UNO_QUERY);
928 OUString query("SELECT refi.CONSTRAINT_CATALOG," // 1: foreign catalog
929 " k.COLUMN_NAME," // 2: foreign column name
930 " refi.UNIQUE_CONSTRAINT_CATALOG," // 3: primary catalog FIXME
931 " k.REFERENCED_TABLE_SCHEMA," // 4: primary schema
932 " refi.REFERENCED_TABLE_NAME," // 5: primary table name
933 " k.REFERENCED_COLUMN_NAME," // 6: primary column name
934 " refi.UPDATE_RULE, refi.DELETE_RULE," // 7,8: update, delete rule
935 " refi.CONSTRAINT_NAME, " // 9: name of constraint itself
936 " refi.TABLE_NAME, " // 10: foreign table name
937 " refi.CONSTRAINT_SCHEMA " // 11: foreign schema name FIXME
938 " FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as refi"
939 " INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE as k ON k.CONSTRAINT_NAME = "
940 "refi.CONSTRAINT_NAME "
941 " and k.TABLE_NAME = refi.TABLE_NAME "
942 " WHERE k.REFERENCED_TABLE_SCHEMA LIKE "
943 "'?' AND refi.TABLE_NAME='?'");
944 query = query.replaceFirst("?", schema); // TODO what if schema is NULL?
945 query = query.replaceFirst("?", table);
947 std::vector<std::vector<Any>> aRows;
948 Reference<XStatement> statement = m_rConnection.createStatement();
949 Reference<XResultSet> rs = statement->executeQuery(query);
950 Reference<XRow> xRow(rs, UNO_QUERY_THROW);
952 while (rs->next())
954 std::vector<Any> aRow{ Any() }; // 0. element is unused
956 // primary key catalog
957 aRow.push_back(makeAny(xRow->getString(3)));
958 // primary key schema
959 aRow.push_back(makeAny(xRow->getString(4)));
960 // primary key table
961 aRow.push_back(makeAny(xRow->getString(5)));
962 // primary column name
963 aRow.push_back(makeAny(xRow->getString(6)));
965 // fk table catalog
966 aRow.push_back(makeAny(xRow->getString(1)));
967 // fk schema
968 aRow.push_back(makeAny(xRow->getString(11)));
969 // fk table
970 aRow.push_back(makeAny(xRow->getString(10)));
971 // fk column name
972 aRow.push_back(makeAny(xRow->getString(2)));
973 // KEY_SEQ
974 aRow.push_back(makeAny(sal_Int32{ 0 })); // TODO
975 // update rule
976 aRow.push_back(makeAny(xRow->getShort(7)));
977 // delete rule
978 aRow.push_back(makeAny(xRow->getShort(8)));
979 // foreign key name
980 aRow.push_back(makeAny(xRow->getString(9)));
981 // primary key name
982 aRow.push_back(makeAny(OUString{})); // TODO
983 // deferrability
984 aRow.push_back(makeAny(Deferrability::NONE));
985 aRows.push_back(aRow);
987 lcl_setRows_throw(xResultSet, 1, aRows);
988 return xResultSet;
991 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getPrimaryKeys(const Any& /*catalog*/,
992 const OUString& schema,
993 const OUString& table)
995 OUString query("SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA "
996 "AS TABLE_SCHEM, TABLE_NAME, "
997 "COLUMN_NAME, SEQ_IN_INDEX AS KEY_SEQ,"
998 "INDEX_NAME AS PK_NAME FROM INFORMATION_SCHEMA.STATISTICS "
999 "WHERE TABLE_SCHEMA LIKE '?' AND TABLE_NAME LIKE '?' AND INDEX_NAME='PRIMARY' "
1000 "ORDER BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX");
1002 // TODO use prepared stmt instead
1003 // TODO escape schema, table name ?
1004 query = query.replaceFirst("?", schema);
1005 query = query.replaceFirst("?", table);
1007 Reference<XStatement> statement = m_rConnection.createStatement();
1008 Reference<XResultSet> rs = statement->executeQuery(query);
1009 return rs;
1012 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getIndexInfo(const Any& /*catalog*/,
1013 const OUString& /*schema*/,
1014 const OUString& /*table*/,
1015 sal_Bool /*unique*/,
1016 sal_Bool /*approximate*/)
1018 Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
1019 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
1020 UNO_QUERY);
1021 std::vector<std::vector<Any>> rRows;
1022 // TODO
1023 SAL_WARN("connectivity.mysqlc", "method not implemented");
1024 lcl_setRows_throw(xResultSet, 11, rRows);
1025 return xResultSet;
1028 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getBestRowIdentifier(const Any& /*catalog*/,
1029 const OUString& /*schema*/,
1030 const OUString& /*table*/,
1031 sal_Int32 /*scope*/,
1032 sal_Bool /*nullable*/)
1034 Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
1035 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
1036 UNO_QUERY);
1037 std::vector<std::vector<Any>> rRows;
1038 // TODO
1039 SAL_WARN("connectivity.mysqlc", "method not implemented");
1040 lcl_setRows_throw(xResultSet, 15, rRows);
1041 return xResultSet;
1044 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTablePrivileges(
1045 const Any& /*catalog*/, const OUString& /*schemaPattern*/, const OUString& /*tableNamePattern*/)
1047 // TODO
1048 SAL_WARN("connectivity.mysqlc", "method not implemented");
1049 throw SQLException("getTablePrivileges method not implemented", *this, "IM001", 0, Any());
1052 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getCrossReference(
1053 const Any& /*primaryCatalog*/, const OUString& /*primarySchema_*/,
1054 const OUString& /*primaryTable_*/, const Any& /*foreignCatalog*/,
1055 const OUString& /*foreignSchema*/, const OUString& /*foreignTable*/)
1057 Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
1058 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
1059 UNO_QUERY);
1060 std::vector<std::vector<Any>> rRows;
1061 // TODO
1062 SAL_WARN("connectivity.mysqlc", "method not implemented");
1063 lcl_setRows_throw(xResultSet, 13, rRows);
1064 return xResultSet;
1067 Reference<XResultSet> SAL_CALL ODatabaseMetaData::getUDTs(const Any& /* catalog */,
1068 const OUString& /* schemaPattern */,
1069 const OUString& /* typeNamePattern */,
1070 const Sequence<sal_Int32>& /* types */)
1072 mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getUDTs", *this);
1073 return nullptr;
1076 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */