[Libreoffice-commits] core.git: mysqlc/Library_mysqlc.mk mysqlc/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Sun Aug 12 21:15:42 UTC 2018
mysqlc/Library_mysqlc.mk | 3
mysqlc/source/mysqlc_connection.cxx | 140 +--
mysqlc/source/mysqlc_connection.hxx | 19
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 | 510 ++++--------
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 | 103 +-
mysqlc/source/mysqlc_statement.hxx | 12
18 files changed, 2724 insertions(+), 1677 deletions(-)
New commits:
commit 3478d7453a3d65b3d8d164e8f898a0b79f005c58
Author: Tamas Bunth <tamas.bunth at collabora.co.uk>
AuthorDate: Sun Jun 17 18:09:43 2018 +0200
Commit: Tamás Bunth <btomi96 at gmail.com>
CommitDate: Sun Aug 12 23:15:21 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 <btomi96 at gmail.com>
Tested-by: Tamás Bunth <btomi96 at gmail.com>
diff --git a/mysqlc/Library_mysqlc.mk b/mysqlc/Library_mysqlc.mk
index 97f2b63500a2..39c6230d2f05 100644
--- a/mysqlc/Library_mysqlc.mk
+++ b/mysqlc/Library_mysqlc.mk
@@ -12,12 +12,14 @@ $(eval $(call gb_Library_Library,mysqlc))
$(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 -lm)) \
+ $(if $(filter LINUX,$(OS)),-lpthread -ldl,) \
))
endif
@@ -46,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 \
diff --git a/mysqlc/source/mysqlc_connection.cxx b/mysqlc/source/mysqlc_connection.cxx
index c9b4c6d2e471..73581734a293 100644
--- a/mysqlc/source/mysqlc_connection.cxx
+++ b/mysqlc/source/mysqlc_connection.cxx
@@ -61,12 +61,25 @@ 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)
,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()
@@ -144,29 +157,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(static_cast<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
}
@@ -182,9 +188,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()
@@ -213,7 +219,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) {
@@ -226,18 +232,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;
}
@@ -269,11 +277,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()
@@ -281,6 +286,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);
@@ -297,22 +303,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()
@@ -329,12 +331,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;
}
@@ -363,6 +362,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());
@@ -376,6 +376,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());
@@ -467,6 +468,7 @@ void SAL_CALL OConnection::close()
MutexGuard aGuard(m_aMutex);
checkDisposed(OConnection_BASE::rBHelper.bDisposed);
}
+ mysql_close(&m_mysql);
dispose();
}
@@ -507,15 +509,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)
@@ -539,13 +534,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 a305d6a9ab89..72af3c89e886 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>
@@ -85,6 +87,8 @@ namespace connectivity
class OConnection final : public OBase_Mutex,
public 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;
@@ -98,9 +102,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();
@@ -108,7 +112,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; }
@@ -184,13 +188,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 18e2db4cb9ae..40cab769e912 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;
+ case MYSQL_TYPE_FLOAT:
+ *mem = malloc(sizeof(float));
+ break;
+ case MYSQL_TYPE_DOUBLE:
+ *mem = malloc(sizeof(double));
+ break;
+ case MYSQL_TYPE_DATE:
+ case MYSQL_TYPE_TIME:
+ case MYSQL_TYPE_DATETIME:
+ case MYSQL_TYPE_TIMESTAMP:
+ case MYSQL_TYPE_YEAR: // FIXME below
+ case MYSQL_TYPE_NEWDATE:
+ case MYSQL_TYPE_ENUM:
+ case MYSQL_TYPE_SET:
+ case MYSQL_TYPE_GEOMETRY:
+ *mem = malloc(sizeof(MYSQL_TIME));
+ break;
+ case MYSQL_TYPE_STRING:
+ case MYSQL_TYPE_VAR_STRING:
+ case MYSQL_TYPE_VARCHAR:
+ case MYSQL_TYPE_DECIMAL:
+ case MYSQL_TYPE_NEWDECIMAL:
+ *mem = malloc(sizeof(char)*nSize);
+ break;
+ case MYSQL_TYPE_NULL:
+ case MYSQL_TYPE_BLOB:
+ case MYSQL_TYPE_TINY_BLOB:
+ case MYSQL_TYPE_MEDIUM_BLOB:
+ case MYSQL_TYPE_LONG_BLOB:
+ *mem = nullptr;
+ break;
+ default:
+ SAL_WARN("connectivity","unknown enum_field_type");
+ }
+}
+
+/// Use this intead of mysql_real_escape_string, because that one also escapes
+/// single quote ('), which should not be escaped
+rtl::OString escapeSql( const rtl::OString& from )
+{
+ rtl::OString sRet = from.replaceAll("\\", "\\\\");
+ sRet = sRet.replaceAll("\"", "\\\"");
+ sRet = sRet.replaceAll("`", "\\`");
+ return sRet;
+}
+
+void throwFeatureNotImplementedException( const sal_Char* _pAsciiFeatureName, const css::uno::Reference< XInterface >& _rxContext )
{
const rtl::OUString sMessage = rtl::OUString::createFromAscii( _pAsciiFeatureName ) + ": feature not implemented.";
throw SQLException(
@@ -43,7 +109,7 @@ void throwFeatureNotImplementedException( const sal_Char* _pAsciiFeatureName, co
);
}
-void throwInvalidArgumentException( const sal_Char* _pAsciiFeatureName, const Reference< XInterface >& _rxContext )
+void throwInvalidArgumentException( const sal_Char* _pAsciiFeatureName, const css::uno::Reference< XInterface >& _rxContext )
{
const rtl::OUString sMessage = rtl::OUString::createFromAscii( _pAsciiFeatureName ) + ": invalid arguments.";
throw SQLException(
@@ -66,6 +132,14 @@ void translateAndThrow(const ::sql::SQLException& _error, const css::uno::Refere
);
}
+void throwSQLExceptionWithMsg(const char* msg, unsigned int errorNum, const css::uno::Reference< css::uno::XInterface >& _context, const rtl_TextEncoding encoding)
+{
+ rtl::OString errorMsg{msg};
+ // TODO error code?
+ throw SQLException( rtl::OStringToOUString(errorMsg, encoding),
+ _context, rtl::OUString(), errorNum, Any());
+}
+
rtl::OUString getStringFromAny(const Any& _rAny)
{
rtl::OUString nReturn;
@@ -73,77 +147,195 @@ rtl::OUString getStringFromAny(const Any& _rAny)
return nReturn;
}
-int mysqlToOOOType(int cppConnType)
- throw ()
+int mysqlToOOOType(int eType, int charsetnr) noexcept
{
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list