summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Repository.mk1
-rw-r--r--connectivity/Configuration_mysql_jdbc.mk20
-rw-r--r--connectivity/Library_mysql_jdbc.mk48
-rw-r--r--connectivity/Module_connectivity.mk2
-rw-r--r--connectivity/registry/mysql_jdbc/org/openoffice/Office/DataAccess/Drivers.xcu249
-rw-r--r--connectivity/source/drivers/mysql_jdbc/YCatalog.cxx133
-rw-r--r--connectivity/source/drivers/mysql_jdbc/YColumns.cxx74
-rw-r--r--connectivity/source/drivers/mysql_jdbc/YDriver.cxx435
-rw-r--r--connectivity/source/drivers/mysql_jdbc/YTable.cxx336
-rw-r--r--connectivity/source/drivers/mysql_jdbc/YTables.cxx216
-rw-r--r--connectivity/source/drivers/mysql_jdbc/YUser.cxx324
-rw-r--r--connectivity/source/drivers/mysql_jdbc/YUsers.cxx101
-rw-r--r--connectivity/source/drivers/mysql_jdbc/YViews.cxx146
-rw-r--r--connectivity/source/drivers/mysql_jdbc/Yservices.cxx66
-rw-r--r--connectivity/source/drivers/mysql_jdbc/mysql_jdbc.component26
-rw-r--r--dbaccess/source/ui/dlg/generalpage.cxx4
-rw-r--r--dbaccess/source/ui/dlg/generalpage.hxx5
-rw-r--r--postprocess/CustomTarget_registry.mk5
-rw-r--r--postprocess/Rdb_services.mk1
19 files changed, 2190 insertions, 2 deletions
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 \