QgsSearchQueryBuilder::QgsSearchQueryBuilder( QgsVectorLayer* layer, QWidget *parent, const Qt::WindowFlags& fl ) : QDialog( parent, fl ), mLayer( layer ) { setupUi( this ); setupListViews(); setWindowTitle( tr( "Search query builder" ) ); QPushButton *pbn = new QPushButton( tr( "&Test" ) ); buttonBox->addButton( pbn, QDialogButtonBox::ActionRole ); connect( pbn, SIGNAL( clicked() ), this, SLOT( on_btnTest_clicked() ) ); pbn = new QPushButton( tr( "&Clear" ) ); buttonBox->addButton( pbn, QDialogButtonBox::ActionRole ); connect( pbn, SIGNAL( clicked() ), this, SLOT( on_btnClear_clicked() ) ); pbn = new QPushButton( tr( "&Save..." ) ); buttonBox->addButton( pbn, QDialogButtonBox::ActionRole ); pbn->setToolTip( tr( "Save query to an xml file" ) ); connect( pbn, SIGNAL( clicked() ), this, SLOT( saveQuery() ) ); pbn = new QPushButton( tr( "&Load..." ) ); buttonBox->addButton( pbn, QDialogButtonBox::ActionRole ); pbn->setToolTip( tr( "Load query from xml file" ) ); connect( pbn, SIGNAL( clicked() ), this, SLOT( loadQuery() ) ); if ( layer ) lblDataUri->setText( layer->name() ); populateFields(); }
void MainWindow::setupConnections() { /* * Actions */ connect(actionAbout, SIGNAL(triggered()), aboutDial, SLOT(exec())); connect(actionAddDb, SIGNAL(triggered()), this, SLOT(createDatabase())); connect(actionClearRecent, SIGNAL(triggered()), this, SLOT(clearRecent())); connect(actionCloseTab, SIGNAL(triggered()), this, SLOT(closeCurrentTab())); connect(actionCopy, SIGNAL(triggered()), this, SLOT(copy())); connect(actionCut, SIGNAL(triggered()), this, SLOT(cut())); connect(actionDbManager, SIGNAL(triggered()), dbDialog, SLOT(exec())); connect(actionLogs, SIGNAL(triggered()), logDial, SLOT(exec())); connect(actionNewQuery, SIGNAL(triggered()), this, SLOT(newQuery())); connect(actionNextTab, SIGNAL(triggered()), this, SLOT(nextTab())); connect(actionOpenQuery, SIGNAL(triggered()), this, SLOT(openQuery())); connect(actionPaste, SIGNAL(triggered()), this, SLOT(paste())); connect(actionPlugins, SIGNAL(triggered()), pluginDialog, SLOT(exec())); connect(actionPreferences, SIGNAL(triggered()), confDial, SLOT(exec())); connect(actionPreviousTab, SIGNAL(triggered()), this, SLOT(previousTab())); connect(actionPrint, SIGNAL(triggered()), this, SLOT(print())); connect(actionRedo, SIGNAL(triggered()), this, SLOT(redo())); connect(actionSaveQuery, SIGNAL(triggered()), this, SLOT(saveQuery())); connect(actionSaveQueryAs, SIGNAL(triggered()), this, SLOT(saveQueryAs())); connect(actionSearch, SIGNAL(triggered()), this, SLOT(search())); connect(actionSelect_all, SIGNAL(triggered()), this, SLOT(selectAll())); connect(actionUndo, SIGNAL(triggered()), this, SLOT(undo())); /* * DbTreeView */ connect(dbTreeView, SIGNAL(tableSelected(QSqlDatabase*,QString)), this, SLOT(openTable(QSqlDatabase*,QString))); /* * DbManager */ connect(DbManager::instance(), SIGNAL(statusChanged(QSqlDatabase*)), this, SLOT(checkDb(QSqlDatabase*))); connect(DbManager::model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(reloadDbList())); /* * Dialogs */ connect(dbWizard, SIGNAL(accepted()), this, SLOT(reloadDbList())); connect(logDial, SIGNAL(event(QString)), QMainWindow::statusBar(), SLOT(showMessage(QString))); connect(QueryScheduler::instance(), SIGNAL(countChanged(int)), this, SLOT(setQueryCount(int))); /* * Tab widget */ connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(refreshTab())); connect(tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(closeTab(int))); }
Status Query::addNewResults(QueryData current_qd, const uint64_t current_epoch, uint64_t& counter, DiffResults& dr, bool calculate_diff) const { // The current results are 'fresh' when not calculating a differential. bool fresh_results = !calculate_diff; bool new_query = false; if (!isQueryNameInDatabase()) { // This is the first encounter of the scheduled query. fresh_results = true; LOG(INFO) << "Storing initial results for new scheduled query: " << name_; saveQuery(name_, query_); } else if (getPreviousEpoch() != current_epoch) { fresh_results = true; LOG(INFO) << "New Epoch " << current_epoch << " for scheduled query " << name_; } else if (isNewQuery()) { // This query is 'new' in that the previous results may be invalid. new_query = true; LOG(INFO) << "Scheduled query has been updated: " + name_; saveQuery(name_, query_); } // Use a 'target' avoid copying the query data when serializing and saving. // If a differential is requested and needed the target remains the original // query data, otherwise the content is moved to the differential's added set. const auto* target_gd = ¤t_qd; bool update_db = true; if (!fresh_results && calculate_diff) { // Get the rows from the last run of this query name. QueryDataSet previous_qd; auto status = getPreviousQueryResults(previous_qd); if (!status.ok()) { return status; } // Calculate the differential between previous and current query results. dr = diff(previous_qd, current_qd); update_db = (!dr.added.empty() || !dr.removed.empty()); } else { dr.added = std::move(current_qd); target_gd = &dr.added; } counter = getQueryCounter(fresh_results || new_query); auto status = setDatabaseValue(kQueries, name_ + "counter", std::to_string(counter)); if (!status.ok()) { return status; } if (update_db) { // Replace the "previous" query data with the current. std::string json; status = serializeQueryDataJSON(*target_gd, json); if (!status.ok()) { return status; } status = setDatabaseValue(kQueries, name_, json); if (!status.ok()) { return status; } status = setDatabaseValue( kQueries, name_ + "epoch", std::to_string(current_epoch)); if (!status.ok()) { return status; } } return Status(0, "OK"); }