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@gmail.com>
This commit is contained in:
Tamas Bunth 2018-10-08 11:04:48 +02:00 committed by Tamás Bunth
parent ba6723431a
commit b2cefc2e36
19 changed files with 2190 additions and 2 deletions

View file

@ -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 \

View file

@ -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:

View file

@ -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:

View file

@ -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 \

View file

@ -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>

View file

@ -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: */

View file

@ -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: */

View file

@ -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: */

View file

@ -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: */

View file

@ -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: */

View file

@ -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: */

View file

@ -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: */

View file

@ -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: */

View file

@ -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: */

View file

@ -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>

View file

@ -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 ) )

View file

@ -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 );

View file

@ -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 += \

View file

@ -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 \