diff options
author | Julien Nabet <serval2412@yahoo.fr> | 2022-01-12 20:58:29 +0100 |
---|---|---|
committer | Julien Nabet <serval2412@yahoo.fr> | 2022-01-14 21:41:31 +0100 |
commit | 628fedabdd27ad08e9a42f47106864751e493c2c (patch) | |
tree | 23fea1a6f0a1c3a547088a6834f4e1c65c89f979 | |
parent | 8be1888ede5b17bae7e5ee239011a9156b9c7614 (diff) |
Mysql/MariaDB: tdf#81430 make tables editable (with or without PK)
Change-Id: I7df464107e692817ef80d887a4addea618d6cc72
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128356
Tested-by: Jenkins
Reviewed-by: Julien Nabet <serval2412@yahoo.fr>
17 files changed, 160 insertions, 65 deletions
diff --git a/connectivity/Library_mysqlc.mk b/connectivity/Library_mysqlc.mk index fa760adefebe..467562c066f7 100644 --- a/connectivity/Library_mysqlc.mk +++ b/connectivity/Library_mysqlc.mk @@ -31,12 +31,12 @@ $(eval $(call gb_Library_add_libs,mysqlc,\ $(eval $(call gb_Library_use_sdk_api,mysqlc)) $(eval $(call gb_Library_use_libraries,mysqlc,\ + comphelper \ cppu \ - dbtools \ + cppuhelper \ + dbtools \ sal \ salhelper \ - comphelper \ - cppuhelper \ )) $(eval $(call gb_Library_add_defs,mysqlc,\ @@ -49,17 +49,26 @@ $(eval $(call gb_Library_add_defs,mysqlc,\ )) $(eval $(call gb_Library_add_exception_objects,mysqlc,\ + connectivity/source/drivers/mysqlc/mysqlc_catalog \ + connectivity/source/drivers/mysqlc/mysqlc_column \ + connectivity/source/drivers/mysqlc/mysqlc_columns \ connectivity/source/drivers/mysqlc/mysqlc_connection \ connectivity/source/drivers/mysqlc/mysqlc_databasemetadata \ connectivity/source/drivers/mysqlc/mysqlc_driver \ connectivity/source/drivers/mysqlc/mysqlc_general \ + connectivity/source/drivers/mysqlc/mysqlc_indexes \ + connectivity/source/drivers/mysqlc/mysqlc_keys \ connectivity/source/drivers/mysqlc/mysqlc_prepared_resultset \ connectivity/source/drivers/mysqlc/mysqlc_preparedstatement \ connectivity/source/drivers/mysqlc/mysqlc_resultset \ connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata \ connectivity/source/drivers/mysqlc/mysqlc_services \ connectivity/source/drivers/mysqlc/mysqlc_statement \ + connectivity/source/drivers/mysqlc/mysqlc_table \ + connectivity/source/drivers/mysqlc/mysqlc_tables \ connectivity/source/drivers/mysqlc/mysqlc_types \ + connectivity/source/drivers/mysqlc/mysqlc_user \ + connectivity/source/drivers/mysqlc/mysqlc_users \ )) $(eval $(call gb_Library_set_componentfile,mysqlc,connectivity/source/drivers/mysqlc/mysqlc,services)) diff --git a/connectivity/source/commontools/TTableHelper.cxx b/connectivity/source/commontools/TTableHelper.cxx index 3235c69ae8ef..2436776fb177 100644 --- a/connectivity/source/commontools/TTableHelper.cxx +++ b/connectivity/source/commontools/TTableHelper.cxx @@ -549,6 +549,11 @@ OUString SAL_CALL OTableHelper::getName() return sComposedName; } +OUString OTableHelper::getTableName() +{ + return m_Name; +} + std::shared_ptr<sdbcx::KeyProperties> OTableHelper::getKeyProperties(const OUString& _sName) const { std::shared_ptr<sdbcx::KeyProperties> pKeyProps; diff --git a/connectivity/source/drivers/mysqlc/mysqlc_connection.cxx b/connectivity/source/drivers/mysqlc/mysqlc_connection.cxx index 4d11c893eb13..1c654c3e24ed 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_connection.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_connection.cxx @@ -17,8 +17,10 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include "mysqlc_catalog.hxx" #include "mysqlc_connection.hxx" #include "mysqlc_databasemetadata.hxx" +#include <com/sun/star/sdbc/SQLException.hpp> #include "mysqlc_driver.hxx" #include "mysqlc_statement.hxx" @@ -27,6 +29,10 @@ #include <com/sun/star/beans/NamedValue.hpp> +#include <comphelper/processfactory.hxx> +#include <comphelper/servicehelper.hxx> +#include <comphelper/storagehelper.hxx> + #include <osl/diagnose.h> #include <cppuhelper/supportsservice.hxx> @@ -37,6 +43,7 @@ using namespace com::sun::star::container; using namespace com::sun::star::lang; using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; +using namespace com::sun::star::sdbcx; using ::osl::MutexGuard; #define MYSQLC_URI_PREFIX "sdbc:mysqlc:" @@ -53,6 +60,7 @@ void lcl_executeUpdate(MYSQL* pMySql, const OString& sql) OConnection::OConnection(MysqlCDriver& _rDriver) : OMetaConnection_BASE(m_aMutex) , m_mysql() + , m_xCatalog(nullptr) , m_xMetaData(nullptr) , m_xDriver(&_rDriver) { @@ -489,4 +497,36 @@ OUString OConnection::transFormPreparedStatement(const OUString& _sSQL) return sSqlStatement; } +//----- XUnoTunnel ---------------------------------------------------------- +// virtual +sal_Int64 SAL_CALL OConnection::getSomething(const css::uno::Sequence<sal_Int8>& rId) +{ + return comphelper::getSomethingImpl(rId, this); +} + +// static +Sequence<sal_Int8> OConnection::getUnoTunnelId() +{ + static const comphelper::UnoIdInit implId; + return implId.getSeq(); +} + +Reference<XTablesSupplier> OConnection::createCatalog() +{ + MutexGuard aGuard(m_aMutex); + + // m_xCatalog is a weak reference. Reuse it if it still exists. + Reference<XTablesSupplier> xCatalog = m_xCatalog; + if (xCatalog.is()) + { + return xCatalog; + } + else + { + xCatalog = new Catalog(this); + m_xCatalog = xCatalog; + return m_xCatalog; + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_connection.hxx b/connectivity/source/drivers/mysqlc/mysqlc_connection.hxx index d527f467e334..5280ecde78f1 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_connection.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_connection.hxx @@ -35,8 +35,10 @@ #include <com/sun/star/sdbc/XWarningsSupplier.hpp> #include <com/sun/star/util/XStringSubstitution.hpp> +#include <com/sun/star/sdbcx/XTablesSupplier.hpp> + #include <cppuhelper/basemutex.hxx> -#include <cppuhelper/compbase3.hxx> +#include <cppuhelper/compbase.hxx> #include <cppuhelper/weakref.hxx> #include <rtl/string.hxx> #include <rtl/ref.hxx> @@ -61,8 +63,8 @@ using ::com::sun::star::sdbc::SQLException; using ::com::sun::star::sdbc::SQLWarning; using ::com::sun::star::uno::RuntimeException; -typedef ::cppu::WeakComponentImplHelper3<css::sdbc::XConnection, css::sdbc::XWarningsSupplier, - css::lang::XServiceInfo> +typedef ::cppu::WeakComponentImplHelper<css::sdbc::XConnection, css::sdbc::XWarningsSupplier, + css::lang::XUnoTunnel, css::lang::XServiceInfo> OMetaConnection_BASE; struct ConnectionSettings @@ -93,6 +95,7 @@ private: // Data attributes + css::uno::WeakReference<css::sdbcx::XTablesSupplier> m_xCatalog; css::uno::WeakReference<css::sdbc::XDatabaseMetaData> m_xMetaData; OWeakRefArray m_aStatements; // vector containing a list @@ -115,6 +118,12 @@ public: rtl_TextEncoding getConnectionEncoding() const { return m_settings.encoding; } + /** + * Create and/or connect to the sdbcx Catalog. This is completely + * unrelated to the SQL "Catalog". + */ + css::uno::Reference<css::sdbcx::XTablesSupplier> createCatalog(); + // OComponentHelper virtual void SAL_CALL disposing() override; @@ -125,6 +134,10 @@ public: virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; + // XUnoTunnel + virtual sal_Int64 SAL_CALL getSomething(const css::uno::Sequence<sal_Int8>& rId) override; + static css::uno::Sequence<sal_Int8> getUnoTunnelId(); + // XConnection css::uno::Reference<css::sdbc::XStatement> SAL_CALL createStatement() override; diff --git a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx index a9b15916594f..adaaa57a7e6f 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx @@ -160,7 +160,7 @@ sal_Bool SAL_CALL ODatabaseMetaData::supportsNonNullableColumns() { return true; OUString SAL_CALL ODatabaseMetaData::getCatalogTerm() { return "n/a"; } -OUString SAL_CALL ODatabaseMetaData::getIdentifierQuoteString() { return "\""; } +OUString SAL_CALL ODatabaseMetaData::getIdentifierQuoteString() { return "`"; } OUString SAL_CALL ODatabaseMetaData::getExtraNameCharacters() { return "#@"; } @@ -806,7 +806,8 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTables(const Any& /*catalog "IF(STRCMP(TABLE_TYPE,'BASE TABLE'), TABLE_TYPE, 'TABLE') AS TABLE_TYPE, TABLE_COMMENT AS " "REMARKS " "FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema', 'mysql', " - "'performance_schema') AND TABLE_SCHEMA LIKE '?' AND TABLE_NAME LIKE '?' " + "'performance_schema') AND TABLE_SCHEMA LIKE '?' AND CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) " + "LIKE '?' " }; if (types.getLength() == 1) diff --git a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.hxx b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.hxx index b56a460e0843..caed92f20e80 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.hxx @@ -177,7 +177,7 @@ public: css::uno::Reference<css::sdbc::XResultSet> SAL_CALL getSchemas() override; css::uno::Reference<css::sdbc::XResultSet> SAL_CALL getCatalogs() override; css::uno::Reference<css::sdbc::XResultSet> SAL_CALL getTableTypes() override; - css::uno::Reference<css::sdbc::XResultSet> + virtual css::uno::Reference<css::sdbc::XResultSet> SAL_CALL getColumns(const Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const OUString& columnNamePattern) override; diff --git a/connectivity/source/drivers/mysqlc/mysqlc_driver.cxx b/connectivity/source/drivers/mysqlc/mysqlc_driver.cxx index d38cfe24eb44..37a14e822aff 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_driver.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_driver.cxx @@ -23,9 +23,11 @@ using namespace css::uno; using namespace css::lang; using namespace css::beans; using namespace css::sdbc; +using namespace css::sdbcx; using namespace connectivity::mysqlc; #include <cppuhelper/supportsservice.hxx> +#include <comphelper/servicehelper.hxx> MysqlCDriver::MysqlCDriver(const Reference<XMultiServiceFactory>& _rxFactory) : ODriver_BASE(m_aMutex) @@ -59,7 +61,7 @@ OUString MysqlCDriver::getImplementationName_Static() Sequence<OUString> MysqlCDriver::getSupportedServiceNames_Static() { - return { "com.sun.star.sdbc.Driver" }; + return { "com.sun.star.sdbc.Driver", "com.sun.star.sdbcx.Driver" }; } OUString SAL_CALL MysqlCDriver::getImplementationName() { return getImplementationName_Static(); } @@ -113,6 +115,21 @@ sal_Int32 SAL_CALL MysqlCDriver::getMajorVersion() { return MARIADBC_VERSION_MAJ sal_Int32 SAL_CALL MysqlCDriver::getMinorVersion() { return MARIADBC_VERSION_MINOR; } +Reference<XTablesSupplier> + SAL_CALL MysqlCDriver::getDataDefinitionByConnection(const Reference<XConnection>& rConnection) +{ + if (OConnection* pConnection = comphelper::getFromUnoTunnel<OConnection>(rConnection)) + return pConnection->createCatalog(); + return {}; +} + +Reference<XTablesSupplier> SAL_CALL +MysqlCDriver::getDataDefinitionByURL(const OUString& rURL, const Sequence<PropertyValue>& rInfo) +{ + Reference<XConnection> xConnection = connect(rURL, rInfo); + return getDataDefinitionByConnection(xConnection); +} + namespace connectivity::mysqlc { Reference<XInterface> MysqlCDriver_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory) diff --git a/connectivity/source/drivers/mysqlc/mysqlc_driver.hxx b/connectivity/source/drivers/mysqlc/mysqlc_driver.hxx index fec80288b59a..64fff2e7704b 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_driver.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_driver.hxx @@ -23,7 +23,8 @@ #include <com/sun/star/sdbc/XDriver.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> - +#include <com/sun/star/sdbcx/XDataDefinitionSupplier.hpp> +#include <cppuhelper/compbase.hxx> #include <cppuhelper/compbase2.hxx> #include <osl/module.h> @@ -38,7 +39,9 @@ using css::uno::Sequence; Reference<css::uno::XInterface> MysqlCDriver_CreateInstance(const Reference<css::lang::XMultiServiceFactory>& _rxFactory); -typedef ::cppu::WeakComponentImplHelper2<css::sdbc::XDriver, css::lang::XServiceInfo> ODriver_BASE; +typedef ::cppu::WeakComponentImplHelper<css::sdbc::XDriver, css::sdbcx::XDataDefinitionSupplier, + css::lang::XServiceInfo> + ODriver_BASE; typedef void* (*OMysqlCConnection_CreateInstanceFunction)(void* _pDriver); @@ -82,6 +85,12 @@ public: const Reference<css::lang::XMultiServiceFactory>& getFactory() const { return m_xFactory; } static rtl_TextEncoding getDefaultEncoding() { return RTL_TEXTENCODING_UTF8; } + + // XDataDefinitionSupplier + virtual css::uno::Reference<css::sdbcx::XTablesSupplier> SAL_CALL getDataDefinitionByConnection( + const css::uno::Reference<css::sdbc::XConnection>& rxConnection) override; + virtual css::uno::Reference<css::sdbcx::XTablesSupplier> SAL_CALL getDataDefinitionByURL( + const OUString& rsURL, const css::uno::Sequence<css::beans::PropertyValue>& rInfo) override; }; } /* connectivity::mysqlc */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_indexes.cxx b/connectivity/source/drivers/mysqlc/mysqlc_indexes.cxx index ef31e2f723fd..3aa2542db9dc 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_indexes.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_indexes.cxx @@ -20,14 +20,12 @@ using namespace ::com::sun::star::sdbc; Indexes::Indexes(Table* pTable, Mutex& rMutex, const vector<OUString>& rVector) : OIndexesHelper(pTable, rMutex, rVector) - , m_pTable(pTable) -{ -} +/* , m_pTable(pTable) */ {} // XDrop -void Indexes::dropObject(sal_Int32 /*nPosition*/, const OUString& sIndexName) +void Indexes::dropObject(sal_Int32 /*nPosition*/, const OUString& /* sIndexName */) { - // TODO IMPLEMENT ME + // TODO: implement } /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_indexes.hxx b/connectivity/source/drivers/mysqlc/mysqlc_indexes.hxx index c450c7bc2785..4c918d1846fd 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_indexes.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_indexes.hxx @@ -18,7 +18,8 @@ namespace connectivity::mysqlc class Indexes : public ::connectivity::OIndexesHelper { private: - Table* m_pTable; + // TODO: useful? + // Table* m_pTable; protected: // XDrop diff --git a/connectivity/source/drivers/mysqlc/mysqlc_keys.cxx b/connectivity/source/drivers/mysqlc/mysqlc_keys.cxx index 4a65a377a7ce..770cead57be1 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_keys.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_keys.cxx @@ -32,8 +32,7 @@ Keys::Keys(Table* pTable, Mutex& rMutex, const ::std::vector<OUString>& rNames) //----- XDrop ---------------------------------------------------------------- void Keys::dropObject(sal_Int32 nPosition, const OUString& sName) { - // TODO IMPLEMENT ME (should we just copy from Firebird LO code below?) - /* + // TODO: implement (should we just copy from Firebird LO code below?) if (m_pTable->isNew()) return; @@ -44,12 +43,11 @@ void Keys::dropObject(sal_Int32 nPosition, const OUString& sName) const OUString sQuote = m_pTable->getConnection()->getMetaData()->getIdentifierQuoteString(); - OUString sSql("ALTER TABLE " + quoteName(sQuote, m_pTable->getName()) + " DROP CONSTRAINT " - + quoteName(sQuote, sName)); + OUString sSql("ALTER TABLE " + quoteName(sQuote, m_pTable->getTableName()) + + " DROP CONSTRAINT " + quoteName(sQuote, sName)); m_pTable->getConnection()->createStatement()->execute(sSql); } -*/ } /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx b/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx index 88d7f7cf05dc..6fc531fa943d 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx @@ -21,6 +21,7 @@ #include "mysqlc_general.hxx" #include <com/sun/star/sdbc/XRow.hpp> +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> using namespace connectivity::mysqlc; using namespace com::sun::star::uno; diff --git a/connectivity/source/drivers/mysqlc/mysqlc_table.cxx b/connectivity/source/drivers/mysqlc/mysqlc_table.cxx index cd877f26cbac..ff5a3a8221d5 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_table.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_table.cxx @@ -16,6 +16,7 @@ #include <sal/log.hxx> #include <comphelper/sequence.hxx> +#include <comphelper/types.hxx> #include <connectivity/dbtools.hxx> #include <com/sun/star/sdbc/ColumnValue.hpp> @@ -44,8 +45,9 @@ Table::Table(Tables* pTables, Mutex& rMutex, const uno::Reference<XConnection>& } Table::Table(Tables* pTables, Mutex& rMutex, const uno::Reference<XConnection>& rConnection, - const OUString& rName, const OUString& rType, const OUString& rDescription) - : OTableHelper(pTables, rConnection, true, rName, rType, rDescription, "", "") + const OUString& rCatalog, const OUString& rSchema, const OUString& rName, + const OUString& rType, const OUString& rDescription) + : OTableHelper(pTables, rConnection, true, rName, rType, rDescription, rSchema, rCatalog) , m_rMutex(rMutex) , m_nPrivileges(0) { @@ -83,8 +85,8 @@ OCollection* Table::createIndexes(const ::std::vector<OUString>& rNames) } //----- XAlterTable ----------------------------------------------------------- -void SAL_CALL Table::alterColumnByName(const OUString& /* rColName */, - const uno::Reference<XPropertySet>& /* rDescriptor */) +void SAL_CALL Table::alterColumnByName(const OUString& rColName, + const uno::Reference<XPropertySet>& rDescriptor) { MutexGuard aGuard(m_rMutex); checkDisposed(WeakComponentImplHelperBase::rBHelper.bDisposed); @@ -97,43 +99,53 @@ void SAL_CALL Table::alterColumnByName(const OUString& /* rColName */, // sdbcx::ColumnDescriptor const bool bTypeChanged = xColumn->getPropertyValue("Type") != rDescriptor->getPropertyValue("Type"); - const bool bTypeNameChanged - = xColumn->getPropertyValue("TypeName") != rDescriptor->getPropertyValue("TypeName"); + const bool bTypeNameChanged = !comphelper::getString(xColumn->getPropertyValue("TypeName")) + .equalsIgnoreAsciiCase(comphelper::getString( + rDescriptor->getPropertyValue("TypeName"))); const bool bPrecisionChanged = xColumn->getPropertyValue("Precision") != rDescriptor->getPropertyValue("Precision"); const bool bScaleChanged = xColumn->getPropertyValue("Scale") != rDescriptor->getPropertyValue("Scale"); + const bool bIsNullableChanged = xColumn->getPropertyValue("IsNullable") != rDescriptor->getPropertyValue("IsNullable"); + const bool bIsAutoIncrementChanged = xColumn->getPropertyValue("IsAutoIncrement") != rDescriptor->getPropertyValue("IsAutoIncrement"); + // there's also DefaultValue but not related to database directly, it seems completely internal to LO + // so no need to test it // TODO: remainder -- these are all "optional" so have to detect presence and change. - - bool bDefaultChanged = xColumn->getPropertyValue("DefaultValue") - != rDescriptor->getPropertyValue("DefaultValue"); - - // TODO: tests to do - if (bTypeChanged || bTypeNameChanged || bPrecisionChanged || bScaleChanged || bIsNullableChanged - || bIsAutoIncrementChanged || bDefaultChanged) + if (bTypeChanged || bTypeNameChanged || bPrecisionChanged || bScaleChanged || bIsNullableChanged + || bIsAutoIncrementChanged) { // If bPrecisionChanged this will only succeed if we have increased the // precision, otherwise an exception is thrown -- however the base // gui then offers to delete and recreate the column. - OUString sSql(getAlterTableColumn(rColName) + "TYPE " - + ::dbtools::createStandardTypePart(rDescriptor, getConnection())); - getConnection()->createStatement()->execute(sSql); + OUStringBuffer sSql(300); + sSql.append("ALTER TABLE `" + getTableName() + "` MODIFY COLUMN `" + rColName + "` " + + ::dbtools::createStandardTypePart(rDescriptor, getConnection())); + + if (comphelper::getBOOL(rDescriptor->getPropertyValue("IsAutoIncrement"))) + sSql.append(" auto_increment"); + + // see ColumnValue: NO_NULLS = 0, NULLABLE = 1, NULLABLE_UNKNOWN + // so entry required = yes corresponds to NO_NULLS = 0 and only in this case + // NOT NULL + if (comphelper::getINT32(rDescriptor->getPropertyValue("IsNullable")) == 0) + sSql.append(" NOT NULL"); + + getConnection()->createStatement()->execute(sSql.makeStringAndClear()); // TODO: could cause errors e.g. if incompatible types, deal with them here as appropriate. // possibly we have to wrap things in Util::evaluateStatusVector. } - // TODO: tests to do - // TODO: quote identifiers as needed. if (bNameChanged) { OUString sNewColName; rDescriptor->getPropertyValue("Name") >>= sNewColName; - OUString sSql(getAlterTableColumn(rColName) + " TO \"" + sNewColName + "\""); + OUString sSql("ALTER TABLE `" + getName() + "` RENAME COLUMN `" + rColName + "` TO `" + + sNewColName + "`"); getConnection()->createStatement()->execute(sSql); } @@ -142,10 +154,13 @@ void SAL_CALL Table::alterColumnByName(const OUString& /* rColName */, } void SAL_CALL Table::alterColumnByIndex( - sal_Int32 /* index */, const css::uno::Reference<css::beans::XPropertySet>& /* descriptor */) + sal_Int32 index, const css::uno::Reference<css::beans::XPropertySet>& descriptor) { MutexGuard aGuard(m_rMutex); - // TODO: implement + uno::Reference<XPropertySet> xColumn(m_xColumns->getByIndex(index), UNO_QUERY_THROW); + alterColumnByName(comphelper::getString(xColumn->getPropertyValue( + OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))), + descriptor); } // ----- XRename -------------------------------------------------------------- @@ -163,13 +178,4 @@ Any SAL_CALL Table::queryInterface(const Type& rType) return OTableHelper::queryInterface(rType); } -// ----- XTypeProvider -------------------------------------------------------- -uno::Sequence<Type> SAL_CALL Table::getTypes() { return OTableHelper::getTypes(); } - -OUString Table::getAlterTableColumn(std::u16string_view rColumn) -{ - // TODO: test - return ("ALTER TABLE \"" + getName() + "\" ALTER COLUMN \"" + rColumn + "\" "); -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_table.hxx b/connectivity/source/drivers/mysqlc/mysqlc_table.hxx index 18e21c4c9126..6c235806117c 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_table.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_table.hxx @@ -29,12 +29,6 @@ private: ::osl::Mutex& m_rMutex; sal_Int32 m_nPrivileges; - /** - * Get the ALTER TABLE [TABLE] ALTER [COLUMN] String. - * Includes a trailing space. - */ - OUString getAlterTableColumn(std::u16string_view rColumn); - protected: void construct() override; @@ -42,8 +36,9 @@ public: Table(Tables* pTables, ::osl::Mutex& rMutex, const css::uno::Reference<css::sdbc::XConnection>& _xConnection); Table(Tables* pTables, ::osl::Mutex& rMutex, - const css::uno::Reference<css::sdbc::XConnection>& _xConnection, const OUString& rName, - const OUString& rType, const OUString& rDescription); + const css::uno::Reference<css::sdbc::XConnection>& _xConnection, const OUString& rCatalog, + const OUString& rSchema, const OUString& rName, const OUString& rType, + const OUString& rDescription); // OTableHelper virtual ::connectivity::sdbcx::OCollection* @@ -70,9 +65,6 @@ public: //XInterface virtual css::uno::Any SAL_CALL queryInterface(const css::uno::Type& rType) override; - - //XTypeProvider - virtual css::uno::Sequence<css::uno::Type> SAL_CALL getTypes() override; }; } // namespace connectivity::mysqlc diff --git a/connectivity/source/drivers/mysqlc/mysqlc_tables.cxx b/connectivity/source/drivers/mysqlc/mysqlc_tables.cxx index f32e5b4c275f..9f150009baf0 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_tables.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_tables.cxx @@ -54,6 +54,8 @@ ObjectType Tables::createObject(const OUString& rName) throw RuntimeException(); ObjectType xRet(new Table(this, m_rMutex, m_xMetaData->getConnection(), + xRow->getString(1), // Catalog + xRow->getString(2), // Schema xRow->getString(3), // Name xRow->getString(4), // Type xRow->getString(5))); // Description / Remarks / Comments diff --git a/connectivity/source/drivers/mysqlc/mysqlc_user.cxx b/connectivity/source/drivers/mysqlc/mysqlc_user.cxx index 4afe9cf76a75..65470be59b86 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_user.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_user.cxx @@ -29,7 +29,7 @@ User::User(const css::uno::Reference<css::sdbc::XConnection>& rConnection, const { } -void User::changePassword(const OUString&, const OUString& newPassword) +void User::changePassword(const OUString&, const OUString& /* newPassword */) { // TODO: implement } diff --git a/include/connectivity/TTableHelper.hxx b/include/connectivity/TTableHelper.hxx index ba32ba7e9b80..a322964bb795 100644 --- a/include/connectivity/TTableHelper.hxx +++ b/include/connectivity/TTableHelper.hxx @@ -148,6 +148,9 @@ namespace connectivity // XNamed virtual OUString SAL_CALL getName() override; + // To retrieve the table name only without the schema + OUString getTableName(); + // helper method to get key properties std::shared_ptr<sdbcx::KeyProperties> getKeyProperties(const OUString& _sName) const; void addKey(const OUString& _sName,const std::shared_ptr<sdbcx::KeyProperties>& _aKeyProperties); |