1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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);
47 Sequence
<Sequence
<Any
>> aRows(_rRows
.size());
49 Sequence
<Any
>* pRowsIter
= aRows
.getArray();
50 for (const auto& rRow
: _rRows
)
54 (*pRowsIter
) = comphelper::containerToSequence(rRow
);
59 xIni
->initialize(aArgs
);
62 ODatabaseMetaData::ODatabaseMetaData(OConnection
& _rCon
, MYSQL
* pMySql
)
63 : m_rConnection(_rCon
)
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");
93 // SELECT @@max_connections
97 sal_Int32 SAL_CALL
ODatabaseMetaData::getMaxColumnsInTable() { return 512; }
99 sal_Int32 SAL_CALL
ODatabaseMetaData::getMaxStatementLength()
101 SAL_WARN("connectivity.mysqlc", "method not implemented");
103 // "SHOW VARIABLES LIKE 'max_allowed_packet'"
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");
120 sal_Bool SAL_CALL
ODatabaseMetaData::storesLowerCaseIdentifiers()
122 SAL_WARN("connectivity.mysqlc", "method not implemented");
127 sal_Bool SAL_CALL
ODatabaseMetaData::storesMixedCaseQuotedIdentifiers()
129 SAL_WARN("connectivity.mysqlc", "method not implemented");
134 sal_Bool SAL_CALL
ODatabaseMetaData::storesMixedCaseIdentifiers()
137 SAL_WARN("connectivity.mysqlc", "method not implemented");
141 sal_Bool SAL_CALL
ODatabaseMetaData::storesUpperCaseQuotedIdentifiers()
144 SAL_WARN("connectivity.mysqlc", "method not implemented");
148 sal_Bool SAL_CALL
ODatabaseMetaData::storesUpperCaseIdentifiers()
151 SAL_WARN("connectivity.mysqlc", "method not implemented");
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()
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*/)
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*/)
260 SAL_WARN("connectivity.mysqlc", "method not implemented");
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("@");
362 OUString user
= userWithConnection
.copy(0, nIndexOfAt
);
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()
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()
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*/)
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*/)
526 sal_Bool SAL_CALL
ODatabaseMetaData::othersDeletesAreVisible(sal_Int32
/*setType*/)
531 sal_Bool SAL_CALL
ODatabaseMetaData::othersInsertsAreVisible(sal_Int32
/*setType*/)
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"),
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
);
577 Reference
<XResultSet
> SAL_CALL
ODatabaseMetaData::getTypeInfo()
579 Reference
<XResultSet
> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
580 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
583 std::vector
<std::vector
<Any
>> rRows
;
585 rtl_TextEncoding encoding
= m_rConnection
.getConnectionEncoding();
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
));
595 makeAny(mysqlc_sdbc_driver::convert(mysqlc_types
[i
].literalPrefix
, encoding
)));
597 makeAny(mysqlc_sdbc_driver::convert(mysqlc_types
[i
].literalSuffix
, encoding
)));
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
));
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
);
618 lcl_setRows_throw(xResultSet
, 14, rRows
);
622 Reference
<XResultSet
> SAL_CALL
ODatabaseMetaData::getCatalogs()
624 Reference
<XResultSet
> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
625 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
630 Reference
<XResultSet
> SAL_CALL
ODatabaseMetaData::getSchemas()
632 Reference
<XResultSet
> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance(
633 "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),
635 std::vector
<std::vector
<Any
>> rRows
;
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();
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
);
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
);
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
);
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
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
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
718 "FROM INFORMATION_SCHEMA.COLUMNS "
720 if (!tableNamePattern
.isEmpty())
723 if (tableNamePattern
.match("%"))
724 sAppend
= "AND TABLE_NAME LIKE '%' ";
726 sAppend
= "AND TABLE_NAME = '%' ";
727 queryBuf
.append(sAppend
.replaceAll("%", tableNamePattern
));
729 if (!schemaPattern
.isEmpty())
732 if (schemaPattern
.match("%"))
733 sAppend
= "AND TABLE_SCHEMA LIKE '%' ";
735 sAppend
= "AND TABLE_SCHEMA = '%' ";
736 queryBuf
.append(sAppend
.replaceAll("%", schemaPattern
));
738 if (!columnNamePattern
.isEmpty())
741 if (columnNamePattern
.match("%"))
742 sAppend
= "AND COLUMN_NAME LIKE '%' ";
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"),
756 std::vector
<std::vector
<Any
>> aRows
;
759 std::vector
<Any
> aRow
{ Any() }; // 0. element is unused
762 aRow
.push_back(makeAny(xRow
->getString(1)));
764 aRow
.push_back(makeAny(xRow
->getString(2)));
766 aRow
.push_back(makeAny(xRow
->getString(3)));
768 aRow
.push_back(makeAny(xRow
->getString(4)));
770 OUString sDataType
= xRow
->getString(5);
771 aRow
.push_back(makeAny(mysqlc_sdbc_driver::mysqlStrToOOOType(sDataType
)));
773 aRow
.push_back(makeAny(sDataType
)); // TODO
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"))
783 else if (sDataType
.equalsIgnoreAsciiCase("time"))
785 else if (sDataType
.equalsIgnoreAsciiCase("datetime")
786 || sDataType
.equalsIgnoreAsciiCase("timestamp"))
788 else if (!bIsCharMax
)
789 nColumnSize
= xRow
->getShort(7); // numeric precision
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)));
797 aRow
.push_back(makeAny(sal_Int32(10)));
799 OUString sIsNullable
= xRow
->getString(13);
801 aRow
.push_back(makeAny(ColumnValue::NULLABLE_UNKNOWN
));
802 else if (sIsNullable
.equalsIgnoreAsciiCase("YES"))
803 aRow
.push_back(makeAny(ColumnValue::NULLABLE
));
805 aRow
.push_back(makeAny(ColumnValue::NO_NULLS
));
807 aRow
.push_back(makeAny(xRow
->getString(9)));
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)));
817 aRow
.push_back(makeAny(xRow
->getString(12)));
819 aRow
.push_back(makeAny(sIsNullable
));
820 aRows
.push_back(aRow
);
822 lcl_setRows_throw(xResultSet
, 1, aRows
);
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 "
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]);
844 else if (types
.getLength() > 1)
846 buffer
.append("AND (TABLE_TYPE LIKE '");
847 buffer
.append(types
[0]);
849 for (sal_Int32 i
= 1; i
< types
.getLength(); ++i
)
851 buffer
.append(" OR TABLE_TYPE LIKE '");
852 buffer
.append(types
[i
]);
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
);
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
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"),
887 std::vector
<std::vector
<Any
>> rRows
;
889 SAL_WARN("connectivity.mysqlc", "method not implemented");
890 lcl_setRows_throw(xResultSet
, 7, rRows
);
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"),
901 std::vector
<std::vector
<Any
>> rRows
;
902 lcl_setRows_throw(xResultSet
, 16, rRows
);
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"),
913 std::vector
<std::vector
<Any
>> rRows
;
915 SAL_WARN("connectivity.mysqlc", "method not implemented");
916 lcl_setRows_throw(xResultSet
, 8, rRows
);
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"),
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
);
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)));
961 aRow
.push_back(makeAny(xRow
->getString(5)));
962 // primary column name
963 aRow
.push_back(makeAny(xRow
->getString(6)));
966 aRow
.push_back(makeAny(xRow
->getString(1)));
968 aRow
.push_back(makeAny(xRow
->getString(11)));
970 aRow
.push_back(makeAny(xRow
->getString(10)));
972 aRow
.push_back(makeAny(xRow
->getString(2)));
974 aRow
.push_back(makeAny(sal_Int32
{ 0 })); // TODO
976 aRow
.push_back(makeAny(xRow
->getShort(7)));
978 aRow
.push_back(makeAny(xRow
->getShort(8)));
980 aRow
.push_back(makeAny(xRow
->getString(9)));
982 aRow
.push_back(makeAny(OUString
{})); // TODO
984 aRow
.push_back(makeAny(Deferrability::NONE
));
985 aRows
.push_back(aRow
);
987 lcl_setRows_throw(xResultSet
, 1, aRows
);
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
);
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"),
1021 std::vector
<std::vector
<Any
>> rRows
;
1023 SAL_WARN("connectivity.mysqlc", "method not implemented");
1024 lcl_setRows_throw(xResultSet
, 11, rRows
);
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"),
1037 std::vector
<std::vector
<Any
>> rRows
;
1039 SAL_WARN("connectivity.mysqlc", "method not implemented");
1040 lcl_setRows_throw(xResultSet
, 15, rRows
);
1044 Reference
<XResultSet
> SAL_CALL
ODatabaseMetaData::getTablePrivileges(
1045 const Any
& /*catalog*/, const OUString
& /*schemaPattern*/, const OUString
& /*tableNamePattern*/)
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"),
1060 std::vector
<std::vector
<Any
>> rRows
;
1062 SAL_WARN("connectivity.mysqlc", "method not implemented");
1063 lcl_setRows_throw(xResultSet
, 13, rRows
);
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);
1076 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */