[Libreoffice-commits] core.git: connectivity/Configuration_mysql_jdbc.mk connectivity/Library_mysql_jdbc.mk connectivity/Module_connectivity.mk connectivity/registry connectivity/source dbaccess/source postprocess/CustomTarget_registry.mk postprocess/Rdb_services.mk Repository.mk

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Sun Oct 14 20:16:25 UTC 2018


 Repository.mk                                                                 |    1 
 connectivity/Configuration_mysql_jdbc.mk                                      |   20 
 connectivity/Library_mysql_jdbc.mk                                            |   48 +
 connectivity/Module_connectivity.mk                                           |    2 
 connectivity/registry/mysql_jdbc/org/openoffice/Office/DataAccess/Drivers.xcu |  249 +++++
 connectivity/source/drivers/mysql_jdbc/YCatalog.cxx                           |  133 +++
 connectivity/source/drivers/mysql_jdbc/YColumns.cxx                           |   74 +
 connectivity/source/drivers/mysql_jdbc/YDriver.cxx                            |  435 ++++++++++
 connectivity/source/drivers/mysql_jdbc/YTable.cxx                             |  336 +++++++
 connectivity/source/drivers/mysql_jdbc/YTables.cxx                            |  216 ++++
 connectivity/source/drivers/mysql_jdbc/YUser.cxx                              |  324 +++++++
 connectivity/source/drivers/mysql_jdbc/YUsers.cxx                             |  101 ++
 connectivity/source/drivers/mysql_jdbc/YViews.cxx                             |  146 +++
 connectivity/source/drivers/mysql_jdbc/Yservices.cxx                          |   66 +
 connectivity/source/drivers/mysql_jdbc/mysql_jdbc.component                   |   26 
 dbaccess/source/ui/dlg/generalpage.cxx                                        |    4 
 dbaccess/source/ui/dlg/generalpage.hxx                                        |    5 
 postprocess/CustomTarget_registry.mk                                          |    5 
 postprocess/Rdb_services.mk                                                   |    1 
 19 files changed, 2190 insertions(+), 2 deletions(-)

New commits:
commit b2cefc2e36925b4384eb0aea54aa2c6bcfb018a8
Author:     Tamas Bunth <tamas.bunth at collabora.co.uk>
AuthorDate: Mon Oct 8 11:04:48 2018 +0200
Commit:     Tamás Bunth <btomi96 at gmail.com>
CommitDate: Sun Oct 14 22:16:05 2018 +0200

    Revert removal of mysql jdbc connector
    
    And also make some minor fixes so it cooperates with the new mysqlc
    library.
    
    Change-Id: I866add99a699150c6550ee7f7ff2ee947e07117c
    Reviewed-on: https://gerrit.libreoffice.org/61648
    Tested-by: Jenkins
    Reviewed-by: Tamás Bunth <btomi96 at gmail.com>

