Some stuff I had on another machine and which might provide useful.

This commit is contained in:
eelke 2017-12-28 07:29:07 +01:00
parent 23e307f93a
commit 36e5526f5f
10 changed files with 325 additions and 13 deletions

View file

@ -0,0 +1,14 @@
#include "CreateDatabaseDialog.h"
#include "ui_CreateDatabaseDialog.h"
CreateDatabaseDialog::CreateDatabaseDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::CreateDatabaseDialog)
{
ui->setupUi(this);
}
CreateDatabaseDialog::~CreateDatabaseDialog()
{
delete ui;
}

View file

@ -0,0 +1,22 @@
#ifndef CREATEDATABASEDIALOG_H
#define CREATEDATABASEDIALOG_H
#include <QDialog>
namespace Ui {
class CreateDatabaseDialog;
}
class CreateDatabaseDialog : public QDialog
{
Q_OBJECT
public:
explicit CreateDatabaseDialog(QWidget *parent = 0);
~CreateDatabaseDialog();
private:
Ui::CreateDatabaseDialog *ui;
};
#endif // CREATEDATABASEDIALOG_H

View file

@ -0,0 +1,162 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CreateDatabaseDialog</class>
<widget class="QDialog" name="CreateDatabaseDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>506</width>
<height>371</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Name</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Template</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBox"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Encoding</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="comboBox_2"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Collation order</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="comboBox_3"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Character classification</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="comboBox_4"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Connection limit</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="spinBox"/>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Tablespace</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QComboBox" name="comboBox_5"/>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Owner</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QComboBox" name="comboBox_6"/>
</item>
<item row="8" column="0">
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>Template database</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QCheckBox" name="checkBox_2">
<property name="text">
<string>Allow connections</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>CreateDatabaseDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>CreateDatabaseDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View file

@ -32,7 +32,7 @@ bool OpenDatabase::Init()
auto kw = m_config.getKeywords(); auto kw = m_config.getKeywords();
auto vals = m_config.getValues(); auto vals = m_config.getValues();
if (conn.connect(kw, vals, 0)) { if (conn.connect(kw, vals, 0)) {
m_catalogue->loadAll(conn); m_catalogue->loadAll(conn, nullptr);
return true; return true;
} }
return false; return false;

View file

