aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/guiSQLiteStudio/constraints
diff options
context:
space:
mode:
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/constraints')
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/constraints/columncollatepanel.cpp2
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp2
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/constraints/columngeneratedpanel.cpp2
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.cpp4
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/constraints/columnuniqueandnotnullpanel.cpp2
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/constraints/constraintpanel.cpp10
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/constraints/constraintpanel.h4
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp32
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.h3
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();