diff --git a/Repository.mk b/Repository.mk
index 7376e0391d6f..f7162e48e080 100644
--- a/Repository.mk
+++ b/Repository.mk
@@ -403,6 +403,7 @@ $(eval $(call gb_Helper_register_libraries_for_install,OOOLIBS,ooo, \
 	msfilter \
 	$(call gb_Helper_optional,SCRIPTING,msforms) \
 	mtfrenderer \
+	$(call gb_Helper_optional,DBCONNECTIVITY,mysql_jdbc) \
 	$(call gb_Helper_optional,DBCONNECTIVITY,mysqlc) \
 	numbertext \
 	odbc \
diff --git a/connectivity/Configuration_mysql_jdbc.mk b/connectivity/Configuration_mysql_jdbc.mk
new file mode 100644
index 000000000000..27a672aad9b3
--- /dev/null
+++ b/connectivity/Configuration_mysql_jdbc.mk
@@ -0,0 +1,20 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_Configuration_Configuration,driver_mysql_jdbc))
+
+$(eval $(call gb_Configuration_add_spool_modules,driver_mysql_jdbc,connectivity/registry/mysql_jdbc,\
+	org/openoffice/Office/DataAccess/Drivers-mysql_jdbc.xcu \
+))
+
+$(eval $(call gb_Configuration_add_localized_datas,driver_mysql_jdbc,connectivity/registry/mysql_jdbc,\
+	org/openoffice/Office/DataAccess/Drivers.xcu \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/connectivity/Library_mysql_jdbc.mk b/connectivity/Library_mysql_jdbc.mk
new file mode 100644
index 000000000000..3e92a7e19622
--- /dev/null
+++ b/connectivity/Library_mysql_jdbc.mk
@@ -0,0 +1,48 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_Library_Library,mysql_jdbc))
+
+$(eval $(call gb_Library_set_componentfile,mysql_jdbc,connectivity/source/drivers/mysql_jdbc/mysql_jdbc))
+
+$(eval $(call gb_Library_use_external,mysql_jdbc,boost_headers))
+
+$(eval $(call gb_Library_use_sdk_api,mysql_jdbc))
+
+$(eval $(call gb_Library_set_include,mysql_jdbc,\
+	$$(INCLUDE) \
+	-I$(SRCDIR)/connectivity/inc \
+	-I$(SRCDIR)/connectivity/source/inc \
+))
+
+$(eval $(call gb_Library_set_precompiled_header,mysql_jdbc,$(SRCDIR)/connectivity/inc/pch/precompiled_mysql))
+
+$(eval $(call gb_Library_use_libraries,mysql_jdbc,\
+	cppu \
+	cppuhelper \
+	sal \
+	salhelper \
+	dbtools \
+	comphelper \
+))
+
+$(eval $(call gb_Library_add_exception_objects,mysql_jdbc,\
+	connectivity/source/drivers/mysql_jdbc/YDriver \
+	connectivity/source/drivers/mysql_jdbc/YTables \
+	connectivity/source/drivers/mysql_jdbc/YTable \
+	connectivity/source/drivers/mysql_jdbc/YViews \
+	connectivity/source/drivers/mysql_jdbc/YCatalog \
+	connectivity/source/drivers/mysql_jdbc/YColumns \
+	connectivity/source/drivers/mysql_jdbc/YUser \
+	connectivity/source/drivers/mysql_jdbc/YUsers \
+	connectivity/source/drivers/mysql_jdbc/Yservices \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/connectivity/Module_connectivity.mk b/connectivity/Module_connectivity.mk
index 0fc587daa340..dec95bd4133b 100644
--- a/connectivity/Module_connectivity.mk
+++ b/connectivity/Module_connectivity.mk
@@ -40,6 +40,8 @@ ifneq ($(ENABLE_JAVA),)
 $(eval $(call gb_Module_add_targets,connectivity,\
 	Configuration_hsqldb \
 	Configuration_jdbc \
+	Configuration_mysql_jdbc \
+	Library_mysql_jdbc \
 	Jar_sdbc_hsqldb \
 	Library_hsqldb \
 	Library_jdbc \
diff --git a/connectivity/registry/mysql_jdbc/org/openoffice/Office/DataAccess/Drivers.xcu b/connectivity/registry/mysql_jdbc/org/openoffice/Office/DataAccess/Drivers.xcu
new file mode 100644
index 000000000000..cae8f705618e
--- /dev/null
+++ b/connectivity/registry/mysql_jdbc/org/openoffice/Office/DataAccess/Drivers.xcu
@@ -0,0 +1,249 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ -->
+<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:install="http://openoffice.org/2004/installation" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <node oor:name="Installed" install:module="mysql_jdbc">
+    <node oor:name="sdbc:mysql:jdbc:*" oor:op="replace">
+      <prop oor:name="Driver">
+        <value>org.openoffice.comp.drivers.MySQL.Driver</value>
+      </prop>
+      <prop oor:name="DriverTypeDisplayName" oor:type="xs:string">
+        <value xml:lang="en-US">MySQL (JDBC)</value>
+      </prop>
+      <node oor:name="Properties">
+        <node oor:name="CharSet" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:string">
+            <value></value>
+          </prop>
+        </node>
+        <node oor:name="JavaDriverClass" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:string">
+            <value>com.mysql.jdbc.Driver</value>
+          </prop>
+        </node>
+        <node oor:name="AddIndexAppendix" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+      </node>
+      <node oor:name="Features">
+        <node oor:name="UseKeywordAsBeforeAlias" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="IgnoreDriverPrivileges" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="DisplayVersionColumns" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="UseDOSLineEnds" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="BooleanComparisonMode" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="FormsCheckRequiredFields" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+      </node>
+      <node oor:name="MetaData">
+        <node oor:name="SupportsTableCreation" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="UseJava" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="Authentication" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:string">
+            <value>UserPassword</value>
+          </prop>
+        </node>
+        <node oor:name="SupportsColumnDescription" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+      </node>
+    </node>
+    <node oor:name="sdbc:mysql:odbc:*" oor:op="replace">
+      <prop oor:name="Driver">
+        <value>org.openoffice.comp.drivers.MySQL.Driver</value>
+      </prop>
+      <prop oor:name="DriverTypeDisplayName" oor:type="xs:string">
+        <value xml:lang="en-US">MySQL (ODBC)</value>
+      </prop>
+      <node oor:name="Properties">
+        <node oor:name="CharSet" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:string">
+            <value></value>
+          </prop>
+        </node>
+        <node oor:name="AddIndexAppendix" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+      </node>
+      <node oor:name="Features">
+        <node oor:name="UseKeywordAsBeforeAlias" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="IgnoreDriverPrivileges" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="DisplayVersionColumns" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="UseDOSLineEnds" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="BooleanComparisonMode" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="FormsCheckRequiredFields" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+      </node>
+      <node oor:name="MetaData">
+        <node oor:name="SupportsTableCreation" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="SupportsBrowsing" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="Authentication" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:string">
+            <value>UserPassword</value>
+          </prop>
+        </node>
+      </node>
+    </node>
+    <node oor:name="sdbc:mysql:mysqlc:*" oor:op="replace">
+      <prop oor:name="Driver">
+        <value>org.openoffice.comp.drivers.MySQL.Driver</value>
+      </prop>
+      <prop oor:name="DriverTypeDisplayName" oor:type="xs:string">
+        <value xml:lang="en-US">MySQL (Native)</value>
+      </prop>
+      <node oor:name="Properties">
+        <node oor:name="CharSet" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:string">
+            <value></value>
+          </prop>
+        </node>
+        <node oor:name="LocalSocket" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:string">
+            <value></value>
+          </prop>
+        </node>
+        <node oor:name="NamedPipe" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:string">
+            <value></value>
+          </prop>
+        </node>
+        <node oor:name="AddIndexAppendix" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+      </node>
+      <node oor:name="Features">
+        <node oor:name="UseKeywordAsBeforeAlias" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="IgnoreDriverPrivileges" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="DisplayVersionColumns" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="UseDOSLineEnds" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="BooleanComparisonMode" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="FormsCheckRequiredFields" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+      </node>
+      <node oor:name="MetaData">
+        <node oor:name="SupportsTableCreation" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+        <node oor:name="Authentication" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:string">
+            <value>UserPassword</value>
+          </prop>
+        </node>
+        <node oor:name="SupportsColumnDescription" oor:op="replace">
+          <prop oor:name="Value" oor:type="xs:boolean">
+            <value>true</value>
+          </prop>
+        </node>
+      </node>
+    </node>
+  </node>
+</oor:component-data>
diff --git a/connectivity/source/drivers/mysql_jdbc/YCatalog.cxx b/connectivity/source/drivers/mysql_jdbc/YCatalog.cxx
new file mode 100644
index 000000000000..2c84d204f2bc
--- /dev/null
+++ b/connectivity/source/drivers/mysql_jdbc/YCatalog.cxx
@@ -0,0 +1,133 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <mysql/YCatalog.hxx>
+#include <mysql/YUsers.hxx>
+#include <mysql/YTables.hxx>
+#include <mysql/YViews.hxx>
+#include <com/sun/star/sdbc/XRow.hpp>
+#include <com/sun/star/sdbc/XResultSet.hpp>
+#include <comphelper/types.hxx>
+
+using namespace connectivity;
+using namespace connectivity::mysql;
+using namespace connectivity::sdbcx;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+OMySQLCatalog::OMySQLCatalog(const Reference<XConnection>& _xConnection)
+    : OCatalog(_xConnection)
+    , m_xConnection(_xConnection)
+{
+}
+
+void OMySQLCatalog::refreshObjects(const Sequence<OUString>& _sKindOfObject,
+                                   ::std::vector<OUString>& _rNames)
+{
+    Reference<XResultSet> xResult = m_xMetaData->getTables(Any(), "%", "%", _sKindOfObject);
+    fillNames(xResult, _rNames);
+}
+
+void OMySQLCatalog::refreshTables()
+{
+    ::std::vector<OUString> aVector;
+
+    Sequence<OUString> sTableTypes(3);
+    sTableTypes[0] = "VIEW";
+    sTableTypes[1] = "TABLE";
+    sTableTypes[2] = "%"; // just to be sure to include anything else ....
+
+    refreshObjects(sTableTypes, aVector);
+
+    if (m_pTables)
+        m_pTables->reFill(aVector);
+    else
+        m_pTables.reset(new OTables(m_xMetaData, *this, m_aMutex, aVector));
+}
+
+void OMySQLCatalog::refreshViews()
+{
+    Sequence<OUString> aTypes{ "VIEW" };
+
+    // let's simply assume the server is new enough to support views. Current drivers
+    // as of this writing might not return the proper information in getTableTypes, so
+    // don't rely on it.
+
+    ::std::vector<OUString> aVector;
+    refreshObjects(aTypes, aVector);
+
+    if (m_pViews)
+        m_pViews->reFill(aVector);
+    else
+        m_pViews.reset(new OViews(m_xMetaData, *this, m_aMutex, aVector));
+}
+
+void OMySQLCatalog::refreshGroups() {}
+
+void OMySQLCatalog::refreshUsers()
+{
+    ::std::vector<OUString> aVector;
+    Reference<XStatement> xStmt = m_xConnection->createStatement();
+    Reference<XResultSet> xResult = xStmt->executeQuery(
+        "SELECT grantee FROM information_schema.user_privileges GROUP BY grantee");
+    if (xResult.is())
+    {
+        Reference<XRow> xRow(xResult, UNO_QUERY);
+        while (xResult->next())
+            aVector.push_back(xRow->getString(1));
+        ::comphelper::disposeComponent(xResult);
+    }
+    ::comphelper::disposeComponent(xStmt);
+
+    if (m_pUsers)
+        m_pUsers->reFill(aVector);
+    else
+        m_pUsers.reset(new OUsers(*this, m_aMutex, aVector, m_xConnection, this));
+}
+
+Any SAL_CALL OMySQLCatalog::queryInterface(const Type& rType)
+{
+    if (rType == cppu::UnoType<XGroupsSupplier>::get())
+        return Any();
+
+    return OCatalog::queryInterface(rType);
+}
+
+Sequence<Type> SAL_CALL OMySQLCatalog::getTypes()
+{
+    Sequence<Type> aTypes = OCatalog::getTypes();
+    std::vector<Type> aOwnTypes;
+    aOwnTypes.reserve(aTypes.getLength());
+    const Type* pBegin = aTypes.getConstArray();
+    const Type* pEnd = pBegin + aTypes.getLength();
+    for (; pBegin != pEnd; ++pBegin)
+    {
+        if (!(*pBegin == cppu::UnoType<XGroupsSupplier>::get()))
+        {
+            aOwnTypes.push_back(*pBegin);
+        }
+    }
+    return Sequence<Type>(aOwnTypes.data(), aOwnTypes.size());
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/mysql_jdbc/YColumns.cxx b/connectivity/source/drivers/mysql_jdbc/YColumns.cxx
new file mode 100644
index 000000000000..cb55be53dbd5
--- /dev/null
+++ b/connectivity/source/drivers/mysql_jdbc/YColumns.cxx
@@ -0,0 +1,74 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <mysql/YColumns.hxx>
+#include <TConnection.hxx>
+
+using namespace ::comphelper;
+using namespace connectivity::mysql;
+using namespace connectivity::sdbcx;
+using namespace connectivity;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+OMySQLColumns::OMySQLColumns(::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex,
+                             const ::std::vector<OUString>& _rVector)
+    : OColumnsHelper(_rParent, true /*_bCase*/, _rMutex, _rVector, true /*_bUseHardRef*/)
+{
+}
+
+Reference<XPropertySet> OMySQLColumns::createDescriptor() { return new OMySQLColumn; }
+
+OMySQLColumn::OMySQLColumn()
+    : connectivity::sdbcx::OColumn(true)
+{
+    construct();
+}
+
+void OMySQLColumn::construct()
+{
+    m_sAutoIncrement = "auto_increment";
+    registerProperty(
+        OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_AUTOINCREMENTCREATION),
+        PROPERTY_ID_AUTOINCREMENTCREATION, 0, &m_sAutoIncrement,
+        cppu::UnoType<decltype(m_sAutoIncrement)>::get());
+}
+
+::cppu::IPropertyArrayHelper* OMySQLColumn::createArrayHelper(sal_Int32 /*_nId*/) const
+{
+    return doCreateArrayHelper();
+}
+
+::cppu::IPropertyArrayHelper& SAL_CALL OMySQLColumn::getInfoHelper()
+{
+    return *OMySQLColumn_PROP::getArrayHelper(isNew() ? 1 : 0);
+}
+
+Sequence<OUString> SAL_CALL OMySQLColumn::getSupportedServiceNames()
+{
+    Sequence<OUString> aSupported{ "com.sun.star.sdbcx.Column" };
+
+    return aSupported;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/mysql_jdbc/YDriver.cxx b/connectivity/source/drivers/mysql_jdbc/YDriver.cxx
new file mode 100644
index 000000000000..b6345f401615
--- /dev/null
+++ b/connectivity/source/drivers/mysql_jdbc/YDriver.cxx
@@ -0,0 +1,435 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <mysql/YDriver.hxx>
+#include <mysql/YCatalog.hxx>
+#include <comphelper/namedvaluecollection.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/types.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <connectivity/dbexception.hxx>
+#include <connectivity/dbcharset.hxx>
+#include <com/sun/star/sdbc/DriverManager.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <TConnection.hxx>
+#include <strings.hrc>
+#include <resource/sharedresources.hxx>
+
+namespace connectivity
+{
+using namespace mysql;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::lang;
+
+namespace mysql
+{
+Reference<XInterface>
+ODriverDelegator_CreateInstance(const Reference<css::lang::XMultiServiceFactory>& _rxFac)
+{
+    return *(new ODriverDelegator(comphelper::getComponentContext(_rxFac)));
+}
+}
+
+namespace
+{
+OUString getJavaDriverClass(css::uno::Sequence<css::beans::PropertyValue> const& info)
+{
+    return comphelper::NamedValueCollection(info).getOrDefault("JavaDriverClass",
+                                                               OUString("com.mysql.jdbc.Driver"));
+}
+}
+
+ODriverDelegator::ODriverDelegator(const Reference<XComponentContext>& _rxContext)
+    : ODriverDelegator_BASE(m_aMutex)
+    , m_xContext(_rxContext)
+{
+}
+
+ODriverDelegator::~ODriverDelegator()
+{
+    try
+    {
+        ::comphelper::disposeComponent(m_xODBCDriver);
+        ::comphelper::disposeComponent(m_xNativeDriver);
+        TJDBCDrivers::iterator aIter = m_aJdbcDrivers.begin();
+        TJDBCDrivers::const_iterator aEnd = m_aJdbcDrivers.end();
+        for (; aIter != aEnd; ++aIter)
+            ::comphelper::disposeComponent(aIter->second);
+    }
+    catch (const Exception&)
+    {
+    }
+}
+
+void ODriverDelegator::disposing()
+{
+    ::osl::MutexGuard aGuard(m_aMutex);
+
+    for (auto const& connection : m_aConnections)
+    {
+        Reference<XInterface> xTemp = connection.first.get();
+        ::comphelper::disposeComponent(xTemp);
+    }
+    m_aConnections.clear();
+    TWeakPairVector().swap(m_aConnections);
+
+    ODriverDelegator_BASE::disposing();
+}
+
+namespace
+{
+enum class T_DRIVERTYPE
+{
+    Odbc,
+    Jdbc,
+    Native
+};
+
+bool isOdbcUrl(const OUString& _sUrl) { return _sUrl.startsWith("sdbc:mysql:odbc:"); }
+
+bool isNativeUrl(const OUString& _sUrl) { return _sUrl.startsWith("sdbc:mysql:mysqlc:"); }
+
+T_DRIVERTYPE lcl_getDriverType(const OUString& _sUrl)
+{
+    T_DRIVERTYPE eRet = T_DRIVERTYPE::Jdbc;
+    if (isOdbcUrl(_sUrl))
+        eRet = T_DRIVERTYPE::Odbc;
+    else if (isNativeUrl(_sUrl))
+        eRet = T_DRIVERTYPE::Native;
+    return eRet;
+}
+
+OUString transformUrl(const OUString& _sUrl)
+{
+    OUString sNewUrl = _sUrl.copy(11);
+    if (isOdbcUrl(_sUrl))
+        sNewUrl = "sdbc:" + sNewUrl;
+    else if (isNativeUrl(_sUrl))
+        sNewUrl = "sdbc:" + sNewUrl;
+    else
+    {
+        sNewUrl = "jdbc:mysql://" + sNewUrl.copy(5);
+    }
+    return sNewUrl;
+}
+
+Reference<XDriver> lcl_loadDriver(const Reference<XComponentContext>& _rxContext,
+                                  const OUString& _sUrl)
+{
+    Reference<XDriverManager2> xDriverAccess = DriverManager::create(_rxContext);
+    Reference<XDriver> xDriver = xDriverAccess->getDriverByURL(_sUrl);
+    return xDriver;
+}
+
+Sequence<PropertyValue> lcl_convertProperties(T_DRIVERTYPE _eType,
+                                              const Sequence<PropertyValue>& info,
+                                              const OUString& _sUrl)
+{
+    std::vector<PropertyValue> aProps;
+    const PropertyValue* pSupported = info.getConstArray();
+    const PropertyValue* pEnd = pSupported + info.getLength();
+
+    aProps.reserve(info.getLength() + 5);
+    bool jdc = false;
+    for (; pSupported != pEnd; ++pSupported)
+    {
+        aProps.push_back(*pSupported);
+        if (pSupported->Name == "JavaDriverClass")
+        {
+            jdc = true;
+        }
+    }
+
+    if (_eType == T_DRIVERTYPE::Odbc)
+    {
+        aProps.push_back(PropertyValue("Silent", 0, makeAny(true), PropertyState_DIRECT_VALUE));
+        aProps.push_back(PropertyValue("PreventGetVersionColumns", 0, makeAny(true),
+                                       PropertyState_DIRECT_VALUE));
+    }
+    else if (_eType == T_DRIVERTYPE::Jdbc)
+    {
+        if (!jdc)
+        {
+            aProps.push_back(PropertyValue("JavaDriverClass", 0,
+                                           makeAny(OUString("com.mysql.jdbc.Driver")),
+                                           PropertyState_DIRECT_VALUE));
+        }
+    }
+    else
+    {
+        aProps.push_back(
+            PropertyValue("PublicConnectionURL", 0, makeAny(_sUrl), PropertyState_DIRECT_VALUE));
+    }
+    aProps.push_back(
+        PropertyValue("IsAutoRetrievingEnabled", 0, makeAny(true), PropertyState_DIRECT_VALUE));
+    aProps.push_back(PropertyValue("AutoRetrievingStatement", 0,
+                                   makeAny(OUString("SELECT LAST_INSERT_ID()")),
+                                   PropertyState_DIRECT_VALUE));
+    aProps.push_back(
+        PropertyValue("ParameterNameSubstitution", 0, makeAny(true), PropertyState_DIRECT_VALUE));
+    return Sequence<PropertyValue>(aProps.data(), aProps.size());
+}
+}
+
+Reference<XDriver> ODriverDelegator::loadDriver(const OUString& url,
+                                                const Sequence<PropertyValue>& info)
+{
+    Reference<XDriver> xDriver;
+    const OUString sCuttedUrl = transformUrl(url);
+    const T_DRIVERTYPE eType = lcl_getDriverType(url);
+    if (eType == T_DRIVERTYPE::Odbc)
+    {
+        if (!m_xODBCDriver.is())
+            m_xODBCDriver = lcl_loadDriver(m_xContext, sCuttedUrl);
+        xDriver = m_xODBCDriver;
+    } // if ( bIsODBC )
+    else if (eType == T_DRIVERTYPE::Native)
+    {
+        if (!m_xNativeDriver.is())
+            m_xNativeDriver = lcl_loadDriver(m_xContext, sCuttedUrl);
+        xDriver = m_xNativeDriver;
+    }
+    else
+    {
+        OUString sDriverClass(getJavaDriverClass(info));
+        TJDBCDrivers::iterator aFind = m_aJdbcDrivers.find(sDriverClass);
+        if (aFind == m_aJdbcDrivers.end())
+            aFind = m_aJdbcDrivers.emplace(sDriverClass, lcl_loadDriver(m_xContext, sCuttedUrl))
+                        .first;
+        xDriver = aFind->second;
+    }
+
+    return xDriver;
+}
+
+Reference<XConnection> SAL_CALL ODriverDelegator::connect(const OUString& url,
+                                                          const Sequence<PropertyValue>& info)
+{
+    Reference<XConnection> xConnection;
+    if (acceptsURL(url))
+    {
+        Reference<XDriver> xDriver;
+        xDriver = loadDriver(url, info);
+        if (xDriver.is())
+        {
+            OUString sCuttedUrl = transformUrl(url);
+            const T_DRIVERTYPE eType = lcl_getDriverType(url);
+            Sequence<PropertyValue> aConvertedProperties = lcl_convertProperties(eType, info, url);
+            if (eType == T_DRIVERTYPE::Jdbc)
+            {
+                ::comphelper::NamedValueCollection aSettings(info);
+                OUString sIanaName = aSettings.getOrDefault("CharSet", OUString());
+                if (!sIanaName.isEmpty())
+                {
+                    ::dbtools::OCharsetMap aLookupIanaName;
+                    ::dbtools::OCharsetMap::const_iterator aLookup
+                        = aLookupIanaName.findIanaName(sIanaName);
+                    if (aLookup != aLookupIanaName.end())
+                    {
+                        OUString sAdd;
+                        if (RTL_TEXTENCODING_UTF8 == (*aLookup).getEncoding())
+                        {
+                            static const char s_sCharSetOp[] = "useUnicode=true&";
+                            if (!sCuttedUrl.matchIgnoreAsciiCase(s_sCharSetOp))
+                            {
+                                sAdd = s_sCharSetOp;
+                            } // if ( !sCuttedUrl.matchIgnoreAsciiCase(s_sCharSetOp) )
+                        } // if ( RTL_TEXTENCODING_UTF8 == (*aLookup).getEncoding() )
+                        if (sCuttedUrl.indexOf('?') == -1)
+                            sCuttedUrl += "?";
+                        else
+                            sCuttedUrl += "&";
+                        sCuttedUrl += sAdd;
+                        sCuttedUrl += "characterEncoding=";
+                        sCuttedUrl += sIanaName;
+                    }
+                }
+            } // if ( !bIsODBC )
+
+            xConnection = xDriver->connect(sCuttedUrl, aConvertedProperties);
+            if (xConnection.is())
+            {
+                OMetaConnection* pMetaConnection = nullptr;
+                // now we have to set the URL to get the correct answer for metadata()->getURL()
+                Reference<XUnoTunnel> xTunnel(xConnection, UNO_QUERY);
+                if (xTunnel.is())
+                {
+                    pMetaConnection = reinterpret_cast<OMetaConnection*>(
+                        xTunnel->getSomething(OMetaConnection::getUnoTunnelImplementationId()));
+                    if (pMetaConnection)
+                        pMetaConnection->setURL(url);
+                }
+                m_aConnections.push_back(
+                    TWeakPair(WeakReferenceHelper(xConnection),
+                              TWeakConnectionPair(WeakReferenceHelper(), pMetaConnection)));
+            }
+        }
+    }
+    return xConnection;
+}
+
+sal_Bool SAL_CALL ODriverDelegator::acceptsURL(const OUString& url)
+{
+    Sequence<PropertyValue> info;
+
+    bool bOK = url.startsWith("sdbc:mysql:odbc:") || url.startsWith("sdbc:mysql:jdbc:")
+               || (url.startsWith("sdbc:mysql:mysqlc:") && loadDriver(url, info).is());
+    return bOK;
+}
+
+Sequence<DriverPropertyInfo> SAL_CALL
+ODriverDelegator::getPropertyInfo(const OUString& url, const Sequence<PropertyValue>& info)
+{
+    std::vector<DriverPropertyInfo> aDriverInfo;
+    if (!acceptsURL(url))
+        return Sequence<DriverPropertyInfo>();
+
+    Sequence<OUString> aBoolean(2);
+    aBoolean[0] = "0";
+    aBoolean[1] = "1";
+
+    aDriverInfo.push_back(DriverPropertyInfo("CharSet", "CharSet of the database.", false,
+                                             OUString(), Sequence<OUString>()));
+    aDriverInfo.push_back(DriverPropertyInfo("SuppressVersionColumns",
+                                             "Display version columns (when available).", false,
+                                             "0", aBoolean));
+    const T_DRIVERTYPE eType = lcl_getDriverType(url);
+    if (eType == T_DRIVERTYPE::Jdbc)
+    {
+        aDriverInfo.push_back(DriverPropertyInfo("JavaDriverClass", "The JDBC driver class name.",
+                                                 true, getJavaDriverClass(info),
+                                                 Sequence<OUString>()));
+    }
+    else if (eType == T_DRIVERTYPE::Native)
+    {
+        aDriverInfo.push_back(DriverPropertyInfo(
+            "LocalSocket", "The file path of a socket to connect to a local MySQL server.", false,
+            OUString(), Sequence<OUString>()));
+        aDriverInfo.push_back(DriverPropertyInfo(
+            "NamedPipe", "The name of a pipe to connect to a local MySQL server.", false,
+            OUString(), Sequence<OUString>()));
+    }
+
+    return Sequence<DriverPropertyInfo>(&aDriverInfo[0], aDriverInfo.size());
+}
+
+sal_Int32 SAL_CALL ODriverDelegator::getMajorVersion() { return 1; }
+
+sal_Int32 SAL_CALL ODriverDelegator::getMinorVersion() { return 0; }
+
+Reference<XTablesSupplier> SAL_CALL
+ODriverDelegator::getDataDefinitionByConnection(const Reference<XConnection>& connection)
+{
+    ::osl::MutexGuard aGuard(m_aMutex);
+    checkDisposed(ODriverDelegator_BASE::rBHelper.bDisposed);
+
+    Reference<XTablesSupplier> xTab;
+    Reference<XUnoTunnel> xTunnel(connection, UNO_QUERY);
+    if (xTunnel.is())
+    {
+        OMetaConnection* pConnection = reinterpret_cast<OMetaConnection*>(
+            xTunnel->getSomething(OMetaConnection::getUnoTunnelImplementationId()));
+        if (pConnection)
+        {
+            TWeakPairVector::const_iterator aEnd = m_aConnections.end();
+            for (TWeakPairVector::iterator i = m_aConnections.begin(); aEnd != i; ++i)
+            {
+                if (i->second.second == pConnection)
+                {
+                    xTab.set(i->second.first.get().get(), UNO_QUERY);
+                    if (!xTab.is())
+                    {
+                        xTab = new OMySQLCatalog(connection);
+                        i->second.first = WeakReferenceHelper(xTab);
+                    }
+                    break;
+                }
+            }
+        }
+    } // if ( xTunnel.is() )
+    if (!xTab.is())
+    {
+        TWeakPairVector::const_iterator aEnd = m_aConnections.end();
+        for (TWeakPairVector::iterator i = m_aConnections.begin(); aEnd != i; ++i)
+        {
+            Reference<XConnection> xTemp(i->first.get(), UNO_QUERY);
+            if (xTemp == connection)
+            {
+                xTab.set(i->second.first.get().get(), UNO_QUERY);
+                if (!xTab.is())
+                {
+                    xTab = new OMySQLCatalog(connection);
+                    i->second.first = WeakReferenceHelper(xTab);
+                }
+                break;
+            }
+        }
+    }
+    return xTab;
+}
+
+Reference<XTablesSupplier> SAL_CALL
+ODriverDelegator::getDataDefinitionByURL(const OUString& url, const Sequence<PropertyValue>& info)
+{
+    if (!acceptsURL(url))
+    {
+        ::connectivity::SharedResources aResources;
+        const OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR);
+        ::dbtools::throwGenericSQLException(sMessage, *this);
+    } // if ( ! acceptsURL(url) )
+
+    return getDataDefinitionByConnection(connect(url, info));
+}
+
+// XServiceInfo
+
+OUString ODriverDelegator::getImplementationName_Static()
+{
+    return OUString("org.openoffice.comp.drivers.MySQL.Driver");
+}
+
+Sequence<OUString> ODriverDelegator::getSupportedServiceNames_Static()
+{
+    Sequence<OUString> aSNS(2);
+    aSNS[0] = "com.sun.star.sdbc.Driver";
+    aSNS[1] = "com.sun.star.sdbcx.Driver";
+    return aSNS;
+}
+
+OUString SAL_CALL ODriverDelegator::getImplementationName()
+{
+    return getImplementationName_Static();
+}
+
+sal_Bool SAL_CALL ODriverDelegator::supportsService(const OUString& _rServiceName)
+{
+    return cppu::supportsService(this, _rServiceName);
+}
+
+Sequence<OUString> SAL_CALL ODriverDelegator::getSupportedServiceNames()
+{
+    return getSupportedServiceNames_Static();
+}
+
+} // namespace connectivity
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/mysql_jdbc/YTable.cxx b/connectivity/source/drivers/mysql_jdbc/YTable.cxx
new file mode 100644
index 000000000000..b0f6945f8ccd
--- /dev/null
+++ b/connectivity/source/drivers/mysql_jdbc/YTable.cxx
@@ -0,0 +1,336 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <string.h>
+#include <mysql/YTable.hxx>
+#include <mysql/YTables.hxx>
+#include <com/sun/star/sdbc/XRow.hpp>
+#include <com/sun/star/sdbc/XResultSet.hpp>
+#include <com/sun/star/sdbcx/KeyType.hpp>
+#include <com/sun/star/sdbc/KeyRule.hpp>
+#include <cppuhelper/typeprovider.hxx>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/sdbc/ColumnValue.hpp>
+#include <com/sun/star/sdbcx/Privilege.hpp>
+#include <comphelper/property.hxx>
+#include <comphelper/types.hxx>
+#include <connectivity/dbtools.hxx>
+#include <connectivity/sdbcx/VColumn.hxx>
+#include <connectivity/TKeys.hxx>
+#include <connectivity/TIndexes.hxx>
+#include <connectivity/TColumnsHelper.hxx>
+#include <mysql/YCatalog.hxx>
+#include <mysql/YColumns.hxx>
+#include <TConnection.hxx>
+
+using namespace ::comphelper;
+using namespace connectivity::mysql;
+using namespace connectivity::sdbcx;
+using namespace connectivity;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+namespace connectivity
+{
+namespace mysql
+{
+class OMySQLKeysHelper : public OKeysHelper
+{
+protected:
+    virtual OUString getDropForeignKey() const override { return OUString(" DROP FOREIGN KEY "); }
+
+public:
+    OMySQLKeysHelper(OTableHelper* _pTable, ::osl::Mutex& _rMutex,
+                     const ::std::vector<OUString>& _rVector)
+        : OKeysHelper(_pTable, _rMutex, _rVector)
+    {
+    }
+};
+}
+}
+
+OMySQLTable::OMySQLTable(sdbcx::OCollection* _pTables, const Reference<XConnection>& _xConnection)
+    : OTableHelper(_pTables, _xConnection, true)
+{
+    // we create a new table here, so we should have all the rights or ;-)
+    m_nPrivileges = Privilege::DROP | Privilege::REFERENCE | Privilege::ALTER | Privilege::CREATE
+                    | Privilege::READ | Privilege::DELETE | Privilege::UPDATE | Privilege::INSERT
+                    | Privilege::SELECT;
+    construct();
+}
+
+OMySQLTable::OMySQLTable(sdbcx::OCollection* _pTables, const Reference<XConnection>& _xConnection,
+                         const OUString& Name, const OUString& Type, const OUString& Description,
+                         const OUString& SchemaName, const OUString& CatalogName,
+                         sal_Int32 _nPrivileges)
+    : OTableHelper(_pTables, _xConnection, true, Name, Type, Description, SchemaName, CatalogName)
+    , m_nPrivileges(_nPrivileges)
+{
+    construct();
+}
+
+void OMySQLTable::construct()
+{
+    OTableHelper::construct();
+    if (!isNew())
+        registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRIVILEGES),
+                         PROPERTY_ID_PRIVILEGES, PropertyAttribute::READONLY, &m_nPrivileges,
+                         cppu::UnoType<decltype(m_nPrivileges)>::get());
+}
+
+::cppu::IPropertyArrayHelper* OMySQLTable::createArrayHelper(sal_Int32 /*_nId*/) const
+{
+    return doCreateArrayHelper();
+}
+
+::cppu::IPropertyArrayHelper& OMySQLTable::getInfoHelper()
+{
+    return *static_cast<OMySQLTable_PROP*>(this)->getArrayHelper(isNew() ? 1 : 0);
+}
+
+sdbcx::OCollection* OMySQLTable::createColumns(const ::std::vector<OUString>& _rNames)
+{
+    OMySQLColumns* pColumns = new OMySQLColumns(*this, m_aMutex, _rNames);
+    pColumns->setParent(this);
+    return pColumns;
+}
+
+sdbcx::OCollection* OMySQLTable::createKeys(const ::std::vector<OUString>& _rNames)
+{
+    return new OMySQLKeysHelper(this, m_aMutex, _rNames);
+}
+
+sdbcx::OCollection* OMySQLTable::createIndexes(const ::std::vector<OUString>& _rNames)
+{
+    return new OIndexesHelper(this, m_aMutex, _rNames);
+}
+
+Sequence<sal_Int8> OMySQLTable::getUnoTunnelImplementationId()
+{
+    static ::cppu::OImplementationId implId;
+
+    return implId.getImplementationId();
+}
+
+// css::lang::XUnoTunnel
+
+sal_Int64 OMySQLTable::getSomething(const Sequence<sal_Int8>& rId)
+{
+    return (rId.getLength() == 16
+            && 0 == memcmp(getUnoTunnelImplementationId().getConstArray(), rId.getConstArray(), 16))
+               ? reinterpret_cast<sal_Int64>(this)
+               : OTable_TYPEDEF::getSomething(rId);
+}
+
+// XAlterTable
+void SAL_CALL OMySQLTable::alterColumnByName(const OUString& colName,
+                                             const Reference<XPropertySet>& descriptor)
+{
+    ::osl::MutexGuard aGuard(m_aMutex);
+    checkDisposed(
+#ifdef __GNUC__
+        ::connectivity::sdbcx::OTableDescriptor_BASE::rBHelper.bDisposed
+#else
+        rBHelper.bDisposed
+#endif
+    );
+
+    if (!m_xColumns || !m_xColumns->hasByName(colName))
+        throw NoSuchElementException(colName, *this);
+
+    if (!isNew())
+    {
+        // first we have to check what should be altered
+        Reference<XPropertySet> xProp;
+        m_xColumns->getByName(colName) >>= xProp;
+        // first check the types
+        sal_Int32 nOldType = 0, nNewType = 0, nOldPrec = 0, nNewPrec = 0, nOldScale = 0,
+                  nNewScale = 0;
+
+        ::dbtools::OPropertyMap& rProp = OMetaConnection::getPropMap();
+        xProp->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_TYPE)) >>= nOldType;
+        descriptor->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_TYPE)) >>= nNewType;
+        // and precisions and scale
+        xProp->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_PRECISION)) >>= nOldPrec;
+        descriptor->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_PRECISION)) >>= nNewPrec;
+        xProp->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_SCALE)) >>= nOldScale;
+        descriptor->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_SCALE)) >>= nNewScale;
+        // second: check the "is nullable" value
+        sal_Int32 nOldNullable = 0, nNewNullable = 0;
+        xProp->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_ISNULLABLE)) >>= nOldNullable;
+        descriptor->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_ISNULLABLE)) >>= nNewNullable;
+
+        // check also the auto_increment
+        bool bOldAutoIncrement = false, bAutoIncrement = false;
+        xProp->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT))
+            >>= bOldAutoIncrement;
+        descriptor->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT))
+            >>= bAutoIncrement;
+        bool bColumnNameChanged = false;
+        OUString sOldDesc, sNewDesc;
+        xProp->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_DESCRIPTION)) >>= sOldDesc;
+        descriptor->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_DESCRIPTION)) >>= sNewDesc;
+
+        if (nOldType != nNewType || nOldPrec != nNewPrec || nOldScale != nNewScale
+            || nNewNullable != nOldNullable || bOldAutoIncrement != bAutoIncrement
+            || sOldDesc != sNewDesc)
+        {
+            // special handling because they changed the type names to distinguish
+            // if a column should be an auto_incmrement one
+            if (bOldAutoIncrement != bAutoIncrement)
+            {
+                OUString sTypeName;
+                descriptor->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_TYPENAME))
+                    >>= sTypeName;
+
+                static const char s_sAutoIncrement[] = "auto_increment";
+                if (bAutoIncrement)
+                {
+                    if (sTypeName.indexOf(s_sAutoIncrement) == -1)
+                    {
+                        sTypeName += " ";
+                        sTypeName += s_sAutoIncrement;
+                    }
+                }
+                else
+                {
+                    sal_Int32 nIndex = 0;
+                    if (!sTypeName.isEmpty()
+                        && (nIndex = sTypeName.indexOf(s_sAutoIncrement)) != -1)
+                    {
+                        sTypeName = sTypeName.copy(0, nIndex);
+                        descriptor->setPropertyValue(rProp.getNameByIndex(PROPERTY_ID_TYPENAME),
+                                                     makeAny(sTypeName));
+                    }
+                }
+            }
+            alterColumnType(nNewType, colName, descriptor);
+            bColumnNameChanged = true;
+        }
+
+        // third: check the default values
+        OUString sNewDefault, sOldDefault;
+        xProp->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_DEFAULTVALUE)) >>= sOldDefault;
+        descriptor->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_DEFAULTVALUE))
+            >>= sNewDefault;
+
+        if (!sOldDefault.isEmpty())
+        {
+            dropDefaultValue(colName);
+            if (!sNewDefault.isEmpty() && sOldDefault != sNewDefault)
+                alterDefaultValue(sNewDefault, colName);
+        }
+        else if (!sNewDefault.isEmpty())
+            alterDefaultValue(sNewDefault, colName);
+
+        // now we should look if the name of the column changed
+        OUString sNewColumnName;
+        descriptor->getPropertyValue(rProp.getNameByIndex(PROPERTY_ID_NAME)) >>= sNewColumnName;
+        if (!sNewColumnName.equalsIgnoreAsciiCase(colName) && !bColumnNameChanged)
+        {
+            const OUString sQuote = getMetaData()->getIdentifierQuoteString();
+            OUString sSql = getAlterTableColumnPart() + " CHANGE "
+                            + ::dbtools::quoteName(sQuote, colName) + " "
+                            + OTables::adjustSQL(::dbtools::createStandardColumnPart(
+                                  descriptor, getConnection(), static_cast<OTables*>(m_pTables),
+                                  getTypeCreatePattern()));
+            executeStatement(sSql);
+        }
+        m_xColumns->refresh();
+    }
+    else
+    {
+        if (m_xColumns)
+        {
+            m_xColumns->dropByName(colName);
+            m_xColumns->appendByDescriptor(descriptor);
+        }
+    }
+}
+
+void OMySQLTable::alterColumnType(sal_Int32 nNewType, const OUString& _rColName,
+                                  const Reference<XPropertySet>& _xDescriptor)
+{
+    const OUString sQuote = getMetaData()->getIdentifierQuoteString();
+    OUString sSql
+        = getAlterTableColumnPart() + " CHANGE " + ::dbtools::quoteName(sQuote, _rColName) + " ";
+
+    OColumn* pColumn = new OColumn(true);
+    Reference<XPropertySet> xProp = pColumn;
+    ::comphelper::copyProperties(_xDescriptor, xProp);
+    xProp->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE),
+                            makeAny(nNewType));
+
+    sSql += OTables::adjustSQL(::dbtools::createStandardColumnPart(
+        xProp, getConnection(), static_cast<OTables*>(m_pTables), getTypeCreatePattern()));
+    executeStatement(sSql);
+}
+
+OUString OMySQLTable::getTypeCreatePattern() const { return OUString("(M,D)"); }
+
+void OMySQLTable::alterDefaultValue(const OUString& _sNewDefault, const OUString& _rColName)
+{
+    const OUString sQuote = getMetaData()->getIdentifierQuoteString();
+    OUString sSql = getAlterTableColumnPart() + " ALTER " + ::dbtools::quoteName(sQuote, _rColName)
+                    + " SET DEFAULT '" + _sNewDefault + "'";
+
+    executeStatement(sSql);
+}
+
+void OMySQLTable::dropDefaultValue(const OUString& _rColName)
+{
+    const OUString sQuote = getMetaData()->getIdentifierQuoteString();
+    OUString sSql = getAlterTableColumnPart() + " ALTER " + ::dbtools::quoteName(sQuote, _rColName)
+                    + " DROP DEFAULT";
+
+    executeStatement(sSql);
+}
+
+OUString OMySQLTable::getAlterTableColumnPart()
+{
+    OUString sSql("ALTER TABLE ");
+
+    OUString sComposedName(
+        ::dbtools::composeTableName(getMetaData(), m_CatalogName, m_SchemaName, m_Name, true,
+                                    ::dbtools::EComposeRule::InTableDefinitions));
+    sSql += sComposedName;
+
+    return sSql;
+}
+
+void OMySQLTable::executeStatement(const OUString& _rStatement)
+{
+    OUString sSQL = _rStatement;
+    if (sSQL.endsWith(","))
+        sSQL = sSQL.replaceAt(sSQL.getLength() - 1, 1, ")");
+
+    Reference<XStatement> xStmt = getConnection()->createStatement();
+    if (xStmt.is())
+    {
+        xStmt->execute(sSQL);
+        ::comphelper::disposeComponent(xStmt);
+    }
+}
+
+OUString OMySQLTable::getRenameStart() const { return OUString("RENAME TABLE "); }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/mysql_jdbc/YTables.cxx b/connectivity/source/drivers/mysql_jdbc/YTables.cxx
new file mode 100644
index 000000000000..9caabc3d2e70
--- /dev/null
+++ b/connectivity/source/drivers/mysql_jdbc/YTables.cxx
@@ -0,0 +1,216 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <mysql/YTables.hxx>
+#include <mysql/YViews.hxx>
+#include <mysql/YTable.hxx>
+#include <com/sun/star/sdbc/XRow.hpp>
+#include <com/sun/star/sdbc/XResultSet.hpp>
+#include <com/sun/star/sdbc/ColumnValue.hpp>
+#include <com/sun/star/sdbcx/Privilege.hpp>
+#include <com/sun/star/sdbc/KeyRule.hpp>
+#include <com/sun/star/sdbcx/KeyType.hpp>
+#include <mysql/YCatalog.hxx>
+#include <connectivity/dbtools.hxx>
+#include <connectivity/dbexception.hxx>
+#include <cppuhelper/interfacecontainer.h>
+#include <comphelper/types.hxx>
+#include <TConnection.hxx>
+
+using namespace ::comphelper;
+using namespace connectivity;
+using namespace ::cppu;
+using namespace connectivity::mysql;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+using namespace dbtools;
+
+sdbcx::ObjectType OTables::createObject(const OUString& _rName)
+{
+    OUString sCatalog, sSchema, sTable;
+    ::dbtools::qualifiedNameComponents(m_xMetaData, _rName, sCatalog, sSchema, sTable,
+                                       ::dbtools::EComposeRule::InDataManipulation);
+
+    Sequence<OUString> sTableTypes(3);
+    sTableTypes[0] = "VIEW";
+    sTableTypes[1] = "TABLE";
+    sTableTypes[2] = "%"; // just to be sure to include anything else ....
+
+    Any aCatalog;
+    if (!sCatalog.isEmpty())
+        aCatalog <<= sCatalog;
+    Reference<XResultSet> xResult = m_xMetaData->getTables(aCatalog, sSchema, sTable, sTableTypes);
+
+    sdbcx::ObjectType xRet = nullptr;
+    if (xResult.is())
+    {
+        Reference<XRow> xRow(xResult, UNO_QUERY);
+        if (xResult->next()) // there can be only one table with this name
+        {
+            sal_Int32 const nPrivileges = Privilege::DROP | Privilege::REFERENCE | Privilege::ALTER
+                                          | Privilege::CREATE | Privilege::READ | Privilege::DELETE
+                                          | Privilege::UPDATE | Privilege::INSERT
+                                          | Privilege::SELECT;
+
+            OMySQLTable* pRet = new OMySQLTable(
+                this, static_cast<OMySQLCatalog&>(m_rParent).getConnection(), sTable,
+                xRow->getString(4), xRow->getString(5), sSchema, sCatalog, nPrivileges);
+            xRet = pRet;
+        }
+        ::comphelper::disposeComponent(xResult);
+    }
+
+    return xRet;
+}
+
+void OTables::impl_refresh() { static_cast<OMySQLCatalog&>(m_rParent).refreshTables(); }
+
+void OTables::disposing()
+{
+    m_xMetaData.clear();
+    OCollection::disposing();
+}
+
+Reference<XPropertySet> OTables::createDescriptor()
+{
+    return new OMySQLTable(this, static_cast<OMySQLCatalog&>(m_rParent).getConnection());
+}
+
+// XAppend
+sdbcx::ObjectType OTables::appendObject(const OUString& _rForName,
+                                        const Reference<XPropertySet>& descriptor)
+{
+    createTable(descriptor);
+    return createObject(_rForName);
+}
+
+// XDrop
+void OTables::dropObject(sal_Int32 _nPos, const OUString& _sElementName)
+{
+    Reference<XInterface> xObject(getObject(_nPos));
+    bool bIsNew = connectivity::sdbcx::ODescriptor::isNew(xObject);
+    if (!bIsNew)
+    {
+        Reference<XConnection> xConnection = static_cast<OMySQLCatalog&>(m_rParent).getConnection();
+
+        OUString sCatalog, sSchema, sTable;
+        ::dbtools::qualifiedNameComponents(m_xMetaData, _sElementName, sCatalog, sSchema, sTable,
+                                           ::dbtools::EComposeRule::InDataManipulation);
+
+        OUString aSql("DROP ");
+
+        Reference<XPropertySet> xProp(xObject, UNO_QUERY);
+        bool bIsView = xProp.is()
+                       && ::comphelper::getString(xProp->getPropertyValue(
+                              OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)))
+                              == "VIEW";
+        if (bIsView) // here we have a view
+            aSql += "VIEW ";
+        else
+            aSql += "TABLE ";
+
+        OUString sComposedName(
+            ::dbtools::composeTableName(m_xMetaData, sCatalog, sSchema, sTable, true,
+                                        ::dbtools::EComposeRule::InDataManipulation));
+        aSql += sComposedName;
+        Reference<XStatement> xStmt = xConnection->createStatement();
+        if (xStmt.is())
+        {
+            xStmt->execute(aSql);
+            ::comphelper::disposeComponent(xStmt);
+        }
+        // if no exception was thrown we must delete it from the views
+        if (bIsView)
+        {
+            OViews* pViews
+                = static_cast<OViews*>(static_cast<OMySQLCatalog&>(m_rParent).getPrivateViews());
+            if (pViews && pViews->hasByName(_sElementName))
+                pViews->dropByNameImpl(_sElementName);
+        }
+    }
+}
+
+OUString OTables::adjustSQL(const OUString& _sSql)
+{
+    OUString sSQL = _sSql;
+    static const char s_sUNSIGNED[] = "UNSIGNED";
+    sal_Int32 nIndex = sSQL.indexOf(s_sUNSIGNED);
+    while (nIndex != -1)
+    {
+        sal_Int32 nParen = sSQL.indexOf(')', nIndex);
+        sal_Int32 nPos = nIndex + strlen(s_sUNSIGNED);
+        OUString sNewUnsigned(sSQL.copy(nPos, nParen - nPos + 1));
+        sSQL = sSQL.replaceAt(nIndex, strlen(s_sUNSIGNED) + sNewUnsigned.getLength(),
+                              sNewUnsigned + s_sUNSIGNED);
+        nIndex = sSQL.indexOf(s_sUNSIGNED, nIndex + strlen(s_sUNSIGNED) + sNewUnsigned.getLength());
+    }
+    return sSQL;
+}
+
+void OTables::createTable(const Reference<XPropertySet>& descriptor)
+{
+    const Reference<XConnection> xConnection
+        = static_cast<OMySQLCatalog&>(m_rParent).getConnection();
+    const OUString aSql
+        = adjustSQL(::dbtools::createSqlCreateTableStatement(descriptor, xConnection));
+    Reference<XStatement> xStmt = xConnection->createStatement();
+    if (xStmt.is())
+    {
+        xStmt->execute(aSql);
+        ::comphelper::disposeComponent(xStmt);
+    }
+}
+
+void OTables::appendNew(const OUString& _rsNewTable)
+{
+    insertElement(_rsNewTable, nullptr);
+
+    // notify our container listeners
+    ContainerEvent aEvent(static_cast<XContainer*>(this), makeAny(_rsNewTable), Any(), Any());
+    OInterfaceIteratorHelper2 aListenerLoop(m_aContainerListeners);
+    while (aListenerLoop.hasMoreElements())
+        static_cast<XContainerListener*>(aListenerLoop.next())->elementInserted(aEvent);
+}
+
+OUString OTables::getNameForObject(const sdbcx::ObjectType& _xObject)
+{
+    OSL_ENSURE(_xObject.is(), "OTables::getNameForObject: Object is NULL!");
+    return ::dbtools::composeTableName(m_xMetaData, _xObject,
+                                       ::dbtools::EComposeRule::InDataManipulation, false);
+}
+
+void OTables::addComment(const Reference<XPropertySet>& descriptor, OUStringBuffer& _rOut)
+{
+    OUString sDesc;
+    descriptor->getPropertyValue(
+        OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION))
+        >>= sDesc;
+    if (!sDesc.isEmpty())
+    {
+        _rOut.append(" COMMENT '");
+        _rOut.append(sDesc);
+        _rOut.append("'");
+    }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/mysql_jdbc/YUser.cxx b/connectivity/source/drivers/mysql_jdbc/YUser.cxx
new file mode 100644
index 000000000000..f29ba3b9006c
--- /dev/null
+++ b/connectivity/source/drivers/mysql_jdbc/YUser.cxx
@@ -0,0 +1,324 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <mysql/YUser.hxx>
+#include <com/sun/star/sdbc/XRow.hpp>
+#include <com/sun/star/sdbc/XResultSet.hpp>
+#include <connectivity/dbtools.hxx>
+#include <connectivity/dbexception.hxx>
+#include <com/sun/star/sdbcx/Privilege.hpp>
+#include <com/sun/star/sdbcx/PrivilegeObject.hpp>
+#include <TConnection.hxx>
+#include <strings.hrc>
+
+using namespace connectivity;
+using namespace connectivity::mysql;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+OMySQLUser::OMySQLUser(const css::uno::Reference<css::sdbc::XConnection>& _xConnection)
+    : connectivity::sdbcx::OUser(true)
+    , m_xConnection(_xConnection)
+{
+    construct();
+}
+
+OMySQLUser::OMySQLUser(const css::uno::Reference<css::sdbc::XConnection>& _xConnection,
+                       const OUString& Name)
+    : connectivity::sdbcx::OUser(Name, true)
+    , m_xConnection(_xConnection)
+{
+    construct();
+}
+
+void OMySQLUser::refreshGroups() {}
+
+OUserExtend::OUserExtend(const css::uno::Reference<css::sdbc::XConnection>& _xConnection)
+    : OMySQLUser(_xConnection)
+{
+    construct();
+}
+
+void OUserExtend::construct()
+{
+    registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD),
+                     PROPERTY_ID_PASSWORD, 0, &m_Password, ::cppu::UnoType<OUString>::get());
+}
+
+cppu::IPropertyArrayHelper* OUserExtend::createArrayHelper() const
+{
+    Sequence<Property> aProps;
+    describeProperties(aProps);
+    return new cppu::OPropertyArrayHelper(aProps);
+}
+
+cppu::IPropertyArrayHelper& OUserExtend::getInfoHelper()
+{
+    return *OUserExtend_PROP::getArrayHelper();
+}
+typedef connectivity::sdbcx::OUser_BASE OUser_BASE_RBHELPER;
+
+sal_Int32 SAL_CALL OMySQLUser::getPrivileges(const OUString& objName, sal_Int32 objType)
+{
+    ::osl::MutexGuard aGuard(m_aMutex);
+    checkDisposed(OUser_BASE_RBHELPER::rBHelper.bDisposed);
+
+    sal_Int32 nRights, nRightsWithGrant;
+    findPrivilegesAndGrantPrivileges(objName, objType, nRights, nRightsWithGrant);
+    return nRights;
+}
+
+void OMySQLUser::findPrivilegesAndGrantPrivileges(const OUString& objName, sal_Int32 objType,
+                                                  sal_Int32& nRights, sal_Int32& nRightsWithGrant)
+{
+    nRightsWithGrant = nRights = 0;
+    // first we need to create the sql stmt to select the privs
+    Reference<XDatabaseMetaData> xMeta = m_xConnection->getMetaData();
+    OUString sCatalog, sSchema, sTable;
+    ::dbtools::qualifiedNameComponents(xMeta, objName, sCatalog, sSchema, sTable,
+                                       ::dbtools::EComposeRule::InDataManipulation);
+    Reference<XResultSet> xRes;
+    switch (objType)
+    {
+        case PrivilegeObject::TABLE:
+        case PrivilegeObject::VIEW:
+        {
+            Any aCatalog;
+            if (!sCatalog.isEmpty())
+                aCatalog <<= sCatalog;
+            xRes = xMeta->getTablePrivileges(aCatalog, sSchema, sTable);
+        }
+        break;
+
+        case PrivilegeObject::COLUMN:
+        {
+            Any aCatalog;
+            if (!sCatalog.isEmpty())
+                aCatalog <<= sCatalog;
+            xRes = xMeta->getColumnPrivileges(aCatalog, sSchema, sTable, "%");
+        }
+        break;
+    }
+
+    if (xRes.is())
+    {
+        static const char sYes[] = "YES";
+
+        nRightsWithGrant = nRights = 0;
+
+        Reference<XRow> xCurrentRow(xRes, UNO_QUERY);
+        while (xCurrentRow.is() && xRes->next())
+        {
+            OUString sGrantee = xCurrentRow->getString(5);
+            OUString sPrivilege = xCurrentRow->getString(6);
+            OUString sGrantable = xCurrentRow->getString(7);
+
+            if (!m_Name.equalsIgnoreAsciiCase(sGrantee))
+                continue;
+
+            if (sPrivilege.equalsIgnoreAsciiCase("SELECT"))
+            {
+                nRights |= Privilege::SELECT;
+                if (sGrantable.equalsIgnoreAsciiCase(sYes))
+                    nRightsWithGrant |= Privilege::SELECT;
+            }
+            else if (sPrivilege.equalsIgnoreAsciiCase("INSERT"))
+            {
+                nRights |= Privilege::INSERT;
+                if (sGrantable.equalsIgnoreAsciiCase(sYes))
+                    nRightsWithGrant |= Privilege::INSERT;
+            }
+            else if (sPrivilege.equalsIgnoreAsciiCase("UPDATE"))
+            {
+                nRights |= Privilege::UPDATE;
+                if (sGrantable.equalsIgnoreAsciiCase(sYes))
+                    nRightsWithGrant |= Privilege::UPDATE;
+            }
+            else if (sPrivilege.equalsIgnoreAsciiCase("DELETE"))
+            {
+                nRights |= Privilege::DELETE;
+                if (sGrantable.equalsIgnoreAsciiCase(sYes))
+                    nRightsWithGrant |= Privilege::DELETE;
+            }
+            else if (sPrivilege.equalsIgnoreAsciiCase("READ"))
+            {
+                nRights |= Privilege::READ;
+                if (sGrantable.equalsIgnoreAsciiCase(sYes))
+                    nRightsWithGrant |= Privilege::READ;
+            }
+            else if (sPrivilege.equalsIgnoreAsciiCase("CREATE"))
+            {
+                nRights |= Privilege::CREATE;
+                if (sGrantable.equalsIgnoreAsciiCase(sYes))
+                    nRightsWithGrant |= Privilege::CREATE;
+            }
+            else if (sPrivilege.equalsIgnoreAsciiCase("ALTER"))
+            {
+                nRights |= Privilege::ALTER;
+                if (sGrantable.equalsIgnoreAsciiCase(sYes))
+                    nRightsWithGrant |= Privilege::ALTER;
+            }
+            else if (sPrivilege.equalsIgnoreAsciiCase("REFERENCES"))
+            {
+                nRights |= Privilege::REFERENCE;
+                if (sGrantable.equalsIgnoreAsciiCase(sYes))
+                    nRightsWithGrant |= Privilege::REFERENCE;
+            }
+            else if (sPrivilege.equalsIgnoreAsciiCase("DROP"))
+            {
+                nRights |= Privilege::DROP;
+                if (sGrantable.equalsIgnoreAsciiCase(sYes))
+                    nRightsWithGrant |= Privilege::DROP;
+            }
+        }
+        ::comphelper::disposeComponent(xRes);
+    }
+}
+
+sal_Int32 SAL_CALL OMySQLUser::getGrantablePrivileges(const OUString& objName, sal_Int32 objType)
+{
+    ::osl::MutexGuard aGuard(m_aMutex);
+    checkDisposed(OUser_BASE_RBHELPER::rBHelper.bDisposed);
+
+    sal_Int32 nRights, nRightsWithGrant;
+    findPrivilegesAndGrantPrivileges(objName, objType, nRights, nRightsWithGrant);
+    return nRightsWithGrant;
+}
+
+void SAL_CALL OMySQLUser::grantPrivileges(const OUString& objName, sal_Int32 objType,
+                                          sal_Int32 objPrivileges)
+{
+    if (objType != PrivilegeObject::TABLE)
+    {
+        ::connectivity::SharedResources aResources;
+        const OUString sError(aResources.getResourceString(STR_PRIVILEGE_NOT_GRANTED));
+        ::dbtools::throwGenericSQLException(sError, *this);
+    } // if ( objType != PrivilegeObject::TABLE )
+
+    ::osl::MutexGuard aGuard(m_aMutex);
+
+    OUString sPrivs = getPrivilegeString(objPrivileges);
+    if (!sPrivs.isEmpty())
+    {
+        Reference<XDatabaseMetaData> xMeta = m_xConnection->getMetaData();
+        OUString sGrant = "GRANT " + sPrivs + " ON "
+                          + ::dbtools::quoteTableName(xMeta, objName,
+                                                      ::dbtools::EComposeRule::InDataManipulation)
+                          + " TO " + m_Name;
+
+        Reference<XStatement> xStmt = m_xConnection->createStatement();
+        if (xStmt.is())
+            xStmt->execute(sGrant);
+        ::comphelper::disposeComponent(xStmt);
+    }
+}
+
+void SAL_CALL OMySQLUser::revokePrivileges(const OUString& objName, sal_Int32 objType,
+                                           sal_Int32 objPrivileges)
+{
+    if (objType != PrivilegeObject::TABLE)
+    {
+        ::connectivity::SharedResources aResources;
+        const OUString sError(aResources.getResourceString(STR_PRIVILEGE_NOT_REVOKED));
+        ::dbtools::throwGenericSQLException(sError, *this);
+    }
+
+    ::osl::MutexGuard aGuard(m_aMutex);
+    checkDisposed(OUser_BASE_RBHELPER::rBHelper.bDisposed);
+    OUString sPrivs = getPrivilegeString(objPrivileges);
+    if (!sPrivs.isEmpty())
+    {
+        Reference<XDatabaseMetaData> xMeta = m_xConnection->getMetaData();
+        OUString sGrant = "REVOKE " + sPrivs + " ON "
+                          + ::dbtools::quoteTableName(xMeta, objName,
+                                                      ::dbtools::EComposeRule::InDataManipulation)
+                          + " FROM " + m_Name;
+
+        Reference<XStatement> xStmt = m_xConnection->createStatement();
+        if (xStmt.is())
+            xStmt->execute(sGrant);
+        ::comphelper::disposeComponent(xStmt);
+    }
+}
+
+// XUser
+void SAL_CALL OMySQLUser::changePassword(const OUString& /*oldPassword*/,
+                                         const OUString& newPassword)
+{
+    ::osl::MutexGuard aGuard(m_aMutex);
+    checkDisposed(OUser_BASE_RBHELPER::rBHelper.bDisposed);
+    OUString sAlterPwd = "SET PASSWORD FOR " + m_Name + "@\"%\" = PASSWORD('" + newPassword + "')";
+
+    Reference<XStatement> xStmt = m_xConnection->createStatement();
+    if (xStmt.is())
+    {
+        xStmt->execute(sAlterPwd);
+        ::comphelper::disposeComponent(xStmt);
+    }
+}
+
+OUString OMySQLUser::getPrivilegeString(sal_Int32 nRights)
+{
+    OUString sPrivs;
+    if ((nRights & Privilege::INSERT) == Privilege::INSERT)
+        sPrivs += "INSERT";
+
+    if ((nRights & Privilege::DELETE) == Privilege::DELETE)
+    {
+        if (!sPrivs.isEmpty())
+            sPrivs += ",";
+        sPrivs += "DELETE";
+    }
+
+    if ((nRights & Privilege::UPDATE) == Privilege::UPDATE)
+    {
+        if (!sPrivs.isEmpty())
+            sPrivs += ",";
+        sPrivs += "UPDATE";
+    }
+
+    if ((nRights & Privilege::ALTER) == Privilege::ALTER)
+    {
+        if (!sPrivs.isEmpty())
+            sPrivs += ",";
+        sPrivs += "ALTER";
+    }
+
+    if ((nRights & Privilege::SELECT) == Privilege::SELECT)
+    {
+        if (!sPrivs.isEmpty())
+            sPrivs += ",";
+        sPrivs += "SELECT";
+    }
+
+    if ((nRights & Privilege::REFERENCE) == Privilege::REFERENCE)
+    {
+        if (!sPrivs.isEmpty())
+            sPrivs += ",";
+        sPrivs += "REFERENCES";
+    }
+
+    return sPrivs;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/mysql_jdbc/YUsers.cxx b/connectivity/source/drivers/mysql_jdbc/YUsers.cxx
new file mode 100644
index 000000000000..cdcd22ea096c
--- /dev/null
+++ b/connectivity/source/drivers/mysql_jdbc/YUsers.cxx
@@ -0,0 +1,101 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <mysql/YUsers.hxx>
+#include <mysql/YUser.hxx>
+#include <mysql/YTable.hxx>
+#include <com/sun/star/sdbc/XRow.hpp>
+#include <com/sun/star/sdbc/XResultSet.hpp>
+#include <connectivity/sdbcx/IRefreshable.hxx>
+#include <comphelper/types.hxx>
+#include <connectivity/dbexception.hxx>
+#include <connectivity/dbtools.hxx>
+#include <TConnection.hxx>
+
+using namespace ::comphelper;
+using namespace connectivity;
+using namespace connectivity::mysql;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+OUsers::OUsers(::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex,
+               const ::std::vector<OUString>& _rVector,
+               const css::uno::Reference<css::sdbc::XConnection>& _xConnection,
+               connectivity::sdbcx::IRefreshableUsers* _pParent)
+    : sdbcx::OCollection(_rParent, true, _rMutex, _rVector)
+    , m_xConnection(_xConnection)
+    , m_pParent(_pParent)
+{
+}
+
+sdbcx::ObjectType OUsers::createObject(const OUString& _rName)
+{
+    return new OMySQLUser(m_xConnection, _rName);
+}
+
+void OUsers::impl_refresh() { m_pParent->refreshUsers(); }
+
+Reference<XPropertySet> OUsers::createDescriptor()
+{
+    OUserExtend* pNew = new OUserExtend(m_xConnection);
+    return pNew;
+}
+
+// XAppend
+sdbcx::ObjectType OUsers::appendObject(const OUString& _rForName,
+                                       const Reference<XPropertySet>& descriptor)
+{
+    OUString aSql("GRANT USAGE ON * TO ");
+    OUString aQuote = m_xConnection->getMetaData()->getIdentifierQuoteString();
+    aSql += ::dbtools::quoteName(aQuote, _rForName) + " @\"%\" ";
+    OUString sPassword;
+    descriptor->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD))
+        >>= sPassword;
+    if (!sPassword.isEmpty())
+    {
+        aSql += " IDENTIFIED BY '";
+        aSql += sPassword;
+        aSql += "'";
+    }
+
+    Reference<XStatement> xStmt = m_xConnection->createStatement();
+    if (xStmt.is())
+        xStmt->execute(aSql);
+    ::comphelper::disposeComponent(xStmt);
+
+    return createObject(_rForName);
+}
+
+// XDrop
+void OUsers::dropObject(sal_Int32 /*_nPos*/, const OUString& _sElementName)
+{
+    OUString aSql("DROP USER ");
+    OUString aQuote = m_xConnection->getMetaData()->getIdentifierQuoteString();
+    aSql += ::dbtools::quoteName(aQuote, _sElementName);
+
+    Reference<XStatement> xStmt = m_xConnection->createStatement();
+    if (xStmt.is())
+        xStmt->execute(aSql);
+    ::comphelper::disposeComponent(xStmt);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/mysql_jdbc/YViews.cxx b/connectivity/source/drivers/mysql_jdbc/YViews.cxx
new file mode 100644
index 000000000000..8884e93244c5
--- /dev/null
+++ b/connectivity/source/drivers/mysql_jdbc/YViews.cxx
@@ -0,0 +1,146 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <mysql/YViews.hxx>
+#include <mysql/YTables.hxx>
+#include <com/sun/star/sdbc/XRow.hpp>
+#include <com/sun/star/sdbc/XResultSet.hpp>
+#include <com/sun/star/sdbc/ColumnValue.hpp>
+#include <com/sun/star/sdbc/KeyRule.hpp>
+#include <com/sun/star/sdbcx/KeyType.hpp>
+#include <com/sun/star/sdbcx/CheckOption.hpp>
+#include <mysql/YCatalog.hxx>
+#include <connectivity/dbtools.hxx>
+#include <connectivity/dbexception.hxx>
+#include <cppuhelper/interfacecontainer.h>
+#include <connectivity/sdbcx/VView.hxx>
+#include <comphelper/types.hxx>
+#include <TConnection.hxx>
+
+using namespace ::comphelper;
+
+using namespace ::cppu;
+using namespace connectivity;
+using namespace connectivity::mysql;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+using namespace dbtools;
+typedef connectivity::sdbcx::OCollection OCollection_TYPE;
+
+sdbcx::ObjectType OViews::createObject(const OUString& _rName)
+{
+    OUString sCatalog, sSchema, sTable;
+    ::dbtools::qualifiedNameComponents(m_xMetaData, _rName, sCatalog, sSchema, sTable,
+                                       ::dbtools::EComposeRule::InDataManipulation);
+    return new ::connectivity::sdbcx::OView(isCaseSensitive(), sTable, m_xMetaData, OUString(),
+                                            sSchema, sCatalog);
+}
+
+void OViews::impl_refresh() { static_cast<OMySQLCatalog&>(m_rParent).refreshTables(); }
+
+void OViews::disposing()
+{
+    m_xMetaData.clear();
+    OCollection::disposing();
+}
+
+Reference<XPropertySet> OViews::createDescriptor()
+{
+    Reference<XConnection> xConnection = static_cast<OMySQLCatalog&>(m_rParent).getConnection();
+    connectivity::sdbcx::OView* pNew
+        = new connectivity::sdbcx::OView(true, xConnection->getMetaData());
+    return pNew;
+}
+
+// XAppend
+sdbcx::ObjectType OViews::appendObject(const OUString& _rForName,
+                                       const Reference<XPropertySet>& descriptor)
+{
+    createView(descriptor);
+    return createObject(_rForName);
+}
+
+// XDrop
+void OViews::dropObject(sal_Int32 _nPos, const OUString& /*_sElementName*/)
+{
+    if (m_bInDrop)
+        return;
+
+    Reference<XInterface> xObject(getObject(_nPos));
+    bool bIsNew = connectivity::sdbcx::ODescriptor::isNew(xObject);
+    if (!bIsNew)
+    {
+        OUString aSql("DROP VIEW");
+
+        Reference<XPropertySet> xProp(xObject, UNO_QUERY);
+        aSql += ::dbtools::composeTableName(m_xMetaData, xProp,
+                                            ::dbtools::EComposeRule::InTableDefinitions, true);
+
+        Reference<XConnection> xConnection = static_cast<OMySQLCatalog&>(m_rParent).getConnection();
+        Reference<XStatement> xStmt = xConnection->createStatement();
+        xStmt->execute(aSql);
+        ::comphelper::disposeComponent(xStmt);
+    }
+}
+
+void OViews::dropByNameImpl(const OUString& elementName)
+{
+    m_bInDrop = true;
+    OCollection_TYPE::dropByName(elementName);
+    m_bInDrop = false;
+}
+
+void OViews::createView(const Reference<XPropertySet>& descriptor)
+{
+    Reference<XConnection> xConnection = static_cast<OMySQLCatalog&>(m_rParent).getConnection();
+
+    OUString aSql("CREATE VIEW ");
+    OUString sCommand;
+
+    aSql += ::dbtools::composeTableName(m_xMetaData, descriptor,
+                                        ::dbtools::EComposeRule::InTableDefinitions, true);
+
+    aSql += " AS ";
+    descriptor->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_COMMAND))
+        >>= sCommand;
+    aSql += sCommand;
+
+    Reference<XStatement> xStmt = xConnection->createStatement();
+    if (xStmt.is())
+    {
+        xStmt->execute(aSql);
+        ::comphelper::disposeComponent(xStmt);
+    }
+
+    // insert the new view also in the tables collection
+    OTables* pTables
+        = static_cast<OTables*>(static_cast<OMySQLCatalog&>(m_rParent).getPrivateTables());
+    if (pTables)
+    {
+        OUString sName = ::dbtools::composeTableName(
+            m_xMetaData, descriptor, ::dbtools::EComposeRule::InDataManipulation, false);
+        pTables->appendNew(sName);
+    }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/mysql_jdbc/Yservices.cxx b/connectivity/source/drivers/mysql_jdbc/Yservices.cxx
new file mode 100644
index 000000000000..e275cd8d0371
--- /dev/null
+++ b/connectivity/source/drivers/mysql_jdbc/Yservices.cxx
@@ -0,0 +1,66 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <mysql/YDriver.hxx>
+#include <cppuhelper/factory.hxx>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+
+using namespace connectivity::mysql;
+using ::com::sun::star::lang::XMultiServiceFactory;
+using ::com::sun::star::lang::XSingleServiceFactory;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Sequence;
+
+typedef Reference<XSingleServiceFactory> (*createFactoryFunc)(
+    const Reference<XMultiServiceFactory>& rServiceManager, const OUString& rComponentName,
+    ::cppu::ComponentInstantiation pCreateFunction, const Sequence<OUString>& rServiceNames,
+    rtl_ModuleCount*);
+
+extern "C" SAL_DLLPUBLIC_EXPORT void*
+mysql_jdbc_component_getFactory(const sal_Char* pImplementationName, void* pServiceManager,
+                                void* /*pRegistryKey*/)
+{
+    if (!pServiceManager)
+    {
+        return nullptr;
+    }
+
+    Reference<XSingleServiceFactory> xRet;
+    const Reference<XMultiServiceFactory> xServiceManager(
+        static_cast<XMultiServiceFactory*>(pServiceManager));
+    const OUString sImplementationName(OUString::createFromAscii(pImplementationName));
+
+    if (ODriverDelegator::getImplementationName_Static() == sImplementationName)
+        try
+        {
+            xRet = ::cppu::createSingleFactory(xServiceManager, sImplementationName,
+                                               ODriverDelegator_CreateInstance,
+                                               ODriverDelegator::getSupportedServiceNames_Static());
+        }
+        catch (...)
+        {
+        }
+
+    if (xRet.is())
+        xRet->acquire();
+
+    return xRet.get();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/mysql_jdbc/mysql_jdbc.component b/connectivity/source/drivers/mysql_jdbc/mysql_jdbc.component
new file mode 100644
index 000000000000..0a1d157e93ad
--- /dev/null
+++ b/connectivity/source/drivers/mysql_jdbc/mysql_jdbc.component
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ -->
+
+<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@"
+    prefix="mysql_jdbc" xmlns="http://openoffice.org/2010/uno-components">
+  <implementation name="org.openoffice.comp.drivers.MySQL.Driver">
+    <service name="com.sun.star.sdbc.Driver"/>
+    <service name="com.sun.star.sdbcx.Driver"/>
+  </implementation>
+</component>
diff --git a/dbaccess/source/ui/dlg/generalpage.cxx b/dbaccess/source/ui/dlg/generalpage.cxx
index 9826ffb3f985..0963e3a7bb5a 100644
--- a/dbaccess/source/ui/dlg/generalpage.cxx
+++ b/dbaccess/source/ui/dlg/generalpage.cxx
@@ -126,6 +126,10 @@ namespace dbaui
                     const OUString sURLPrefix = aTypeLoop.getURLPrefix();
                     if ( !sURLPrefix.isEmpty() )
                     {
+                        // skip mysql connection variations. It is handled in another window.
+                        if(sURLPrefix.startsWith("sdbc:mysql:") && !sURLPrefix.startsWith("sdbc:mysql:jdbc:"))
+                            continue;
+
                         OUString sDisplayName = aTypeLoop.getDisplayName();
                         if (   m_pDatasourceType->GetEntryPos( sDisplayName ) == LISTBOX_ENTRY_NOTFOUND
                             && approveDatasourceType( sURLPrefix, sDisplayName ) )
diff --git a/dbaccess/source/ui/dlg/generalpage.hxx b/dbaccess/source/ui/dlg/generalpage.hxx
index b5b22ec38b89..7a9879becd14 100644
--- a/dbaccess/source/ui/dlg/generalpage.hxx
+++ b/dbaccess/source/ui/dlg/generalpage.hxx
@@ -85,6 +85,11 @@ namespace dbaui
         virtual void fillWindows(std::vector< std::unique_ptr<ISaveValueWrapper> >& _rControlList) override;
 
         void onTypeSelected(const OUString& _sURLPrefix);
+
+        /**
+         * Initializes the listbox, which contains entires each representing a
+         * connection to an existing database.
+         */
         void initializeTypeList();
 
         void implSetCurrentType( const OUString& _eType );
diff --git a/postprocess/CustomTarget_registry.mk b/postprocess/CustomTarget_registry.mk
index 4968b6e3eaf5..d1583f2f81f5 100644
--- a/postprocess/CustomTarget_registry.mk
+++ b/postprocess/CustomTarget_registry.mk
@@ -331,8 +331,9 @@ endif
 ifeq ($(ENABLE_JAVA),TRUE)
 postprocess_FILES_main += \
 	$(call gb_XcuModuleTarget_get_target,connectivity/registry/hsqldb)/org/openoffice/Office/DataAccess/Drivers-hsqldb.xcu \
-	$(call gb_XcuModuleTarget_get_target,connectivity/registry/jdbc)/org/openoffice/Office/DataAccess/Drivers-jdbc.xcu
-postprocess_DRIVERS += hsqldb jdbc
+	$(call gb_XcuModuleTarget_get_target,connectivity/registry/jdbc)/org/openoffice/Office/DataAccess/Drivers-jdbc.xcu \
+	$(call gb_XcuModuleTarget_get_target,connectivity/registry/mysql_jdbc)/org/openoffice/Office/DataAccess/Drivers-mysql_jdbc.xcu
+postprocess_DRIVERS += hsqldb jdbc mysql_jdbc
 endif
 ifeq ($(ENABLE_FIREBIRD_SDBC),TRUE)
 postprocess_FILES_main += \
diff --git a/postprocess/Rdb_services.mk b/postprocess/Rdb_services.mk
index 34a3dab0c6d3..fbd2a3008c1f 100644
--- a/postprocess/Rdb_services.mk
+++ b/postprocess/Rdb_services.mk
@@ -261,6 +261,7 @@ $(eval $(call gb_Rdb_add_components,services,\
 	$(if $(ENABLE_JAVA), \
 		connectivity/source/drivers/hsqldb/hsqldb \
 		connectivity/source/drivers/jdbc/jdbc \
+		connectivity/source/drivers/mysql_jdbc/mysql_jdbc \
 	) \
 	connectivity/source/manager/sdbc2 \
 	connectivity/source/drivers/writer/writer \


More information about the Libreoffice-commits mailing list