Bunch of raw pointers replaced with smart pointers of references.

This commit is contained in:
eelke 2017-12-09 20:21:22 +01:00
parent 5a199c9138
commit ea035f58c8
20 changed files with 67 additions and 79 deletions

View file

@ -11,7 +11,7 @@ DatabasesTableModel::DatabasesTableModel(QObject *parent)
{ {
} }
void DatabasesTableModel::setDatabaseList(const PgDatabaseCatalogue* cat) void DatabasesTableModel::setDatabaseList(std::shared_ptr<const PgDatabaseCatalogue> cat)
{ {
beginResetModel(); beginResetModel();
m_catalog = cat; m_catalog = cat;

View file

@ -2,6 +2,7 @@
#define DATABASESTABLEMODEL_H #define DATABASESTABLEMODEL_H
#include "BaseTableModel.h" #include "BaseTableModel.h"
#include <memory>
class PgDatabaseContainer; class PgDatabaseContainer;
class PgDatabaseCatalogue; class PgDatabaseCatalogue;
@ -22,7 +23,7 @@ public:
explicit DatabasesTableModel(QObject *parent); explicit DatabasesTableModel(QObject *parent);
void setDatabaseList(const PgDatabaseCatalogue* cat); void setDatabaseList(std::shared_ptr<const PgDatabaseCatalogue> cat);
// Header: // Header:
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
@ -34,11 +35,9 @@ public:
virtual Oid getType(int column) const override; virtual Oid getType(int column) const override;
virtual QVariant getData(const QModelIndex &index) const override; virtual QVariant getData(const QModelIndex &index) const override;
// QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
private: private:
const PgDatabaseCatalogue *m_catalog = nullptr; std::shared_ptr<const PgDatabaseCatalogue> m_catalog;
const PgDatabaseContainer *m_databases = nullptr; std::shared_ptr<const PgDatabaseContainer> m_databases;
}; };
#endif // DATABASESTABLEMODEL_H #endif // DATABASESTABLEMODEL_H

View file

@ -1,4 +1,4 @@
#include "OpenDatabase.h" #include "OpenDatabase.h"
#include "PgDatabaseCatalogue.h" #include "PgDatabaseCatalogue.h"
#include "Pgsql_Connection.h" #include "Pgsql_Connection.h"
#include "TypeSelectionItemModel.h" #include "TypeSelectionItemModel.h"
@ -19,13 +19,12 @@ Expected<OpenDatabase*> OpenDatabase::createOpenDatabase(const ConnectionConfig
OpenDatabase::OpenDatabase(const ConnectionConfig& cfg, QObject *parent) OpenDatabase::OpenDatabase(const ConnectionConfig& cfg, QObject *parent)
: QObject(parent) : QObject(parent)
, m_config(cfg) , m_config(cfg)
, m_catalogue(new PgDatabaseCatalogue) , m_catalogue(std::make_shared<PgDatabaseCatalogue>())
{ {
} }
OpenDatabase::~OpenDatabase() OpenDatabase::~OpenDatabase()
{ {
delete m_catalogue;
} }
bool OpenDatabase::Init() bool OpenDatabase::Init()
@ -40,7 +39,7 @@ bool OpenDatabase::Init()
return false; return false;
} }
PgDatabaseCatalogue* OpenDatabase::catalogue() std::shared_ptr<PgDatabaseCatalogue> OpenDatabase::catalogue()
{ {
return m_catalogue; return m_catalogue;
} }

View file

@ -1,9 +1,10 @@
#ifndef OPENDATABASE_H #ifndef OPENDATABASE_H
#define OPENDATABASE_H #define OPENDATABASE_H
#include <QObject> #include <QObject>
#include "ConnectionConfig.h" #include "ConnectionConfig.h"
#include "Expected.h" #include "Expected.h"
#include <memory>
class PgDatabaseCatalogue; class PgDatabaseCatalogue;
class TypeSelectionItemModel; class TypeSelectionItemModel;
@ -21,7 +22,7 @@ public:
OpenDatabase& operator=(const OpenDatabase &) = delete; OpenDatabase& operator=(const OpenDatabase &) = delete;
~OpenDatabase(); ~OpenDatabase();
PgDatabaseCatalogue* catalogue(); std::shared_ptr<PgDatabaseCatalogue> catalogue();
TypeSelectionItemModel* typeSelectionModel(); TypeSelectionItemModel* typeSelectionModel();
signals: signals:
@ -29,7 +30,7 @@ public slots:
private: private:
ConnectionConfig m_config; ConnectionConfig m_config;
PgDatabaseCatalogue *m_catalogue; std::shared_ptr<PgDatabaseCatalogue> m_catalogue;
TypeSelectionItemModel *m_typeSelectionModel = nullptr; TypeSelectionItemModel *m_typeSelectionModel = nullptr;

