]> git.stg.codes - stg.git/blobdiff - projects/stargazer/admins_impl.h
Checkout submodules in GitHub Actions.
[stg.git] / projects / stargazer / admins_impl.h
index 8318fc214aa295b9f7d5867eb064ba3dc0cb74bd..9c443a77abe771e8c557e21a87275fe49ad777cc 100644 (file)
  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
  */
 
- /*
- $Revision: 1.10 $
- $Date: 2010/10/04 20:17:12 $
- $Author: faust $
- */
+#pragma once
+
+#include "stg/admins.h"
+#include "stg/admin.h"
+#include "stg/store.h"
+#include "stg/logger.h"
 
-#ifndef ADMINS_IMPL_H
-#define ADMINS_IMPL_H
+#include <vector>
+#include <string>
+#include <algorithm>
+#include <mutex>
 
-#include <pthread.h>
-#include <list>
-#include <map>
+namespace STG
+{
 
-#include "admins.h"
-#include "admin.h"
-#include "admin_impl.h"
-#include "stg_locker.h"
-#include "base_store.h"
-#include "noncopyable.h"
+class AdminsImpl : public Admins
+{
+    public:
+        explicit AdminsImpl(Store& st);
 
-class ADMINS_IMPL : private NONCOPYABLE, public ADMINS {
-public:
-    ADMINS_IMPL(BASE_STORE * st);
-    virtual ~ADMINS_IMPL() {};
+        AdminsImpl(const AdminsImpl&) = delete;
+        AdminsImpl& operator=(const AdminsImpl&) = delete;
 
-    int           Add(const string & login, const ADMIN & admin);
-    int           Del(const string & login, const ADMIN & admin);
-    int           Change(const ADMIN_CONF & ac, const ADMIN & admin);
-    void          PrintAdmins() const;
-    const ADMIN * GetSysAdmin() const { return &stg; };
-    const ADMIN * GetNoAdmin() const { return &noAdmin; };
-    bool          FindAdmin(const std::string & l, ADMIN ** admin);
-    bool          AdminExists(const std::string & login) const;
-    bool          AdminCorrect(const std::string & login,
-                               const std::string & password,
-                               ADMIN * admin) const;
-    const std::string & GetStrError() const { return strError; };
+        int          add(const std::string& login, const Admin& admin) override;
+        int          del(const std::string& login, const Admin& admin) override;
+        int          change(const AdminConf& ac, const Admin& admin) override;
+        const Admin& sysAdmin() const override { return m_stg; }
+        const Admin& noAdmin() const override { return m_noAdmin; }
+        bool         find(const std::string& login, Admin** admin) override;
+        bool         exists(const std::string& login) const override;
+        bool         correct(const std::string& login,
+                             const std::string& password,
+                             Admin** admin) override;
 
-    int OpenSearch() const;
-    int SearchNext(int, ADMIN_CONF * ac) const;
-    int CloseSearch(int) const;
+        const std::string& strError() const override { return m_strError; }
 
-private:
-    typedef list<ADMIN_IMPL>::iterator admin_iter;
-    typedef list<ADMIN_IMPL>::const_iterator const_admin_iter;
+        size_t       count() const override { return m_data.size(); }
 
-    int             ReadAdmins();
+        void fmap(std::function<void (const Admin&)> callback) const
+        {
+            for (const auto& admin : m_data)
+                callback(admin);
+        }
 
-    ADMIN_IMPL           stg;
-    ADMIN_IMPL           noAdmin;
-    list<ADMIN_IMPL>     data;
-    BASE_STORE *    store;
-    STG_LOGGER &    WriteServLog;
-    mutable map<int, const_admin_iter> searchDescriptors;
-    mutable unsigned int handle;
-    mutable pthread_mutex_t mutex;
-    std::string     strError;
+    private:
+        void         read();
+        auto         find(const std::string& login) { return std::find(m_data.begin(), m_data.end(), Admin(Priv(0), login, "")); }
+        auto         find(const std::string& login) const { return std::find(m_data.begin(), m_data.end(), Admin(Priv(0), login, "")); }
+
+        Admin              m_stg;
+        Admin              m_noAdmin;
+        std::vector<Admin> m_data;
+        Store&             m_store;
+        Logger&            WriteServLog;
+        mutable std::mutex m_mutex;
+        std::string        m_strError;
 };
-#endif
+
+}