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:
using PgContainer<PgAuthId>::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:
};

View file

@ -1,15 +1,25 @@
#ifndef PGCONTAINER_H
#define PGCONTAINER_H
#include "Pgsql_declare.h"
#include <QString>
#include <memory>
#include <vector>
#include <libpq-fe.h>
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>
class PgContainer {
class PgContainer: public IPgContainter {
public:
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)
{}
typename t_Container::const_iterator begin() const
{
return m_container.begin();

View file

@ -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<PgTypeContainer>(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<PgDatabaseContainer>(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<PgAuthIdContainer>(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

View file

@ -17,8 +17,8 @@ public:
//explicit PgDatabaseContainer(PgDatabaseCatalogue *cat);
using PgContainer<PgDatabase>::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:
};

View file

@ -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"

View file

@ -15,8 +15,8 @@ class PgTypeContainer: public PgContainer<PgType> {
public:
using PgContainer<PgType>::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.
*