Switched ConnectionConfig to QString from std::string to fit better into Qt framework
This commit is contained in:
parent
bcfd82c27d
commit
082293e58a
20 changed files with 1077 additions and 211 deletions
|
|
@ -61,14 +61,14 @@ public:
|
||||||
return base64_encode(wrapped_key);
|
return base64_encode(wrapped_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
secure_vector<uint8_t> get(const std::string& name, const std::string &wrapped_key) const
|
secure_vector<uint8_t> get(const std::string& name, const std::string_view &wrapped_key) const
|
||||||
{
|
{
|
||||||
const std::vector<uint8_t> wrapped_name =
|
const std::vector<uint8_t> wrapped_name =
|
||||||
nist_key_wrap_padded(cast_char_ptr_to_uint8(name.data()),
|
nist_key_wrap_padded(cast_char_ptr_to_uint8(name.data()),
|
||||||
name.size(),
|
name.size(),
|
||||||
*m_cipher);
|
*m_cipher);
|
||||||
|
|
||||||
const secure_vector<uint8_t> val = base64_decode(wrapped_key);
|
const secure_vector<uint8_t> val = base64_decode(wrapped_key.data(), wrapped_key.size());
|
||||||
|
|
||||||
std::unique_ptr<BlockCipher> wrap_cipher(m_cipher->clone());
|
std::unique_ptr<BlockCipher> wrap_cipher(m_cipher->clone());
|
||||||
wrap_cipher->set_key(m_hmac->process(wrapped_name));
|
wrap_cipher->set_key(m_hmac->process(wrapped_name));
|
||||||
|
|
@ -169,7 +169,7 @@ std::string PasswordManager::encrypt(const std::string &name, const std::string
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string PasswordManager::decrypt(const std::string &id, const std::string &encpwd)
|
std::string PasswordManager::decrypt(const std::string &id, const std::string_view &encpwd)
|
||||||
{
|
{
|
||||||
if (m_cryptoEngine) {
|
if (m_cryptoEngine) {
|
||||||
secure_vector<uint8_t> decoded = m_cryptoEngine->get(id, encpwd);
|
secure_vector<uint8_t> decoded = m_cryptoEngine->get(id, encpwd);
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
#include <QSqlDatabase>
|
#include <QSqlDatabase>
|
||||||
#include <botan/secmem.h>
|
#include <botan/secmem.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
|
@ -55,7 +56,7 @@ public:
|
||||||
bool locked() const;
|
bool locked() const;
|
||||||
|
|
||||||
std::string encrypt(const std::string &id, const std::string &passwd);
|
std::string encrypt(const std::string &id, const std::string &passwd);
|
||||||
std::string decrypt(const std::string &id, const std::string &encpwd);
|
std::string decrypt(const std::string &id, const std::string_view &encpwd);
|
||||||
// void remove(const std::string &id);
|
// void remove(const std::string &id);
|
||||||
private:
|
private:
|
||||||
QString m_passwordTableName = "psk_passwd";
|
QString m_passwordTableName = "psk_passwd";
|
||||||
|
|
|
||||||
|
|
@ -169,16 +169,16 @@ void ConnectionConfigurationWidget::setData(const ConnectionConfig &cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
m_uuid = cfg.uuid();
|
m_uuid = cfg.uuid();
|
||||||
edtName->setText(stdStrToQ(cfg.name()));
|
edtName->setText(cfg.name());
|
||||||
edtHost->setText(stdStrToQ(cfg.host()));
|
edtHost->setText(cfg.host());
|
||||||
spinPort->setValue(cfg.port());
|
spinPort->setValue(cfg.port());
|
||||||
edtUser->setText(stdStrToQ(cfg.user()));
|
edtUser->setText(cfg.user());
|
||||||
edtDbname->setText(stdStrToQ(cfg.dbname()));
|
edtDbname->setText(cfg.dbname());
|
||||||
cmbbxSsl->setCurrentIndex(static_cast<int>(cfg.sslMode()));
|
cmbbxSsl->setCurrentIndex(static_cast<int>(cfg.sslMode()));
|
||||||
edtCert->setText(stdStrToQ(cfg.sslCert()));
|
edtCert->setText(cfg.sslCert());
|
||||||
edtKey->setText(stdStrToQ(cfg.sslKey()));
|
edtKey->setText(cfg.sslKey());
|
||||||
edtRootCert->setText(stdStrToQ(cfg.sslRootCert()));
|
edtRootCert->setText(cfg.sslRootCert());
|
||||||
edtCrl->setText(stdStrToQ(cfg.sslCrl()));
|
edtCrl->setText(cfg.sslCrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<QString, ConnectionConfig> ConnectionConfigurationWidget::data() const
|
std::tuple<QString, ConnectionConfig> ConnectionConfigurationWidget::data() const
|
||||||
|
|
@ -188,16 +188,16 @@ std::tuple<QString, ConnectionConfig> ConnectionConfigurationWidget::data() cons
|
||||||
|
|
||||||
ConnectionConfig cfg;
|
ConnectionConfig cfg;
|
||||||
cfg.setUuid(m_uuid);
|
cfg.setUuid(m_uuid);
|
||||||
cfg.setName(qStrToStd(edtName->text()));
|
cfg.setName(edtName->text());
|
||||||
cfg.setHost(qStrToStd(edtHost->text()));
|
cfg.setHost(edtHost->text());
|
||||||
cfg.setPort(static_cast<uint16_t>(spinPort->value()));
|
cfg.setPort(static_cast<uint16_t>(spinPort->value()));
|
||||||
cfg.setUser(qStrToStd(edtUser->text()));
|
cfg.setUser(edtUser->text());
|
||||||
cfg.setDbname(qStrToStd(edtDbname->text()));
|
cfg.setDbname(edtDbname->text());
|
||||||
cfg.setSslMode(static_cast<SslMode>(cmbbxSsl->currentIndex()));
|
cfg.setSslMode(static_cast<SslMode>(cmbbxSsl->currentIndex()));
|
||||||
cfg.setSslCert(qStrToStd(edtCert->text()));
|
cfg.setSslCert(edtCert->text());
|
||||||
cfg.setSslKey(qStrToStd(edtKey->text()));
|
cfg.setSslKey(edtKey->text());
|
||||||
cfg.setSslRootCert(qStrToStd(edtRootCert->text()));
|
cfg.setSslRootCert(edtRootCert->text());
|
||||||
cfg.setSslCrl(qStrToStd(edtCrl->text()));
|
cfg.setSslCrl(edtCrl->text());
|
||||||
return { group, cfg };
|
return { group, cfg };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
|
|
||||||
ConnectionController::ConnectionController(MasterController *parent)
|
ConnectionController::ConnectionController(MasterController *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_masterController(parent)
|
, m_masterController(parent)
|
||||||
|
|
@ -146,11 +145,12 @@ void ConnectionController::openServerWindowForConnection(QModelIndex index)
|
||||||
bool ConnectionController::retrieveConnectionPassword(ConnectionConfig &cc)
|
bool ConnectionController::retrieveConnectionPassword(ConnectionConfig &cc)
|
||||||
{
|
{
|
||||||
auto enc_pwd = cc.encodedPassword();
|
auto enc_pwd = cc.encodedPassword();
|
||||||
if (!enc_pwd.empty()) {
|
if (!enc_pwd.isEmpty()) {
|
||||||
std::string pw;
|
std::string pw;
|
||||||
bool result = decodePassword(getPskId(cc), cc.encodedPassword(), pw);// getPasswordFromPskdb(getPskId(cc), pw);
|
bool result = decodePassword(getPskId(cc),
|
||||||
|
std::string_view(enc_pwd.data(), enc_pwd.size()) , pw);// getPasswordFromPskdb(getPskId(cc), pw);
|
||||||
if (result) {
|
if (result) {
|
||||||
cc.setPassword(pw);
|
cc.setPassword(QString::fromUtf8(pw.data(), pw.size()));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -163,12 +163,14 @@ bool ConnectionController::retrieveConnectionPassword(ConnectionConfig &cc)
|
||||||
int exec_result = dlg->exec();
|
int exec_result = dlg->exec();
|
||||||
|
|
||||||
if (exec_result == QDialog::Accepted) {
|
if (exec_result == QDialog::Accepted) {
|
||||||
std::string password = dlg->password().toUtf8().data();
|
auto password = dlg->password();
|
||||||
cc.setPassword(password);
|
cc.setPassword(password);
|
||||||
if (dlg->saveChecked()) {
|
if (dlg->saveChecked()) {
|
||||||
|
auto ba = password.toUtf8();
|
||||||
|
std::string pw(ba.data(), static_cast<size_t>(ba.size()));
|
||||||
std::string encoded_pw;
|
std::string encoded_pw;
|
||||||
if (encodePassword(getPskId(cc), password, encoded_pw)) {
|
if (encodePassword(getPskId(cc), pw, encoded_pw)) {
|
||||||
cc.setEncodedPassword(encoded_pw);
|
cc.setEncodedPassword({ encoded_pw.data(), static_cast<int>(encoded_pw.size()) });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -176,7 +178,7 @@ bool ConnectionController::retrieveConnectionPassword(ConnectionConfig &cc)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ConnectionController::decodePassword(const std::string &password_id, const std::string &enc_password, std::string &password)
|
bool ConnectionController::decodePassword(const std::string &password_id, const std::string_view &enc_password, std::string &password)
|
||||||
{
|
{
|
||||||
if (!UnlockPasswordManagerIfNeeded())
|
if (!UnlockPasswordManagerIfNeeded())
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#define CONNECTIONCONTROLLER_H
|
#define CONNECTIONCONTROLLER_H
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <string_view>
|
||||||
|
|
||||||
class MasterController;
|
class MasterController;
|
||||||
class ConnectionConfig;
|
class ConnectionConfig;
|
||||||
|
|
@ -56,7 +57,7 @@ private:
|
||||||
*/
|
*/
|
||||||
bool retrieveConnectionPassword(ConnectionConfig &cc);
|
bool retrieveConnectionPassword(ConnectionConfig &cc);
|
||||||
|
|
||||||
bool decodePassword(const std::string &password_id, const std::string &enc_password, std::string &password);
|
bool decodePassword(const std::string &password_id, const std::string_view &enc_password, std::string &password);
|
||||||
bool encodePassword(const std::string &password_id, const std::string &password, std::string &enc_password);
|
bool encodePassword(const std::string &password_id, const std::string &password, std::string &enc_password);
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,13 @@
|
||||||
|
|
||||||
#include <botan/cryptobox.h>
|
#include <botan/cryptobox.h>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QMimeData>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QSqlDatabase>
|
#include <QSqlDatabase>
|
||||||
#include <QSqlError>
|
#include <QSqlError>
|
||||||
#include <QSqlQuery>
|
#include <QSqlQuery>
|
||||||
#include <QStandardPaths>
|
#include <QStandardPaths>
|
||||||
|
#include <QStringBuilder>
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
@ -24,19 +26,19 @@ CREATE TABLE IF NOT EXISTS conngroup (
|
||||||
R"__(
|
R"__(
|
||||||
CREATE TABLE IF NOT EXISTS connection (
|
CREATE TABLE IF NOT EXISTS connection (
|
||||||
uuid TEXT PRIMARY KEY,
|
uuid TEXT PRIMARY KEY,
|
||||||
cname TEXT NOT NULL,
|
cname TEXT,
|
||||||
conngroup_id INTEGER NOT NULL,
|
conngroup_id INTEGER NOT NULL,
|
||||||
host TEXT NOT NULL,
|
host TEXT ,
|
||||||
hostaddr TEXT NOT NULL,
|
hostaddr TEXT ,
|
||||||
port INTEGER NOT NULL,
|
port INTEGER NOT NULL,
|
||||||
user TEXT NOT NULL,
|
user TEXT ,
|
||||||
dbname TEXT NOT NULL,
|
dbname TEXT ,
|
||||||
sslmode INTEGER NOT NULL,
|
sslmode INTEGER NOT NULL,
|
||||||
sslcert TEXT NOT NULL,
|
sslcert TEXT ,
|
||||||
sslkey TEXT NOT NULL,
|
sslkey TEXT ,
|
||||||
sslrootcert TEXT NOT NULL,
|
sslrootcert TEXT ,
|
||||||
sslcrl TEXT NOT NULL,
|
sslcrl TEXT ,
|
||||||
password TEXT NOT NULL
|
password TEXT
|
||||||
);)__";
|
);)__";
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -68,22 +70,23 @@ R"__(INSERT OR REPLACE INTO connection
|
||||||
QSqlQuery q(db);
|
QSqlQuery q(db);
|
||||||
q.prepare(q_insert_or_replace_into_connection);
|
q.prepare(q_insert_or_replace_into_connection);
|
||||||
q.bindValue(":uuid", cc.uuid().toString());
|
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(":conngroup_id", conngroup_id);
|
||||||
q.bindValue(":host", stdStrToQ(cc.host()));
|
q.bindValue(":host", cc.host());
|
||||||
q.bindValue(":hostaddr", stdStrToQ(cc.hostAddr()));
|
q.bindValue(":hostaddr", cc.hostAddr());
|
||||||
q.bindValue(":port", cc.port());
|
q.bindValue(":port", (int)cc.port());
|
||||||
q.bindValue(":user", stdStrToQ(cc.user()));
|
q.bindValue(":user", cc.user());
|
||||||
q.bindValue(":dbname", stdStrToQ(cc.dbname()));
|
q.bindValue(":dbname", cc.dbname());
|
||||||
q.bindValue(":sslmode", static_cast<int>(cc.sslMode()));
|
q.bindValue(":sslmode", static_cast<int>(cc.sslMode()));
|
||||||
q.bindValue(":sslcert", stdStrToQ(cc.sslCert()));
|
q.bindValue(":sslcert", cc.sslCert());
|
||||||
q.bindValue(":sslkey", stdStrToQ(cc.sslKey()));
|
q.bindValue(":sslkey", cc.sslKey());
|
||||||
q.bindValue(":sslrootcert", stdStrToQ(cc.sslRootCert()));
|
q.bindValue(":sslrootcert", cc.sslRootCert());
|
||||||
q.bindValue(":sslcrl", stdStrToQ(cc.sslCrl()));
|
q.bindValue(":sslcrl", cc.sslCrl());
|
||||||
q.bindValue(":password", stdStrToQ(cc.encodedPassword()));
|
q.bindValue(":password", cc.encodedPassword());
|
||||||
|
|
||||||
if (!q.exec()) {
|
if (!q.exec()) {
|
||||||
return q.lastError();
|
auto sql_error = q.lastError();
|
||||||
|
return { sql_error };
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
@ -129,18 +132,18 @@ void ConnectionTreeModel::load()
|
||||||
while (q.next()) {
|
while (q.next()) {
|
||||||
auto cc = std::make_shared<ConnectionConfig>();
|
auto cc = std::make_shared<ConnectionConfig>();
|
||||||
cc->setUuid(q.value(0).toUuid());
|
cc->setUuid(q.value(0).toUuid());
|
||||||
cc->setName(qvarToStdStr(q.value(1)));
|
cc->setName(q.value(1).toString());
|
||||||
cc->setHost(qvarToStdStr(q.value(3)));
|
cc->setHost(q.value(3).toString());
|
||||||
cc->setHostAddr(qvarToStdStr(q.value(4)));
|
cc->setHostAddr(q.value(4).toString());
|
||||||
cc->setPort(static_cast<uint16_t>(q.value(5).toInt()));
|
cc->setPort(static_cast<uint16_t>(q.value(5).toInt()));
|
||||||
cc->setUser(qvarToStdStr(q.value(6)));
|
cc->setUser(q.value(6).toString());
|
||||||
cc->setDbname(qvarToStdStr(q.value(7)));
|
cc->setDbname(q.value(7).toString());
|
||||||
cc->setSslMode(static_cast<SslMode>(q.value(8).toInt()));
|
cc->setSslMode(static_cast<SslMode>(q.value(8).toInt()));
|
||||||
cc->setSslCert(qvarToStdStr(q.value(9)));
|
cc->setSslCert(q.value(9).toString());
|
||||||
cc->setSslKey(qvarToStdStr(q.value(10)));
|
cc->setSslKey(q.value(10).toString());
|
||||||
cc->setSslRootCert(qvarToStdStr(q.value(11)));
|
cc->setSslRootCert(q.value(11).toString());
|
||||||
cc->setSslCrl(qvarToStdStr(q.value(12)));
|
cc->setSslCrl(q.value(12).toString());
|
||||||
cc->setEncodedPassword(qvarToStdStr(q.value(13)));
|
cc->setEncodedPassword(q.value(13).toByteArray());
|
||||||
|
|
||||||
int group_id = q.value(2).toInt();
|
int group_id = q.value(2).toInt();
|
||||||
auto find_res = std::find_if(m_groups.begin(), m_groups.end(),
|
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
|
// This is a connection
|
||||||
if (role == Qt::DisplayRole) {
|
if (role == Qt::DisplayRole) {
|
||||||
switch (index.column()) {
|
switch (index.column()) {
|
||||||
case Name: v = stdStrToQ(conn->name()); break;
|
case Name: v = conn->name(); break;
|
||||||
case Host: v = stdStrToQ(conn->host()); break;
|
case Host: v = conn->host(); break;
|
||||||
case Port: v = conn->port(); break;
|
case Port: v = conn->port(); break;
|
||||||
case User: v = stdStrToQ(conn->user()); break;
|
case User: v = conn->user(); break;
|
||||||
case DbName: v= stdStrToQ(conn->dbname()); break;
|
case DbName: v= conn->dbname(); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -338,7 +341,11 @@ void ConnectionTreeModel::save(const QString &group_name, const ConnectionConfig
|
||||||
new_grp->add(node);
|
new_grp->add(node);
|
||||||
auto save_res = saveToDb(*node);
|
auto save_res = saveToDb(*node);
|
||||||
if (save_res) {
|
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);
|
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;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,17 @@ private:
|
||||||
int findGroup(const QString &name) const;
|
int findGroup(const QString &name) const;
|
||||||
|
|
||||||
std::optional<QSqlError> saveToDb(const ConnectionConfig &cc);
|
std::optional<QSqlError> saveToDb(const ConnectionConfig &cc);
|
||||||
|
|
||||||
|
// QAbstractItemModel interface
|
||||||
|
public:
|
||||||
|
virtual Qt::DropActions supportedDropActions() const override;
|
||||||
|
virtual Qt::DropActions supportedDragActions() const override;
|
||||||
|
virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
|
||||||
|
// virtual bool insertRows(int row, int count, const QModelIndex &parent) override;
|
||||||
|
// virtual bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) override;
|
||||||
|
virtual QStringList mimeTypes() const override;
|
||||||
|
virtual QMimeData *mimeData(const QModelIndexList &indexes) const override;
|
||||||
|
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CONNECTIONLISTMODEL_H
|
#endif // CONNECTIONLISTMODEL_H
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,8 @@ ConnectionManagerWindow::ConnectionManagerWindow(MasterController *master, QWidg
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
ui->treeView->setModel(m_connectionController->getConnectionTreeModel());
|
ui->treeView->setModel(m_connectionController->getConnectionTreeModel());
|
||||||
|
ui->treeView->setDragDropMode(QAbstractItemView::InternalMove);
|
||||||
|
|
||||||
connect(ui->treeView, &QTreeView::activated, this,
|
connect(ui->treeView, &QTreeView::activated, this,
|
||||||
&ConnectionManagerWindow::connectionActivated);
|
&ConnectionManagerWindow::connectionActivated);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -434,7 +434,7 @@ std::tuple<bool, CrudModel::ModifiedRow> CrudModel::updateRow(const PendingRow &
|
||||||
int row_number = pending_row.row();
|
int row_number = pending_row.row();
|
||||||
Pgsql::Connection db_update_conn;
|
Pgsql::Connection db_update_conn;
|
||||||
auto dbconfig = m_database->config();
|
auto dbconfig = m_database->config();
|
||||||
db_update_conn.connect(dbconfig.getKeywords(), dbconfig.getValues(), false);
|
db_update_conn.connect(dbconfig.connectionString().toStdString().c_str());
|
||||||
auto result = db_update_conn.queryParam(buffer, params);
|
auto result = db_update_conn.queryParam(buffer, params);
|
||||||
if (result && result.rows() == 1) {
|
if (result && result.rows() == 1) {
|
||||||
|
|
||||||
|
|
@ -523,7 +523,7 @@ std::tuple<bool, QString> CrudModel::removeRows(const std::set<IntegerRange<int>
|
||||||
try {
|
try {
|
||||||
Pgsql::Connection db_update_conn;
|
Pgsql::Connection db_update_conn;
|
||||||
auto dbconfig = m_database->config();
|
auto dbconfig = m_database->config();
|
||||||
db_update_conn.connect(dbconfig.getKeywords(), dbconfig.getValues(), false);
|
db_update_conn.connect(dbconfig.connectionString().toStdString().c_str());
|
||||||
|
|
||||||
// First delete rows in table
|
// First delete rows in table
|
||||||
QString delete_statement = createDeleteStatement();
|
QString delete_statement = createDeleteStatement();
|
||||||
|
|
|
||||||
|
|
@ -94,7 +94,7 @@ void DatabaseWindow::setConfig(const ConnectionConfig &config)
|
||||||
m_config = config;
|
m_config = config;
|
||||||
try {
|
try {
|
||||||
QString title = "pglab - ";
|
QString title = "pglab - ";
|
||||||
title += m_config.name().c_str();
|
title += m_config.name();
|
||||||
setWindowTitle(title);
|
setWindowTitle(title);
|
||||||
|
|
||||||
auto f = TaskExecutor::run(new LoadCatalog(m_config));
|
auto f = TaskExecutor::run(new LoadCatalog(m_config));
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include "Pgsql_Connection.h"
|
#include "Pgsql_Connection.h"
|
||||||
#include "Pgsql_PgException.h"
|
#include "Pgsql_PgException.h"
|
||||||
#include "model/TypeSelectionItemModel.h"
|
#include "model/TypeSelectionItemModel.h"
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
OpenDatabase::OpenDatabaseSPtr OpenDatabase::createOpenDatabase(const ConnectionConfig &cfg)
|
OpenDatabase::OpenDatabaseSPtr OpenDatabase::createOpenDatabase(const ConnectionConfig &cfg)
|
||||||
{
|
{
|
||||||
|
|
@ -27,11 +28,14 @@ OpenDatabase::~OpenDatabase() = default;
|
||||||
void OpenDatabase::Init()
|
void OpenDatabase::Init()
|
||||||
{
|
{
|
||||||
Pgsql::Connection conn;
|
Pgsql::Connection conn;
|
||||||
auto kw = m_config.getKeywords();
|
std::string connstr = m_config.connectionString().toStdString();
|
||||||
auto vals = m_config.getValues();
|
if (conn.connect(connstr.c_str())) {
|
||||||
conn.connect(kw, vals, 0);
|
|
||||||
m_catalog->loadAll(conn, nullptr);
|
m_catalog->loadAll(conn, nullptr);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
qDebug() << "Connect failed connstr: " << connstr.c_str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<PgDatabaseCatalog> OpenDatabase::catalog()
|
std::shared_ptr<PgDatabaseCatalog> OpenDatabase::catalog()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,6 @@ void ServerWindow::setConfig(const ConnectionConfig &config)
|
||||||
qWarning() << ex.text();
|
qWarning() << ex.text();
|
||||||
}
|
}
|
||||||
QString title = "pglab - ";
|
QString title = "pglab - ";
|
||||||
title += m_config.name().c_str();
|
title += m_config.name();
|
||||||
setWindowTitle(title);
|
setWindowTitle(title);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
481
pglabAll.pro.user.4.10-pre1
Normal file
481
pglabAll.pro.user.4.10-pre1
Normal file
|
|
@ -0,0 +1,481 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE QtCreatorProject>
|
||||||
|
<!-- Written by QtCreator 4.9.2, 2019-09-15T08:19:54. -->
|
||||||
|
<qtcreator>
|
||||||
|
<data>
|
||||||
|
<variable>EnvironmentId</variable>
|
||||||
|
<value type="QByteArray">{78888978-f53a-469c-ac73-a847c4fa88dd}</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||||
|
<value type="int">0</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
||||||
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
||||||
|
<value type="QString" key="language">Cpp</value>
|
||||||
|
<valuemap type="QVariantMap" key="value">
|
||||||
|
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
||||||
|
<value type="QString" key="language">QmlJS</value>
|
||||||
|
<valuemap type="QVariantMap" key="value">
|
||||||
|
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
||||||
|
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">2</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
||||||
|
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.Utf8BomBehavior">0</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey">
|
||||||
|
<value type="QString">-fno-delayed-template-parsing</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
|
||||||
|
<valuelist type="QVariantList" key="ClangStaticAnalyzer.SuppressedDiagnostics"/>
|
||||||
|
<value type="bool" key="ClangTools.BuildBeforeAnalysis">false</value>
|
||||||
|
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.TidyAndClazy</value>
|
||||||
|
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
|
||||||
|
<valuelist type="QVariantList" key="ClangTools.SelectedFiles">
|
||||||
|
<value type="QString">X:/Prog/pglab/pglab/ConnectionManagerWindow.cpp</value>
|
||||||
|
<value type="QString">X:/Prog/pglab/pglab/ConnectionConfigurationWidget.cpp</value>
|
||||||
|
<value type="QString">X:/Prog/pglab/pglab/ConnectionController.cpp</value>
|
||||||
|
<value type="QString">X:/Prog/pglab/pglab/ConnectionListModel.cpp</value>
|
||||||
|
</valuelist>
|
||||||
|
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
|
||||||
|
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.Target.0</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.13.0 MSVC2017 32bit</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.13.0 MSVC2017 32bit</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5130.win32_msvc2017_kit</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">X:/Prog/build-pglabAll-Desktop_Qt_5_13_0_MSVC2017_32bit-Debug</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
||||||
|
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
|
||||||
|
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
||||||
|
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
||||||
|
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
|
||||||
|
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||||
|
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
||||||
|
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
||||||
|
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||||
|
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
||||||
|
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
||||||
|
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
||||||
|
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">X:/Prog/build-pglabAll-Desktop_Qt_5_13_0_MSVC2017_32bit-Release</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
||||||
|
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
|
||||||
|
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
||||||
|
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
||||||
|
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
|
||||||
|
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||||
|
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
||||||
|
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
||||||
|
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||||
|
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
||||||
|
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
||||||
|
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
||||||
|
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">X:/Prog/build-pglabAll-Desktop_Qt_5_13_0_MSVC2017_32bit-Profile</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
||||||
|
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
|
||||||
|
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
||||||
|
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
||||||
|
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
|
||||||
|
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||||
|
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
||||||
|
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
||||||
|
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||||
|
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
||||||
|
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
||||||
|
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
||||||
|
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
||||||
|
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy Configuration</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
||||||
|
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
|
||||||
|
<value type="QString">cpu-cycles</value>
|
||||||
|
</valuelist>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
|
||||||
|
<value type="int" key="Analyzer.Perf.Frequency">250</value>
|
||||||
|
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
|
||||||
|
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
|
||||||
|
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
|
||||||
|
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
||||||
|
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
||||||
|
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
||||||
|
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
||||||
|
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
||||||
|
<value type="int">0</value>
|
||||||
|
<value type="int">1</value>
|
||||||
|
<value type="int">2</value>
|
||||||
|
<value type="int">3</value>
|
||||||
|
<value type="int">4</value>
|
||||||
|
<value type="int">5</value>
|
||||||
|
<value type="int">6</value>
|
||||||
|
<value type="int">7</value>
|
||||||
|
<value type="int">8</value>
|
||||||
|
<value type="int">9</value>
|
||||||
|
<value type="int">10</value>
|
||||||
|
<value type="int">11</value>
|
||||||
|
<value type="int">12</value>
|
||||||
|
<value type="int">13</value>
|
||||||
|
<value type="int">14</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||||
|
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">pglab</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:X:/Prog/pglab/pglab/pglab.pro</value>
|
||||||
|
<value type="QString" key="RunConfiguration.Arguments"></value>
|
||||||
|
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory.default">X:/Prog/build-pglabAll-Desktop_Qt_5_13_0_MSVC2017_32bit-Debug/pglab</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
|
||||||
|
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
|
||||||
|
<value type="QString">cpu-cycles</value>
|
||||||
|
</valuelist>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
|
||||||
|
<value type="int" key="Analyzer.Perf.Frequency">250</value>
|
||||||
|
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
|
||||||
|
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
|
||||||
|
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
|
||||||
|
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
||||||
|
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
||||||
|
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
||||||
|
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
||||||
|
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
||||||
|
<value type="int">0</value>
|
||||||
|
<value type="int">1</value>
|
||||||
|
<value type="int">2</value>
|
||||||
|
<value type="int">3</value>
|
||||||
|
<value type="int">4</value>
|
||||||
|
<value type="int">5</value>
|
||||||
|
<value type="int">6</value>
|
||||||
|
<value type="int">7</value>
|
||||||
|
<value type="int">8</value>
|
||||||
|
<value type="int">9</value>
|
||||||
|
<value type="int">10</value>
|
||||||
|
<value type="int">11</value>
|
||||||
|
<value type="int">12</value>
|
||||||
|
<value type="int">13</value>
|
||||||
|
<value type="int">14</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||||
|
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">pglabtests</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:X:/Prog/pglab/tests/pglabtests/pglabtests.pro</value>
|
||||||
|
<value type="QString" key="RunConfiguration.Arguments"></value>
|
||||||
|
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory.default">X:/Prog/build-pglabAll-Desktop_Qt_5_13_0_MSVC2017_32bit-Debug/tests/pglabtests</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.2">
|
||||||
|
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
|
||||||
|
<value type="QString">cpu-cycles</value>
|
||||||
|
</valuelist>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
|
||||||
|
<value type="int" key="Analyzer.Perf.Frequency">250</value>
|
||||||
|
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
|
||||||
|
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
|
||||||
|
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
|
||||||
|
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
||||||
|
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
||||||
|
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
||||||
|
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
||||||
|
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
||||||
|
<value type="int">0</value>
|
||||||
|
<value type="int">1</value>
|
||||||
|
<value type="int">2</value>
|
||||||
|
<value type="int">3</value>
|
||||||
|
<value type="int">4</value>
|
||||||
|
<value type="int">5</value>
|
||||||
|
<value type="int">6</value>
|
||||||
|
<value type="int">7</value>
|
||||||
|
<value type="int">8</value>
|
||||||
|
<value type="int">9</value>
|
||||||
|
<value type="int">10</value>
|
||||||
|
<value type="int">11</value>
|
||||||
|
<value type="int">12</value>
|
||||||
|
<value type="int">13</value>
|
||||||
|
<value type="int">14</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||||
|
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">PgsqlTests</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:X:/Prog/pglab/tests/PgsqlTests/PgsqlTests.pro</value>
|
||||||
|
<value type="QString" key="RunConfiguration.Arguments"></value>
|
||||||
|
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory.default">X:/Prog/build-pglabAll-Desktop_Qt_5_13_0_MSVC2017_32bit-Debug/tests/PgsqlTests</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">3</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.TargetCount</variable>
|
||||||
|
<value type="int">1</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
||||||
|
<value type="int">21</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>Version</variable>
|
||||||
|
<value type="int">21</value>
|
||||||
|
</data>
|
||||||
|
</qtcreator>
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include "ASyncDBConnection.h"
|
#include "ASyncDBConnection.h"
|
||||||
#include "ScopeGuard.h"
|
#include "ScopeGuard.h"
|
||||||
|
#include "util.h"
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
using namespace boost::asio;
|
using namespace boost::asio;
|
||||||
|
|
@ -33,10 +34,10 @@ ASyncDBConnection::State ASyncDBConnection::state() const
|
||||||
void ASyncDBConnection::setupConnection(const ConnectionConfig &config)
|
void ASyncDBConnection::setupConnection(const ConnectionConfig &config)
|
||||||
{
|
{
|
||||||
m_config = config;
|
m_config = config;
|
||||||
auto keywords = m_config.getKeywords();
|
// auto keywords = m_config.getKeywords();
|
||||||
auto values = m_config.getValues();
|
// auto values = m_config.getValues();
|
||||||
|
QString conn_string = config.connectionString();
|
||||||
bool ok = m_connection.connectStart(keywords, values);
|
bool ok = m_connection.connectStart(conn_string.toStdString().c_str());
|
||||||
// auto start = std::chrono::steady_clock::now();
|
// auto start = std::chrono::steady_clock::now();
|
||||||
if (ok && m_connection.status() != CONNECTION_BAD) {
|
if (ok && m_connection.status() != CONNECTION_BAD) {
|
||||||
auto sock_handle = m_connection.socket();
|
auto sock_handle = m_connection.socket();
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,19 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QProcessEnvironment>
|
#include <QProcessEnvironment>
|
||||||
|
#include <QStringBuilder>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
class registerMetaTypes {
|
||||||
|
public:
|
||||||
|
registerMetaTypes()
|
||||||
|
{
|
||||||
|
qRegisterMetaTypeStreamOperators<ConnectionConfig>("ConnectionConfig");
|
||||||
|
}
|
||||||
|
} registerMetaTypes_instance;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
SslMode mode;
|
SslMode mode;
|
||||||
const char* string;
|
const char* string;
|
||||||
|
|
@ -24,18 +34,17 @@ namespace {
|
||||||
|
|
||||||
} // end unnamed namespace
|
} // end unnamed namespace
|
||||||
|
|
||||||
std::string SslModeToString(SslMode sm)
|
QString SslModeToString(SslMode sm)
|
||||||
{
|
{
|
||||||
std::string result;
|
|
||||||
for (auto e : SslModeStringTable) {
|
for (auto e : SslModeStringTable) {
|
||||||
if (e.mode == sm) {
|
if (e.mode == sm) {
|
||||||
result = e.string;
|
return QString::fromUtf8(e.string);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
SslMode StringToSslMode(std::string s)
|
SslMode StringToSslMode(QString s)
|
||||||
{
|
{
|
||||||
SslMode result = SslMode::allow;
|
SslMode result = SslMode::allow;
|
||||||
for (auto e : SslModeStringTable) {
|
for (auto e : SslModeStringTable) {
|
||||||
|
|
@ -43,14 +52,14 @@ SslMode StringToSslMode(std::string s)
|
||||||
result = e.mode;
|
result = e.mode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<const char*> ConnectionConfig::s_keywords = {
|
//std::vector<const char*> ConnectionConfig::s_keywords = {
|
||||||
"host", "hostaddr", "port", "user", "password", "dbname",
|
// "host", "hostaddr", "port", "user", "password", "dbname",
|
||||||
"sslmode", "sslcert", "sslkey", "sslrootcrt", "sslcrl",
|
// "sslmode", "sslcert", "sslkey", "sslrootcrt", "sslcrl",
|
||||||
"client_encoding", "application_name", nullptr };
|
// "client_encoding", "application_name", nullptr };
|
||||||
|
|
||||||
|
|
||||||
ConnectionConfig::ConnectionConfig()
|
ConnectionConfig::ConnectionConfig()
|
||||||
|
|
@ -83,7 +92,7 @@ const QUuid &ConnectionConfig::uuid() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ConnectionConfig::setName(std::string desc)
|
void ConnectionConfig::setName(const QString& desc)
|
||||||
{
|
{
|
||||||
if (m_name != desc) {
|
if (m_name != desc) {
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
|
@ -91,12 +100,12 @@ void ConnectionConfig::setName(std::string desc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& ConnectionConfig::name() const
|
const QString& ConnectionConfig::name() const
|
||||||
{
|
{
|
||||||
return m_name;
|
return m_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::setHost(std::string host)
|
void ConnectionConfig::setHost(const QString& host)
|
||||||
{
|
{
|
||||||
if (m_host != host) {
|
if (m_host != host) {
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
|
@ -104,12 +113,12 @@ void ConnectionConfig::setHost(std::string host)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& ConnectionConfig::host() const
|
const QString& ConnectionConfig::host() const
|
||||||
{
|
{
|
||||||
return m_host;
|
return m_host;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::setHostAddr(std::string v)
|
void ConnectionConfig::setHostAddr(const QString &v)
|
||||||
{
|
{
|
||||||
if (m_hostaddr != v) {
|
if (m_hostaddr != v) {
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
|
@ -117,26 +126,25 @@ void ConnectionConfig::setHostAddr(std::string v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& ConnectionConfig::hostAddr() const
|
const QString& ConnectionConfig::hostAddr() const
|
||||||
{
|
{
|
||||||
return m_hostaddr;
|
return m_hostaddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::setPort(unsigned short port)
|
void ConnectionConfig::setPort(unsigned short port)
|
||||||
{
|
{
|
||||||
auto p = std::to_string(port);
|
if (m_port != port) {
|
||||||
if (m_port != p) {
|
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
m_port = p;
|
m_port = port;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned short ConnectionConfig::port() const
|
unsigned short ConnectionConfig::port() const
|
||||||
{
|
{
|
||||||
return static_cast<unsigned short>(std::stoi(m_port));
|
return m_port;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::setUser(std::string v)
|
void ConnectionConfig::setUser(const QString& v)
|
||||||
{
|
{
|
||||||
if (m_user != v) {
|
if (m_user != v) {
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
|
@ -145,12 +153,12 @@ void ConnectionConfig::setUser(std::string v)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& ConnectionConfig::user() const
|
const QString& ConnectionConfig::user() const
|
||||||
{
|
{
|
||||||
return m_user;
|
return m_user;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::setPassword(std::string v)
|
void ConnectionConfig::setPassword(const QString& v)
|
||||||
{
|
{
|
||||||
if (m_password != v) {
|
if (m_password != v) {
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
|
@ -158,12 +166,12 @@ void ConnectionConfig::setPassword(std::string v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& ConnectionConfig::password() const
|
const QString& ConnectionConfig::password() const
|
||||||
{
|
{
|
||||||
return m_password;
|
return m_password;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::setDbname(std::string v)
|
void ConnectionConfig::setDbname(const QString& v)
|
||||||
{
|
{
|
||||||
if (m_dbname != v) {
|
if (m_dbname != v) {
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
|
@ -171,26 +179,25 @@ void ConnectionConfig::setDbname(std::string v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& ConnectionConfig::dbname() const
|
const QString& ConnectionConfig::dbname() const
|
||||||
{
|
{
|
||||||
return m_dbname;
|
return m_dbname;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::setSslMode(SslMode m)
|
void ConnectionConfig::setSslMode(SslMode m)
|
||||||
{
|
{
|
||||||
auto v = SslModeToString(m);
|
if (m_sslMode != m) {
|
||||||
if (m_sslMode != v) {
|
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
m_sslMode = v;
|
m_sslMode = m;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SslMode ConnectionConfig::sslMode() const
|
SslMode ConnectionConfig::sslMode() const
|
||||||
{
|
{
|
||||||
return StringToSslMode(m_sslMode);
|
return m_sslMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::setSslCert(std::string v)
|
void ConnectionConfig::setSslCert(const QString& v)
|
||||||
{
|
{
|
||||||
if (m_sslCert != v) {
|
if (m_sslCert != v) {
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
|
@ -198,12 +205,12 @@ void ConnectionConfig::setSslCert(std::string v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& ConnectionConfig::sslCert() const
|
const QString& ConnectionConfig::sslCert() const
|
||||||
{
|
{
|
||||||
return m_sslCert;
|
return m_sslCert;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::setSslKey(std::string v)
|
void ConnectionConfig::setSslKey(const QString& v)
|
||||||
{
|
{
|
||||||
if (m_sslKey != v) {
|
if (m_sslKey != v) {
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
|
@ -211,12 +218,12 @@ void ConnectionConfig::setSslKey(std::string v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& ConnectionConfig::sslKey() const
|
const QString& ConnectionConfig::sslKey() const
|
||||||
{
|
{
|
||||||
return m_sslKey;
|
return m_sslKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::setSslRootCert(std::string v)
|
void ConnectionConfig::setSslRootCert(const QString& v)
|
||||||
{
|
{
|
||||||
if (m_sslRootCert != v) {
|
if (m_sslRootCert != v) {
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
|
@ -224,12 +231,12 @@ void ConnectionConfig::setSslRootCert(std::string v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& ConnectionConfig::sslRootCert() const
|
const QString& ConnectionConfig::sslRootCert() const
|
||||||
{
|
{
|
||||||
return m_sslRootCert;
|
return m_sslRootCert;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::setSslCrl(std::string v)
|
void ConnectionConfig::setSslCrl(const QString& v)
|
||||||
{
|
{
|
||||||
if (m_sslCrl != v) {
|
if (m_sslCrl != v) {
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
|
@ -237,36 +244,36 @@ void ConnectionConfig::setSslCrl(std::string v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& ConnectionConfig::sslCrl() const
|
const QString& ConnectionConfig::sslCrl() const
|
||||||
{
|
{
|
||||||
return m_sslCrl;
|
return m_sslCrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char * const * ConnectionConfig::getKeywords() const
|
//const char * const * ConnectionConfig::getKeywords() const
|
||||||
{
|
//{
|
||||||
return s_keywords.data();
|
// return s_keywords.data();
|
||||||
}
|
//}
|
||||||
|
|
||||||
const char * const * ConnectionConfig::getValues() const
|
//const char * const * ConnectionConfig::getValues() const
|
||||||
{
|
//{
|
||||||
m_values.resize(s_keywords.size(), nullptr);
|
// m_values.resize(s_keywords.size(), nullptr);
|
||||||
m_values[0] = valuePtr(m_host);
|
// m_values[0] = valuePtr(m_host);
|
||||||
m_values[1] = valuePtr(m_hostaddr);
|
// m_values[1] = valuePtr(m_hostaddr);
|
||||||
m_values[2] = valuePtr(m_port);
|
// m_values[2] = valuePtr(m_port);
|
||||||
m_values[3] = valuePtr(m_user);
|
// m_values[3] = valuePtr(m_user);
|
||||||
m_values[4] = valuePtr(m_password);
|
// m_values[4] = valuePtr(m_password);
|
||||||
m_values[5] = valuePtr(m_dbname);
|
// m_values[5] = valuePtr(m_dbname);
|
||||||
m_values[6] = valuePtr(m_sslMode);
|
// m_values[6] = valuePtr(m_sslMode);
|
||||||
m_values[7] = valuePtr(m_sslCert);
|
// m_values[7] = valuePtr(m_sslCert);
|
||||||
m_values[8] = valuePtr(m_sslKey);
|
// m_values[8] = valuePtr(m_sslKey);
|
||||||
m_values[9] = valuePtr(m_sslRootCert);
|
// m_values[9] = valuePtr(m_sslRootCert);
|
||||||
m_values[10] = valuePtr(m_sslCrl);
|
// m_values[10] = valuePtr(m_sslCrl);
|
||||||
m_values[11] = "utf8";
|
// m_values[11] = "utf8";
|
||||||
m_values[12] = valuePtr(m_applicationName);
|
// m_values[12] = valuePtr(m_applicationName);
|
||||||
|
|
||||||
return m_values.data();
|
// return m_values.data();
|
||||||
}
|
//}
|
||||||
|
|
||||||
bool ConnectionConfig::isSameDatabase(const ConnectionConfig &rhs) const
|
bool ConnectionConfig::isSameDatabase(const ConnectionConfig &rhs) const
|
||||||
{
|
{
|
||||||
|
|
@ -290,30 +297,113 @@ void ConnectionConfig::clean()
|
||||||
|
|
||||||
QString ConnectionConfig::makeLongDescription() const
|
QString ConnectionConfig::makeLongDescription() const
|
||||||
{
|
{
|
||||||
std::string result(name());
|
QString result;
|
||||||
result += " (";
|
result = name() % " (" % user() % "@" % host() % ":" % QString::number(port()) % "/" % dbname() % ")";
|
||||||
result += user();
|
return result;
|
||||||
result += "@";
|
|
||||||
result += host();
|
|
||||||
result += ":";
|
|
||||||
result += std::to_string(port());
|
|
||||||
result += "/";
|
|
||||||
result += dbname();
|
|
||||||
result += ")";
|
|
||||||
return stdStrToQ(result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ConnectionConfig::encodedPassword() const
|
QByteArray ConnectionConfig::encodedPassword() const
|
||||||
{
|
{
|
||||||
return m_encodedPassword;
|
return m_encodedPassword;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::setEncodedPassword(const std::string &encodedPassword)
|
void ConnectionConfig::setEncodedPassword(const QByteArray &encodedPassword)
|
||||||
{
|
{
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
m_encodedPassword = encodedPassword;
|
m_encodedPassword = encodedPassword;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConnectionConfig::write(QDataStream &out) const
|
||||||
|
{
|
||||||
|
// out <<
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectionConfig::read(QDataStream &in)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ConnectionConfig::escapeConnectionStringValue(const QString &value)
|
||||||
|
{
|
||||||
|
bool contains_spaces = false;
|
||||||
|
int escapes = 0;
|
||||||
|
for (auto&& c : value)
|
||||||
|
if (c == ' ') contains_spaces = true;
|
||||||
|
else if (c == '\'' || c == '\\') ++escapes;
|
||||||
|
|
||||||
|
if (contains_spaces || escapes > 0 || value.length() == 0) {
|
||||||
|
QString result;
|
||||||
|
result.reserve(2 + value.length() + escapes);
|
||||||
|
result += '\'';
|
||||||
|
for (auto&& c : value) {
|
||||||
|
if (c == '\'' || c == '\\') {
|
||||||
|
result += '\\';
|
||||||
|
}
|
||||||
|
result += c;
|
||||||
|
}
|
||||||
|
result += '\'';
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ConnectionConfig::connectionString() const
|
||||||
|
{
|
||||||
|
QString s;
|
||||||
|
s += "host="
|
||||||
|
% escapeConnectionStringValue(m_host)
|
||||||
|
% " port="
|
||||||
|
% QString::number(m_port)
|
||||||
|
% " user="
|
||||||
|
% escapeConnectionStringValue(m_user);
|
||||||
|
s += " password=";
|
||||||
|
s += escapeConnectionStringValue(m_password);
|
||||||
|
s += " dbname=";
|
||||||
|
s += escapeConnectionStringValue(m_dbname);
|
||||||
|
s += " sslmode=";
|
||||||
|
s += SslModeToString(m_sslMode);
|
||||||
|
if (!m_sslCert.isEmpty()) {
|
||||||
|
s += " sslcert=";
|
||||||
|
s += escapeConnectionStringValue(m_sslCert);
|
||||||
|
}
|
||||||
|
if (!m_sslKey.isEmpty()) {
|
||||||
|
s += " sslkey=";
|
||||||
|
s += escapeConnectionStringValue(m_sslKey);
|
||||||
|
}
|
||||||
|
if (!m_sslRootCert.isEmpty()) {
|
||||||
|
s += " sslrootcrt=";
|
||||||
|
s += escapeConnectionStringValue(m_sslRootCert);
|
||||||
|
}
|
||||||
|
if (!m_sslCrl.isEmpty()) {
|
||||||
|
s += " sslCrl=";
|
||||||
|
s += escapeConnectionStringValue(m_sslCrl);
|
||||||
|
}
|
||||||
|
s += " client_encoding=utf8";
|
||||||
|
s += " application_name=";
|
||||||
|
s += escapeConnectionStringValue(m_applicationName);
|
||||||
|
|
||||||
|
// "host", "hostaddr", "port", "user", "password", "dbname",
|
||||||
|
// "sslmode", "sslcert", "sslkey", "sslrootcrt", "sslcrl",
|
||||||
|
// "client_encoding", "application_name", nullptr };
|
||||||
|
// m_values[0] = valuePtr(m_host);
|
||||||
|
// m_values[1] = valuePtr(m_hostaddr);
|
||||||
|
// m_values[2] = valuePtr(m_port);
|
||||||
|
// m_values[3] = valuePtr(m_user);
|
||||||
|
// m_values[4] = valuePtr(m_password);
|
||||||
|
// m_values[5] = valuePtr(m_dbname);
|
||||||
|
// m_values[6] = valuePtr(m_sslMode);
|
||||||
|
// m_values[7] = valuePtr(m_sslCert);
|
||||||
|
// m_values[8] = valuePtr(m_sslKey);
|
||||||
|
// m_values[9] = valuePtr(m_sslRootCert);
|
||||||
|
// m_values[10] = valuePtr(m_sslCrl);
|
||||||
|
// m_values[11] = "utf8";
|
||||||
|
// m_values[12] = valuePtr(m_applicationName);
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
PGHOST behaves the same as the host connection parameter.
|
PGHOST behaves the same as the host connection parameter.
|
||||||
|
|
@ -347,11 +437,11 @@ void ConnectionConfig::writeToEnvironment(QProcessEnvironment &env) const
|
||||||
{
|
{
|
||||||
strToEnv(env, "PGHOST", m_host);
|
strToEnv(env, "PGHOST", m_host);
|
||||||
strToEnv(env, "PGHOSTADDR", m_hostaddr);
|
strToEnv(env, "PGHOSTADDR", m_hostaddr);
|
||||||
strToEnv(env, "PGPORT", m_port);
|
strToEnv(env, "PGPORT", QString::number(m_port));
|
||||||
strToEnv(env, "PGDATABASE", m_dbname);
|
strToEnv(env, "PGDATABASE", m_dbname);
|
||||||
strToEnv(env, "PGUSER", m_user);
|
strToEnv(env, "PGUSER", m_user);
|
||||||
strToEnv(env, "PGPASSWORD", m_password);
|
strToEnv(env, "PGPASSWORD", m_password);
|
||||||
strToEnv(env, "PGSSLMODE", m_sslMode);
|
strToEnv(env, "PGSSLMODE", SslModeToString(m_sslMode));
|
||||||
strToEnv(env, "PGSSLCERT", m_sslCert);
|
strToEnv(env, "PGSSLCERT", m_sslCert);
|
||||||
strToEnv(env, "PGSSLKEY", m_sslKey);
|
strToEnv(env, "PGSSLKEY", m_sslKey);
|
||||||
strToEnv(env, "PGSSLROOTCERT", m_sslRootCert);
|
strToEnv(env, "PGSSLROOTCERT", m_sslRootCert);
|
||||||
|
|
@ -363,12 +453,12 @@ void ConnectionConfig::writeToEnvironment(QProcessEnvironment &env) const
|
||||||
env.remove("PGREQUIRESSL");
|
env.remove("PGREQUIRESSL");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionConfig::strToEnv(QProcessEnvironment &env, const QString &var, const std::string &val)
|
void ConnectionConfig::strToEnv(QProcessEnvironment &env, const QString &var, const QString &val)
|
||||||
{
|
{
|
||||||
if (val.empty())
|
if (val.isEmpty())
|
||||||
env.remove(var);
|
env.remove(var);
|
||||||
else
|
else
|
||||||
env.insert(var, stdStrToQ(val));
|
env.insert(var, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionGroup::erase(int idx, int count)
|
void ConnectionGroup::erase(int idx, int count)
|
||||||
|
|
@ -389,3 +479,16 @@ void ConnectionGroup::update(int idx, const ConnectionConfig &cc)
|
||||||
*node = cc;
|
*node = cc;
|
||||||
node->setParent(this);
|
node->setParent(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDataStream &operator<<(QDataStream &out, const ConnectionConfig &cc)
|
||||||
|
{
|
||||||
|
cc.write(out);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDataStream &operator>>(QDataStream &in, ConnectionConfig &cc)
|
||||||
|
{
|
||||||
|
//in>>myObj.uId>>myObj.passwd>>myObj.statusType;
|
||||||
|
cc.read(in);
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
#ifndef CONNECTION_H
|
#ifndef CONNECTION_H
|
||||||
#define CONNECTION_H
|
#define CONNECTION_H
|
||||||
|
|
||||||
|
#include <QByteArray>
|
||||||
|
#include <QDataStream>
|
||||||
|
#include <QMetaType>
|
||||||
#include <QUuid>
|
#include <QUuid>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
@ -66,44 +69,44 @@ public:
|
||||||
void setUuid(const QUuid &uuid);
|
void setUuid(const QUuid &uuid);
|
||||||
const QUuid &uuid() const;
|
const QUuid &uuid() const;
|
||||||
|
|
||||||
void setName(std::string desc);
|
void setName(const QString& desc);
|
||||||
const std::string& name() const;
|
const QString& name() const;
|
||||||
|
|
||||||
void setHost(std::string host);
|
void setHost(const QString& host);
|
||||||
const std::string& host() const;
|
const QString& host() const;
|
||||||
|
|
||||||
void setHostAddr(std::string v);
|
void setHostAddr(const QString& v);
|
||||||
const std::string& hostAddr() const;
|
const QString& hostAddr() const;
|
||||||
|
|
||||||
void setPort(unsigned short port);
|
void setPort(unsigned short port);
|
||||||
unsigned short port() const;
|
unsigned short port() const;
|
||||||
|
|
||||||
void setUser(std::string v);
|
void setUser(const QString& v);
|
||||||
const std::string& user() const;
|
const QString& user() const;
|
||||||
|
|
||||||
void setPassword(std::string v);
|
void setPassword(const QString& v);
|
||||||
const std::string& password() const;
|
const QString& password() const;
|
||||||
|
|
||||||
void setDbname(std::string v);
|
void setDbname(const QString& v);
|
||||||
const std::string& dbname() const;
|
const QString& dbname() const;
|
||||||
|
|
||||||
void setSslMode(SslMode m);
|
void setSslMode(SslMode m);
|
||||||
SslMode sslMode() const;
|
SslMode sslMode() const;
|
||||||
|
|
||||||
void setSslCert(std::string v);
|
void setSslCert(const QString& v);
|
||||||
const std::string& sslCert() const;
|
const QString& sslCert() const;
|
||||||
|
|
||||||
void setSslKey(std::string v);
|
void setSslKey(const QString& v);
|
||||||
const std::string& sslKey() const;
|
const QString& sslKey() const;
|
||||||
|
|
||||||
void setSslRootCert(std::string v);
|
void setSslRootCert(const QString& v);
|
||||||
const std::string& sslRootCert() const;
|
const QString& sslRootCert() const;
|
||||||
|
|
||||||
void setSslCrl(std::string v);
|
void setSslCrl(const QString& v);
|
||||||
const std::string& sslCrl() const;
|
const QString& sslCrl() const;
|
||||||
|
|
||||||
const char * const * getKeywords() const;
|
// const char * const * getKeywords() const;
|
||||||
const char * const * getValues() const;
|
// const char * const * getValues() const;
|
||||||
|
|
||||||
bool isSameDatabase(const ConnectionConfig &rhs) const;
|
bool isSameDatabase(const ConnectionConfig &rhs) const;
|
||||||
|
|
||||||
|
|
@ -115,38 +118,55 @@ public:
|
||||||
bool operator==(QUuid id) const { return m_uuid == id; }
|
bool operator==(QUuid id) const { return m_uuid == id; }
|
||||||
|
|
||||||
QString makeLongDescription() const;
|
QString makeLongDescription() const;
|
||||||
std::string encodedPassword() const;
|
QByteArray encodedPassword() const;
|
||||||
void setEncodedPassword(const std::string &encodedPassword);
|
void setEncodedPassword(const QByteArray &encodedPassword);
|
||||||
|
|
||||||
|
void write(QDataStream &out) const;
|
||||||
|
void read(QDataStream &in);
|
||||||
|
|
||||||
|
/** Escapes a value for inclusion in a keyword value connection string.
|
||||||
|
*
|
||||||
|
* Unlikely it will be everneeded outside this class except for unit testing :)
|
||||||
|
*/
|
||||||
|
static QString escapeConnectionStringValue(const QString &value);
|
||||||
|
QString connectionString() const;
|
||||||
private:
|
private:
|
||||||
QUuid m_uuid;
|
QUuid m_uuid;
|
||||||
std::string m_name;
|
QString m_name;
|
||||||
std::string m_host;
|
QString m_host;
|
||||||
std::string m_hostaddr;
|
QString m_hostaddr;
|
||||||
std::string m_port = "5432";
|
uint16_t m_port = 5432;
|
||||||
|
|
||||||
std::string m_user;
|
QString m_user;
|
||||||
std::string m_password; ///< TODO do we want to keep this here or should we remember it seperatly?
|
QString m_password; ///< Note this is not saved in the DB only the m_encodedPassword is safed.
|
||||||
std::string m_dbname;
|
QString m_dbname;
|
||||||
|
|
||||||
std::string m_sslMode;
|
SslMode m_sslMode = SslMode::prefer;
|
||||||
std::string m_sslCert;
|
QString m_sslCert;
|
||||||
std::string m_sslKey;
|
QString m_sslKey;
|
||||||
std::string m_sslRootCert;
|
QString m_sslRootCert;
|
||||||
std::string m_sslCrl;
|
QString m_sslCrl;
|
||||||
|
|
||||||
std::string m_applicationName;
|
QString m_applicationName;
|
||||||
std::string m_encodedPassword;
|
QByteArray m_encodedPassword;
|
||||||
|
|
||||||
bool m_dirty = false;
|
bool m_dirty = false;
|
||||||
ConnectionGroup* m_group = nullptr;
|
ConnectionGroup* m_group = nullptr;
|
||||||
|
|
||||||
|
|
||||||
static void strToEnv(QProcessEnvironment &env, const QString &var, const std::string &val);
|
static void strToEnv(QProcessEnvironment &env, const QString &var, const QString &val);
|
||||||
|
|
||||||
|
// static std::vector<const char*> s_keywords;
|
||||||
|
// mutable std::vector<const char*> m_values;
|
||||||
|
|
||||||
|
|
||||||
static std::vector<const char*> s_keywords;
|
|
||||||
mutable std::vector<const char*> m_values;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(ConnectionConfig)
|
||||||
|
|
||||||
|
QDataStream &operator<<(QDataStream &out, const ConnectionConfig &cc);
|
||||||
|
|
||||||
|
QDataStream &operator>>(QDataStream &in, ConnectionConfig &cc);
|
||||||
|
|
||||||
|
|
||||||
#endif // CONNECTION_H
|
#endif // CONNECTION_H
|
||||||
|
|
|
||||||
|
|
@ -6,11 +6,120 @@ namespace {
|
||||||
using KeywordHT = std::unordered_set<Keyword>;
|
using KeywordHT = std::unordered_set<Keyword>;
|
||||||
|
|
||||||
#define PG_KEYWORD(a,b,c) Keyword{a,c},
|
#define PG_KEYWORD(a,b,c) Keyword{a,c},
|
||||||
const KeywordHT _ScanKeywords {
|
const KeywordHT _ScanKeywords = {
|
||||||
//const Keyword _ScanKeywords[] = {
|
//const Keyword _ScanKeywords[] = {
|
||||||
#include <server/parser/kwlist.h>
|
#include <server/parser/kwlist.h>
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// The following keyword list are for plpgsql and are copied from the postgresql source.
|
||||||
|
// src\pl\plpgsql\src\pl_scanner.c
|
||||||
|
|
||||||
|
static const KeywordHT plpgsql_reserved_keywords = {
|
||||||
|
PG_KEYWORD("all", K_ALL, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("begin", K_BEGIN, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("by", K_BY, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("case", K_CASE, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("declare", K_DECLARE, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("else", K_ELSE, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("end", K_END, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("execute", K_EXECUTE, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("for", K_FOR, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("foreach", K_FOREACH, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("from", K_FROM, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("if", K_IF, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("in", K_IN, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("into", K_INTO, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("loop", K_LOOP, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("not", K_NOT, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("null", K_NULL, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("or", K_OR, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("strict", K_STRICT, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("then", K_THEN, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("to", K_TO, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("using", K_USING, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("when", K_WHEN, RESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("while", K_WHILE, RESERVED_KEYWORD)
|
||||||
|
};
|
||||||
|
|
||||||
|
static const KeywordHT plpgsql_unreserved_keywords = {
|
||||||
|
PG_KEYWORD("absolute", K_ABSOLUTE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("alias", K_ALIAS, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("array", K_ARRAY, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("assert", K_ASSERT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("backward", K_BACKWARD, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("close", K_CLOSE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("collate", K_COLLATE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("column", K_COLUMN, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("column_name", K_COLUMN_NAME, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("constant", K_CONSTANT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("constraint", K_CONSTRAINT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("constraint_name", K_CONSTRAINT_NAME, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("continue", K_CONTINUE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("current", K_CURRENT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("cursor", K_CURSOR, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("datatype", K_DATATYPE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("debug", K_DEBUG, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("default", K_DEFAULT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("detail", K_DETAIL, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("diagnostics", K_DIAGNOSTICS, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("dump", K_DUMP, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("elseif", K_ELSIF, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("elsif", K_ELSIF, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("errcode", K_ERRCODE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("error", K_ERROR, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("exception", K_EXCEPTION, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("exit", K_EXIT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("fetch", K_FETCH, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("first", K_FIRST, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("forward", K_FORWARD, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("get", K_GET, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("hint", K_HINT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("import", K_IMPORT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("info", K_INFO, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("insert", K_INSERT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("is", K_IS, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("last", K_LAST, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("log", K_LOG, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("message", K_MESSAGE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("message_text", K_MESSAGE_TEXT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("move", K_MOVE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("next", K_NEXT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("no", K_NO, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("notice", K_NOTICE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("open", K_OPEN, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("option", K_OPTION, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("perform", K_PERFORM, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("pg_context", K_PG_CONTEXT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("pg_datatype_name", K_PG_DATATYPE_NAME, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("pg_exception_context", K_PG_EXCEPTION_CONTEXT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("pg_exception_detail", K_PG_EXCEPTION_DETAIL, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("pg_exception_hint", K_PG_EXCEPTION_HINT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("print_strict_params", K_PRINT_STRICT_PARAMS, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("prior", K_PRIOR, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("query", K_QUERY, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("raise", K_RAISE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("relative", K_RELATIVE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("result_oid", K_RESULT_OID, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("return", K_RETURN, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("returned_sqlstate", K_RETURNED_SQLSTATE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("reverse", K_REVERSE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("row_count", K_ROW_COUNT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("rowtype", K_ROWTYPE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("schema", K_SCHEMA, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("schema_name", K_SCHEMA_NAME, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("scroll", K_SCROLL, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("slice", K_SLICE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("sqlstate", K_SQLSTATE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("stacked", K_STACKED, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("table", K_TABLE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("table_name", K_TABLE_NAME, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("type", K_TYPE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("use_column", K_USE_COLUMN, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("use_variable", K_USE_VARIABLE, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("variable_conflict", K_VARIABLE_CONFLICT, UNRESERVED_KEYWORD)
|
||||||
|
PG_KEYWORD("warning", K_WARNING, UNRESERVED_KEYWORD)
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const Keyword* getPgsqlKeyword(QString s)
|
const Keyword* getPgsqlKeyword(QString s)
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,8 @@ inline QString stdStrToQ(const std::string &s)
|
||||||
|
|
||||||
inline std::string qStrToStd(const QString &s)
|
inline std::string qStrToStd(const QString &s)
|
||||||
{
|
{
|
||||||
return std::string(s.toUtf8().data());
|
auto ba = s.toUtf8();
|
||||||
|
return std::string(ba.data(), ba.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::string qvarToStdStr(const QVariant &c)
|
inline std::string qvarToStdStr(const QVariant &c)
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ SOURCES += main.cpp \
|
||||||
tst_ConvertLangToSqlString.cpp \
|
tst_ConvertLangToSqlString.cpp \
|
||||||
tst_ConvertToMultiLineCString.cpp \
|
tst_ConvertToMultiLineCString.cpp \
|
||||||
tst_ExplainJsonParser.cpp \
|
tst_ExplainJsonParser.cpp \
|
||||||
|
tst_escapeConnectionStringValue.cpp \
|
||||||
tst_expected.cpp \
|
tst_expected.cpp \
|
||||||
tst_SqlLexer.cpp \
|
tst_SqlLexer.cpp \
|
||||||
tst_scopeguard.cpp \
|
tst_scopeguard.cpp \
|
||||||
|
|
|
||||||
57
tests/pglabtests/tst_escapeConnectionStringValue.cpp
Normal file
57
tests/pglabtests/tst_escapeConnectionStringValue.cpp
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <gmock/gmock-matchers.h>
|
||||||
|
#include "ConnectionConfig.h"
|
||||||
|
#include "PrintTo_Qt.h"
|
||||||
|
|
||||||
|
using namespace testing;
|
||||||
|
|
||||||
|
|
||||||
|
TEST(escapeConnectionStringValue, emptyValue)
|
||||||
|
{
|
||||||
|
auto input = QStringLiteral("");
|
||||||
|
auto expected = QStringLiteral("''");
|
||||||
|
|
||||||
|
auto result = ConnectionConfig::escapeConnectionStringValue(input);
|
||||||
|
|
||||||
|
ASSERT_EQ(result, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(escapeConnectionStringValue, simpleValue)
|
||||||
|
{
|
||||||
|
auto input = QStringLiteral("abc");
|
||||||
|
auto expected = QStringLiteral("abc");
|
||||||
|
|
||||||
|
auto result = ConnectionConfig::escapeConnectionStringValue(input);
|
||||||
|
|
||||||
|
ASSERT_EQ(result, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(escapeConnectionStringValue, valueWithSpace)
|
||||||
|
{
|
||||||
|
auto input = QStringLiteral("ab c");
|
||||||
|
auto expected = QStringLiteral("'ab c'");
|
||||||
|
|
||||||
|
auto result = ConnectionConfig::escapeConnectionStringValue(input);
|
||||||
|
|
||||||
|
ASSERT_EQ(result, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(escapeConnectionStringValue, valueWithQuote)
|
||||||
|
{
|
||||||
|
auto input = QStringLiteral("ab'c");
|
||||||
|
auto expected = QStringLiteral("'ab\\'c'");
|
||||||
|
|
||||||
|
auto result = ConnectionConfig::escapeConnectionStringValue(input);
|
||||||
|
|
||||||
|
ASSERT_EQ(result, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(escapeConnectionStringValue, valueBackslash)
|
||||||
|
{
|
||||||
|
auto input = QStringLiteral("ab\\c");
|
||||||
|
auto expected = QStringLiteral("'ab\\\\c'");
|
||||||
|
|
||||||
|
auto result = ConnectionConfig::escapeConnectionStringValue(input);
|
||||||
|
|
||||||
|
ASSERT_EQ(result, expected);
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue