diff options
| author | 2025-01-16 01:57:37 -0500 | |
|---|---|---|
| committer | 2025-01-16 01:57:37 -0500 | |
| commit | 81a21e6ce040e7740de86340c8ea4dba30e69bc3 (patch) | |
| tree | 95fc1741b907d5ba6d029a42d80092cb7c056c5e /SQLiteStudio3/guiSQLiteStudio/constraints | |
| parent | 3565aad630864ecdbe53fdaa501ea708555b3c7c (diff) | |
New upstream version 3.4.13+dfsg.upstream/3.4.13+dfsgupstream
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/constraints')
9 files changed, 60 insertions, 1 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columncollatepanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/columncollatepanel.cpp index de78b2b..d10dc5a 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columncollatepanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columncollatepanel.cpp @@ -102,6 +102,8 @@ void ColumnCollatePanel::storeConfiguration() if (ui->namedCheck->isChecked()) constr->name = ui->namedEdit->text(); + else + constr->name.clear(); constr->collationName = ui->collationCombo->currentText(); } diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp index bb70c81..79b6b6a 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp @@ -139,6 +139,8 @@ void ColumnDefaultPanel::storeConfiguration() if (ui->namedCheck->isChecked()) constr->name = ui->namedEdit->text(); + else + constr->name.clear(); } void ColumnDefaultPanel::storeExpr(SqliteCreateTable::Column::Constraint* constr) diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columngeneratedpanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/columngeneratedpanel.cpp index 308b868..8e49c93 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columngeneratedpanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columngeneratedpanel.cpp @@ -133,6 +133,8 @@ void ColumnGeneratedPanel::storeConfiguration() if (ui->namedCheck->isChecked()) constr->name = ui->namedEdit->text(); + else + constr->name.clear(); } void ColumnGeneratedPanel::storeExpr(SqliteCreateTable::Column::Constraint* constr) diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.cpp index fa7b7c3..2c70eb9 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.cpp @@ -61,7 +61,7 @@ void ColumnPrimaryKeyPanel::readConstraint() if (!constr->name.isNull()) { - ui->namedCheck->setEnabled(true); + ui->namedCheck->setChecked(true); ui->namedEdit->setText(constr->name); } @@ -122,6 +122,8 @@ void ColumnPrimaryKeyPanel::storeConfiguration() if (ui->namedCheck->isChecked()) constr->name = ui->namedEdit->text(); + else + constr->name.clear(); if (ui->conflictCheck->isChecked() && ui->conflictCombo->currentIndex() > -1) constr->onConflict = sqliteConflictAlgo(ui->conflictCombo->currentText()); diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columnuniqueandnotnullpanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/columnuniqueandnotnullpanel.cpp index 7c0f5a8..3b455e9 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columnuniqueandnotnullpanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columnuniqueandnotnullpanel.cpp @@ -93,6 +93,8 @@ void ColumnUniqueAndNotNullPanel::storeConfiguration() SqliteCreateTable::Column::Constraint* constr = dynamic_cast<SqliteCreateTable::Column::Constraint*>(constraint.data()); if (ui->namedCheck->isChecked()) constr->name = ui->namedEdit->text(); + else + constr->name.clear(); if (ui->conflictCheck->isChecked() && ui->conflictCombo->currentIndex() > -1) constr->onConflict = sqliteConflictAlgo(ui->conflictCombo->currentText()); diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/constraintpanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/constraintpanel.cpp index 4f3e350..3296532 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/constraintpanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/constraintpanel.cpp @@ -29,6 +29,16 @@ void ConstraintPanel::setConstraint(SqliteStatement* stmt) constraintAvailable(); } +void ConstraintPanel::setCreateTableStmt(SqliteCreateTable *stmt) +{ + createTableStmt = stmt; +} + +void ConstraintPanel::setColumnStmt(SqliteCreateTable::Column *stmt) +{ + columnStmt = stmt; +} + void ConstraintPanel::storeDefinition() { storeConfiguration(); diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/constraintpanel.h b/SQLiteStudio3/guiSQLiteStudio/constraints/constraintpanel.h index 9f875a9..f7ed9d5 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/constraintpanel.h +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/constraintpanel.h @@ -16,6 +16,8 @@ class GUI_API_EXPORT ConstraintPanel : public QWidget virtual ~ConstraintPanel(); void setConstraint(SqliteStatement* stmt); + void setCreateTableStmt(SqliteCreateTable* stmt); + void setColumnStmt(SqliteCreateTable::Column* stmt); void storeDefinition(); virtual void setDb(Db* value); @@ -68,6 +70,8 @@ class GUI_API_EXPORT ConstraintPanel : public QWidget Db* db = nullptr; QPointer<SqliteStatement> constraint; + QPointer<SqliteCreateTable> createTableStmt; + QPointer<SqliteCreateTable::Column> columnStmt; public slots: diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp index cecf5f4..5e85915 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp @@ -53,6 +53,8 @@ bool TableForeignKeyPanel::validate() setValidState(combo, idxOk, tr("Pick the foreign column.")); if (!idxOk) columnsSelected = false; + else + handleFkTypeMatched(combo, check->property(UI_PROP_COLUMN).toString(), combo->currentText()); break; } @@ -386,6 +388,36 @@ void TableForeignKeyPanel::storeMatchCondition(const QString& reaction) constr->foreignKey->conditions << condition; } +void TableForeignKeyPanel::handleFkTypeMatched(QWidget* indicatorParent, const QString &localColumn, const QString fkColumn) +{ + SqliteCreateTable::Column* column = createTableStmt->getColumn(localColumn); + if (!column || !column->type) + return; + + QString localType = column->type->toDataType().toString(); + + // FK column type + QString fkTable = ui->fkTableCombo->currentText(); + if (!fkTableTypesCache.contains(fkTable, Qt::CaseInsensitive)) + { + SchemaResolver resolver(db); + fkTableTypesCache[fkTable] = resolver.getTableColumnDataTypesByName(fkTable); + } + + StrHash<DataType> fkTypes = fkTableTypesCache.value(fkTable, Qt::CaseInsensitive); + if (!fkTypes.contains(fkColumn, Qt::CaseInsensitive)) + return; + + QString fkType = fkTypes.value(fkColumn, Qt::CaseInsensitive).toString(); + + if (localType.toLower().trimmed() != fkType.toLower().trimmed()) + { + setValidStateWarning(indicatorParent, + tr("Referenced column type (%1) is different than type declared for local column (%2). It may cause issues while inserting or updating data.") + .arg(fkType, localType)); + } +} + void TableForeignKeyPanel::readTables() { SchemaResolver resolver(db); diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.h b/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.h index cecc04a..a6d48e6 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.h +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.h @@ -4,6 +4,7 @@ #include "constraintpanel.h" #include "parser/ast/sqlitecreatetable.h" #include "guiSQLiteStudio_global.h" +#include "common/strhash.h" #include <QStringListModel> #include <QWidget> @@ -40,12 +41,14 @@ class GUI_API_EXPORT TableForeignKeyPanel : public ConstraintPanel int getColumnIndex(const QString& colName); void storeCondition(SqliteForeignKey::Condition::Action action, const QString& reaction); void storeMatchCondition(const QString& reaction); + void handleFkTypeMatched(QWidget* indicatorParent, const QString& localColumn, const QString fkColumn); Ui::TableForeignKeyPanel *ui = nullptr; QGridLayout* columnsLayout = nullptr; int totalColumns = 0; QStringListModel fkColumnsModel; QSignalMapper* columnSignalMapping = nullptr; + StrHash<StrHash<DataType>> fkTableTypesCache; private slots: void updateState(); |
