Switched ConnectionConfig to QString from std::string to fit better into Qt framework

This commit is contained in:
eelke 2019-09-16 19:24:39 +02:00
parent bcfd82c27d
commit 082293e58a
20 changed files with 1077 additions and 211 deletions

View file

@ -4,11 +4,13 @@
#include <botan/cryptobox.h>
#include <QDir>
#include <QMimeData>
#include <QSettings>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QStandardPaths>
#include <QStringBuilder>
namespace {
@ -24,19 +26,19 @@ CREATE TABLE IF NOT EXISTS conngroup (
R"__(
CREATE TABLE IF NOT EXISTS connection (
uuid TEXT PRIMARY KEY,
cname TEXT NOT NULL,
cname TEXT,
conngroup_id INTEGER NOT NULL,
host TEXT NOT NULL,
hostaddr TEXT NOT NULL,
host TEXT ,
hostaddr TEXT ,
port INTEGER NOT NULL,
user TEXT NOT NULL,
dbname TEXT NOT NULL,
user TEXT ,
dbname TEXT ,
sslmode INTEGER NOT NULL,
sslcert TEXT NOT NULL,
sslkey TEXT NOT NULL,
sslrootcert TEXT NOT NULL,
sslcrl TEXT NOT NULL,
password TEXT NOT NULL
sslcert TEXT ,
sslkey TEXT ,
sslrootcert TEXT ,
sslcrl TEXT ,
password TEXT
);)__";
@ -68,22 +70,23 @@ R"__(INSERT OR REPLACE INTO connection
QSqlQuery q(db);
q.prepare(q_insert_or_replace_into_connection);
q.bindValue(":uuid", cc.uuid().toString());
q.bindValue(":name", stdStrToQ(cc.name()));
q.bindValue(":name", cc.name());
q.bindValue(":conngroup_id", conngroup_id);
q.bindValue(":host", stdStrToQ(cc.host()));
q.bindValue(":hostaddr", stdStrToQ(cc.hostAddr()));
q.bindValue(":port", cc.port());
q.bindValue(":user", stdStrToQ(cc.user()));
q.bindValue(":dbname", stdStrToQ(cc.dbname()));
q.bindValue(":host", cc.host());
q.bindValue(":hostaddr", cc.hostAddr());
q.bindValue(":port", (int)cc.port());
q.bindValue(":user", cc.user());
q.bindValue(":dbname", cc.dbname());
q.bindValue(":sslmode", static_cast<int>(cc.sslMode()));
q.bindValue(":sslcert", stdStrToQ(cc.sslCert()));
q.bindValue(":sslkey", stdStrToQ(cc.sslKey()));
q.bindValue(":sslrootcert", stdStrToQ(cc.sslRootCert()));
q.bindValue(":sslcrl", stdStrToQ(cc.sslCrl()));
q.bindValue(":password", stdStrToQ(cc.encodedPassword()));
q.bindValue(":sslcert", cc.sslCert());
q.bindValue(":sslkey", cc.sslKey());
q.bindValue(":sslrootcert", cc.sslRootCert());
q.bindValue(":sslcrl", cc.sslCrl());
q.bindValue(":password", cc.encodedPassword());
if (!q.exec()) {
return q.lastError();
auto sql_error = q.lastError();
return { sql_error };
}
return {};
}
@ -129,18 +132,18 @@ void ConnectionTreeModel::load()
while (q.next()) {
auto cc = std::make_shared<ConnectionConfig>();
cc->setUuid(q.value(0).toUuid());
cc->setName(qvarToStdStr(q.value(1)));
cc->setHost(qvarToStdStr(q.value(3)));
cc->setHostAddr(qvarToStdStr(q.value(4)));
cc->setName(q.value(1).toString());
cc->setHost(q.value(3).toString());
cc->setHostAddr(q.value(4).toString());
cc->setPort(static_cast<uint16_t>(q.value(5).toInt()));
cc->setUser(qvarToStdStr(q.value(6)));
cc->setDbname(qvarToStdStr(q.value(7)));
cc->setUser(q.value(6).toString());
cc->setDbname(q.value(7).toString());
cc->setSslMode(static_cast<SslMode>(q.value(8).toInt()));
cc->setSslCert(qvarToStdStr(q.value(9)));
cc->setSslKey(qvarToStdStr(q.value(10)));
cc->setSslRootCert(qvarToStdStr(q.value(11)));
cc->setSslCrl(qvarToStdStr(q.value(12)));
cc->setEncodedPassword(qvarToStdStr(q.value(13)));
cc->setSslCert(q.value(9).toString());
cc->setSslKey(q.value(10).toString());
cc->setSslRootCert(q.value(11).toString());
cc->setSslCrl(q.value(12).toString());
cc->setEncodedPassword(q.value(13).toByteArray());
int group_id = q.value(2).toInt();
auto find_res = std::find_if(m_groups.begin(), m_groups.end(),
@ -173,11 +176,11 @@ QVariant ConnectionTreeModel::data(const QModelIndex &index, int role) const
// This is a connection
if (role == Qt::DisplayRole) {
switch (index.column()) {
case Name: v = stdStrToQ(conn->name()); break;
case Host: v = stdStrToQ(conn->host()); break;
case Name: v = conn->name(); break;
case Host: v = conn->host(); break;
case Port: v = conn->port(); break;
case User: v = stdStrToQ(conn->user()); break;
case DbName: v= stdStrToQ(conn->dbname()); break;
case User: v = conn->user(); break;
case DbName: v= conn->dbname(); break;
}
}
}
@ -338,7 +341,11 @@ void ConnectionTreeModel::save(const QString &group_name, const ConnectionConfig
new_grp->add(node);
auto save_res = saveToDb(*node);
if (save_res) {
throw std::runtime_error("SqlError2");
QString msg = save_res->text()
% "\n" % save_res->driverText()
% "\n" % save_res->databaseText();
throw std::runtime_error(msg.toUtf8().data());
}
}
@ -446,3 +453,68 @@ std::optional<QSqlError> ConnectionTreeModel::saveToDb(const ConnectionConfig &c
{
return SaveConnectionConfig(m_db, cc, cc.parent()->conngroup_id);
}
Qt::DropActions ConnectionTreeModel::supportedDropActions() const
{
return Qt::MoveAction;
}
Qt::DropActions ConnectionTreeModel::supportedDragActions() const
{
return Qt::MoveAction;
}
Qt::ItemFlags ConnectionTreeModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags defaultFlags = QAbstractItemModel::flags(index);
ConnectionConfig* cfg = getConfigFromModelIndex(index);
if (cfg)
return Qt::ItemIsDragEnabled | defaultFlags;
else
return Qt::ItemIsDropEnabled | defaultFlags;
}
//bool ConnectionTreeModel::insertRows(int row, int count, const QModelIndex &parent)
//{
// return false;
//}
//bool ConnectionTreeModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild)
//{
// return false;
//}
namespace {
const auto mimeType = "application/vnd.pgLab.connection";
}
QStringList ConnectionTreeModel::mimeTypes() const
{
return { mimeType };
}
QMimeData *ConnectionTreeModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *mimeData = new QMimeData;
QByteArray encodedData;
QDataStream stream(&encodedData, QIODevice::WriteOnly);
for (const QModelIndex &index : indexes) {
if (index.isValid()) {
QString text = data(index, Qt::DisplayRole).toString();
stream << text;
}
}
mimeData->setData(mimeType, encodedData);
return mimeData;
}
bool ConnectionTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
return false;
}