Deduplication of loading logic for catalog data.

This commit is contained in:
eelke 2017-12-09 21:46:19 +01:00
parent ea035f58c8
commit cd4e99cd11
6 changed files with 33 additions and 28 deletions

View file

@ -16,8 +16,8 @@ class PgAuthIdContainer: public PgContainer<PgAuthId> {
public: public:
using PgContainer<PgAuthId>::PgContainer; using PgContainer<PgAuthId>::PgContainer;
std::string getLoadQuery() const; virtual std::string getLoadQuery() const override;
void load(const Pgsql::Result &res); virtual void load(const Pgsql::Result &res) override;
private: private:
}; };

View file

@ -1,15 +1,25 @@
#ifndef PGCONTAINER_H #ifndef PGCONTAINER_H
#define PGCONTAINER_H #define PGCONTAINER_H
#include "Pgsql_declare.h"
#include <QString> #include <QString>
#include <memory> #include <memory>
#include <vector> #include <vector>
#include <libpq-fe.h> #include <libpq-fe.h>
class PgDatabaseCatalogue; class PgDatabaseCatalogue;
class IPgContainter {
public:
virtual ~IPgContainter() = default;
virtual std::string getLoadQuery() const = 0;
virtual void load(const Pgsql::Result &res) = 0;
};
template<typename T> template<typename T>
class PgContainer { class PgContainer: public IPgContainter {
public: public:
using t_Container = std::vector<T>; ///< Do not assume it will stay a vector only expect bidirectional access using t_Container = std::vector<T>; ///< Do not assume it will stay a vector only expect bidirectional access
@ -17,6 +27,7 @@ public:
: m_catalogue(cat) : m_catalogue(cat)
{} {}
typename t_Container::const_iterator begin() const typename t_Container::const_iterator begin() const
{ {
return m_container.begin(); return m_container.begin();

View file

@ -53,18 +53,23 @@ void PgDatabaseCatalogue::loadInfo(Pgsql::Connection &conn)
m_serverVersionString = r.get(0, 0).asQString(); 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) void PgDatabaseCatalogue::loadTypes(Pgsql::Connection &conn)
{ {
if (!m_types) if (!m_types)
m_types = std::make_shared<PgTypeContainer>(shared_from_this()); m_types = std::make_shared<PgTypeContainer>(shared_from_this());
std::string q = m_types->getLoadQuery(); load(conn, *m_types);
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");
} }
void PgDatabaseCatalogue::loadDatabases(Pgsql::Connection &conn) void PgDatabaseCatalogue::loadDatabases(Pgsql::Connection &conn)
@ -72,13 +77,7 @@ void PgDatabaseCatalogue::loadDatabases(Pgsql::Connection &conn)
if (!m_databases) if (!m_databases)
m_databases = std::make_shared<PgDatabaseContainer>(shared_from_this()); m_databases = std::make_shared<PgDatabaseContainer>(shared_from_this());
load(conn, *m_databases);
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");
} }
void PgDatabaseCatalogue::loadAuthIds(Pgsql::Connection &conn) void PgDatabaseCatalogue::loadAuthIds(Pgsql::Connection &conn)
@ -86,12 +85,7 @@ void PgDatabaseCatalogue::loadAuthIds(Pgsql::Connection &conn)
if (!m_authIds) if (!m_authIds)
m_authIds = std::make_shared<PgAuthIdContainer>(shared_from_this()); m_authIds = std::make_shared<PgAuthIdContainer>(shared_from_this());
std::string q = m_authIds->getLoadQuery(); load(conn, *m_authIds);
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");
} }
const QString& PgDatabaseCatalogue::serverVersionString() const const QString& PgDatabaseCatalogue::serverVersionString() const

View file

@ -17,8 +17,8 @@ public:
//explicit PgDatabaseContainer(PgDatabaseCatalogue *cat); //explicit PgDatabaseContainer(PgDatabaseCatalogue *cat);
using PgContainer<PgDatabase>::PgContainer; using PgContainer<PgDatabase>::PgContainer;
std::string getLoadQuery() const; virtual std::string getLoadQuery() const override;
void load(const Pgsql::Result &res); virtual void load(const Pgsql::Result &res) override;
private: private:
}; };

View file

@ -26,7 +26,7 @@
// return m_types.at(idx); // return m_types.at(idx);
//} //}
std::string PgTypeContainer::getLoadQuery() std::string PgTypeContainer::getLoadQuery() const
{ {
return return
"SELECT oid, typname, typnamespace, typowner, typlen, typbyval, typtype, typcategory, \n" "SELECT oid, typname, typnamespace, typowner, typlen, typbyval, typtype, typcategory, \n"

View file

@ -15,8 +15,8 @@ class PgTypeContainer: public PgContainer<PgType> {
public: public:
using PgContainer<PgType>::PgContainer; using PgContainer<PgType>::PgContainer;
std::string getLoadQuery(); virtual std::string getLoadQuery() const override;
void load(const Pgsql::Result &res); virtual void load(const Pgsql::Result &res) override;
/** Searches for the type matching the specified oid. /** Searches for the type matching the specified oid.
* *