connectivity/Library_mysqlc.mk                        |    1 
 connectivity/source/drivers/mysqlc/mysqlc_catalog.cxx |   25 +++++-
 connectivity/source/drivers/mysqlc/mysqlc_users.cxx   |   73 ++++++++++++++++++
 connectivity/source/drivers/mysqlc/mysqlc_users.hxx   |   43 ++++++++++
 4 files changed, 141 insertions(+), 1 deletion(-)

New commits:
commit 4f928a5823b0bc7cd8af1d588e2084ae1ff1543f
Author:     Julien Nabet <[email protected]>
AuthorDate: Sat Dec 2 14:38:16 2023 +0100
Commit:     Julien Nabet <[email protected]>
CommitDate: Sat Dec 2 18:35:20 2023 +0100

    Mysql/Mariadb: implement refreshUsers so get access to users admin page
    
    There's still work to do:
    - retrieve privileges of each table since it's empty for the moment
    - make the checkboxes editable (it seems read only)
    - make the user management work (creating one doesn't work for example)
    
    Change-Id: Ia1d9c4db7faae16ec1903c5d7aa5e679ce5e944a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160244
    Tested-by: Jenkins
    Reviewed-by: Julien Nabet <[email protected]>

diff --git a/connectivity/Library_mysqlc.mk b/connectivity/Library_mysqlc.mk
index afc8f19b86cf..af46fb9ba137 100644
--- a/connectivity/Library_mysqlc.mk
+++ b/connectivity/Library_mysqlc.mk
@@ -68,6 +68,7 @@ $(eval $(call gb_Library_add_exception_objects,mysqlc,\
        connectivity/source/drivers/mysqlc/mysqlc_tables \
        connectivity/source/drivers/mysqlc/mysqlc_types \
        connectivity/source/drivers/mysqlc/mysqlc_user \
+       connectivity/source/drivers/mysqlc/mysqlc_users \
        connectivity/source/drivers/mysqlc/mysqlc_view \
        connectivity/source/drivers/mysqlc/mysqlc_views \
 ))
diff --git a/connectivity/source/drivers/mysqlc/mysqlc_catalog.cxx 
b/connectivity/source/drivers/mysqlc/mysqlc_catalog.cxx
index d8b9db7422d0..d72ab1f65d72 100644
--- a/connectivity/source/drivers/mysqlc/mysqlc_catalog.cxx
+++ b/connectivity/source/drivers/mysqlc/mysqlc_catalog.cxx
@@ -10,6 +10,9 @@
 #include "mysqlc_catalog.hxx"
 #include "mysqlc_tables.hxx"
 #include "mysqlc_views.hxx"
+#include "mysqlc_users.hxx"
+#include <com/sun/star/sdbc/XRow.hpp>
+#include <comphelper/types.hxx>
 
 connectivity::mysqlc::Catalog::Catalog(
     const css::uno::Reference<css::sdbc::XConnection>& rConnection)
@@ -64,7 +67,27 @@ void connectivity::mysqlc::Catalog::refreshGroups()
 //----- IRefreshableUsers ----------------------------------------------------
 void connectivity::mysqlc::Catalog::refreshUsers()
 {
-    // TODO: implement me
+    css::uno::Reference<css::sdbc::XStatement> statement = 
m_xConnection->createStatement();
+    css::uno::Reference<css::sdbc::XResultSet> xUsers = 
statement->executeQuery(
+        "SELECT grantee FROM information_schema.user_privileges GROUP BY 
grantee");
+
+    if (!xUsers.is())
+        return;
+
+    ::std::vector<OUString> aUserNames;
+
+    css::uno::Reference<css::sdbc::XRow> xRow(xUsers, css::uno::UNO_QUERY);
+    while (xUsers->next())
+    {
+        aUserNames.push_back(xRow->getString(1));
+    }
+    xRow.clear();
+    ::comphelper::disposeComponent(xUsers);
+
+    if (!m_pUsers)
+        m_pUsers.reset(new Users(m_xConnection->getMetaData(), *this, 
m_aMutex, aUserNames));
+    else
+        m_pUsers->reFill(aUserNames);
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/connectivity/source/drivers/mysqlc/mysqlc_users.cxx 
b/connectivity/source/drivers/mysqlc/mysqlc_users.cxx
new file mode 100644
index 000000000000..62b8ae44836c
--- /dev/null
+++ b/connectivity/source/drivers/mysqlc/mysqlc_users.cxx
@@ -0,0 +1,73 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 
fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#include <utility>
+
+#include "mysqlc_user.hxx"
+#include "mysqlc_users.hxx"
+
+using namespace ::connectivity;
+using namespace ::connectivity::mysqlc;
+using namespace ::connectivity::sdbcx;
+using namespace ::cppu;
+using namespace ::osl;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::uno;
+
+Users::Users(const uno::Reference<XDatabaseMetaData>& rMetaData, OWeakObject& 
rParent,
+             Mutex& rMutex, ::std::vector<OUString> const& rNames)
+    : OCollection(rParent, true, rMutex, rNames)
+    , m_xMetaData(rMetaData)
+{
+}
+
+//----- OCollection -----------------------------------------------------------
+void Users::impl_refresh()
+{
+    // TODO: IMPLEMENT ME
+}
+
+ObjectType Users::createObject(const OUString& rName)
+{
+    return new User(m_xMetaData->getConnection(), rName);
+}
+
+uno::Reference<XPropertySet> Users::createDescriptor()
+{
+    // There is some internal magic so that the same class can be used as 
either
+    // a descriptor or as a normal user. See VUser.cxx for the details. In our
+    // case we just need to ensure we use the correct constructor.
+    return new User(m_xMetaData->getConnection());
+}
+
+//----- XAppend ---------------------------------------------------------------
+ObjectType Users::appendObject(const OUString& rName, const 
uno::Reference<XPropertySet>&)
+{
+    // TODO: set sSql as appropriate
+    m_xMetaData->getConnection()->createStatement()->execute(OUString());
+
+    return createObject(rName);
+}
+
+//----- XDrop -----------------------------------------------------------------
+void Users::dropObject(sal_Int32 nPosition, const OUString&)
+{
+    uno::Reference<XPropertySet> xUser(getObject(nPosition));
+
+    if (!ODescriptor::isNew(xUser))
+    {
+        // TODO: drop me
+    }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/connectivity/source/drivers/mysqlc/mysqlc_users.hxx 
b/connectivity/source/drivers/mysqlc/mysqlc_users.hxx
new file mode 100644
index 000000000000..d4c4d3558e42
--- /dev/null
+++ b/connectivity/source/drivers/mysqlc/mysqlc_users.hxx
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 
fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#pragma once
+
+#include <connectivity/sdbcx/VCollection.hxx>
+#include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
+
+namespace connectivity::mysqlc
+{
+class Users : public ::connectivity::sdbcx::OCollection
+{
+    css::uno::Reference<css::sdbc::XDatabaseMetaData> m_xMetaData;
+
+protected:
+    // OCollection
+    virtual void impl_refresh() override;
+    virtual ::connectivity::sdbcx::ObjectType createObject(const OUString& 
rName) override;
+    virtual css::uno::Reference<css::beans::XPropertySet> createDescriptor() 
override;
+    virtual ::connectivity::sdbcx::ObjectType
+    appendObject(const OUString& rName,
+                 const css::uno::Reference<css::beans::XPropertySet>& 
rDescriptor) override;
+
+public:
+    Users(const css::uno::Reference<css::sdbc::XDatabaseMetaData>& rMetaData,
+          ::cppu::OWeakObject& rParent, ::osl::Mutex& rMutex,
+          ::std::vector<OUString> const& rNames);
+
+    // TODO: we should also implement XDataDescriptorFactory, XRefreshable,
+    // XAppend,  etc., but all are optional.
+
+    // XDrop
+    virtual void dropObject(sal_Int32 nPosition, const OUString& rName) 
override;
+};
+} // namespace connectivity::mysqlc
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */

Reply via email to