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.bu...@collabora.co.uk>
AuthorDate: Sun Jun 17 18:09:43 2018 +0200
Commit:     Tamás Bunth <btom...@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 <btom...@gmail.com>
    Tested-by: Tamás Bunth <btom...@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
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to