diff --git a/.travis.yml b/.travis.yml index 50f587ae55..4584dbe851 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,6 @@ language: cpp +sudo: required +dist: trusty matrix: fast_finish: true @@ -23,8 +25,12 @@ matrix: before_install: - sudo add-apt-repository ppa:likemartinma/devel -y + - sudo add-apt-repository --yes ppa:beineri/opt-qt57-trusty - sudo apt-get update -qq - - sudo apt-get --force-yes install -qq libqt4-dev libsqlite3-dev libsqlcipher-dev libantlr-dev + - sudo apt-get --force-yes install -qq qt57-meta-full + - sudo apt-get --force-yes install -qq libsqlite3-dev libsqlcipher-dev libantlr-dev + - QT_ENV_SCRIPT=$(find /opt -name 'qt*-env.sh') + - source $QT_ENV_SCRIPT install: - if [ "$CXX" = "g++" ]; then export CXX="g++-5" CC="gcc-5"; fi @@ -34,11 +40,11 @@ script: - mkdir build - mkdir build_cipher - cd build - - cmake -DENABLE_TESTING=ON .. + - cmake -DENABLE_TESTING=ON -DUSE_QT5=1 .. - make - ctest -V - cd ../build_cipher - - cmake -DENABLE_TESTING=ON -Dsqlcipher=1 .. + - cmake -DENABLE_TESTING=ON -Dsqlcipher=1 -DUSE_QT5=1 .. - make - ctest -V diff --git a/src/EditTableDialog.cpp b/src/EditTableDialog.cpp index c9e96c9784..ec5c5edf4d 100644 --- a/src/EditTableDialog.cpp +++ b/src/EditTableDialog.cpp @@ -121,7 +121,7 @@ void EditTableDialog::populateFields() tbitem->setText(kCheck, f->check()); - QSharedPointer fk = m_table.constraint(f, sqlb::Constraint::ForeignKeyConstraintType).dynamicCast(); + QSharedPointer fk = m_table.constraint({f}, sqlb::Constraint::ForeignKeyConstraintType).dynamicCast(); if(fk) tbitem->setText(kForeignKey, fk->toString()); ui->treeWidget->addTopLevelItem(tbitem); @@ -438,7 +438,7 @@ void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column) case kForeignKey: sqlb::ForeignKeyClause* fk = new sqlb::ForeignKeyClause; fk->setFromString(item->text(column)); - m_table.addConstraint(field, sqlb::ConstraintPtr(fk)); + m_table.addConstraint({field}, sqlb::ConstraintPtr(fk)); if(!m_bNewTable) callRenameColumn = true; break; diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 14728a5d67..b19c24cde6 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -154,10 +154,12 @@ void MainWindow::init() popupBrowseDataHeaderMenu->addSeparator(); popupBrowseDataHeaderMenu->addAction(ui->actionSetAllTablesEncoding); - popupRecordMenu = new QMenu(this); - popupRecordMenu->addAction(ui->actionDittoRecord); QShortcut* dittoRecordShortcut = new QShortcut(QKeySequence("Ctrl+\""), this); - connect(dittoRecordShortcut, SIGNAL(activated()), this, SLOT(dittoRecord())); + connect(dittoRecordShortcut, &QShortcut::activated, [this]() { + int currentRow = ui->dataTable->currentIndex().row(); + auto row = m_browseTableModel->dittoRecord(currentRow); + ui->dataTable->setCurrentIndex(row); + }); // Add menu item for log dock ui->viewMenu->insertAction(ui->viewDBToolbarAction, ui->dockLog->toggleViewAction()); @@ -594,25 +596,6 @@ void MainWindow::deleteRecord() } } -void MainWindow::dittoRecord() -{ - const QString sCurrentTable = ui->comboBrowseTable->currentText(); - if (!(db.getObjectByName(sCurrentTable).gettype() == "table" && !db.readOnly())) - return; - - int row; - if (qobject_cast(sender())) - row = ui->dataTable->currentIndex().row(); - else - row = ui->actionDittoRecord->property("current_row").toInt(); - - if (row == -1) - return; - - QModelIndex idx = m_browseTableModel->dittoRecord(row); - ui->dataTable->setCurrentIndex(idx); -} - void MainWindow::selectTableLine(int lineToSelect) { // Are there even that many lines? @@ -2468,8 +2451,15 @@ void MainWindow::showRecordPopupMenu(const QPoint& pos) if (row == -1) return; - ui->actionDittoRecord->setProperty("current_row", row); - popupRecordMenu->exec(ui->dataTable->verticalHeader()->mapToGlobal(pos)); + QMenu popupRecordMenu(this); + QAction* action = new QAction("Duplicate record", &popupRecordMenu); + popupRecordMenu.addAction(action); + + connect(action, &QAction::triggered, [&]() { + m_browseTableModel->dittoRecord(row); + }); + + popupRecordMenu.exec(ui->dataTable->verticalHeader()->mapToGlobal(pos)); } void MainWindow::editDataColumnDisplayFormat() diff --git a/src/MainWindow.h b/src/MainWindow.h index c619ceb87a..84bae0f919 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -118,7 +118,6 @@ class MainWindow : public QMainWindow QMenu *recentFilesMenu; QMenu *popupSaveSqlFileMenu; QMenu* popupBrowseDataHeaderMenu; - QMenu* popupRecordMenu; QLabel* statusEncodingLabel; QLabel* statusEncryptionLabel; @@ -173,7 +172,6 @@ private slots: bool fileClose(); void addRecord(); void deleteRecord(); - void dittoRecord(); void selectTableLine( int lineToSelect ); void navigatePrevious(); void navigateNext(); diff --git a/src/MainWindow.ui b/src/MainWindow.ui index e4e79a3757..9ac89a6723 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -1927,14 +1927,6 @@ Change the default encoding assumed for all tables in the database - - - Duplicate record - - - Duplicate record - - @@ -2972,22 +2964,6 @@ - - actionDittoRecord - triggered() - MainWindow - dittoRecord() - - - -1 - -1 - - - 518 - 314 - - - fileExportJsonAction triggered() @@ -3065,7 +3041,6 @@ browseDataSetTableEncoding() browseDataSetDefaultTableEncoding() browseDataFetchAllData() - dittoRecord() exportTableToJson() diff --git a/src/sqlitedb.cpp b/src/sqlitedb.cpp index 050cf83f30..f4846143e0 100644 --- a/src/sqlitedb.cpp +++ b/src/sqlitedb.cpp @@ -782,7 +782,7 @@ QString DBBrowserDB::emptyInsertStmt(const sqlb::Table& t, const QString& pk_val QStringList fields; foreach(sqlb::FieldPtr f, t.fields()) { - sqlb::ConstraintPtr pk = t.constraint(f, sqlb::Constraint::PrimaryKeyConstraintType); + sqlb::ConstraintPtr pk = t.constraint({f}, sqlb::Constraint::PrimaryKeyConstraintType); if(pk) { fields << f->name(); diff --git a/src/sqlitetablemodel.cpp b/src/sqlitetablemodel.cpp index ed23f54764..961cbd123b 100644 --- a/src/sqlitetablemodel.cpp +++ b/src/sqlitetablemodel.cpp @@ -267,7 +267,7 @@ sqlb::ForeignKeyClause SqliteTableModel::getForeignKeyClause(int column) const // Note that the rowid column has number -1 here, it can safely be excluded since there will never be a // foreign key on that column. - sqlb::ConstraintPtr ptr = obj.table.constraint(obj.table.fields().at(column), sqlb::Constraint::ForeignKeyConstraintType); + sqlb::ConstraintPtr ptr = obj.table.constraint({obj.table.fields().at(column)}, sqlb::Constraint::ForeignKeyConstraintType); if(ptr) return *(ptr.dynamicCast()); } diff --git a/src/sqlitetypes.cpp b/src/sqlitetypes.cpp index 80f13ce767..968aed07c8 100644 --- a/src/sqlitetypes.cpp +++ b/src/sqlitetypes.cpp @@ -312,27 +312,11 @@ QString Table::sql() const return sql + ";"; } -void Table::addConstraint(FieldPtr field, ConstraintPtr constraint) -{ - FieldVector v; - v.push_back(field); - addConstraint(v, constraint); -} - void Table::addConstraint(FieldVector fields, ConstraintPtr constraint) { m_constraints.insert(fields, constraint); } -ConstraintPtr Table::constraint(FieldPtr field, Constraint::ConstraintTypes type) const -{ - QList list = constraints(field, type); - if(list.size()) - return list.at(0); - else - return ConstraintPtr(nullptr); -} - ConstraintPtr Table::constraint(FieldVector fields, Constraint::ConstraintTypes type) const { QList list = constraints(fields, type); @@ -342,13 +326,6 @@ ConstraintPtr Table::constraint(FieldVector fields, Constraint::ConstraintTypes return ConstraintPtr(nullptr); } -QList Table::constraints(FieldPtr field, Constraint::ConstraintTypes type) const -{ - FieldVector v; - v.push_back(field); - return constraints(v, type); -} - QList Table::constraints(FieldVector fields, Constraint::ConstraintTypes type) const { QList clist; @@ -762,14 +739,14 @@ void CreateTableWalker::parsecolumn(Table& table, antlr::RefAST c) table.addField(f); if(foreignKey) - table.addConstraint(f, ConstraintPtr(foreignKey)); + table.addConstraint({f}, ConstraintPtr(foreignKey)); if(primarykey) { FieldVector v; if(table.constraint(v, Constraint::PrimaryKeyConstraintType)) table.primaryKeyRef().push_back(f); else - table.addConstraint(f, ConstraintPtr(new PrimaryKeyConstraint())); + table.addConstraint({f}, ConstraintPtr(new PrimaryKeyConstraint())); } } diff --git a/src/sqlitetypes.h b/src/sqlitetypes.h index fc421ad297..7cff11901a 100644 --- a/src/sqlitetypes.h +++ b/src/sqlitetypes.h @@ -192,11 +192,8 @@ class Table bool isWithoutRowidTable() const { return m_rowidColumn != "_rowid_"; } void clear(); - void addConstraint(FieldPtr field, ConstraintPtr constraint); void addConstraint(FieldVector fields, ConstraintPtr constraint); - ConstraintPtr constraint(FieldPtr field, Constraint::ConstraintTypes type = Constraint::NoType) const; //! Only returns the first constraint, if any ConstraintPtr constraint(FieldVector fields = FieldVector(), Constraint::ConstraintTypes type = Constraint::NoType) const; //! Only returns the first constraint, if any - QList constraints(FieldPtr field, Constraint::ConstraintTypes type = Constraint::NoType) const; QList constraints(FieldVector fields = FieldVector(), Constraint::ConstraintTypes type = Constraint::NoType) const; FieldVector& primaryKeyRef(); const FieldVector& primaryKey() const; diff --git a/src/tests/testsqlobjects.cpp b/src/tests/testsqlobjects.cpp index 2e13812437..648d312b87 100644 --- a/src/tests/testsqlobjects.cpp +++ b/src/tests/testsqlobjects.cpp @@ -15,10 +15,7 @@ void TestTable::sqlOutput() tt.addField(f); tt.addField(FieldPtr(new Field("car", "text"))); tt.addField(fkm); - FieldVector pk; - pk.push_back(f); - pk.push_back(fkm); - tt.addConstraint(pk, ConstraintPtr(new PrimaryKeyConstraint())); + tt.addConstraint({f, fkm}, ConstraintPtr(new PrimaryKeyConstraint())); QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n" "\t`id`\tinteger,\n" @@ -37,7 +34,7 @@ void TestTable::autoincrement() tt.addField(f); tt.addField(FieldPtr(new Field("car", "text"))); tt.addField(fkm); - tt.addConstraint(f, ConstraintPtr(new PrimaryKeyConstraint())); + tt.addConstraint({f}, ConstraintPtr(new PrimaryKeyConstraint())); QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n" "\t`id`\tinteger PRIMARY KEY AUTOINCREMENT,\n" @@ -55,7 +52,7 @@ void TestTable::notnull() tt.addField(f); tt.addField(FieldPtr(new Field("car", "text", true))); tt.addField(fkm); - tt.addConstraint(f, ConstraintPtr(new PrimaryKeyConstraint())); + tt.addConstraint({f}, ConstraintPtr(new PrimaryKeyConstraint())); QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n" "\t`id`\tinteger PRIMARY KEY AUTOINCREMENT,\n" @@ -72,7 +69,7 @@ void TestTable::withoutRowid() tt.addField(f); tt.addField(FieldPtr(new Field("b", "integer"))); tt.setRowidColumn("a"); - tt.addConstraint(f, ConstraintPtr(new PrimaryKeyConstraint())); + tt.addConstraint({f}, ConstraintPtr(new PrimaryKeyConstraint())); QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n" "\t`a`\tinteger PRIMARY KEY AUTOINCREMENT,\n" @@ -85,7 +82,7 @@ void TestTable::foreignKeys() Table tt("testtable"); FieldPtr f = FieldPtr(new Field("a", "integer")); tt.addField(f); - tt.addConstraint(f, sqlb::ConstraintPtr(new sqlb::ForeignKeyClause("b", QStringList("c")))); + tt.addConstraint({f}, sqlb::ConstraintPtr(new sqlb::ForeignKeyClause("b", QStringList("c")))); QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n" "\t`a`\tinteger,\n" @@ -100,13 +97,10 @@ void TestTable::uniqueConstraint() FieldPtr f2 = FieldPtr(new Field("b", "integer")); FieldPtr f3 = FieldPtr(new Field("c", "integer")); f1->setUnique(true); - FieldVector uc; - uc.push_back(f2); - uc.push_back(f3); tt.addField(f1); tt.addField(f2); tt.addField(f3); - tt.addConstraint(uc, sqlb::ConstraintPtr(new sqlb::UniqueConstraint())); + tt.addConstraint({f2, f3}, sqlb::ConstraintPtr(new sqlb::UniqueConstraint())); QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n" "\t`a`\tinteger UNIQUE,\n" @@ -276,11 +270,11 @@ void TestTable::parseSQLForeignKeys() QCOMPARE(tab.fields().at(0)->name(), QString("a")); QCOMPARE(tab.fields().at(0)->type(), QString("int")); #if QT_VERSION_MAJOR >= 5 - QCOMPARE(tab.constraint(tab.fields().at(0), sqlb::Constraint::ForeignKeyConstraintType).dynamicCast()->table(), QString("x")); + QCOMPARE(tab.constraint({tab.fields().at(0)}, sqlb::Constraint::ForeignKeyConstraintType).dynamicCast()->table(), QString("x")); #endif QCOMPARE(tab.fields().at(1)->name(), QString("b")); QCOMPARE(tab.fields().at(1)->type(), QString("int")); - QCOMPARE(tab.constraint(tab.fields().at(1), sqlb::Constraint::ForeignKeyConstraintType).dynamicCast()->toString(), QString("`w`(`y`,`z`) on delete set null")); + QCOMPARE(tab.constraint({tab.fields().at(1)}, sqlb::Constraint::ForeignKeyConstraintType).dynamicCast()->toString(), QString("`w`(`y`,`z`) on delete set null")); } void TestTable::parseSQLCheckConstraint()