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:
parent
ba6723431a
commit
b2cefc2e36
19 changed files with 2190 additions and 2 deletions
|
@ -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 \
|
||||
|
|
20
connectivity/Configuration_mysql_jdbc.mk
Normal file
20
connectivity/Configuration_mysql_jdbc.mk
Normal 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:
|
48
connectivity/Library_mysql_jdbc.mk
Normal file
48
connectivity/Library_mysql_jdbc.mk
Normal 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:
|
|
@ -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 \
|
||||
|
|
|
@ -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>
|
133
connectivity/source/drivers/mysql_jdbc/YCatalog.cxx
Normal file
133
connectivity/source/drivers/mysql_jdbc/YCatalog.cxx
Normal 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: */
|
74
connectivity/source/drivers/mysql_jdbc/YColumns.cxx
Normal file
74
connectivity/source/drivers/mysql_jdbc/YColumns.cxx
Normal 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: */
|
435
connectivity/source/drivers/mysql_jdbc/YDriver.cxx
Normal file
435
connectivity/source/drivers/mysql_jdbc/YDriver.cxx
Normal 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: */
|
336
connectivity/source/drivers/mysql_jdbc/YTable.cxx
Normal file
336
connectivity/source/drivers/mysql_jdbc/YTable.cxx
Normal 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: */
|
216
connectivity/source/drivers/mysql_jdbc/YTables.cxx
Normal file
216
connectivity/source/drivers/mysql_jdbc/YTables.cxx
Normal 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: */
|
324
connectivity/source/drivers/mysql_jdbc/YUser.cxx
Normal file
324
connectivity/source/drivers/mysql_jdbc/YUser.cxx
Normal 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: */
|
101
connectivity/source/drivers/mysql_jdbc/YUsers.cxx
Normal file
101
connectivity/source/drivers/mysql_jdbc/YUsers.cxx
Normal 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: */
|
146
connectivity/source/drivers/mysql_jdbc/YViews.cxx
Normal file
146
connectivity/source/drivers/mysql_jdbc/YViews.cxx
Normal 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: */
|
66
connectivity/source/drivers/mysql_jdbc/Yservices.cxx
Normal file
66
connectivity/source/drivers/mysql_jdbc/Yservices.cxx
Normal 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: */
|
26
connectivity/source/drivers/mysql_jdbc/mysql_jdbc.component
Normal file
26
connectivity/source/drivers/mysql_jdbc/mysql_jdbc.component
Normal 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>
|
|
@ -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 ) )
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 += \
|
||||
|
|
|
@ -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 \
|
||||
|
|
Loading…
Reference in a new issue