/* * Resets the backend database. This function shall be called only when * nothing holds the database open. * * ARGUMENTS: * path Pathname of the database directory. Shall not be NULL. * The client can free it upon return. * RETURNS: * 0 Success. * EIO Backend database error. "log_start()" called. */ RegStatus beReset( const char* const path) { RegStatus status; assert(NULL != path); if (0 == (status = verifyBackend(path))) { /* * The database is OK. Make a backup copy. */ status = copyDatabase(path, "", ".bck"); } else if (ECANCELED == status) { /* * The backend database needs to be restored. */ log_add("Restoring from backup"); log_log(LOG_NOTICE); if (0 == (status = removeEnvironment(path))) { status = copyDatabase(path, ".bck", ""); } } return status; }
/* * Removes the backend database. This function shall be called only when * nothing holds the database open. * * ARGUMENTS: * path Pathname of the database directory. Shall not be NULL. * The client can free it upon return. * RETURNS: * 0 Success. * ENOMEM System error. "log_start()" called. * EIO Backend database error. "log_start()" called. */ RegStatus beRemove( const char* const path) { RegStatus status; DB_ENV* env; assert(NULL != path); /* * First, remove the database. */ if (0 == (status = openEnvironment(path, &env))) { if (status = env->dbremove(env, NULL, DB_FILENAME, NULL, 0)) { log_add("Couldn't remove database file \"%s\" in \"%s\"", DB_FILENAME, path); status = EIO; } (void)env->close(env, 0); } /* "env" allocated */ /* * Then, remove the database environment. */ if (0 == status) status = removeEnvironment(path); return status; }
OdroidReader::OdroidReader(QWidget *parent) : QMainWindow(parent), hasExecuted(false), isLoaded(false), es(ExperimentState::Idle), ui(new Ui::OdroidReader), currentExp(nullptr), currentEnv(nullptr), selectedExp(nullptr) { ui->setupUi(this); ui->runSelected->setMenu(new QMenu("On Client")); ui->totalProgress->hide(); ui->experimentProgress->hide(); ui->environmentProgress->hide(); ui->runAll->setMenu(new QMenu("On Client")); ui->ip->setValidator(new IPValidator()); ui->sourceType->tabBar()->setStyle(new TabStyle(Qt::Horizontal)); ui->sensors->setColumnWidth(0,30); ui->globalPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); connect(ui->globalPlot,&QCustomPlot::mouseDoubleClick,[this] (QMouseEvent*) { for (DataSeries* d : data) d->clear(); for (QCPGraph* g : graphs) if (g != nullptr) g->clearData(); }); DeviceMonitor *dm = new SmartPowerMonitor(); devMonitors.append(dm); dm->monitor(1000); connect(ui->globalPlot,&QCustomPlot::mouseMove,this,&OdroidReader::plotMousePress); connect(dm,&DeviceMonitor::addSource,[this] (DataSource* src) { ui->foundDevices->addItem(src->descriptor(),QVariant::fromValue(src)); }); connect(dm,&DeviceMonitor::removeSource, [this] (DataSource* src) { if (sources.contains(src)) { if (src->isRunning()) src->start(); //Terminate if running sources.remove(sources.indexOf(src)); delete src->property("Item").value<QListWidgetItem*>(); } ui->foundDevices->removeItem(ui->foundDevices->findData(QVariant::fromValue(src))); }); ui->stopSampling->hide(); ui->loadProgress->hide(); connect(ui->runSelected->menu(),&QMenu::triggered,this,&OdroidReader::runSelectedOnSource); connect(ui->runAll->menu(),&QMenu::triggered,this,&OdroidReader::runAllOnSource); connect(ui->environment,SIGNAL(clicked(QModelIndex)),this,SLOT(removeEnvironment(QModelIndex))); connect(ui->stopSampling,&QPushButton::clicked,[this]() { ui->addDevice->setEnabled(true); ui->addConnection->setEnabled(true); }); connect(ui->startSampling,&QPushButton::clicked,[this]() { hasExecuted = true; ui->addDevice->setEnabled(false); ui->addConnection->setEnabled(false); }); connect(ui->startSampling,&QPushButton::clicked,[this] () { ui->startSampling->hide(); ui->stopSampling->show(); ui->repetitions->setEnabled(true); }); connect(ui->stopSampling,&QPushButton::clicked,[this] () { for (DataSource* src : sources) src->stop(); ui->startSampling->show(); ui->stopSampling->hide(); ui->totalProgress->hide(); ui->experimentProgress->hide(); ui->environmentProgress->hide(); ui->repetitions->setDisabled(true); }); connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(aboutToQuit())); connect(&envs,&Environments::addedSet, [this] (const EnvironmentSet* e) { ui->availEnvs->addItem(e->name()); }); connect(&envs,&Environments::removingSet, [this] (const EnvironmentSet* e) { if (ui->availEnvs->findText(e->name()) == -1) return; ui->availEnvs->removeItem(ui->availEnvs->findText(e->name())); for (QListWidgetItem *i : ui->expEnvs->findItems(e->name(),Qt::MatchCaseSensitive)) delete i; }); connect(&envs,&Environments::renamingSet, [this] (QString oldName, QString newName) { int oldIdx = ui->availEnvs->findText(oldName); if (oldIdx == -1) return; ui->availEnvs->removeItem(oldIdx); ui->availEnvs->insertItem(oldIdx,newName); for (QListWidgetItem *i : ui->expEnvs->findItems(oldName,Qt::MatchCaseSensitive)) i->setText(newName); }); //Load state ... QFile f("experiments.json"); if (!f.open(QFile::ReadOnly)) { qWarning() << "Could not read experiments!"; return; }; QJsonObject expData = QJsonDocument::fromJson(f.readAll()).object(); for (const QJsonValue& v : expData["environments"].toArray()) envs.addEnvironment(new Environment(v.toObject())); for (const QJsonValue& v : expData["sets"] .toArray()) { QString name = v.toObject()["name"].toString(); EnvironmentSet* s = envs.addSet(name); for (const QJsonValue& idx : v.toObject()["items"].toArray()) s->addEnvironment(envs.environments()[idx.toInt()]); ui->envSets->addItem(name); } for (const QJsonValue& v : expData["experiments"].toArray()) experiments.append(new Experiment(v.toObject(), data, envs)); updateExperiments(); ui->environment->setModel(&envs); ui->environment->setItemDelegate(new EnvironmentDelegate(ui->environment)); ui->environment->resizeColumnsToContents(); }