@ -1,5 +1,6 @@
#include "PgDatabaseCatalog.h" #include "PgDatabaseCatalog.h"
#include "ASyncDBConnection.h"
#include "PgAttributeContainer.h" #include "PgAttributeContainer.h"
#include "PgAuthIdContainer.h" #include "PgAuthIdContainer.h"
#include "PgClassContainer.h" #include "PgClassContainer.h"
@ -11,6 +12,8 @@
#include "Pgsql_Connection.h" #include "Pgsql_Connection.h"
#include "Pgsql_oids.h" #include "Pgsql_oids.h"
#include <QThread>
using namespace Pgsql; using namespace Pgsql;
QString getRoleNameFromOid(const PgDatabaseCatalog &cat, Oid oid) QString getRoleNameFromOid(const PgDatabaseCatalog &cat, Oid oid)
@ -100,17 +103,35 @@ PgDatabaseCatalog::~PgDatabaseCatalog()
{ {
} }
void PgDatabaseCatalog::loadAll(Pgsql::Connection &conn) void PgDatabaseCatalog::loadAll(Pgsql::Connection &conn,
std::function<bool(int, int)> progress_callback)
{ {
loadInfo(conn); loadInfo(conn);
if (progress_callback && !progress_callback(1, 9))
return;
load2(m_attributes, conn); load2(m_attributes, conn);
if (progress_callback && !progress_callback(2, 9))
return;
load2(m_authIds, conn); load2(m_authIds, conn);
if (progress_callback && !progress_callback(3, 9))
return;
load2(m_classes, conn); load2(m_classes, conn);
if (progress_callback && !progress_callback(4, 9))
return;
load2(m_constraints, conn); load2(m_constraints, conn);
if (progress_callback && !progress_callback(5, 9))
return;
load2(m_databases, conn); load2(m_databases, conn);
if (progress_callback && !progress_callback(6, 9))
return;
load2(m_indexes, conn); load2(m_indexes, conn);
if (progress_callback && !progress_callback(7, 9))
return;
load2(m_namespaces, conn); load2(m_namespaces, conn);
if (progress_callback && !progress_callback(8, 9))
return;
load2(m_types, conn); load2(m_types, conn);
progress_callback && progress_callback(9, 9);
} }
void PgDatabaseCatalog::loadInfo(Pgsql::Connection &conn) void PgDatabaseCatalog::loadInfo(Pgsql::Connection &conn)
@ -128,6 +149,7 @@ void PgDatabaseCatalog::loadInfo(Pgsql::Connection &conn)
void load(Pgsql::Connection &conn, IPgContainter &pg_cont) void load(Pgsql::Connection &conn, IPgContainter &pg_cont)
{ {
QThread::msleep(400);
std::string q = pg_cont.getLoadQuery(); std::string q = pg_cont.getLoadQuery();
Pgsql::Result result = conn.query(q.c_str()); Pgsql::Result result = conn.query(q.c_str());
if (result && result.resultStatus() == PGRES_TUPLES_OK) if (result && result.resultStatus() == PGRES_TUPLES_OK)

View file

@ -3,6 +3,7 @@
#include <libpq-fe.h> #include <libpq-fe.h>
#include <QString> #include <QString>
#include <functional>
#include <memory> #include <memory>
#include <vector> #include <vector>
@ -26,22 +27,13 @@ public:
PgDatabaseCatalog(); PgDatabaseCatalog();
PgDatabaseCatalog(const PgDatabaseCatalog&) = delete; PgDatabaseCatalog(const PgDatabaseCatalog&) = delete;
PgDatabaseCatalog& operator = (const PgDatabaseCatalog&) = delete; PgDatabaseCatalog& operator = (const PgDatabaseCatalog&) = delete;
~PgDatabaseCatalog(); ~PgDatabaseCatalog();
void loadAll(Pgsql::Connection &conn,
std::function<bool(int, int)> progress_callback);
void loadAll(Pgsql::Connection &conn);
void loadInfo(Pgsql::Connection &conn); void loadInfo(Pgsql::Connection &conn);
//void loadAttributes(Pgsql::Connection &conn);
// void loadAuthIds(Pgsql::Connection &conn);
// void loadClasses(Pgsql::Connection &conn);
// void loadConstraints(Pgsql::Connection &conn);
// void loadDatabases(Pgsql::Connection &conn);
// void loadIndexes(Pgsql::Connection &conn);
// void loadNamespaces(Pgsql::Connection &conn);
// void loadTypes(Pgsql::Connection &conn);
const QString& serverVersionString() const; const QString& serverVersionString() const;
int serverVersion() const; int serverVersion() const;

View file

@ -34,6 +34,7 @@ SOURCES += main.cpp\
QueryExplainModel.cpp \ QueryExplainModel.cpp \
ASyncDBConnection.cpp \ ASyncDBConnection.cpp \
tsqueue.cpp \ tsqueue.cpp \
CreateDatabaseDialog.cpp \
DatabaseWindow.cpp \ DatabaseWindow.cpp \
ConnectionManagerWindow.cpp \ ConnectionManagerWindow.cpp \
ConnectionListModel.cpp \ ConnectionListModel.cpp \
@ -89,6 +90,7 @@ HEADERS += \
QueryExplainModel.h \ QueryExplainModel.h \
ASyncDBConnection.h \ ASyncDBConnection.h \
tsqueue.h \ tsqueue.h \
CreateDatabaseDialog.h \
DatabaseWindow.h \ DatabaseWindow.h \
ConnectionManagerWindow.h \ ConnectionManagerWindow.h \
ConnectionListModel.h \ ConnectionListModel.h \
@ -141,6 +143,7 @@ HEADERS += \
FORMS += mainwindow.ui \ FORMS += mainwindow.ui \
DatabaseWindow.ui \ DatabaseWindow.ui \
ConnectionManagerWindow.ui \ ConnectionManagerWindow.ui \
CreateDatabaseDialog.ui \
DatabaseInspectorWidget.ui \ DatabaseInspectorWidget.ui \
TuplesResultWidget.ui \ TuplesResultWidget.ui \
QueryTab.ui \ QueryTab.ui \

View file

@ -0,0 +1 @@
#include "Pgsql_PgException.h"

94
pgsql/Pgsql_PgException.h Normal file
View file

@ -0,0 +1,94 @@
#ifndef PGEXCEPTION_H
#define PGEXCEPTION_H
#include <stdexcept>
#include <utility>
namespace Pgsql {
class PgException {
public:
PgException(const char *msg)
: message(msg)
{}
PgException(std::string msg)
: message(std::move(msg))
{}
private:
std::string message;
};
class PgResultError: public PgException {
public:
PgResultError(std::string msg, std::string result_code)
: PgException(std::move(msg))
{}
};
class PgConnectionError: public PgResultError, std::runtime_error {
PgConnectionError(const std::string &msg, std::string result_code)
: PgResultError(msg, std::move(result_code))
, std::runtime_error(msg)
{}
};
/* postgresq error classes
*
* success
* warning
* no data
*
* 03 sql statement not yet complete
* 08 connection exception -> could be resolved by reconnecting / resetting connection
* 09 triggered action exception
* 0A feature not supported
* 0B invalid transaction initiation
* 0F locator exception
* 0L invalid grantor
* 0P invalid role
* 0Z diagnostic exception
* 20 case not fount
* 21 cardinality violation
* 22 data exception
* 23 integrity constraint error
* 24 invalid cursor statement
* 25 invalid transaction state
* 26 invalid sql statement name
* 27 triggered data change violation
* 28 invalid authorization specification
* 2B Dependent Privilege Descriptors Still Exist
* 2D Invalid Transaction Termination
* 2F SQL Routine Exception
* 34 Invalid Cursor Name
* 38 External Routine Exception
* 39 External Routine Invocation Exception
* 3B Savepoint Exception
* 3D Invalid Catalog Name
* 3F Invalid Schema Name
* 40 Transaction Rollback
* 42 Syntax Error or Access Rule Violation
* 44 WITH CHECK OPTION Violation
* 53 Insufficient Resources
* 54 Program Limit Exceeded
* 55 Object Not In Prerequisite State
* 57 Operator Intervention
* 58 System Error (errors external to PostgreSQL itself)
* 72 Snapshot Failure
* F0 Configuration File Error
* HV Foreign Data Wrapper Error (SQL/MED)
* P0 PL/pgSQL Error
* XX Internal Error
*
* At what levels can the communication with postgresql fail
* - network -> reset/reconnecting
* -
*/
}
#endif // PGEXCEPTION_H

View file

@ -34,6 +34,7 @@ release {
SOURCES += Pgsql_Connection.cpp \ SOURCES += Pgsql_Connection.cpp \
Pgsql_Params.cpp \ Pgsql_Params.cpp \
Pgsql_PgException.cpp \
Pgsql_Result.cpp \ Pgsql_Result.cpp \
Pgsql_Row.cpp \ Pgsql_Row.cpp \
Pgsql_Value.cpp \ Pgsql_Value.cpp \
@ -43,6 +44,7 @@ SOURCES += Pgsql_Connection.cpp \
HEADERS += Pgsql_Connection.h \ HEADERS += Pgsql_Connection.h \
Pgsql_Params.h \ Pgsql_Params.h \
Pgsql_PgException.h \
Pgsql_Result.h \ Pgsql_Result.h \
Pgsql_Row.h \ Pgsql_Row.h \
Pgsql_Value.h \ Pgsql_Value.h \