From cd4e99cd1101b5335e249ac77309f0add6b5e874 Mon Sep 17 00:00:00 2001 From: eelke Date: Sat, 9 Dec 2017 21:46:19 +0100 Subject: [PATCH] Deduplication of loading logic for catalog data. --- pglab/PgAuthIdContainer.h | 4 ++-- pglab/PgContainer.h | 13 ++++++++++++- pglab/PgDatabaseCatalogue.cpp | 34 ++++++++++++++-------------------- pglab/PgDatabaseContainer.h | 4 ++-- pglab/PgTypeContainer.cpp | 2 +- pglab/PgTypeContainer.h | 4 ++-- 6 files changed, 33 insertions(+), 28 deletions(-) diff --git a/pglab/PgAuthIdContainer.h b/pglab/PgAuthIdContainer.h index a1f9f61..514f602 100644 --- a/pglab/PgAuthIdContainer.h +++ b/pglab/PgAuthIdContainer.h @@ -16,8 +16,8 @@ class PgAuthIdContainer: public PgContainer { public: using PgContainer::PgContainer; - std::string getLoadQuery() const; - void load(const Pgsql::Result &res); + virtual std::string getLoadQuery() const override; + virtual void load(const Pgsql::Result &res) override; private: }; diff --git a/pglab/PgContainer.h b/pglab/PgContainer.h index 7736cef..201dfa4 100644 --- a/pglab/PgContainer.h +++ b/pglab/PgContainer.h @@ -1,15 +1,25 @@ #ifndef PGCONTAINER_H #define PGCONTAINER_H +#include "Pgsql_declare.h" #include #include #include #include + class PgDatabaseCatalogue; +class IPgContainter { +public: + virtual ~IPgContainter() = default; + + virtual std::string getLoadQuery() const = 0; + virtual void load(const Pgsql::Result &res) = 0; +}; + template -class PgContainer { +class PgContainer: public IPgContainter { public: using t_Container = std::vector; ///< Do not assume it will stay a vector only expect bidirectional access @@ -17,6 +27,7 @@ public: : m_catalogue(cat) {} + typename t_Container::const_iterator begin() const { return m_container.begin(); diff --git a/pglab/PgDatabaseCatalogue.cpp b/pglab/PgDatabaseCatalogue.cpp index fd51094..3777f39 100644 --- a/pglab/PgDatabaseCatalogue.cpp +++ b/pglab/PgDatabaseCatalogue.cpp @@ -53,18 +53,23 @@ void PgDatabaseCatalogue::loadInfo(Pgsql::Connection &conn) m_serverVersionString = r.get(0, 0).asQString(); } +void load(Pgsql::Connection &conn, IPgContainter &pg_cont) +{ + std::string q = pg_cont.getLoadQuery(); + Pgsql::Result result = conn.query(q.c_str()); + if (result && result.resultStatus() == PGRES_TUPLES_OK) + pg_cont.load(result); + else + throw std::runtime_error("Query failed"); + +} + void PgDatabaseCatalogue::loadTypes(Pgsql::Connection &conn) { if (!m_types) m_types = std::make_shared(shared_from_this()); - std::string q = m_types->getLoadQuery(); - Pgsql::Result result = conn.query(q.c_str()); - if (result && result.resultStatus() == PGRES_TUPLES_OK) - m_types->load(result); - else - throw std::runtime_error("Query failed"); - + load(conn, *m_types); } void PgDatabaseCatalogue::loadDatabases(Pgsql::Connection &conn) @@ -72,13 +77,7 @@ void PgDatabaseCatalogue::loadDatabases(Pgsql::Connection &conn) if (!m_databases) m_databases = std::make_shared(shared_from_this()); - - std::string q = m_databases->getLoadQuery(); - Pgsql::Result result = conn.query(q.c_str()); - if (result && result.resultStatus() == PGRES_TUPLES_OK) - m_databases->load(result); - else - throw std::runtime_error("Query failed"); + load(conn, *m_databases); } void PgDatabaseCatalogue::loadAuthIds(Pgsql::Connection &conn) @@ -86,12 +85,7 @@ void PgDatabaseCatalogue::loadAuthIds(Pgsql::Connection &conn) if (!m_authIds) m_authIds = std::make_shared(shared_from_this()); - std::string q = m_authIds->getLoadQuery(); - Pgsql::Result result = conn.query(q.c_str()); - if (result && result.resultStatus() == PGRES_TUPLES_OK) - m_authIds->load(result); - else - throw std::runtime_error("Query failed"); + load(conn, *m_authIds); } const QString& PgDatabaseCatalogue::serverVersionString() const diff --git a/pglab/PgDatabaseContainer.h b/pglab/PgDatabaseContainer.h index 6574f4d..d1f41d1 100644 --- a/pglab/PgDatabaseContainer.h +++ b/pglab/PgDatabaseContainer.h @@ -17,8 +17,8 @@ public: //explicit PgDatabaseContainer(PgDatabaseCatalogue *cat); using PgContainer::PgContainer; - std::string getLoadQuery() const; - void load(const Pgsql::Result &res); + virtual std::string getLoadQuery() const override; + virtual void load(const Pgsql::Result &res) override; private: }; diff --git a/pglab/PgTypeContainer.cpp b/pglab/PgTypeContainer.cpp index b18694b..b02c0e1 100644 --- a/pglab/PgTypeContainer.cpp +++ b/pglab/PgTypeContainer.cpp @@ -26,7 +26,7 @@ // return m_types.at(idx); //} -std::string PgTypeContainer::getLoadQuery() +std::string PgTypeContainer::getLoadQuery() const { return "SELECT oid, typname, typnamespace, typowner, typlen, typbyval, typtype, typcategory, \n" diff --git a/pglab/PgTypeContainer.h b/pglab/PgTypeContainer.h index 91b15ac..145883f 100644 --- a/pglab/PgTypeContainer.h +++ b/pglab/PgTypeContainer.h @@ -15,8 +15,8 @@ class PgTypeContainer: public PgContainer { public: using PgContainer::PgContainer; - std::string getLoadQuery(); - void load(const Pgsql::Result &res); + virtual std::string getLoadQuery() const override; + virtual void load(const Pgsql::Result &res) override; /** Searches for the type matching the specified oid. *