Deduplication of loading logic for catalog data.
This commit is contained in:
parent
ea035f58c8
commit
cd4e99cd11
6 changed files with 33 additions and 28 deletions
|
|
@ -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:
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue