pgLab/pglab/ColumnPage.cpp
eelke 5777a9c834 additonal SQL on the columns page
After the "all in one" ALTER TABLE ADD COLUMN statement ALTER TABLE ALTER COLUMN statements are listed for
setting the default and the NOT NULL constraint.
2021-07-02 20:06:08 +02:00

101 lines
3.8 KiB
C++

#include "ColumnPage.h"
#include "ColumnTableModel.h"
#include "CustomFilterSortModel.h"
#include "CustomDataRole.h"
#include "PgLabTableView.h"
#include "ResultTableModelUtil.h"
#include "SqlCodePreview.h"
#include "SqlFormattingUtils.h"
#include "UserConfiguration.h"
#include "catalog/PgClass.h"
#include <QHeaderView>
#include <QSortFilterProxyModel>
#include <QStyledItemDelegate>
#include <QStringBuilder>
#include <unordered_set>
ColumnPage::ColumnPage(QWidget *parent)
: QSplitter(Qt::Vertical, parent)
{
m_tableView = new PgLabTableView(this);
m_definitionView = new SqlCodePreview(this);
addWidget(m_tableView);
addWidget(m_definitionView);
m_columnModel = new ColumnTableModel(this);
m_sortFilterProxy = new QSortFilterProxyModel(this);
m_sortFilterProxy->setSourceModel(m_columnModel);
m_tableView->setItemDelegateForColumn(ColumnTableModel::TypeCol, new QStyledItemDelegate(this));
m_tableView->setModel(m_sortFilterProxy);
m_tableView->horizontalHeader()->setSortIndicator(ColumnTableModel::AttnumCol, Qt::AscendingOrder);
m_tableView->setSortingEnabled(true);
// m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
m_sortFilterProxy->sort(ColumnTableModel::AttnumCol, Qt::AscendingOrder);
connect(m_tableView->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &ColumnPage::tableView_selectionChanged);
connect(m_columnModel, &ColumnTableModel::modelReset, m_definitionView, &SqlCodePreview::clear);
}
void ColumnPage::setData(std::shared_ptr<const PgDatabaseCatalog> cat, const std::optional<PgClass> &cls)
{
m_catalog = cat;
m_definitionView->setCatalog(cat);
m_columnModel->setData(cat, cls);
m_Class = cls;
m_tableView->resizeColumnsToContents();
}
void ColumnPage::tableView_selectionChanged(const QItemSelection &/*selected*/, const QItemSelection &/*deselected*/)
{
auto&& indexes = m_tableView->selectionModel()->selectedIndexes();
std::unordered_set<int> rijen;
for (const auto &e : indexes)
rijen.insert(m_sortFilterProxy->mapToSource(e).row());
const QString alterTable = "ALTER TABLE " % m_Class->fullyQualifiedQuotedObjectName();
QString completeSql;
if (!rijen.empty()) {
QString drops;
QString addsql;
auto iter = rijen.begin();
if (iter != rijen.end()) {
auto && col = m_columnModel->column(*iter);
drops = alterTable % "\n DROP COLUMN " % quoteIdent(col.name);
addsql = alterTable % "\n ADD COLUMN " % col.columnDefinition(*m_catalog);
for (++iter; iter != rijen.end(); ++iter) {
auto && col = m_columnModel->column(*iter);
drops += ",\n DROP COLUMN " % quoteIdent(col.name);
addsql += ",\n ADD COLUMN " % col.columnDefinition(*m_catalog);
}
drops += ";";
addsql += ";";
m_definitionView->setPlainText(drops % "\n\n" % addsql);
completeSql += drops % "\n\n" % addsql;
}
else {
m_definitionView->setPlainText("");
}
completeSql += "\n-- SQL to correct just the defaults\n";
for (auto r : rijen) {
auto && col = m_columnModel->column(r);
completeSql += alterTable % " ALTER COLUMN " % quoteIdent(col.name);
if (col.hasdef)
completeSql += " SET DEFAULT " % col.defaultValue % ";\n";
else
completeSql += " DROP DEFAULT;\n";
}
completeSql += "\n-- SQL to correct NULLABLE\n";
for (auto r : rijen) {
auto && col = m_columnModel->column(r);
completeSql += alterTable % " ALTER COLUMN " % quoteIdent(col.name);
if (col.notnull)
completeSql += " SET NOT NULL;\n";
else
completeSql += " DROP NOT NULL;\n";
}
}
m_definitionView->setPlainText(completeSql);
}