diff --git a/pglab/ASyncDBConnection.cpp b/pglab/ASyncDBConnection.cpp index 173a6a9..42b9b62 100644 --- a/pglab/ASyncDBConnection.cpp +++ b/pglab/ASyncDBConnection.cpp @@ -128,7 +128,7 @@ bool ASyncDBConnection::send(const std::string &command, Pgsql::Params params, o return true; } -void ASyncDBConnection::async_query_handler(boost::system::error_code ec, std::size_t s, on_result_callback on_result) +void ASyncDBConnection::async_query_handler(boost::system::error_code ec, std::size_t /*s*/, on_result_callback on_result) { if (ec == boost::system::errc::success) { bool finished = false; diff --git a/pglab/BackupDialog.cpp b/pglab/BackupDialog.cpp index 1620453..797c62b 100644 --- a/pglab/BackupDialog.cpp +++ b/pglab/BackupDialog.cpp @@ -248,7 +248,7 @@ void BackupDialog::on_btnStart_clicked() p->start(program, arguments); } -void BackupDialog::on_backupFormat_currentIndexChanged(int index) +void BackupDialog::on_backupFormat_currentIndexChanged(int /*index*/) { int format_index = ui->backupFormat->currentIndex(); auto format_model_base = ui->backupFormat->model(); diff --git a/pglab/ColumnTableModel.cpp b/pglab/ColumnTableModel.cpp index ed46e23..6a193f4 100644 --- a/pglab/ColumnTableModel.cpp +++ b/pglab/ColumnTableModel.cpp @@ -4,6 +4,7 @@ #include "PgAttributeContainer.h" #include "PgType.h" #include "PgTypeContainer.h" +#include "PgIndexContainer.h" #include "ScopeGuard.h" #include @@ -23,6 +24,14 @@ void ColumnTableModel::setData(std::shared_ptr cat, Oid // sort remaining columns by order in table std::sort(m_columns.begin(), m_columns.end(), [] (auto &l, auto &r) -> bool { return l.num < r.num; }); + + m_indexes = m_catalog->indexes()->getIndexesForTable(table_oid); + std::sort(m_indexes.begin(), m_indexes.end(), + [] (const auto &l, const auto &r) -> bool + { + return l.isprimary > r.isprimary + || (l.isprimary == r.isprimary && l.indexrelid < r.indexrelid); + }); } QVariant ColumnTableModel::headerData(int section, Qt::Orientation orientation, int role) const @@ -31,22 +40,33 @@ QVariant ColumnTableModel::headerData(int section, Qt::Orientation orientation, if (orientation == Qt::Horizontal) { if (role == Qt::DisplayRole) { QString c; - switch (section) { - case NameCol: - c = tr("Name"); - break; - case TypeCol: - c = tr("Type"); - break; - case NullCol: - c = tr("Nullable"); - break; - case DefaultCol: - c = tr("Default"); - break; - case CollationCol: - c = tr("Collation"); - break; + if (section >= colCount) { + const auto &tbl_idx = m_indexes[section - colCount]; + if (tbl_idx.isprimary) + c = "Pri"; + else if (tbl_idx.isunique) + c = "Unq"; + else + c = "Idx"; + } + else { + switch (section) { + case NameCol: + c = tr("Name"); + break; + case TypeCol: + c = tr("Type"); + break; + case NullCol: + c = tr("Nullable"); + break; + case DefaultCol: + c = tr("Default"); + break; + case CollationCol: + c = tr("Collation"); + break; + } } v = c; } @@ -62,7 +82,7 @@ int ColumnTableModel::rowCount(const QModelIndex &/*parent*/) const int ColumnTableModel::columnCount(const QModelIndex &/*parent*/) const { - return colCount; + return colCount + m_indexes.size(); } Oid ColumnTableModel::getType(int /*column*/) const @@ -86,26 +106,42 @@ Oid ColumnTableModel::getType(int /*column*/) const QVariant ColumnTableModel::getData(const QModelIndex &index) const { QVariant v; - const auto &t = m_columns[index.row()]; - QString s; - switch (index.column()) { - case NameCol: - s = t.name; - break; - case TypeCol: - s = getTypeDisplayString(*m_catalog, t.typid); - break; - case NullCol: - s = t.notnull ? "NOT NULL" : ""; - break; - case DefaultCol: - s = ""; - break; - case CollationCol: - s = ""; //t.collation; - break; + const int row = index.row(); + const auto &t = m_columns[row]; + + const int col = index.column(); + if (col >= colCount) { + const auto &tbl_idx = m_indexes[col - colCount]; + int i = 1; + for (auto attr : tbl_idx.key) { + if (attr == t.num) { + v = i; + break; + } + ++i; + } + } + else { + QString s; + switch (col) { + case NameCol: + s = t.name; + break; + case TypeCol: + s = getTypeDisplayString(*m_catalog, t.typid); + break; + case NullCol: + s = t.notnull ? "NOT NULL" : ""; + break; + case DefaultCol: + s = ""; + break; + case CollationCol: + s = ""; //t.collation; + break; + } + v = s; } - v = s; return v; } diff --git a/pglab/ColumnTableModel.h b/pglab/ColumnTableModel.h index aff86ce..0771a2d 100644 --- a/pglab/ColumnTableModel.h +++ b/pglab/ColumnTableModel.h @@ -2,7 +2,9 @@ #define COLUMNTABLEMODEL_H #include "BaseTableModel.h" +#include "PgIndex.h" #include +#include class PgDatabaseCatalog; class PgAttribute; @@ -38,6 +40,7 @@ protected: std::shared_ptr m_catalog; t_Columns m_columns; + std::vector m_indexes; }; diff --git a/pglab/ConnectionManagerWindow.cpp b/pglab/ConnectionManagerWindow.cpp index cd5740a..abae0e1 100644 --- a/pglab/ConnectionManagerWindow.cpp +++ b/pglab/ConnectionManagerWindow.cpp @@ -166,7 +166,7 @@ void ConnectionManagerWindow::on_testButton_clicked() QMessageBox::information(this, "pglab", QString::fromUtf8(s.c_str()), QMessageBox::Yes); } - catch (Botan::Decoding_Error &e) { + catch (Botan::Decoding_Error &/*e*/) { QMessageBox::information(this, "pglab", tr("Failure to decrypt"), QMessageBox::Yes); diff --git a/pglab/ParamTypeDelegate.cpp b/pglab/ParamTypeDelegate.cpp index da0d3f2..58d4af8 100644 --- a/pglab/ParamTypeDelegate.cpp +++ b/pglab/ParamTypeDelegate.cpp @@ -15,8 +15,8 @@ void ParamTypeDelegate::setTypeSelectionModel(TypeSelectionItemModel* model) } QWidget *ParamTypeDelegate::createEditor(QWidget *parent, - const QStyleOptionViewItem &option, - const QModelIndex &index) const + const QStyleOptionViewItem &/*option*/, + const QModelIndex &/*index*/) const { QWidget *w = nullptr; diff --git a/pglab/PgIndex.h b/pglab/PgIndex.h index f92e3a6..f17f675 100644 --- a/pglab/PgIndex.h +++ b/pglab/PgIndex.h @@ -27,6 +27,7 @@ public: std::vector option; QString exprs; QString pred; + QString definition; PgIndex(); diff --git a/pglab/PgIndexContainer.cpp b/pglab/PgIndexContainer.cpp index c02539c..ca1da39 100644 --- a/pglab/PgIndexContainer.cpp +++ b/pglab/PgIndexContainer.cpp @@ -8,7 +8,8 @@ std::string PgIndexContainer::getLoadQuery() const SELECT indexrelid, indrelid, indnatts, indisunique, indisprimary, indisexclusion, indimmediate, indisclustered, indisvalid, indcheckxmin, indisready, indislive, indisreplident, indkey, - indcollation, indclass, indoption, indexprs, indpred + indcollation, indclass, indoption, indexprs, indpred, + pg_get_indexdef(indexrelid) FROM pg_index)__"; } @@ -23,6 +24,16 @@ PgIndex PgIndexContainer::loadElem(const Pgsql::Row &row) col.getAsVector(std::back_inserter(v.collation)); col.getAsVector(std::back_inserter(v.indclass)); col.getAsVector(std::back_inserter(v.option)); - col >> v.exprs >> v.pred; + col >> v.exprs >> v.pred >> v.definition; return v; } + +std::vector PgIndexContainer::getIndexesForTable(Oid table_oid) const +{ + std::vector result; + for (const auto &e : m_container) + if (e.relid == table_oid) + result.push_back(e); + + return result; +} diff --git a/pglab/PgIndexContainer.h b/pglab/PgIndexContainer.h index 7df8b68..9c3a770 100644 --- a/pglab/PgIndexContainer.h +++ b/pglab/PgIndexContainer.h @@ -11,6 +11,7 @@ public: using PgContainer::PgContainer; virtual std::string getLoadQuery() const override; + std::vector getIndexesForTable(Oid table_oid) const; protected: virtual PgIndex loadElem(const Pgsql::Row &row) override; };