View file

@ -1,18 +1,16 @@
#include "PgAuthIdContainer.h" #include "PgAuthIdContainer.h"
#include "Pgsql_Connection.h" #include "Pgsql_Connection.h"
#include "PgDatabaseCatalogue.h" #include "PgDatabaseCatalogue.h"
PgAuthIdContainer::PgAuthIdContainer(PgDatabaseCatalogue *cat)
: PgContainer<PgAuthId>(cat)
{}
std::string PgAuthIdContainer::getLoadQuery() const std::string PgAuthIdContainer::getLoadQuery() const
{ {
std::string result = std::string result =
"SELECT oid, rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, " "SELECT oid, rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, "
" rolcanlogin, rolreplication, rolconnlimit, rolvaliduntil"; " rolcanlogin, rolreplication, rolconnlimit, rolvaliduntil";
if (m_catalogue->serverVersion() >= 90500) auto cat = m_catalogue.lock();
if (cat && cat->serverVersion() >= 90500)
result += ", rolbypassrls"; result += ", rolbypassrls";
result += "\n" result += "\n"
"FROM pg_authid"; "FROM pg_authid";
return result; return result;
@ -23,7 +21,8 @@ void PgAuthIdContainer::load(const Pgsql::Result &res)
const int n_rows = res.rows(); const int n_rows = res.rows();
m_container.clear(); m_container.clear();
m_container.reserve(n_rows); m_container.reserve(n_rows);
bool with_rls = (m_catalogue->serverVersion() >= 90500); auto cat = m_catalogue.lock();
bool with_rls = (cat && cat->serverVersion() >= 90500);
for (auto row : res) { for (auto row : res) {
PgAuthId v; PgAuthId v;
v.oid << row.get(0); // InvalidOid; v.oid << row.get(0); // InvalidOid;

View file

@ -1,4 +1,4 @@
#ifndef PGAUTHIDCONTAINER_H #ifndef PGAUTHIDCONTAINER_H
#define PGAUTHIDCONTAINER_H #define PGAUTHIDCONTAINER_H
#include <vector> #include <vector>
@ -14,11 +14,10 @@ namespace Pgsql {
class PgAuthIdContainer: public PgContainer<PgAuthId> { class PgAuthIdContainer: public PgContainer<PgAuthId> {
public: public:
explicit PgAuthIdContainer(PgDatabaseCatalogue *cat); using PgContainer<PgAuthId>::PgContainer;
std::string getLoadQuery() const; std::string getLoadQuery() const;
void load(const Pgsql::Result &res); void load(const Pgsql::Result &res);
private: private:
}; };

View file

@ -1,7 +1,8 @@
#ifndef PGCONTAINER_H #ifndef PGCONTAINER_H
#define PGCONTAINER_H #define PGCONTAINER_H
#include <QString> #include <QString>
#include <memory>
#include <vector> #include <vector>
#include <libpq-fe.h> #include <libpq-fe.h>
@ -12,7 +13,7 @@ class PgContainer {
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
explicit PgContainer(PgDatabaseCatalogue *cat) explicit PgContainer(std::weak_ptr<PgDatabaseCatalogue> cat)
: m_catalogue(cat) : m_catalogue(cat)
{} {}
@ -60,7 +61,7 @@ public:
return m_container.at(idx); return m_container.at(idx);
} }
protected: protected:
PgDatabaseCatalogue *m_catalogue; std::weak_ptr<PgDatabaseCatalogue> m_catalogue;
t_Container m_container; t_Container m_container;
private: private:
T m_invalidInstance; T m_invalidInstance;

View file

@ -5,7 +5,7 @@
#include "Pgsql_Connection.h" #include "Pgsql_Connection.h"
QString getRoleNameFromOid(const PgDatabaseCatalogue *cat, Oid oid) QString getRoleNameFromOid(std::shared_ptr<const PgDatabaseCatalogue> cat, Oid oid)
{ {
QString name; QString name;
auto auth_ids = cat->authIds(); auto auth_ids = cat->authIds();
@ -18,7 +18,7 @@ QString getRoleNameFromOid(const PgDatabaseCatalogue *cat, Oid oid)
return name; return name;
} }
QString getRoleDisplayString(const PgDatabaseCatalogue *cat, Oid oid) QString getRoleDisplayString(std::shared_ptr<const PgDatabaseCatalogue> cat, Oid oid)
{ {
QString name = getRoleNameFromOid(cat, oid); QString name = getRoleNameFromOid(cat, oid);
return QString("%1 (%2)").arg(name).arg(oid); return QString("%1 (%2)").arg(name).arg(oid);
@ -31,7 +31,6 @@ PgDatabaseCatalogue::PgDatabaseCatalogue()
PgDatabaseCatalogue::~PgDatabaseCatalogue() PgDatabaseCatalogue::~PgDatabaseCatalogue()
{ {
delete m_types;
} }
void PgDatabaseCatalogue::loadAll(Pgsql::Connection &conn) void PgDatabaseCatalogue::loadAll(Pgsql::Connection &conn)
@ -56,8 +55,8 @@ void PgDatabaseCatalogue::loadInfo(Pgsql::Connection &conn)
void PgDatabaseCatalogue::loadTypes(Pgsql::Connection &conn) void PgDatabaseCatalogue::loadTypes(Pgsql::Connection &conn)
{ {
if (m_types == nullptr) if (!m_types)
m_types = new PgTypeContainer(this); m_types = std::make_shared<PgTypeContainer>(shared_from_this());
std::string q = m_types->getLoadQuery(); std::string q = m_types->getLoadQuery();
Pgsql::Result result = conn.query(q.c_str()); Pgsql::Result result = conn.query(q.c_str());
@ -70,8 +69,8 @@ void PgDatabaseCatalogue::loadTypes(Pgsql::Connection &conn)
void PgDatabaseCatalogue::loadDatabases(Pgsql::Connection &conn) void PgDatabaseCatalogue::loadDatabases(Pgsql::Connection &conn)
{ {
if (m_databases == nullptr) if (!m_databases)
m_databases = new PgDatabaseContainer(this); m_databases = std::make_shared<PgDatabaseContainer>(shared_from_this());
std::string q = m_databases->getLoadQuery(); std::string q = m_databases->getLoadQuery();
@ -84,8 +83,8 @@ void PgDatabaseCatalogue::loadDatabases(Pgsql::Connection &conn)
void PgDatabaseCatalogue::loadAuthIds(Pgsql::Connection &conn) void PgDatabaseCatalogue::loadAuthIds(Pgsql::Connection &conn)
{ {
if (m_authIds == nullptr) if (!m_authIds)
m_authIds = new PgAuthIdContainer(this); m_authIds = std::make_shared<PgAuthIdContainer>(shared_from_this());
std::string q = m_authIds->getLoadQuery(); std::string q = m_authIds->getLoadQuery();
Pgsql::Result result = conn.query(q.c_str()); Pgsql::Result result = conn.query(q.c_str());
@ -105,17 +104,17 @@ int PgDatabaseCatalogue::serverVersion() const
return m_serverVersion; return m_serverVersion;
} }
const PgTypeContainer* PgDatabaseCatalogue::types() const std::shared_ptr<const PgTypeContainer> PgDatabaseCatalogue::types() const
{ {
return m_types; return m_types;
} }
const PgDatabaseContainer *PgDatabaseCatalogue::databases() const std::shared_ptr<const PgDatabaseContainer> PgDatabaseCatalogue::databases() const
{ {
return m_databases; return m_databases;
} }
const PgAuthIdContainer *PgDatabaseCatalogue::authIds() const std::shared_ptr<const PgAuthIdContainer> PgDatabaseCatalogue::authIds() const
{ {
return m_authIds; return m_authIds;
} }

View file

@ -3,6 +3,7 @@
#include <libpq-fe.h> #include <libpq-fe.h>
#include <QString> #include <QString>
#include <memory>
#include <vector> #include <vector>
namespace Pgsql { namespace Pgsql {
@ -15,7 +16,7 @@ class PgTypeContainer;
class PgDatabaseContainer; class PgDatabaseContainer;
class PgAuthIdContainer; class PgAuthIdContainer;
class PgDatabaseCatalogue { class PgDatabaseCatalogue: public std::enable_shared_from_this<PgDatabaseCatalogue> {
public: public:
PgDatabaseCatalogue(); PgDatabaseCatalogue();
PgDatabaseCatalogue(const PgDatabaseCatalogue&) = delete; PgDatabaseCatalogue(const PgDatabaseCatalogue&) = delete;
@ -33,19 +34,19 @@ public:
const QString& serverVersionString() const; const QString& serverVersionString() const;
int serverVersion() const; int serverVersion() const;
const PgTypeContainer* types() const; std::shared_ptr<const PgTypeContainer> types() const;
const PgDatabaseContainer *databases() const; std::shared_ptr<const PgDatabaseContainer> databases() const;
const PgAuthIdContainer *authIds() const; std::shared_ptr<const PgAuthIdContainer> authIds() const;
private: private:
QString m_serverVersionString; QString m_serverVersionString;
int m_serverVersion; int m_serverVersion;
PgTypeContainer *m_types = nullptr; std::shared_ptr<PgTypeContainer> m_types;
PgDatabaseContainer *m_databases = nullptr; std::shared_ptr<PgDatabaseContainer> m_databases;
PgAuthIdContainer *m_authIds = nullptr; std::shared_ptr<PgAuthIdContainer> m_authIds;
}; };
QString getRoleNameFromOid(const PgDatabaseCatalogue *cat, Oid oid); QString getRoleNameFromOid(std::shared_ptr<const PgDatabaseCatalogue> cat, Oid oid);
QString getRoleDisplayString(const PgDatabaseCatalogue *cat, Oid oid); QString getRoleDisplayString(std::shared_ptr<const PgDatabaseCatalogue> cat, Oid oid);
#endif // PGSQLDATABASECATALOGUE_H #endif // PGSQLDATABASECATALOGUE_H

View file

@ -2,9 +2,9 @@
#include "Pgsql_Connection.h" #include "Pgsql_Connection.h"
#include "Pgsql_Col.h" #include "Pgsql_Col.h"
PgDatabaseContainer::PgDatabaseContainer(PgDatabaseCatalogue *cat) //PgDatabaseContainer::PgDatabaseContainer(PgDatabaseCatalogue *cat)
: PgContainer<PgDatabase>(cat) // : PgContainer<PgDatabase>(cat)
{} //{}
std::string PgDatabaseContainer::getLoadQuery() const std::string PgDatabaseContainer::getLoadQuery() const
{ {

View file

@ -1,4 +1,4 @@
#ifndef PGDATABASECONTAINER_H #ifndef PGDATABASECONTAINER_H
#define PGDATABASECONTAINER_H #define PGDATABASECONTAINER_H
#include <vector> #include <vector>
@ -14,7 +14,8 @@ namespace Pgsql {
class PgDatabaseContainer: public PgContainer<PgDatabase> { class PgDatabaseContainer: public PgContainer<PgDatabase> {
public: public:
explicit PgDatabaseContainer(PgDatabaseCatalogue *cat); //explicit PgDatabaseContainer(PgDatabaseCatalogue *cat);
using PgContainer<PgDatabase>::PgContainer;
std::string getLoadQuery() const; std::string getLoadQuery() const;
void load(const Pgsql::Result &res); void load(const Pgsql::Result &res);

View file

@ -1,12 +1,7 @@
#include "PgTypeContainer.h" #include "PgTypeContainer.h"
#include "Pgsql_Connection.h" #include "Pgsql_Connection.h"
#include <algorithm> #include <algorithm>
PgTypeContainer::PgTypeContainer(PgDatabaseCatalogue *cat)
: PgContainer<PgType>(cat)
{}
//const PgType& PgTypeContainer::getTypeByOid(Oid oid) const //const PgType& PgTypeContainer::getTypeByOid(Oid oid) const
//{ //{
// auto lb_result = std::lower_bound(m_types.begin(), m_types.end(), oid); // auto lb_result = std::lower_bound(m_types.begin(), m_types.end(), oid);

View file

@ -1,9 +1,9 @@
#ifndef PGTYPECONTAINER_H #ifndef PGTYPECONTAINER_H
#define PGTYPECONTAINER_H #define PGTYPECONTAINER_H
#include <vector>
#include "PgType.h" #include "PgType.h"
#include "PgContainer.h" #include "PgContainer.h"
#include <vector>
namespace Pgsql { namespace Pgsql {
@ -13,15 +13,8 @@ namespace Pgsql {
class PgTypeContainer: public PgContainer<PgType> { class PgTypeContainer: public PgContainer<PgType> {
public: public:
// using t_Types = std::vector<PgType>; ///< Do not assume it will stay a vector only expect bidirectional access using PgContainer<PgType>::PgContainer;
explicit PgTypeContainer(PgDatabaseCatalogue *cat);
// t_Types::const_iterator begin() const { return m_types.begin(); }
// t_Types::const_iterator end() const { return m_types.end(); }
// void clear();
// int count() const { return (int)m_types.size(); }
std::string getLoadQuery(); std::string getLoadQuery();
void load(const Pgsql::Result &res); void load(const Pgsql::Result &res);

View file

@ -44,7 +44,7 @@ QueryTab::QueryTab(MainWindow *win, QWidget *parent) :
OpenDatabase* open_database = m_win->getDatabase(); OpenDatabase* open_database = m_win->getDatabase();
if (open_database) { if (open_database) {
auto cat = open_database->catalogue(); auto cat = open_database->catalogue();
highlighter->setTypes(cat->types()); highlighter->setTypes(*cat->types());
} }
connect(ui->queryEdit, &QPlainTextEdit::textChanged, this, &QueryTab::queryTextChanged); connect(ui->queryEdit, &QPlainTextEdit::textChanged, this, &QueryTab::queryTextChanged);

View file

@ -6,7 +6,7 @@ RolesTableModel::RolesTableModel(QObject *parent)
{ {
} }
void RolesTableModel::setRoleList(const PgAuthIdContainer* roles) void RolesTableModel::setRoleList(std::shared_ptr<const PgAuthIdContainer> roles)
{ {
beginResetModel(); beginResetModel();
m_roles = roles; m_roles = roles;

View file

@ -3,6 +3,7 @@
#include "BaseTableModel.h" #include "BaseTableModel.h"
#include <memory>
class PgAuthIdContainer; class PgAuthIdContainer;
@ -20,7 +21,7 @@ public:
explicit RolesTableModel(QObject *parent); explicit RolesTableModel(QObject *parent);
void setRoleList(const PgAuthIdContainer* roles); void setRoleList(std::shared_ptr<const PgAuthIdContainer> roles);
// Header: // Header:
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
@ -35,7 +36,7 @@ public:
// QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; // QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
private: private:
const PgAuthIdContainer *m_roles = nullptr; std::shared_ptr<const PgAuthIdContainer> m_roles;
}; };

View file

@ -126,10 +126,10 @@ SqlSyntaxHighlighter::~SqlSyntaxHighlighter()
{ {
} }
void SqlSyntaxHighlighter::setTypes(const PgTypeContainer *types) void SqlSyntaxHighlighter::setTypes(const PgTypeContainer& types)
{ {
m_typeNames.clear(); m_typeNames.clear();
for (auto &e : *types) { for (auto &e : types) {
m_typeNames.insert(e.typname); m_typeNames.insert(e.typname);
} }
} }

View file

@ -18,7 +18,7 @@ public:
SqlSyntaxHighlighter(QTextDocument *parent = nullptr); SqlSyntaxHighlighter(QTextDocument *parent = nullptr);
~SqlSyntaxHighlighter(); ~SqlSyntaxHighlighter();
void setTypes(const PgTypeContainer *types); void setTypes(const PgTypeContainer& types);
protected: protected:
void highlightBlock(const QString &text) override; void highlightBlock(const QString &text) override;

View file

@ -56,13 +56,12 @@ QVariant TypeSelectionItemModel::data(const QModelIndex &index, int role) const
return result; return result;
} }
void TypeSelectionItemModel::setTypeList(const PgTypeContainer* types) void TypeSelectionItemModel::setTypeList(std::shared_ptr<const PgTypeContainer> types)
{ {
beginResetModel(); beginResetModel();
m_types.clear(); m_types.clear();
for (const auto &e : *types) { for (const auto &e : *types) {
if (e.typcategory != "A" if (e.typcategory != "A" && e.typtype != "c") {
&& e.typtype != "c") {
m_types.push_back(e.typname); m_types.push_back(e.typname);
} }
} }

View file

@ -2,6 +2,7 @@
#define TYPESELECTIONITEMMODEL_H #define TYPESELECTIONITEMMODEL_H
#include <QAbstractListModel> #include <QAbstractListModel>
#include <memory>
#include <vector> #include <vector>
class PgTypeContainer; class PgTypeContainer;
@ -11,7 +12,7 @@ class TypeSelectionItemModel : public QAbstractListModel {
public: public:
explicit TypeSelectionItemModel(QObject *parent = 0); explicit TypeSelectionItemModel(QObject *parent = 0);
void setTypeList(const PgTypeContainer* types); void setTypeList(std::shared_ptr<const PgTypeContainer> types);
int rowCount(const QModelIndex &parent = QModelIndex()) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override;