Repository.mk | 2 RepositoryModule_host.mk | 2 mysqlc/Library_mysqlc.mk | 9 mysqlc/Module_mysqlc.mk | 4 mysqlc/source/dummy.cxx | 20 mysqlc/source/mysqlc_connection.cxx | 140 +-- mysqlc/source/mysqlc_connection.hxx | 21 mysqlc/source/mysqlc_databasemetadata.cxx | 1127 ++++++++++------------------ mysqlc/source/mysqlc_databasemetadata.hxx | 4 mysqlc/source/mysqlc_driver.cxx | 2 mysqlc/source/mysqlc_general.cxx | 266 +++++- mysqlc/source/mysqlc_general.hxx | 65 + mysqlc/source/mysqlc_prepared_resultset.cxx | 1097 +++++++++++++++++++++++++++ mysqlc/source/mysqlc_prepared_resultset.hxx | 248 ++++++ mysqlc/source/mysqlc_preparedstatement.cxx | 512 ++++-------- mysqlc/source/mysqlc_preparedstatement.hxx | 24 mysqlc/source/mysqlc_resultset.cxx | 497 ++++++------ mysqlc/source/mysqlc_resultset.hxx | 20 mysqlc/source/mysqlc_resultsetmetadata.cxx | 247 +----- mysqlc/source/mysqlc_resultsetmetadata.hxx | 17 mysqlc/source/mysqlc_statement.cxx | 105 +- mysqlc/source/mysqlc_statement.hxx | 12 22 files changed, 2727 insertions(+), 1714 deletions(-)
New commits: commit 1db3337a82320aacbeed87963e2f6d0c84ba408c Author: Tamas Bunth <tamas.bu...@collabora.co.uk> AuthorDate: Tue Aug 28 15:47:56 2018 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Tue Aug 28 20:26:48 2018 +0200 Switch from mysql to MariaDB C API In order to get rid of the MySQL C++ Connector, the sdbc driver should be implemented using the MariaDB C connector instead. MariaDB Connector/C is LGPL licensed, so later it can be used in the connectivity module. This way mysqlc won't be an extension, so it could be maintained easier. Change-Id: I99c13ccf154b33b145d34b1e06eec85946dc82a0 Reviewed-on: https://gerrit.libreoffice.org/55960 Reviewed-by: Tamás Bunth <btom...@gmail.com> Tested-by: Tamás Bunth <btom...@gmail.com> Reviewed-on: https://gerrit.libreoffice.org/59711 Reviewed-by: Andras Timar <andras.ti...@collabora.com> Tested-by: Andras Timar <andras.ti...@collabora.com> diff --git a/Repository.mk b/Repository.mk index 08b999ed5ac1..a35e837c21de 100644 --- a/Repository.mk +++ b/Repository.mk @@ -391,7 +391,6 @@ $(eval $(call gb_Helper_register_libraries_for_install,OOOLIBS,ooo, \ mtfrenderer \ $(call gb_Helper_optional,DBCONNECTIVITY,mysql) \ odbc \ - mysqlc \ odfflatxml \ offacc \ oox \ @@ -708,6 +707,7 @@ $(eval $(call gb_Helper_register_libraries_for_install,UNOVERLIBS,ure, \ $(eval $(call gb_Helper_register_libraries,EXTENSIONLIBS, \ active_native \ + mysqlc \ passive_native \ )) diff --git a/RepositoryModule_host.mk b/RepositoryModule_host.mk index e415cc992505..3b530286114e 100644 --- a/RepositoryModule_host.mk +++ b/RepositoryModule_host.mk @@ -81,7 +81,7 @@ $(eval $(call gb_Module_add_moduledirs,libreoffice,\ linguistic \ lotuswordpro \ $(call gb_Helper_optional,DESKTOP,l10ntools) \ - mysqlc \ + $(call gb_Helper_optional,MARIADBC,mysqlc) \ $(call gb_Helper_optional,NLPSOLVER,nlpsolver) \ o3tl \ $(call gb_Helper_optional,ODK,odk) \ diff --git a/mysqlc/Library_mysqlc.mk b/mysqlc/Library_mysqlc.mk index 6cb47081748e..f034eaeece76 100644 --- a/mysqlc/Library_mysqlc.mk +++ b/mysqlc/Library_mysqlc.mk @@ -9,16 +9,17 @@ $(eval $(call gb_Library_Library,mysqlc)) -ifeq ($(ENABLE_MARIADBC),TRUE) $(eval $(call gb_Library_use_externals,mysqlc,\ boost_headers \ mysql-connector-cpp \ + mariadb-connector-c \ )) ifeq ($(SYSTEM_MYSQL_CONNECTOR_CPP),) $(eval $(call gb_Library_add_libs,mysqlc,\ $(if $(filter-out WNT,$(OS)),$(if $(filter MACOSX SOLARIS,$(OS)),-lz -lm,\ -rdynamic -lz -lcrypt -lnsl -lm)) \ + $(if $(filter LINUX,$(OS)),-lpthread -ldl,) \ )) endif @@ -47,6 +48,7 @@ $(eval $(call gb_Library_add_exception_objects,mysqlc,\ mysqlc/source/mysqlc_services \ mysqlc/source/mysqlc_connection \ mysqlc/source/mysqlc_resultset \ + mysqlc/source/mysqlc_prepared_resultset \ mysqlc/source/mysqlc_resultsetmetadata \ mysqlc/source/mysqlc_statement \ mysqlc/source/mysqlc_preparedstatement \ @@ -58,10 +60,5 @@ $(eval $(call gb_Library_add_exception_objects,mysqlc,\ $(eval $(call gb_Library_set_componentfile,mysqlc,mysqlc/source/mysqlc)) $(eval $(call gb_Library_set_external_code,mysqlc)) -else -$(eval $(call gb_Library_add_exception_objects,mysqlc,\ - mysqlc/source/dummy \ -)) -endif # vim: set noet sw=4 ts=4: diff --git a/mysqlc/Module_mysqlc.mk b/mysqlc/Module_mysqlc.mk index 2577df5ffcdf..8274b0dc02e8 100644 --- a/mysqlc/Module_mysqlc.mk +++ b/mysqlc/Module_mysqlc.mk @@ -18,10 +18,6 @@ $(eval $(call gb_Module_add_targets,mysqlc,\ Extension_mysql-connector-ooo \ )) -else -$(eval $(call gb_Module_add_targets,mysqlc,\ - Library_mysqlc \ -)) endif # vim: set noet sw=4 ts=4: diff --git a/mysqlc/source/dummy.cxx b/mysqlc/source/dummy.cxx deleted file mode 100644 index 05d4cc35b69e..000000000000 --- a/mysqlc/source/dummy.cxx +++ /dev/null @@ -1,20 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#include <sal/types.h> - -using namespace com::sun::star; - -extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory( - const sal_Char* /*pImplementationName*/, void* /*pServiceManager*/, void* /*pRegistryKey*/) -{ - return nullptr; -}; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/mysqlc/source/mysqlc_connection.cxx b/mysqlc/source/mysqlc_connection.cxx index f44fca89e205..c9f1746004f1 100644 --- a/mysqlc/source/mysqlc_connection.cxx +++ b/mysqlc/source/mysqlc_connection.cxx @@ -61,13 +61,26 @@ using ::osl::MutexGuard; #define MYSQLC_URI_PREFIX "sdbc:mysqlc:" -OConnection::OConnection(MysqlCDriver& _rDriver, sql::Driver * _cppDriver) +namespace +{ + void lcl_executeUpdate(MYSQL* pMySql, const rtl::OString& sql) + { + mysql_real_query(pMySql, sql.getStr(), sql.getLength()); + // TODO handle error + } +} + +OConnection::OConnection(MysqlCDriver& _rDriver) :OMetaConnection_BASE(m_aMutex) ,OSubComponent<OConnection, OConnection_BASE>(static_cast<cppu::OWeakObject*>(&_rDriver), this) ,m_xMetaData(nullptr) ,m_xDriver(&_rDriver) - ,cppDriver(_cppDriver) { + mysql_init(&m_mysql); + + // use TCP as connection + mysql_protocol_type protocol = MYSQL_PROTOCOL_TCP; + mysql_options(&m_mysql, MYSQL_OPT_PROTOCOL, reinterpret_cast<int*>(&protocol)); } OConnection::~OConnection() @@ -151,29 +164,22 @@ void OConnection::construct(const rtl::OUString& url, const Sequence< PropertyVa } if (!bEmbedded) { - try { - sql::ConnectOptionsMap connProps; - std::string host_str = rtl::OUStringToOString(aHostName, m_settings.encoding).getStr(); - std::string user_str = rtl::OUStringToOString(aUser, m_settings.encoding).getStr(); - std::string pass_str = rtl::OUStringToOString(aPass, m_settings.encoding).getStr(); - std::string schema_str = rtl::OUStringToOString(aDbName, m_settings.encoding).getStr(); - connProps["hostName"] = sql::ConnectPropertyVal(host_str); - connProps["userName"] = sql::ConnectPropertyVal(user_str); - connProps["password"] = sql::ConnectPropertyVal(pass_str); - connProps["schema"] = sql::ConnectPropertyVal(schema_str); - connProps["port"] = sql::ConnectPropertyVal((int)nPort); - if (unixSocketPassed) { - sql::SQLString socket_str = rtl::OUStringToOString(sUnixSocket, m_settings.encoding).getStr(); - connProps["socket"] = socket_str; - } else if (namedPipePassed) { - sql::SQLString pipe_str = rtl::OUStringToOString(sNamedPipe, m_settings.encoding).getStr(); - connProps["socket"] = pipe_str; - } - - m_settings.cppConnection.reset(cppDriver->connect(connProps)); - } catch (const sql::SQLException &e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding()); + rtl::OString host_str = rtl::OUStringToOString(aHostName, m_settings.encoding); + rtl::OString user_str = rtl::OUStringToOString(aUser, m_settings.encoding); + rtl::OString pass_str = rtl::OUStringToOString(aPass, m_settings.encoding); + rtl::OString schema_str = rtl::OUStringToOString(aDbName, m_settings.encoding); + rtl::OString socket_str; + if (unixSocketPassed) { + socket_str = rtl::OUStringToOString(sUnixSocket, m_settings.encoding); + } else if (namedPipePassed) { + socket_str = rtl::OUStringToOString(sNamedPipe, m_settings.encoding); } + + // flags can also be passed as last parameter + if(!mysql_real_connect(&m_mysql, host_str.getStr(), user_str.getStr(), + pass_str.getStr(), schema_str.getStr(), nPort, socket_str.getStr(), 0)) + mysqlc_sdbc_driver::throwSQLExceptionWithMsg(mysql_error(&m_mysql), + mysql_errno(&m_mysql),*this, getConnectionEncoding()); } else { // TODO: support for embedded server } @@ -189,9 +195,9 @@ void OConnection::construct(const rtl::OUString& url, const Sequence< PropertyVa 0, Any()); } - std::unique_ptr<sql::Statement> stmt(m_settings.cppConnection->createStatement()); - stmt->executeUpdate("SET session sql_mode='ANSI_QUOTES'"); - stmt->executeUpdate("SET NAMES utf8"); + + lcl_executeUpdate(&m_mysql, rtl::OString{"SET session sql_mode='ANSI_QUOTES'"}); + lcl_executeUpdate(&m_mysql, rtl::OString{"SET NAMES utf8"}); } rtl::OUString OConnection::getImplementationName() @@ -220,7 +226,7 @@ Reference< XStatement > SAL_CALL OConnection::createStatement() Reference< XStatement > xReturn; // the statement can only be executed once try { - xReturn = new OStatement(this, m_settings.cppConnection->createStatement()); + xReturn = new OStatement(this); m_aStatements.push_back(WeakReferenceHelper(xReturn)); return xReturn; } catch (const sql::SQLException & e) { @@ -233,18 +239,20 @@ Reference< XPreparedStatement > SAL_CALL OConnection::prepareStatement(const rtl { MutexGuard aGuard(m_aMutex); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - const rtl::OUString sSqlStatement = transFormPreparedStatement( _sSql ); + const rtl::OString sSqlStatement = rtl::OUStringToOString( + _sSql, getConnectionEncoding()); // FIXME transform statement ? + + MYSQL_STMT* pStmt = mysql_stmt_init(&m_mysql); + mysql_stmt_prepare(pStmt, sSqlStatement.getStr(), sSqlStatement.getLength()); + + unsigned int nErrorNum = mysql_errno(&m_mysql); + if(nErrorNum != 0) + mysqlc_sdbc_driver::throwSQLExceptionWithMsg(mysql_error(&m_mysql), + nErrorNum,*this, getConnectionEncoding()); Reference< XPreparedStatement > xStatement; - try { - // create a statement - // the statement can only be executed more than once - xStatement = new OPreparedStatement(this, - m_settings.cppConnection->prepareStatement(rtl::OUStringToOString(sSqlStatement, getConnectionEncoding()).getStr())); - m_aStatements.push_back( WeakReferenceHelper( xStatement ) ); - } catch (const sql::SQLException & e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding()); - } + xStatement = new OPreparedStatement(this, pStmt); + m_aStatements.push_back( WeakReferenceHelper( xStatement ) ); return xStatement; } @@ -276,11 +284,8 @@ void SAL_CALL OConnection::setAutoCommit(sal_Bool autoCommit) { MutexGuard aGuard(m_aMutex); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - try { - m_settings.cppConnection->setAutoCommit(autoCommit); - } catch (const sql::SQLException & e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding()); - } + if(!mysql_autocommit(&m_mysql, autoCommit)) + mysqlc_sdbc_driver::throwSQLExceptionWithMsg(mysql_error(&m_mysql), mysql_errno(&m_mysql), *this, getConnectionEncoding()); } sal_Bool SAL_CALL OConnection::getAutoCommit() @@ -288,6 +293,7 @@ sal_Bool SAL_CALL OConnection::getAutoCommit() // you have to distinguish which if you are in autocommit mode or not // at normal case true should be fine here + // TODO use SELECT @@autocommit query for that MutexGuard aGuard(m_aMutex); checkDisposed(OConnection_BASE::rBHelper.bDisposed); @@ -304,22 +310,18 @@ void SAL_CALL OConnection::commit() { MutexGuard aGuard(m_aMutex); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - try { - m_settings.cppConnection->commit(); - } catch (const sql::SQLException & e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding()); - } + + if(!mysql_commit(&m_mysql)) + mysqlc_sdbc_driver::throwSQLExceptionWithMsg(mysql_error(&m_mysql), mysql_errno(&m_mysql), *this, getConnectionEncoding()); } void SAL_CALL OConnection::rollback() { MutexGuard aGuard(m_aMutex); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - try { - m_settings.cppConnection->rollback(); - } catch (const sql::SQLException & e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding()); - } + + if(!mysql_rollback(&m_mysql)) + mysqlc_sdbc_driver::throwSQLExceptionWithMsg(mysql_error(&m_mysql), mysql_errno(&m_mysql), *this, getConnectionEncoding()); } sal_Bool SAL_CALL OConnection::isClosed() @@ -336,12 +338,9 @@ Reference< XDatabaseMetaData > SAL_CALL OConnection::getMetaData() checkDisposed(OConnection_BASE::rBHelper.bDisposed); Reference< XDatabaseMetaData > xMetaData = m_xMetaData; - if (!xMetaData.is()) { - try { - xMetaData = new ODatabaseMetaData(*this); // need the connection because it can return it - } catch (const sql::SQLException & e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding()); - } + if (!xMetaData.is()) + { + xMetaData = new ODatabaseMetaData(*this, &m_mysql); m_xMetaData = xMetaData; } @@ -370,6 +369,7 @@ void SAL_CALL OConnection::setCatalog(const rtl::OUString& catalog) MutexGuard aGuard(m_aMutex); checkDisposed(OConnection_BASE::rBHelper.bDisposed); + // TODO How? try { // m_settings.cppConnection->setCatalog(rtl::OUStringToOString(catalog, m_settings.encoding).getStr()); m_settings.cppConnection->setSchema(rtl::OUStringToOString(catalog, getConnectionEncoding()).getStr()); @@ -383,6 +383,7 @@ rtl::OUString SAL_CALL OConnection::getCatalog() MutexGuard aGuard(m_aMutex); checkDisposed(OConnection_BASE::rBHelper.bDisposed); + // TODO How? rtl::OUString catalog; try { catalog = mysqlc_sdbc_driver::convert(m_settings.cppConnection->getSchema(), getConnectionEncoding()); @@ -474,6 +475,7 @@ void SAL_CALL OConnection::close() MutexGuard aGuard(m_aMutex); checkDisposed(OConnection_BASE::rBHelper.bDisposed); } + mysql_close(&m_mysql); dispose(); } @@ -514,15 +516,8 @@ sal_Int32 OConnection::getMysqlVersion() MutexGuard aGuard(m_aMutex); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - sal_Int32 version(0); - try { - version = 10000 * m_settings.cppConnection->getMetaData()->getDatabaseMajorVersion(); - version += 100 * m_settings.cppConnection->getMetaData()->getDatabaseMinorVersion(); - version += m_settings.cppConnection->getMetaData()->getDatabasePatchVersion(); - } catch (const sql::SQLException & e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, getConnectionEncoding()); - } - return version; + unsigned long version = mysql_get_server_version(&m_mysql); + return static_cast<sal_Int32>(version); } rtl::OUString OConnection::transFormPreparedStatement(const rtl::OUString& _sSQL) @@ -546,13 +541,4 @@ rtl::OUString OConnection::transFormPreparedStatement(const rtl::OUString& _sSQL } -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: noet sw=4 ts=4 fdm=marker - * vim<600: noet sw=4 ts=4 - */ - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/mysqlc/source/mysqlc_connection.hxx b/mysqlc/source/mysqlc_connection.hxx index 63c121c99a2e..910a5a08d152 100644 --- a/mysqlc/source/mysqlc_connection.hxx +++ b/mysqlc/source/mysqlc_connection.hxx @@ -43,6 +43,8 @@ #include <rtl/string.hxx> #include <rtl/ref.hxx> +#include <mysql.h> + #include <map> @@ -86,8 +88,8 @@ namespace connectivity public OConnection_BASE, public connectivity::mysqlc::OSubComponent<OConnection, OConnection_BASE> { - friend class connectivity::mysqlc::OSubComponent<OConnection, OConnection_BASE>; - + private: + MYSQL m_mysql; ConnectionSettings m_settings; css::uno::Reference< css::container::XNameAccess > m_typeMap; css::uno::Reference< css::util::XStringSubstitution > m_xParameterSubstitution; @@ -101,9 +103,9 @@ namespace connectivity // for this Connection rtl::Reference<MysqlCDriver> m_xDriver; // Pointer to the owning driver object - sql::Driver* cppDriver; - public: + MYSQL* getMysqlConnection() { return &m_mysql; } + /// @throws SQLException /// @throws RuntimeException sal_Int32 getMysqlVersion(); @@ -111,7 +113,7 @@ namespace connectivity /// @throws SQLException void construct(const rtl::OUString& url,const css::uno::Sequence< css::beans::PropertyValue >& info); - OConnection(MysqlCDriver& _rDriver, sql::Driver * cppDriver); + OConnection(MysqlCDriver& _rDriver ); virtual ~OConnection(); rtl_TextEncoding getConnectionEncoding() const { return m_settings.encoding; } @@ -190,13 +192,4 @@ namespace connectivity } /* connectivity */ #endif // INCLUDED_MYSQLC_SOURCE_MYSQLC_CONNECTION_HXX -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: noet sw=4 ts=4 fdm=marker - * vim<600: noet sw=4 ts=4 - */ - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/mysqlc/source/mysqlc_databasemetadata.cxx b/mysqlc/source/mysqlc_databasemetadata.cxx index 68dad0cbcf84..0f9e539e6df3 100644 --- a/mysqlc/source/mysqlc_databasemetadata.cxx +++ b/mysqlc/source/mysqlc_databasemetadata.cxx @@ -29,7 +29,7 @@ #include <com/sun/star/sdbc/ColumnType.hpp> #include <com/sun/star/lang/XInitialization.hpp> - +#include <rtl/ustrbuf.hxx> #include "mysqlc_general.hxx" #include "mysqlc_statement.hxx" #include "mysqlc_driver.hxx" @@ -44,12 +44,6 @@ using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; using mysqlc_sdbc_driver::getStringFromAny; -#include <cppconn/connection.h> -#include <cppconn/resultset.h> -#include <cppconn/metadata.h> -#include <cppconn/statement.h> -#include <cppconn/prepared_statement.h> - #include <sal/macros.h> static std::string wild("%"); @@ -76,9 +70,9 @@ void lcl_setRows_throw(const Reference< XResultSet >& _xResultSet,sal_Int32 _nTy xIni->initialize(aArgs); } -ODatabaseMetaData::ODatabaseMetaData(OConnection& _rCon) +ODatabaseMetaData::ODatabaseMetaData(OConnection& _rCon, MYSQL* pMySql) :m_rConnection(_rCon) - ,meta(_rCon.getConnectionSettings().cppConnection->getMetaData()) + ,m_pMySql(pMySql) ,identifier_quote_string_set(false) { } @@ -87,564 +81,477 @@ ODatabaseMetaData::~ODatabaseMetaData() { } -rtl::OUString ODatabaseMetaData::impl_getStringMetaData(const sal_Char* _methodName, const sql::SQLString& (sql::DatabaseMetaData::*Method)() ) -{ - rtl::OUString stringMetaData; - try { - stringMetaData = mysqlc_sdbc_driver::convert((meta->*Method)(), m_rConnection.getConnectionEncoding()); - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException(_methodName, *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException(_methodName, *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - return stringMetaData; -} - -rtl::OUString ODatabaseMetaData::impl_getStringMetaData(const sal_Char* _methodName, sql::SQLString (sql::DatabaseMetaData::*Method)() ) -{ - rtl::OUString stringMetaData; - try { - stringMetaData = mysqlc_sdbc_driver::convert((meta->*Method)(), m_rConnection.getConnectionEncoding()); - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException(_methodName, *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException(_methodName, *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - return stringMetaData; -} - -sal_Int32 ODatabaseMetaData::impl_getInt32MetaData(const sal_Char* _methodName, unsigned int (sql::DatabaseMetaData::*Method)() ) -{ - sal_Int32 int32MetaData(0); - try { - int32MetaData = (meta->*Method)(); - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException(_methodName, *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException(_methodName, *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - return int32MetaData; -} - -bool ODatabaseMetaData::impl_getBoolMetaData(const sal_Char* _methodName, bool (sql::DatabaseMetaData::*Method)() ) -{ - bool boolMetaData(false); - try { - boolMetaData = (meta->*Method)(); - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException(_methodName, *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException(_methodName, *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - return boolMetaData; -} - -bool ODatabaseMetaData::impl_getBoolMetaData(const sal_Char* _methodName, bool (sql::DatabaseMetaData::*Method)(int), sal_Int32 _arg ) -{ - bool boolMetaData(false); - try { - boolMetaData = (meta->*Method)( _arg ); - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException(_methodName, *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException(_methodName, *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - return boolMetaData; -} - -bool ODatabaseMetaData::impl_getRSTypeMetaData(const sal_Char* _methodName, bool (sql::DatabaseMetaData::*Method)(int), sal_Int32 _resultSetType ) -{ - int resultSetType(sql::ResultSet::TYPE_FORWARD_ONLY); - switch ( _resultSetType ) { - case ResultSetType::SCROLL_INSENSITIVE: resultSetType = sql::ResultSet::TYPE_SCROLL_INSENSITIVE; break; - case ResultSetType::SCROLL_SENSITIVE: resultSetType = sql::ResultSet::TYPE_SCROLL_SENSITIVE; break; - } - - return impl_getBoolMetaData(_methodName, Method, resultSetType); -} - rtl::OUString SAL_CALL ODatabaseMetaData::getCatalogSeparator() { - return impl_getStringMetaData("getCatalogSeparator", &sql::DatabaseMetaData::getCatalogSeparator); + return rtl::OUString(); } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxBinaryLiteralLength() { - return impl_getInt32MetaData("getMaxBinaryLiteralLength", &sql::DatabaseMetaData::getMaxBinaryLiteralLength); + return 16777208L; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxRowSize() { - return impl_getInt32MetaData("getMaxRowSize", &sql::DatabaseMetaData::getMaxRowSize); + return 2147483647L - 8; // Max buffer size - HEADER } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxCatalogNameLength() { - return impl_getInt32MetaData("getMaxCatalogNameLength", &sql::DatabaseMetaData::getMaxCatalogNameLength); + return 32; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxCharLiteralLength() { - return impl_getInt32MetaData("getMaxCharLiteralLength", &sql::DatabaseMetaData::getMaxCharLiteralLength); + return 16777208; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnNameLength() { - return impl_getInt32MetaData("getMaxColumnNameLength", &sql::DatabaseMetaData::getMaxColumnNameLength); + return 64; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInIndex() { - return impl_getInt32MetaData("getMaxColumnsInIndex", &sql::DatabaseMetaData::getMaxColumnsInIndex); + return 16; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxCursorNameLength() { - return impl_getInt32MetaData("getMaxCursorNameLength", &sql::DatabaseMetaData::getMaxCursorNameLength); + return 64; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxConnections() { - return impl_getInt32MetaData("getMaxConnections", &sql::DatabaseMetaData::getMaxConnections); + // TODO + // SELECT @@max_connections + return 100; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInTable() { - return impl_getInt32MetaData("getMaxColumnsInTable", &sql::DatabaseMetaData::getMaxColumnsInTable); + return 512; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxStatementLength() { - return impl_getInt32MetaData("getMaxStatementLength", &sql::DatabaseMetaData::getMaxStatementLength); + // TODO + // "SHOW VARIABLES LIKE 'max_allowed_packet'" + return 32767; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxTableNameLength() { - return impl_getInt32MetaData("getMaxTableNameLength", &sql::DatabaseMetaData::getMaxTableNameLength); + return 64; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxTablesInSelect() { - return impl_getInt32MetaData("getMaxTablesInSelect", &sql::DatabaseMetaData::getMaxTablesInSelect); + return 256; } sal_Bool SAL_CALL ODatabaseMetaData::doesMaxRowSizeIncludeBlobs() { - return impl_getBoolMetaData("doesMaxRowSizeIncludeBlobs", &sql::DatabaseMetaData::doesMaxRowSizeIncludeBlobs); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::storesLowerCaseQuotedIdentifiers() { - return impl_getBoolMetaData("storesLowerCaseQuotedIdentifiers", &sql::DatabaseMetaData::storesLowerCaseQuotedIdentifiers); + // TODO + return false; } sal_Bool SAL_CALL ODatabaseMetaData::storesLowerCaseIdentifiers() { - return impl_getBoolMetaData("storesLowerCaseIdentifiers", &sql::DatabaseMetaData::storesLowerCaseIdentifiers); + //TODO; + return false; } sal_Bool SAL_CALL ODatabaseMetaData::storesMixedCaseQuotedIdentifiers() { - return impl_getBoolMetaData("storesMixedCaseQuotedIdentifiers", &sql::DatabaseMetaData::storesMixedCaseQuotedIdentifiers); + // TODO + return false; } sal_Bool SAL_CALL ODatabaseMetaData::storesMixedCaseIdentifiers() { - return impl_getBoolMetaData("storesMixedCaseIdentifiers", &sql::DatabaseMetaData::storesMixedCaseIdentifiers); + // TODO + return false; } sal_Bool SAL_CALL ODatabaseMetaData::storesUpperCaseQuotedIdentifiers() { - return impl_getBoolMetaData("storesUpperCaseQuotedIdentifiers", &sql::DatabaseMetaData::storesUpperCaseQuotedIdentifiers); + // TODO + return false; } sal_Bool SAL_CALL ODatabaseMetaData::storesUpperCaseIdentifiers() { - return impl_getBoolMetaData("storesUpperCaseIdentifiers", &sql::DatabaseMetaData::storesUpperCaseIdentifiers); + // TODO + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsAlterTableWithAddColumn() { - return impl_getBoolMetaData("supportsAlterTableWithAddColumn", &sql::DatabaseMetaData::supportsAlterTableWithAddColumn); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsAlterTableWithDropColumn() { - return impl_getBoolMetaData("supportsAlterTableWithDropColumn", &sql::DatabaseMetaData::supportsAlterTableWithDropColumn); + return true; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxIndexLength() { - return impl_getInt32MetaData("getMaxIndexLength", &sql::DatabaseMetaData::getMaxIndexLength); + return 256; } sal_Bool SAL_CALL ODatabaseMetaData::supportsNonNullableColumns() { - return impl_getBoolMetaData("supportsNonNullableColumns", &sql::DatabaseMetaData::supportsNonNullableColumns); + return true; } rtl::OUString SAL_CALL ODatabaseMetaData::getCatalogTerm() { - return impl_getStringMetaData("getCatalogTerm", &sql::DatabaseMetaData::getCatalogTerm); + return rtl::OUString("n/a"); } rtl::OUString SAL_CALL ODatabaseMetaData::getIdentifierQuoteString() { - if (!identifier_quote_string_set) { - identifier_quote_string = impl_getStringMetaData("getIdentifierQuoteString", &sql::DatabaseMetaData::getIdentifierQuoteString); - identifier_quote_string_set = true; - } - return identifier_quote_string; + return rtl::OUString("\""); } rtl::OUString SAL_CALL ODatabaseMetaData::getExtraNameCharacters() { - return impl_getStringMetaData("getExtraNameCharacters", &sql::DatabaseMetaData::getExtraNameCharacters); + return rtl::OUString("#@"); } sal_Bool SAL_CALL ODatabaseMetaData::supportsDifferentTableCorrelationNames() { - return impl_getBoolMetaData("supportsDifferentTableCorrelationNames", &sql::DatabaseMetaData::supportsDifferentTableCorrelationNames); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::isCatalogAtStart() { - return impl_getBoolMetaData("isCatalogAtStart", &sql::DatabaseMetaData::isCatalogAtStart); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::dataDefinitionIgnoredInTransactions() { - return impl_getBoolMetaData("dataDefinitionIgnoredInTransactions", &sql::DatabaseMetaData::dataDefinitionIgnoredInTransactions); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::dataDefinitionCausesTransactionCommit() { - return impl_getBoolMetaData("dataDefinitionCausesTransactionCommit", &sql::DatabaseMetaData::dataDefinitionCausesTransactionCommit); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsDataManipulationTransactionsOnly() { - return impl_getBoolMetaData("supportsDataManipulationTransactionsOnly", &sql::DatabaseMetaData::supportsDataManipulationTransactionsOnly); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsDataDefinitionAndDataManipulationTransactions() { - return impl_getBoolMetaData("supportsDataDefinitionAndDataManipulationTransactions", &sql::DatabaseMetaData::supportsDataDefinitionAndDataManipulationTransactions); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsPositionedDelete() { - return impl_getBoolMetaData("supportsPositionedDelete", &sql::DatabaseMetaData::supportsPositionedDelete); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsPositionedUpdate() { - return impl_getBoolMetaData("supportsPositionedUpdate", &sql::DatabaseMetaData::supportsPositionedUpdate); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenStatementsAcrossRollback() { - return impl_getBoolMetaData("supportsOpenStatementsAcrossRollback", &sql::DatabaseMetaData::supportsOpenStatementsAcrossRollback); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenStatementsAcrossCommit() { - return impl_getBoolMetaData("supportsOpenStatementsAcrossCommit", &sql::DatabaseMetaData::supportsOpenStatementsAcrossCommit); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenCursorsAcrossCommit() { - return impl_getBoolMetaData("supportsOpenCursorsAcrossCommit", &sql::DatabaseMetaData::supportsOpenCursorsAcrossCommit); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenCursorsAcrossRollback() { - return impl_getBoolMetaData("supportsOpenCursorsAcrossRollback", &sql::DatabaseMetaData::supportsOpenCursorsAcrossRollback); + return false; } -sal_Bool SAL_CALL ODatabaseMetaData::supportsTransactionIsolationLevel(sal_Int32 level) +sal_Bool SAL_CALL ODatabaseMetaData::supportsTransactionIsolationLevel(sal_Int32 /*level*/) { - return impl_getBoolMetaData("supportsTransactionIsolationLevel", &sql::DatabaseMetaData::supportsTransactionIsolationLevel, level); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInDataManipulation() { - return impl_getBoolMetaData("supportsSchemasInDataManipulation", &sql::DatabaseMetaData::supportsSchemasInDataManipulation); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92FullSQL() { - return impl_getBoolMetaData("supportsANSI92FullSQL", &sql::DatabaseMetaData::supportsANSI92FullSQL); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92EntryLevelSQL() { - return impl_getBoolMetaData("supportsANSI92EntryLevelSQL", &sql::DatabaseMetaData::supportsANSI92EntryLevelSQL); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsIntegrityEnhancementFacility() { - return impl_getBoolMetaData("supportsIntegrityEnhancementFacility", &sql::DatabaseMetaData::supportsIntegrityEnhancementFacility); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInIndexDefinitions() { - return impl_getBoolMetaData("supportsSchemasInIndexDefinitions", &sql::DatabaseMetaData::supportsSchemasInIndexDefinitions); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInTableDefinitions() { - return impl_getBoolMetaData("supportsSchemasInTableDefinitions", &sql::DatabaseMetaData::supportsSchemasInTableDefinitions); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInTableDefinitions() { - return impl_getBoolMetaData("supportsCatalogsInTableDefinitions", &sql::DatabaseMetaData::supportsCatalogsInTableDefinitions); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInIndexDefinitions() { - return impl_getBoolMetaData("supportsCatalogsInIndexDefinitions", &sql::DatabaseMetaData::supportsCatalogsInIndexDefinitions); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInDataManipulation() { - return impl_getBoolMetaData("supportsCatalogsInDataManipulation", &sql::DatabaseMetaData::supportsCatalogsInDataManipulation); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsOuterJoins() { - return impl_getBoolMetaData("supportsOuterJoins", &sql::DatabaseMetaData::supportsOuterJoins); + return true; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxStatements() { - return impl_getInt32MetaData("getMaxStatements", &sql::DatabaseMetaData::getMaxStatements); + return 0; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxProcedureNameLength() { - return impl_getInt32MetaData("getMaxProcedureNameLength", &sql::DatabaseMetaData::getMaxProcedureNameLength); + return 64; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxSchemaNameLength() { - return impl_getInt32MetaData("getMaxSchemaNameLength", &sql::DatabaseMetaData::getMaxSchemaNameLength); + return 64; } sal_Bool SAL_CALL ODatabaseMetaData::supportsTransactions() { - return impl_getBoolMetaData("supportsTransactions", &sql::DatabaseMetaData::supportsTransactions); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::allProceduresAreCallable() { - return impl_getBoolMetaData("allProceduresAreCallable", &sql::DatabaseMetaData::allProceduresAreCallable); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsStoredProcedures() { - return impl_getBoolMetaData("supportsStoredProcedures", &sql::DatabaseMetaData::supportsStoredProcedures); + return m_rConnection.getMysqlVersion() >= 50000; } sal_Bool SAL_CALL ODatabaseMetaData::supportsSelectForUpdate() { - return impl_getBoolMetaData("supportsSelectForUpdate", &sql::DatabaseMetaData::supportsSelectForUpdate); + return m_rConnection.getMysqlVersion() >= 40000; } sal_Bool SAL_CALL ODatabaseMetaData::allTablesAreSelectable() { - return impl_getBoolMetaData("allTablesAreSelectable", &sql::DatabaseMetaData::allTablesAreSelectable); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::isReadOnly() { - return impl_getBoolMetaData("isReadOnly", &sql::DatabaseMetaData::isReadOnly); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::usesLocalFiles() { - return impl_getBoolMetaData("usesLocalFiles", &sql::DatabaseMetaData::usesLocalFiles); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::usesLocalFilePerTable() { - return impl_getBoolMetaData("usesLocalFilePerTable", &sql::DatabaseMetaData::usesLocalFilePerTable); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsTypeConversion() { - return impl_getBoolMetaData("supportsTypeConversion", &sql::DatabaseMetaData::supportsTypeConversion); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::nullPlusNonNullIsNull() { - return impl_getBoolMetaData("nullPlusNonNullIsNull", &sql::DatabaseMetaData::nullPlusNonNullIsNull); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsColumnAliasing() { - return impl_getBoolMetaData("supportsColumnAliasing", &sql::DatabaseMetaData::supportsColumnAliasing); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsTableCorrelationNames() { - return impl_getBoolMetaData("supportsTableCorrelationNames", &sql::DatabaseMetaData::supportsTableCorrelationNames); + return true; } -sal_Bool SAL_CALL ODatabaseMetaData::supportsConvert(sal_Int32 /* fromType */, sal_Int32 /* toType */) +sal_Bool SAL_CALL ODatabaseMetaData::supportsConvert(sal_Int32 /*fromType*/, sal_Int32 /*toType*/) { - try { - /* ToDo -> use supportsConvert( fromType, toType) */ - return meta->supportsConvert(); - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::supportsConvert", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::supportsConvert", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } + // TODO return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsExpressionsInOrderBy() { - return impl_getBoolMetaData("supportsExpressionsInOrderBy", &sql::DatabaseMetaData::supportsExpressionsInOrderBy); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsGroupBy() { - return impl_getBoolMetaData("supportsGroupBy", &sql::DatabaseMetaData::supportsGroupBy); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsGroupByBeyondSelect() { - return impl_getBoolMetaData("supportsGroupByBeyondSelect", &sql::DatabaseMetaData::supportsGroupByBeyondSelect); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsGroupByUnrelated() { - return impl_getBoolMetaData("supportsGroupByUnrelated", &sql::DatabaseMetaData::supportsGroupByUnrelated); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsMultipleTransactions() { - return impl_getBoolMetaData("supportsMultipleTransactions", &sql::DatabaseMetaData::supportsMultipleTransactions); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsMultipleResultSets() { - return impl_getBoolMetaData("supportsMultipleResultSets", &sql::DatabaseMetaData::supportsMultipleResultSets); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsLikeEscapeClause() { - return impl_getBoolMetaData("supportsLikeEscapeClause", &sql::DatabaseMetaData::supportsLikeEscapeClause); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsOrderByUnrelated() { - return impl_getBoolMetaData("supportsOrderByUnrelated", &sql::DatabaseMetaData::supportsOrderByUnrelated); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsUnion() { - return impl_getBoolMetaData("supportsUnion", &sql::DatabaseMetaData::supportsUnion); + return m_rConnection.getMysqlVersion() >= 40000; } sal_Bool SAL_CALL ODatabaseMetaData::supportsUnionAll() { - return impl_getBoolMetaData("supportsUnionAll", &sql::DatabaseMetaData::supportsUnionAll); + return m_rConnection.getMysqlVersion() >= 40000; } sal_Bool SAL_CALL ODatabaseMetaData::supportsMixedCaseIdentifiers() { - return impl_getBoolMetaData("supportsMixedCaseIdentifiers", &sql::DatabaseMetaData::supportsMixedCaseIdentifiers); + // TODO + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsMixedCaseQuotedIdentifiers() { - return impl_getBoolMetaData("supportsMixedCaseQuotedIdentifiers", &sql::DatabaseMetaData::supportsMixedCaseQuotedIdentifiers); + // TODO + return false; } sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedAtEnd() { - return impl_getBoolMetaData("nullsAreSortedAtEnd", &sql::DatabaseMetaData::nullsAreSortedAtEnd); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedAtStart() { - return impl_getBoolMetaData("nullsAreSortedAtStart", &sql::DatabaseMetaData::nullsAreSortedAtStart); + return m_rConnection.getMysqlVersion() > 40001 && m_rConnection.getMysqlVersion() < 40011; } sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedHigh() { - return impl_getBoolMetaData("nullsAreSortedHigh", &sql::DatabaseMetaData::nullsAreSortedHigh); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedLow() { - return impl_getBoolMetaData("nullsAreSortedLow", &sql::DatabaseMetaData::nullsAreSortedLow); + return !nullsAreSortedHigh(); } sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInProcedureCalls() { - return impl_getBoolMetaData("supportsSchemasInProcedureCalls", &sql::DatabaseMetaData::supportsSchemasInProcedureCalls); + return m_rConnection.getMysqlVersion() >= 32200; } sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInPrivilegeDefinitions() { - return impl_getBoolMetaData("supportsSchemasInPrivilegeDefinitions", &sql::DatabaseMetaData::supportsSchemasInPrivilegeDefinitions); + return m_rConnection.getMysqlVersion() >= 32200; } sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInProcedureCalls() { - return impl_getBoolMetaData("supportsCatalogsInProcedureCalls", &sql::DatabaseMetaData::supportsCatalogsInProcedureCalls); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInPrivilegeDefinitions() { - return impl_getBoolMetaData("supportsCatalogsInPrivilegeDefinitions", &sql::DatabaseMetaData::supportsCatalogsInPrivilegeDefinitions); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsCorrelatedSubqueries() { - return impl_getBoolMetaData("supportsCorrelatedSubqueries", &sql::DatabaseMetaData::supportsCorrelatedSubqueries); + return m_rConnection.getMysqlVersion() >= 40100; } sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInComparisons() { - return impl_getBoolMetaData("supportsSubqueriesInComparisons", &sql::DatabaseMetaData::supportsSubqueriesInComparisons); + return m_rConnection.getMysqlVersion() >= 40100; } sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInExists() { - return impl_getBoolMetaData("supportsSubqueriesInExists", &sql::DatabaseMetaData::supportsSubqueriesInExists); + return m_rConnection.getMysqlVersion() >= 40100; } sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInIns() { - return impl_getBoolMetaData("supportsSubqueriesInIns", &sql::DatabaseMetaData::supportsSubqueriesInIns); + return m_rConnection.getMysqlVersion() >= 40100; } sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInQuantifieds() { - return impl_getBoolMetaData("supportsSubqueriesInQuantifieds", &sql::DatabaseMetaData::supportsSubqueriesInQuantifieds); + return m_rConnection.getMysqlVersion() >= 40100; } sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92IntermediateSQL() { - return impl_getBoolMetaData("supportsANSI92IntermediateSQL", &sql::DatabaseMetaData::supportsANSI92IntermediateSQL); + return false; } rtl::OUString SAL_CALL ODatabaseMetaData::getURL() @@ -654,7 +561,8 @@ rtl::OUString SAL_CALL ODatabaseMetaData::getURL() rtl::OUString SAL_CALL ODatabaseMetaData::getUserName() { - return impl_getStringMetaData("getUserName", &sql::DatabaseMetaData::getUserName); + // TODO execute "SELECT USER()" + return rtl::OUString(); } rtl::OUString SAL_CALL ODatabaseMetaData::getDriverName() @@ -669,199 +577,236 @@ rtl::OUString SAL_CALL ODatabaseMetaData::getDriverVersion() rtl::OUString SAL_CALL ODatabaseMetaData::getDatabaseProductVersion() { - return impl_getStringMetaData("getDatabaseProductVersion", &sql::DatabaseMetaData::getDatabaseProductVersion); + return rtl::OStringToOUString(mysql_get_server_info(m_pMySql), + m_rConnection.getConnectionEncoding()); } rtl::OUString SAL_CALL ODatabaseMetaData::getDatabaseProductName() { - return impl_getStringMetaData("getDatabaseProductName", &sql::DatabaseMetaData::getDatabaseProductName); + return rtl::OUString("MySQL"); } rtl::OUString SAL_CALL ODatabaseMetaData::getProcedureTerm() { - return impl_getStringMetaData("getProcedureTerm", &sql::DatabaseMetaData::getProcedureTerm); + return rtl::OUString("procedure"); } rtl::OUString SAL_CALL ODatabaseMetaData::getSchemaTerm() { - return impl_getStringMetaData("getSchemaTerm", &sql::DatabaseMetaData::getSchemaTerm); + return rtl::OUString("database"); } sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMajorVersion() { + // TODO return MARIADBC_VERSION_MAJOR; } sal_Int32 SAL_CALL ODatabaseMetaData::getDefaultTransactionIsolation() { - try { - switch (meta->getDefaultTransactionIsolation()) { - case sql::TRANSACTION_SERIALIZABLE: return TransactionIsolation::SERIALIZABLE; - case sql::TRANSACTION_REPEATABLE_READ: return TransactionIsolation::REPEATABLE_READ; - case sql::TRANSACTION_READ_COMMITTED: return TransactionIsolation::READ_COMMITTED; - case sql::TRANSACTION_READ_UNCOMMITTED: return TransactionIsolation::READ_UNCOMMITTED; - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getDriverMajorVersion", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getDriverMajorVersion", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - return TransactionIsolation::NONE; + return m_rConnection.getMysqlVersion() >= 32336 ? TransactionIsolation::READ_COMMITTED : + TransactionIsolation::NONE; } sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMinorVersion() { + // TODO return MARIADBC_VERSION_MINOR; } rtl::OUString SAL_CALL ODatabaseMetaData::getSQLKeywords() { - return impl_getStringMetaData("getSQLKeywords", &sql::DatabaseMetaData::getSQLKeywords); + return rtl::OUString( + "ACCESSIBLE, ADD, ALL,"\ + "ALTER, ANALYZE, AND, AS, ASC, ASENSITIVE, BEFORE,"\ + "BETWEEN, BIGINT, BINARY, BLOB, BOTH, BY, CALL,"\ + "CASCADE, CASE, CHANGE, CHAR, CHARACTER, CHECK,"\ + "COLLATE, COLUMN, CONDITION, CONNECTION, CONSTRAINT,"\ + "CONTINUE, CONVERT, CREATE, CROSS, CURRENT_DATE,"\ + "CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CURSOR,"\ + "DATABASE, DATABASES, DAY_HOUR, DAY_MICROSECOND,"\ + "DAY_MINUTE, DAY_SECOND, DEC, DECIMAL, DECLARE,"\ + "DEFAULT, DELAYED, DELETE, DESC, DESCRIBE,"\ + "DETERMINISTIC, DISTINCT, DISTINCTROW, DIV, DOUBLE,"\ + "DROP, DUAL, EACH, ELSE, ELSEIF, ENCLOSED,"\ + "ESCAPED, EXISTS, EXIT, EXPLAIN, FALSE, FETCH,"\ + "FLOAT, FLOAT4, FLOAT8, FOR, FORCE, FOREIGN, FROM,"\ + "FULLTEXT, GRANT, GROUP, HAVING, HIGH_PRIORITY,"\ + "HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IF,"\ + "IGNORE, IN, INDEX, INFILE, INNER, INOUT,"\ + "INSENSITIVE, INSERT, INT, INT1, INT2, INT3, INT4,"\ + "INT8, INTEGER, INTERVAL, INTO, IS, ITERATE, JOIN,"\ + "KEY, KEYS, KILL, LEADING, LEAVE, LEFT, LIKE,"\ + "LOCALTIMESTAMP, LOCK, LONG, LONGBLOB, LONGTEXT,"\ + "LOOP, LOW_PRIORITY, MATCH, MEDIUMBLOB, MEDIUMINT,"\ + "MEDIUMTEXT, MIDDLEINT, MINUTE_MICROSECOND,"\ + "MINUTE_SECOND, MOD, MODIFIES, NATURAL, NOT,"\ + "NO_WRITE_TO_BINLOG, NULL, NUMERIC, ON, OPTIMIZE,"\ + "OPTION, OPTIONALLY, OR, ORDER, OUT, OUTER,"\ + "OUTFILE, PRECISION, PRIMARY, PROCEDURE, PURGE,"\ + "RANGE, READ, READS, READ_ONLY, READ_WRITE, REAL,"\ + "REFERENCES, REGEXP, RELEASE, RENAME, REPEAT,"\ + "REPLACE, REQUIRE, RESTRICT, RETURN, REVOKE, RIGHT,"\ + "RLIKE, SCHEMA, SCHEMAS, SECOND_MICROSECOND, SELECT,"\ + "SENSITIVE, SEPARATOR, SET, SHOW, SMALLINT, SPATIAL,"\ + "SPECIFIC, SQL, SQLEXCEPTION, SQLSTATE, SQLWARNING,"\ + "SQL_BIG_RESULT, SQL_CALC_FOUND_ROWS, SQL_SMALL_RESULT,"\ + "SSL, STARTING, STRAIGHT_JOIN, TABLE, TERMINATED,"\ + "THEN, TINYBLOB, TINYINT, TINYTEXT, TO, TRAILING,"\ + "TRIGGER, TRUE, UNDO, UNION, UNIQUE, UNLOCK,"\ + "UNSIGNED, UPDATE, USAGE, USE, USING, UTC_DATE,"\ + "UTC_TIME, UTC_TIMESTAMP, VALUES, VARBINARY, VARCHAR,"\ + "VARCHARACTER, VARYING, WHEN, WHERE, WHILE, WITH,"\ + "WRITE, X509, XOR, YEAR_MONTH, ZEROFILL" \ + "GENERAL, IGNORE_SERVER_IDS, MASTER_HEARTBEAT_PERIOD," \ + "MAXVALUE, RESIGNAL, SIGNAL, SLOW"); } rtl::OUString SAL_CALL ODatabaseMetaData::getSearchStringEscape() { - return impl_getStringMetaData("getSearchStringEscape", &sql::DatabaseMetaData::getSearchStringEscape); + return rtl::OUString("\\"); } rtl::OUString SAL_CALL ODatabaseMetaData::getStringFunctions() { - return impl_getStringMetaData("getStringFunctions", &sql::DatabaseMetaData::getStringFunctions); + return rtl::OUString( + "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"); } rtl::OUString SAL_CALL ODatabaseMetaData::getTimeDateFunctions() { - return impl_getStringMetaData("getTimeDateFunctions", &sql::DatabaseMetaData::getTimeDateFunctions); + return rtl::OUString( + "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"); } rtl::OUString SAL_CALL ODatabaseMetaData::getSystemFunctions() { - return impl_getStringMetaData("getSystemFunctions", &sql::DatabaseMetaData::getSystemFunctions); + return rtl::OUString( + "DATABASE,USER,SYSTEM_USER," + "SESSION_USER,PASSWORD,ENCRYPT,LAST_INSERT_ID,VERSION"); } rtl::OUString SAL_CALL ODatabaseMetaData::getNumericFunctions() { - return impl_getStringMetaData("getNumericFunctions", &sql::DatabaseMetaData::getNumericFunctions); + return rtl::OUString("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"); } sal_Bool SAL_CALL ODatabaseMetaData::supportsExtendedSQLGrammar() { - return impl_getBoolMetaData("supportsExtendedSQLGrammar", &sql::DatabaseMetaData::supportsExtendedSQLGrammar); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsCoreSQLGrammar() { - return impl_getBoolMetaData("supportsCoreSQLGrammar", &sql::DatabaseMetaData::supportsCoreSQLGrammar); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsMinimumSQLGrammar() { - return impl_getBoolMetaData("supportsMinimumSQLGrammar", &sql::DatabaseMetaData::supportsMinimumSQLGrammar); + return true; } sal_Bool SAL_CALL ODatabaseMetaData::supportsFullOuterJoins() { - return impl_getBoolMetaData("supportsFullOuterJoins", &sql::DatabaseMetaData::supportsFullOuterJoins); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsLimitedOuterJoins() { - return impl_getBoolMetaData("supportsLimitedOuterJoins", &sql::DatabaseMetaData::supportsLimitedOuterJoins); + return true; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInGroupBy() { - return impl_getInt32MetaData("getMaxColumnsInGroupBy", &sql::DatabaseMetaData::getMaxColumnsInGroupBy); + return 64; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInOrderBy() { - return impl_getInt32MetaData("getMaxColumnsInOrderBy", &sql::DatabaseMetaData::getMaxColumnsInOrderBy); + return 64; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInSelect() { - return impl_getInt32MetaData("getMaxColumnsInSelect", &sql::DatabaseMetaData::getMaxColumnsInSelect); + return 256; } sal_Int32 SAL_CALL ODatabaseMetaData::getMaxUserNameLength() { - return impl_getInt32MetaData("getMaxUserNameLength", &sql::DatabaseMetaData::getMaxUserNameLength); + return 16; } sal_Bool SAL_CALL ODatabaseMetaData::supportsResultSetType(sal_Int32 setType) { - return impl_getRSTypeMetaData("supportsResultSetType", &sql::DatabaseMetaData::supportsResultSetType, setType); + return setType == ResultSetType::SCROLL_SENSITIVE; } -sal_Bool SAL_CALL ODatabaseMetaData::supportsResultSetConcurrency(sal_Int32 setType, sal_Int32 concurrency) +sal_Bool SAL_CALL ODatabaseMetaData::supportsResultSetConcurrency(sal_Int32 /*setType*/, sal_Int32 /*concurrency*/) { - /* TODO: Check this out */ - try { - return meta->supportsResultSetConcurrency(setType, concurrency==css::sdbc::TransactionIsolation::READ_COMMITTED? - sql::TRANSACTION_READ_COMMITTED: - (concurrency == css::sdbc::TransactionIsolation::SERIALIZABLE? - sql::TRANSACTION_SERIALIZABLE:sql::TRANSACTION_SERIALIZABLE)); - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::supportsResultSetConcurrency", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::supportsResultSetConcurrency", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } return false; } -sal_Bool SAL_CALL ODatabaseMetaData::ownUpdatesAreVisible(sal_Int32 setType) +sal_Bool SAL_CALL ODatabaseMetaData::ownUpdatesAreVisible(sal_Int32 /*setType*/) { - return impl_getRSTypeMetaData("ownUpdatesAreVisible", &sql::DatabaseMetaData::ownUpdatesAreVisible, setType); + return false; } -sal_Bool SAL_CALL ODatabaseMetaData::ownDeletesAreVisible(sal_Int32 setType) +sal_Bool SAL_CALL ODatabaseMetaData::ownDeletesAreVisible(sal_Int32 /*setType*/) { - return impl_getRSTypeMetaData("ownDeletesAreVisible", &sql::DatabaseMetaData::ownDeletesAreVisible, setType); + return false; } -sal_Bool SAL_CALL ODatabaseMetaData::ownInsertsAreVisible(sal_Int32 setType) +sal_Bool SAL_CALL ODatabaseMetaData::ownInsertsAreVisible(sal_Int32 /*setType*/) { - return impl_getRSTypeMetaData("ownInsertsAreVisible", &sql::DatabaseMetaData::ownInsertsAreVisible, setType); + return false; } -sal_Bool SAL_CALL ODatabaseMetaData::othersUpdatesAreVisible(sal_Int32 setType) +sal_Bool SAL_CALL ODatabaseMetaData::othersUpdatesAreVisible(sal_Int32 /*setType*/) { - return impl_getRSTypeMetaData("othersUpdatesAreVisible", &sql::DatabaseMetaData::othersUpdatesAreVisible, setType); + return false; } -sal_Bool SAL_CALL ODatabaseMetaData::othersDeletesAreVisible(sal_Int32 setType) +sal_Bool SAL_CALL ODatabaseMetaData::othersDeletesAreVisible(sal_Int32 /*setType*/) { - return impl_getRSTypeMetaData("othersDeletesAreVisible", &sql::DatabaseMetaData::othersDeletesAreVisible, setType); + return false; } -sal_Bool SAL_CALL ODatabaseMetaData::othersInsertsAreVisible(sal_Int32 setType) +sal_Bool SAL_CALL ODatabaseMetaData::othersInsertsAreVisible(sal_Int32 /*setType*/) { - return impl_getRSTypeMetaData("othersInsertsAreVisible", &sql::DatabaseMetaData::othersInsertsAreVisible, setType); + return false; } -sal_Bool SAL_CALL ODatabaseMetaData::updatesAreDetected(sal_Int32 setType) +sal_Bool SAL_CALL ODatabaseMetaData::updatesAreDetected(sal_Int32 /*setType*/) { - return impl_getRSTypeMetaData("updatesAreDetected", &sql::DatabaseMetaData::updatesAreDetected, setType); + return false; } -sal_Bool SAL_CALL ODatabaseMetaData::deletesAreDetected(sal_Int32 setType) +sal_Bool SAL_CALL ODatabaseMetaData::deletesAreDetected(sal_Int32 /*setType*/) { - return impl_getRSTypeMetaData("deletesAreDetected", &sql::DatabaseMetaData::deletesAreDetected, setType); + return false; } -sal_Bool SAL_CALL ODatabaseMetaData::insertsAreDetected(sal_Int32 setType) +sal_Bool SAL_CALL ODatabaseMetaData::insertsAreDetected(sal_Int32 /*setType*/) { - return impl_getRSTypeMetaData("insertsAreDetected", &sql::DatabaseMetaData::insertsAreDetected, setType); + return false; } sal_Bool SAL_CALL ODatabaseMetaData::supportsBatchUpdates() { - return impl_getBoolMetaData("supportsBatchUpdates", &sql::DatabaseMetaData::supportsBatchUpdates); + return true; } Reference< XConnection > SAL_CALL ODatabaseMetaData::getConnection() @@ -937,29 +882,6 @@ 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); - std::vector< std::vector< Any > > rRows; - - try { - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - std::unique_ptr< sql::ResultSet> rset( meta->getCatalogs()); - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - for (sal_uInt32 i = 1; i <= columns; i++) { - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(rset->getString(i), encoding))); - } - rRows.push_back(aRow); - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getCatalogs", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getCatalogs", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - - lcl_setRows_throw(xResultSet, 0, rRows); return xResultSet; } @@ -968,31 +890,32 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getSchemas() Reference< XResultSet > xResultSet(getOwnConnection().getDriver().getFactory()->createInstance("org.openoffice.comp.helper.DatabaseMetaDataResultSet"),UNO_QUERY); std::vector< std::vector< Any > > rRows; - try { - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - std::unique_ptr< sql::ResultSet> rset( meta->getSchemas()); - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - bool informationSchema = false; - for (sal_uInt32 i = 1; i <= columns; i++) { - sql::SQLString columnStringValue = rset->getString(i); - if (i == 1) { // TABLE_SCHEM - informationSchema = (0 == columnStringValue.compare("information_schema")); - } - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(columnStringValue, encoding))); - } - if (!informationSchema ) { - rRows.push_back(aRow); + rtl::OUString sSql = m_rConnection.getMysqlVersion() > 49999? + rtl::OUString{"SELECT SCHEMA_NAME AS TABLE_SCHEM, CATALOG_NAME AS TABLE_CATALOG FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY SCHEMA_NAME"}: + rtl::OUString{"SHOW DATABASES"}; + + Reference< XStatement > statement = m_rConnection.createStatement(); + Reference< XInterface > executed = statement->executeQuery(sSql); + Reference< XResultSet > rs( executed, UNO_QUERY_THROW); + Reference< XResultSetMetaDataSupplier > supp( executed, UNO_QUERY_THROW); + Reference< XResultSetMetaData > rs_meta = supp->getMetaData(); + + Reference< XRow > xRow( rs, UNO_QUERY_THROW ); + sal_uInt32 columns = rs_meta->getColumnCount(); + while( rs->next() ) + { + std::vector< Any > aRow { Any() }; + bool informationSchema = false; + for (sal_uInt32 i = 1; i <= columns; i++) { + rtl::OUString columnStringValue = xRow->getString(i); + if (i == 1) { // TABLE_SCHEM + informationSchema = (0 == columnStringValue.equalsIgnoreAsciiCase("information_schema")); } + aRow.push_back(makeAny(columnStringValue)); + } + if (!informationSchema ) { + rRows.push_back(aRow); } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getSchemas", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getSchemas", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); } lcl_setRows_throw(xResultSet, 1, rRows); @@ -1000,142 +923,169 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getSchemas() } Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumnPrivileges( - const Any& catalog, + const Any& /*catalog*/, const rtl::OUString& schema, const rtl::OUString& table, const rtl::OUString& columnNamePattern) { - Reference< XResultSet > xResultSet(getOwnConnection().getDriver().getFactory()->createInstance("org.openoffice.comp.helper.DatabaseMetaDataResultSet"),UNO_QUERY); - std::vector< std::vector< Any > > rRows; + rtl::OUString query("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"); - std::string cat(catalog.hasValue()? rtl::OUStringToOString(getStringFromAny(catalog), m_rConnection.getConnectionEncoding()).getStr():""), - sch(rtl::OUStringToOString(schema, m_rConnection.getConnectionEncoding()).getStr()), - tab(rtl::OUStringToOString(table, m_rConnection.getConnectionEncoding()).getStr()), - cNamePattern(rtl::OUStringToOString(columnNamePattern, m_rConnection.getConnectionEncoding()).getStr()); - try { - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - std::unique_ptr< sql::ResultSet> rset( meta->getColumnPrivileges(cat, sch, tab, cNamePattern.compare("")? cNamePattern:wild)); - - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - for (sal_uInt32 i = 1; i <= columns; i++) { - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(rset->getString(i), encoding))); - } - rRows.push_back(aRow); - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getColumnPrivileges", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getColumnPrivileges", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } + query = query.replaceFirst("?", schema); + query = query.replaceFirst("?", table); + query = query.replaceFirst("?", columnNamePattern); - lcl_setRows_throw(xResultSet, 2, rRows); - return xResultSet; + Reference<XStatement> statement = m_rConnection.createStatement(); + Reference<XResultSet> rs = statement->executeQuery(query); + return rs; } Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumns( - const Any& catalog, - const rtl::OUString& schemaPattern, + const Any& /*catalog*/, + const rtl::OUString& /*schemaPattern*/, const rtl::OUString& tableNamePattern, const rtl::OUString& columnNamePattern) { - Reference< XResultSet > xResultSet(getOwnConnection().getDriver().getFactory()->createInstance("org.openoffice.comp.helper.DatabaseMetaDataResultSet"),UNO_QUERY); - std::vector< std::vector< Any > > rRows; - std::string cat(catalog.hasValue()? rtl::OUStringToOString(getStringFromAny(catalog), m_rConnection.getConnectionEncoding()).getStr():""), - sPattern(rtl::OUStringToOString(schemaPattern, m_rConnection.getConnectionEncoding()).getStr()), - tNamePattern(rtl::OUStringToOString(tableNamePattern, m_rConnection.getConnectionEncoding()).getStr()), - cNamePattern(rtl::OUStringToOString(columnNamePattern, m_rConnection.getConnectionEncoding()).getStr()); - - try { - std::unique_ptr< sql::ResultSet> rset( meta->getColumns(cat, - sPattern.compare("")? sPattern:wild, - tNamePattern.compare("")? tNamePattern:wild, - cNamePattern.compare("")? cNamePattern:wild)); - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - for (sal_uInt32 i = 1; i <= columns; i++) { - if (i == 5) { // ColumnType - sal_Int32 sdbc_type = mysqlc_sdbc_driver::mysqlToOOOType(atoi(rset->getString(i).c_str())); - aRow.push_back(makeAny(sdbc_type)); - } else { - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(rset->getString(i), encoding))); - } - } - rRows.push_back(aRow); - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getColumns", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getColumns", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); + rtl::OUStringBuffer queryBuf("SELECT TABLE_CATALOG AS TABLE_CAT, " // 1 + "TABLE_SCHEMA AS TABLE_SCHEM, " // 2 + "TABLE_NAME, " // 3 + "COLUMN_NAME, " // 4 + "DATA_TYPE, " // 5 + // TYPE_NAME missing + "CHARACTER_MAXIMUM_LENGTH, " // 6 + "NUMERIC_PRECISION, " // 7 + // buffer length missing + "NUMERIC_SCALE AS DECIMAL_DIGITS, " // 8 + // NUM_PREC_RADIX missing + // NULLABLE missing + "COLUMN_COMMENT AS REMARKS, " // 9 + "COLUMN_DEFAULT AS COLUMN_DEF," // 10 + "CHARACTER_OCTET_LENGTH, " // 11 + "ORDINAL_POSITION, " // 12 + "IS_NULLABLE, " // 13 + "COLUMN_TYPE " // 14 + "FROM INFORMATION_SCHEMA.COLUMNS " + "WHERE (1 = 1) "); + + if (!tableNamePattern.isEmpty()) + { + rtl::OUString sAppend; + if (tableNamePattern.match("%")) + sAppend = "AND TABLE_NAME LIKE '%' "; + else + sAppend = "AND TABLE_NAME = '%' "; + queryBuf.append(sAppend.replaceAll("%", tableNamePattern)); + } + if (!columnNamePattern.isEmpty()) + { + rtl::OUString sAppend; + if (columnNamePattern.match("%")) + sAppend = "AND COLUMN_NAME LIKE '%' "; + else + sAppend = "AND COLUMN_NAME = '%' "; + queryBuf.append(sAppend.replaceAll("%", columnNamePattern)); } - lcl_setRows_throw(xResultSet, 3, rRows); + + rtl::OUString query = queryBuf.makeStringAndClear(); + Reference<XStatement> statement = m_rConnection.createStatement(); + Reference<XResultSet> rs = statement->executeQuery(query.getStr()); + Reference<XRow> xRow( rs, UNO_QUERY_THROW ); + + Reference< XResultSet > xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( + "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),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))); + // schema name + aRow.push_back(makeAny(xRow->getString(2))); + // table name + aRow.push_back(makeAny(xRow->getString(3))); + // column name + aRow.push_back(makeAny(xRow->getString(4))); + // data type + rtl::OUString sDataType = xRow->getString(5); + aRow.push_back(makeAny(mysqlc_sdbc_driver::mysqlStrToOOOType(sDataType))); + // type name + aRow.push_back(makeAny(sDataType)); // TODO + // column size + sal_Int32 nColumnSize = 0; + rtl::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 + else if(sDataType.equalsIgnoreAsciiCase("date")) + nColumnSize = 10; + else if(sDataType.equalsIgnoreAsciiCase("date")) + nColumnSize = 8; + else if(sDataType.equalsIgnoreAsciiCase("datetime") + || sDataType.equalsIgnoreAsciiCase("timestamp")) + nColumnSize = 19; + else if(!bIsCharMax) + nColumnSize = xRow->getShort(7); // numeric precision + else + nColumnSize = nCharMaxLen; + aRow.push_back(makeAny(nColumnSize)); + aRow.push_back( Any() ); // buffer length - unused + // decimal digits (scale) + aRow.push_back(makeAny(xRow->getShort(8))); + // num_prec_radix + aRow.push_back(makeAny(sal_Int32(10))); + // nullable + rtl::OUString sIsNullable = xRow->getString(13); + if(xRow->wasNull()) + aRow.push_back(makeAny(ColumnValue::NULLABLE_UNKNOWN)); + else if(sIsNullable.equalsIgnoreAsciiCase("YES")) + aRow.push_back(makeAny(ColumnValue::NULLABLE)); + else + aRow.push_back(makeAny(ColumnValue::NO_NULLS)); + // remarks + aRow.push_back(makeAny(xRow->getString(9))); + // default + aRow.push_back(makeAny(xRow->getString(10))); + + aRow.push_back( Any{} ); // sql_data_type - unused + aRow.push_back( Any{} ); // sql_datetime_sub - unused + + // character octet length + aRow.push_back(makeAny(xRow->getString(11))); + // ordinal position + aRow.push_back(makeAny(xRow->getString(12))); + // is nullable + aRow.push_back(makeAny(sIsNullable)); + aRows.push_back(aRow); + } + lcl_setRows_throw(xResultSet, 1, aRows); return xResultSet; } Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTables( - const Any& catalog, + const Any& /*catalog*/, const rtl::OUString& schemaPattern, const rtl::OUString& tableNamePattern, - const Sequence< rtl::OUString >& types ) + const Sequence< rtl::OUString >& /*types */) { - sal_Int32 nLength = types.getLength(); + rtl::OUString query("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 '?' " + "ORDER BY TABLE_TYPE, TABLE_SCHEMA, TABLE_NAME"); - Reference< XResultSet > xResultSet(getOwnConnection(). - getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"),UNO_QUERY); - std::vector< std::vector< Any > > rRows; + // TODO use prepared stmt instead + // TODO escape schema, table name ? + query = query.replaceFirst("?", schemaPattern); + query = query.replaceFirst("?", tableNamePattern); - std::string cat(catalog.hasValue()? rtl::OUStringToOString(getStringFromAny(catalog), m_rConnection.getConnectionEncoding()).getStr():""), - sPattern(rtl::OUStringToOString(schemaPattern, m_rConnection.getConnectionEncoding()).getStr()), - tNamePattern(rtl::OUStringToOString(tableNamePattern, m_rConnection.getConnectionEncoding()).getStr()); - - std::list<sql::SQLString> tabTypes; - for (const rtl::OUString *pStart = types.getConstArray(), *p = pStart, *pEnd = pStart + nLength; p != pEnd; ++p) { - tabTypes.push_back(rtl::OUStringToOString(*p, m_rConnection.getConnectionEncoding()).getStr()); - } - - try { - std::unique_ptr< sql::ResultSet> rset( meta->getTables(cat, - sPattern.compare("")? sPattern:wild, - tNamePattern.compare("")? tNamePattern:wild, - tabTypes)); - - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - bool informationSchema = false; - for (sal_uInt32 i = 1; (i <= columns) && !informationSchema; ++i) { - sql::SQLString columnStringValue = rset->getString(i); - if (i == 2) { // TABLE_SCHEM - informationSchema = ( 0 == columnStringValue.compare("information_schema")); - } - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(columnStringValue, encoding))); - } - if (!informationSchema) { - rRows.push_back(aRow); - } - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getTables", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getTables", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - - lcl_setRows_throw(xResultSet, 4, rRows); - return xResultSet; + Reference<XStatement> statement = m_rConnection.createStatement(); + Reference<XResultSet> rs = statement->executeQuery(query); + return rs; } Reference< XResultSet > SAL_CALL ODatabaseMetaData::getProcedureColumns( @@ -1149,41 +1099,13 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getProcedureColumns( } Reference< XResultSet > SAL_CALL ODatabaseMetaData::getProcedures( - const Any& catalog, - const rtl::OUString& schemaPattern, - const rtl::OUString& procedureNamePattern) + const Any& /*catalog*/, + const rtl::OUString& /*schemaPattern*/, + const rtl::OUString& /*procedureNamePattern*/) { Reference< XResultSet > xResultSet(getOwnConnection().getDriver().getFactory()->createInstance("org.openoffice.comp.helper.DatabaseMetaDataResultSet"),UNO_QUERY); std::vector< std::vector< Any > > rRows; - - std::string cat(catalog.hasValue()? rtl::OUStringToOString(getStringFromAny(catalog), m_rConnection.getConnectionEncoding()).getStr():""), - sPattern(rtl::OUStringToOString(schemaPattern, m_rConnection.getConnectionEncoding()).getStr()), - procNamePattern(rtl::OUStringToOString(procedureNamePattern, m_rConnection.getConnectionEncoding()).getStr()); - - - try { - std::unique_ptr< sql::ResultSet> rset( meta->getProcedures(cat, - sPattern.compare("")? sPattern:wild, - procNamePattern.compare("")? procNamePattern:wild)); - - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - for (sal_uInt32 i = 1; i <= columns; i++) { - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(rset->getString(i), encoding))); - } - rRows.push_back(aRow); - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getProcedures", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getProcedures", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - + // TODO IMPL lcl_setRows_throw(xResultSet, 7,rRows); return xResultSet; } @@ -1200,283 +1122,101 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getVersionColumns( } Reference< XResultSet > SAL_CALL ODatabaseMetaData::getExportedKeys( - const Any& catalog , - const rtl::OUString& schema , - const rtl::OUString& table ) + const Any& /*catalog */, + const rtl::OUString& /*schema */, + const rtl::OUString& /*table */) { Reference< XResultSet > xResultSet(getOwnConnection().getDriver().getFactory()->createInstance("org.openoffice.comp.helper.DatabaseMetaDataResultSet"),UNO_QUERY); std::vector< std::vector< Any > > rRows; - std::string cat(catalog.hasValue()? rtl::OUStringToOString(getStringFromAny(catalog), m_rConnection.getConnectionEncoding()).getStr():""), - sch(rtl::OUStringToOString(schema, m_rConnection.getConnectionEncoding()).getStr()), - tab(rtl::OUStringToOString(table, m_rConnection.getConnectionEncoding()).getStr()); - - try { - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - std::unique_ptr< sql::ResultSet> rset( meta->getExportedKeys(cat, sch, tab)); - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - for (sal_uInt32 i = 1; i <= columns; i++) { - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(rset->getString(i), encoding))); - } - rRows.push_back(aRow); - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getExportedKeys", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getExportedKeys", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - + // TODO implement lcl_setRows_throw(xResultSet, 8, rRows); return xResultSet; } Reference< XResultSet > SAL_CALL ODatabaseMetaData::getImportedKeys( - const Any& catalog, - const rtl::OUString& schema, - const rtl::OUString& table) + const Any& /*catalog*/, + const rtl::OUString& /*schema*/, + const rtl::OUString& /*table*/) { Reference< XResultSet > xResultSet(getOwnConnection().getDriver().getFactory()->createInstance("org.openoffice.comp.helper.DatabaseMetaDataResultSet"),UNO_QUERY); std::vector< std::vector< Any > > rRows; - - std::string cat(catalog.hasValue()? rtl::OUStringToOString(getStringFromAny(catalog), m_rConnection.getConnectionEncoding()).getStr():""), - sch(rtl::OUStringToOString(schema, m_rConnection.getConnectionEncoding()).getStr()), - tab(rtl::OUStringToOString(table, m_rConnection.getConnectionEncoding()).getStr()); - - try { - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - std::unique_ptr< sql::ResultSet> rset( meta->getImportedKeys(cat, sch, tab)); - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - for (sal_uInt32 i = 1; i <= columns; i++) { - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(rset->getString(i), encoding))); - } - rRows.push_back(aRow); - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getImportedKeys", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getImportedKeys", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - + // TODO implement lcl_setRows_throw(xResultSet,9,rRows); return xResultSet; } Reference< XResultSet > SAL_CALL ODatabaseMetaData::getPrimaryKeys( - const Any& catalog, + const Any& /*catalog*/, const rtl::OUString& schema, const rtl::OUString& table) { - Reference< XResultSet > xResultSet(getOwnConnection().getDriver().getFactory()->createInstance("org.openoffice.comp.helper.DatabaseMetaDataResultSet"),UNO_QUERY); - std::vector< std::vector< Any > > rRows; - - std::string cat(catalog.hasValue()? rtl::OUStringToOString(getStringFromAny(catalog), m_rConnection.getConnectionEncoding()).getStr():""), - sch(rtl::OUStringToOString(schema, m_rConnection.getConnectionEncoding()).getStr()), - tab(rtl::OUStringToOString(table, m_rConnection.getConnectionEncoding()).getStr()); + rtl::OUString query("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"); - try { - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - std::unique_ptr< sql::ResultSet> rset( meta->getPrimaryKeys(cat, sch, tab)); - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - for (sal_uInt32 i = 1; i <= columns; i++) { - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(rset->getString(i), encoding))); - } - rRows.push_back(aRow); - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getPrimaryKeys", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getPrimaryKeys", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } + // TODO use prepared stmt instead + // TODO escape schema, table name ? + query = query.replaceFirst("?", schema); + query = query.replaceFirst("?", table); - lcl_setRows_throw(xResultSet, 10, rRows); - return xResultSet; + Reference<XStatement> statement = m_rConnection.createStatement(); + Reference<XResultSet> rs = statement->executeQuery(query); + return rs; } Reference< XResultSet > SAL_CALL ODatabaseMetaData::getIndexInfo( - const Any& catalog, - const rtl::OUString& schema, - const rtl::OUString& table, - sal_Bool unique, - sal_Bool approximate) + const Any& /*catalog*/, + const rtl::OUString& /*schema*/, + const rtl::OUString& /*table*/, + sal_Bool /*unique*/, + sal_Bool /*approximate*/) { Reference< XResultSet > xResultSet(getOwnConnection().getDriver().getFactory()->createInstance("org.openoffice.comp.helper.DatabaseMetaDataResultSet"),UNO_QUERY); std::vector< std::vector< Any > > rRows; - - std::string cat(catalog.hasValue()? rtl::OUStringToOString(getStringFromAny(catalog), m_rConnection.getConnectionEncoding()).getStr():""), - sch(rtl::OUStringToOString(schema, m_rConnection.getConnectionEncoding()).getStr()), - tab(rtl::OUStringToOString(table, m_rConnection.getConnectionEncoding()).getStr()); - - try { - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - std::unique_ptr< sql::ResultSet> rset( meta->getIndexInfo(cat, sch, tab, unique, approximate)); - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - for (sal_uInt32 i = 1; i <= columns; i++) { - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(rset->getString(i), encoding))); - } - rRows.push_back(aRow); - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getIndexInfo", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getIndexInfo", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - + // TODO lcl_setRows_throw(xResultSet, 11, rRows); return xResultSet; } Reference< XResultSet > SAL_CALL ODatabaseMetaData::getBestRowIdentifier( - const Any& catalog, - const rtl::OUString& schema, - const rtl::OUString& table, - sal_Int32 scope, - sal_Bool nullable) + const Any& /*catalog*/, + const rtl::OUString& /*schema*/, + const rtl::OUString& /*table*/, + sal_Int32 /*scope*/, + sal_Bool /*nullable*/) { Reference< XResultSet > xResultSet(getOwnConnection().getDriver().getFactory()->createInstance("org.openoffice.comp.helper.DatabaseMetaDataResultSet"),UNO_QUERY); std::vector< std::vector< Any > > rRows; - - std::string cat(catalog.hasValue()? rtl::OUStringToOString(getStringFromAny(catalog), m_rConnection.getConnectionEncoding()).getStr():""), - sch(rtl::OUStringToOString(schema, m_rConnection.getConnectionEncoding()).getStr()), - tab(rtl::OUStringToOString(table, m_rConnection.getConnectionEncoding()).getStr()); - - try { - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - std::unique_ptr< sql::ResultSet> rset( meta->getBestRowIdentifier(cat, sch, tab, scope, nullable)); - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - for (sal_uInt32 i = 1; i <= columns; i++) { - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(rset->getString(i), encoding))); - } - rRows.push_back(aRow); - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getBestRowIdentifier", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getBestRowIdentifier", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - + // TODO lcl_setRows_throw(xResultSet, 15, rRows); return xResultSet; } Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTablePrivileges( - const Any& catalog, - const rtl::OUString& schemaPattern, - const rtl::OUString& tableNamePattern) + const Any& /*catalog*/, + const rtl::OUString& /*schemaPattern*/, + const rtl::OUString& /*tableNamePattern*/) { Reference< XResultSet > xResultSet(getOwnConnection().getDriver().getFactory()->createInstance("org.openoffice.comp.helper.DatabaseMetaDataResultSet"),UNO_QUERY); std::vector< std::vector< Any > > rRows; - - std::string cat(catalog.hasValue()? rtl::OUStringToOString(getStringFromAny(catalog), m_rConnection.getConnectionEncoding()).getStr():""), - sPattern(rtl::OUStringToOString(schemaPattern, m_rConnection.getConnectionEncoding()).getStr()), - tPattern(rtl::OUStringToOString(tableNamePattern, m_rConnection.getConnectionEncoding()).getStr()); - - try { - static bool fakeTablePrivileges = false; - if (fakeTablePrivileges) { - static const sal_Char* allPrivileges[] = { - "ALTER", "DELETE", "DROP", "INDEX", "INSERT", "LOCK TABLES", "SELECT", "UPDATE" - }; - Any userName; userName <<= getUserName(); - for (size_t i = 0; i < SAL_N_ELEMENTS( allPrivileges ); ++i) { - std::vector< Any > aRow; - aRow.push_back(makeAny( sal_Int32( i ) )); - aRow.push_back(catalog); // TABLE_CAT - aRow.push_back(makeAny( schemaPattern )); // TABLE_SCHEM - aRow.push_back(makeAny( tableNamePattern )); // TABLE_NAME - aRow.push_back(Any()); // GRANTOR - aRow.push_back(userName); // GRANTEE - aRow.push_back(makeAny( rtl::OUString::createFromAscii( allPrivileges[i] ) )); // PRIVILEGE - aRow.push_back(Any()); // IS_GRANTABLE - - rRows.push_back(aRow); - } - } else { - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - std::unique_ptr< sql::ResultSet> rset( meta->getTablePrivileges(cat, sPattern.compare("")? sPattern:wild, tPattern.compare("")? tPattern:wild)); - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - for (sal_uInt32 i = 1; i <= columns; i++) { - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(rset->getString(i), encoding))); - } - rRows.push_back(aRow); - } - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getTablePrivileges", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getTablePrivileges", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - + // TODO lcl_setRows_throw(xResultSet,12,rRows); return xResultSet; } Reference< XResultSet > SAL_CALL ODatabaseMetaData::getCrossReference( - const Any& primaryCatalog, - const rtl::OUString& primarySchema_, - const rtl::OUString& primaryTable_, - const Any& foreignCatalog, - const rtl::OUString& foreignSchema, - const rtl::OUString& foreignTable) + const Any& /*primaryCatalog*/, + const rtl::OUString& /*primarySchema_*/, + const rtl::OUString& /*primaryTable_*/, + const Any& /*foreignCatalog*/, + const rtl::OUString& /*foreignSchema*/, + const rtl::OUString& /*foreignTable*/) { Reference< XResultSet > xResultSet(getOwnConnection().getDriver().getFactory()->createInstance("org.openoffice.comp.helper.DatabaseMetaDataResultSet"),UNO_QUERY); std::vector< std::vector< Any > > rRows; - - std::string primaryCat(primaryCatalog.hasValue()? rtl::OUStringToOString(getStringFromAny(primaryCatalog), m_rConnection.getConnectionEncoding()).getStr():""), - foreignCat(foreignCatalog.hasValue()? rtl::OUStringToOString(getStringFromAny(foreignCatalog), m_rConnection.getConnectionEncoding()).getStr():""), - primarySchema(rtl::OUStringToOString(primarySchema_, m_rConnection.getConnectionEncoding()).getStr()), - primaryTable(rtl::OUStringToOString(primaryTable_, m_rConnection.getConnectionEncoding()).getStr()), - fSchema(rtl::OUStringToOString(foreignSchema, m_rConnection.getConnectionEncoding()).getStr()), - fTable(rtl::OUStringToOString(foreignTable, m_rConnection.getConnectionEncoding()).getStr()); - - try { - rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); - std::unique_ptr< sql::ResultSet> rset( meta->getCrossReference(primaryCat, primarySchema, primaryTable, foreignCat, fSchema, fTable)); - sql::ResultSetMetaData * rs_meta = rset->getMetaData(); - sal_uInt32 columns = rs_meta->getColumnCount(); - while (rset->next()) { - std::vector< Any > aRow { Any() }; - for (sal_uInt32 i = 1; i <= columns; i++) { - aRow.push_back(makeAny(mysqlc_sdbc_driver::convert(rset->getString(i), encoding))); - } - rRows.push_back(aRow); - } - } catch (const sql::MethodNotImplementedException &) { - mysqlc_sdbc_driver::throwFeatureNotImplementedException("ODatabaseMetaData::getCrossReference", *this); - } catch (const sql::InvalidArgumentException &) { - mysqlc_sdbc_driver::throwInvalidArgumentException("ODatabaseMetaData::getCrossReference", *this); - } catch (const sql::SQLException& e) { - mysqlc_sdbc_driver::translateAndThrow(e, *this, m_rConnection.getConnectionEncoding()); - } - + // TODO lcl_setRows_throw(xResultSet,13,rRows); return xResultSet; } @@ -1491,13 +1231,4 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getUDTs( return nullptr; } -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: noet sw=4 ts=4 fdm=marker - * vim<600: noet sw=4 ts=4 - */ - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/mysqlc/source/mysqlc_databasemetadata.hxx b/mysqlc/source/mysqlc_databasemetadata.hxx index 9f09e534215d..3801acadc4a7 100644 --- a/mysqlc/source/mysqlc_databasemetadata.hxx +++ b/mysqlc/source/mysqlc_databasemetadata.hxx @@ -42,7 +42,7 @@ namespace connectivity class ODatabaseMetaData final : public ODatabaseMetaData_BASE { OConnection& m_rConnection; - sql::DatabaseMetaData * meta; + MYSQL * m_pMySql; rtl::OUString identifier_quote_string; bool identifier_quote_string_set; @@ -56,7 +56,7 @@ namespace connectivity public: const OConnection& getOwnConnection() const { return m_rConnection; } - explicit ODatabaseMetaData(OConnection& _rCon); + explicit ODatabaseMetaData(OConnection& _rCon, MYSQL* pMySql); virtual ~ODatabaseMetaData(); // as I mentioned before this interface is really BIG diff --git a/mysqlc/source/mysqlc_driver.cxx b/mysqlc/source/mysqlc_driver.cxx index 319fc963cc39..efbc0777d57c 100644 --- a/mysqlc/source/mysqlc_driver.cxx +++ b/mysqlc/source/mysqlc_driver.cxx @@ -198,7 +198,7 @@ Reference< XConnection > SAL_CALL MysqlCDriver::connect(const rtl::OUString& url Reference< XConnection > xConn; // create a new connection with the given properties and append it to our vector try { - OConnection* pCon = new OConnection(*this, cppDriver); + OConnection* pCon = new OConnection(*this); xConn = pCon; pCon->construct(url,info); diff --git a/mysqlc/source/mysqlc_general.cxx b/mysqlc/source/mysqlc_general.cxx index 2c4eb1f53853..8f3d0ed619d2 100644 --- a/mysqlc/source/mysqlc_general.cxx +++ b/mysqlc/source/mysqlc_general.cxx @@ -19,8 +19,7 @@ #include "mysqlc_general.hxx" #include "mysqlc_resultsetmetadata.hxx" -#include <cppconn/exception.h> -#include <cppconn/datatype.h> +#include <rtl/ustring.hxx> using com::sun::star::sdbc::SQLException; @@ -28,10 +27,77 @@ using com::sun::star::uno::Reference; using com::sun::star::uno::XInterface; using com::sun::star::uno::Any; +using namespace rtl; + namespace mysqlc_sdbc_driver { -void throwFeatureNotImplementedException( const sal_Char* _pAsciiFeatureName, const Reference< XInterface >& _rxContext ) +void allocateSqlVar(void** mem, enum_field_types eType, unsigned nSize) +{ + assert(mem); + switch(eType) + { + case MYSQL_TYPE_LONG: + case MYSQL_TYPE_INT24: + *mem = malloc(sizeof(sal_Int32)); + break; + case MYSQL_TYPE_SHORT: + *mem = malloc(sizeof(sal_Int16)); + break; + case MYSQL_TYPE_BIT: + case MYSQL_TYPE_TINY: + *mem = malloc(sizeof(sal_Int8)); + break; + case MYSQL_TYPE_LONGLONG: + *mem = malloc(sizeof(sal_Int64)); + break; ... etc. - the rest is truncated _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits