diff options
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/constraints/constraintcheckpanel.cpp')
| -rw-r--r-- | SQLiteStudio3/guiSQLiteStudio/constraints/constraintcheckpanel.cpp | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/constraintcheckpanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/constraintcheckpanel.cpp new file mode 100644 index 0000000..adb5e2b --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/constraintcheckpanel.cpp @@ -0,0 +1,175 @@ +#include "constraintcheckpanel.h" +#include "ui_constraintcheckpanel.h" +#include "parser/ast/sqlitecreatetable.h" +#include "parser/parser.h" +#include "parser/keywords.h" +#include "uiutils.h" +#include <QDebug> + +ConstraintCheckPanel::ConstraintCheckPanel(QWidget *parent) : + ConstraintPanel(parent), + ui(new Ui::ConstraintCheckPanel) +{ + ui->setupUi(this); + init(); +} + +ConstraintCheckPanel::~ConstraintCheckPanel() +{ + delete ui; +} + +void ConstraintCheckPanel::changeEvent(QEvent *e) +{ + QWidget::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + + +bool ConstraintCheckPanel::validate() +{ + bool nameOk = true; + if (ui->namedCheck->isChecked() && ui->namedEdit->text().isEmpty()) + nameOk = false; + + bool exprOk = !ui->exprEdit->toPlainText().trimmed().isEmpty() && + !ui->exprEdit->haveErrors(); + + bool exprCheckedOk = exprOk && ui->exprEdit->isSyntaxChecked(); + + setValidState(ui->exprEdit, exprOk, tr("Enter a valid condition.")); + setValidState(ui->namedEdit, nameOk, tr("Enter a name of the constraint.")); + + return exprCheckedOk && nameOk; +} + +void ConstraintCheckPanel::constraintAvailable() +{ + if (constraint.isNull()) + return; + + if (constraint->dialect == Dialect::Sqlite3) + { + ui->onConflictCheck->setVisible(false); + ui->onConflictCombo->setVisible(false); + } + + readConstraint(); + updateVirtualSql(); +} + +void ConstraintCheckPanel::storeConfiguration() +{ + if (constraint.isNull()) + return; + + storeType(); + + SqliteExprPtr expr = parseExpression(ui->exprEdit->toPlainText()); + SqliteExpr* newExpr = new SqliteExpr(*expr.data()); + newExpr->setParent(constraint.data()); + storeExpr(newExpr); + + QString name = QString::null; + if (ui->namedCheck->isChecked()) + name = ui->namedEdit->text(); + + storeName(name); + + if (constraint->dialect == Dialect::Sqlite2 && ui->onConflictCheck->isChecked()) + storeConflictAlgo(sqliteConflictAlgo(ui->onConflictCombo->currentText())); +} + +void ConstraintCheckPanel::init() +{ + setFocusProxy(ui->exprEdit); + ui->exprEdit->setShowLineNumbers(false); + + connect(ui->namedCheck, SIGNAL(toggled(bool)), this, SIGNAL(updateValidation())); + connect(ui->namedEdit, SIGNAL(textChanged(QString)), this, SIGNAL(updateValidation())); + connect(ui->exprEdit, SIGNAL(textChanged()), this, SIGNAL(updateValidation())); + connect(ui->exprEdit, SIGNAL(errorsChecked(bool)), this, SIGNAL(updateValidation())); + + connect(ui->namedCheck, SIGNAL(toggled(bool)), this, SLOT(updateState())); + connect(ui->onConflictCheck, SIGNAL(toggled(bool)), this, SLOT(updateState())); + + ui->onConflictCombo->addItems(getConflictAlgorithms()); + + updateState(); +} + +void ConstraintCheckPanel::readConstraint() +{ + SqliteExpr* expr = readExpr(); + if (expr) + ui->exprEdit->setPlainText(expr->detokenize()); + + QString name = readName(); + if (!name.isNull()) + { + ui->namedCheck->setChecked(true); + ui->namedEdit->setText(name); + } + + SqliteConflictAlgo onConflict = readConflictAlgo(); + if (constraint->dialect == Dialect::Sqlite2 && onConflict != SqliteConflictAlgo::null) + { + ui->onConflictCheck->setChecked(true); + ui->onConflictCombo->setCurrentText(sqliteConflictAlgo(onConflict)); + } +} + +void ConstraintCheckPanel::updateVirtualSql() +{ + ui->exprEdit->setDb(db); + + SqliteCreateTable* createTable = getCreateTable(); + + createTable->rebuildTokens(); + TokenList tokens = createTable->tokens; + int idx = tokens.lastIndexOf(Token::PAR_RIGHT); + if (idx == -1) + { + qWarning() << "CREATE TABLE tokens are invalid while call to ConstraintCheckPanel::updateVirtualSql()."; + return; + } + + TokenList newTokens; + newTokens << TokenPtr::create(Token::OPERATOR, ",") + << TokenPtr::create(Token::SPACE, " ") + << TokenPtr::create(Token::KEYWORD, "CHECK") + << TokenPtr::create(Token::SPACE, " ") + << TokenPtr::create(Token::PAR_LEFT, "(") + << TokenPtr::create(Token::OTHER, "%1") + << TokenPtr::create(Token::PAR_RIGHT, ")"); + + tokens.insert(idx, newTokens); + QString sql = tokens.detokenize(); + + ui->exprEdit->setVirtualSqlExpression(sql); +} + +SqliteExprPtr ConstraintCheckPanel::parseExpression(const QString& sql) +{ + Parser parser(db->getDialect()); + SqliteExpr *expr = parser.parseExpr(sql); + return SqliteExprPtr(expr); +} + +void ConstraintCheckPanel::updateState() +{ + ui->namedEdit->setEnabled(ui->namedCheck->isChecked()); + ui->onConflictCombo->setEnabled(ui->onConflictCheck->isChecked()); +} + +bool ConstraintCheckPanel::validateOnly() +{ + ui->exprEdit->checkSyntaxNow(); + return validate(); +} |
