Permalink
Browse files

Don't allow selection of tables/indices in VACUUM dialog

Remove the feature to select individual tables and indices to vacuum in
the vacuum dialog. Turns out SQLite doesn't support this (and apparently
never has). If you didn't select all tables at once, it would just print
errors to the console output. I have no idea why we ever implemented it
this way. However, the dialog could be reused to allow selection of
database schemata to compact - and this actually does work.
  • Loading branch information...
MKleusberg committed Sep 3, 2017
1 parent 829e310 commit c616b3947806411cd1e7d20ca936b5f1dfae35bd
Showing with 16 additions and 26 deletions.
  1. +12 −22 src/VacuumDialog.cpp
  2. +4 −4 src/VacuumDialog.ui
@@ -16,19 +16,16 @@ VacuumDialog::VacuumDialog(DBBrowserDB* _db, QWidget* parent) :
ui->labelSavepointWarning->setVisible(db->getDirty());

// Populate list of objects to compact. We just support vacuuming the main schema here.
QList<sqlb::ObjectPtr> objects = db->schemata["main"].values("table");
objects.append(db->schemata["main"].values("index"));
for(QList<sqlb::ObjectPtr>::const_iterator i=objects.constBegin();i!=objects.constEnd();++i)
for(auto it=db->schemata.constBegin();it!=db->schemata.constEnd();++it)
{
QTreeWidgetItem* item = new QTreeWidgetItem(ui->treeSelectedObjects);
item->setText(0, (*i)->name());
item->setIcon(0, QIcon(QString(":icons/%1").arg(sqlb::Object::typeToString((*i)->type()))));
ui->treeSelectedObjects->addTopLevelItem(item);
QTreeWidgetItem* item = new QTreeWidgetItem(ui->treeDatabases);
item->setText(0, it.key());
item->setIcon(0, QIcon(QString(":icons/database")));
ui->treeDatabases->addTopLevelItem(item);
}

// Sort objects and select them all
ui->treeSelectedObjects->sortByColumn(0, Qt::AscendingOrder);
ui->treeSelectedObjects->selectAll();
// Select the first item which should always be the main schema
ui->treeDatabases->setCurrentItem(ui->treeDatabases->topLevelItem(0));
}

VacuumDialog::~VacuumDialog()
@@ -38,25 +35,18 @@ VacuumDialog::~VacuumDialog()

void VacuumDialog::accept()
{
if(ui->treeSelectedObjects->selectedItems().count() == 0)
if(ui->treeDatabases->selectedItems().count() == 0)
return QDialog::reject();

QApplication::setOverrideCursor(Qt::WaitCursor);

// Commit all changes first
db->releaseAllSavepoints();

// All items selected?
if(ui->treeSelectedObjects->selectedItems().count() == ui->treeSelectedObjects->topLevelItemCount())
{
// Yes, so just execute a simple vacuum command for all objects
db->executeSQL("VACUUM;", false);
} else {
// No, so execute a vacuum command for each selected object individually
QList<QTreeWidgetItem*> selection = ui->treeSelectedObjects->selectedItems();
foreach(QTreeWidgetItem* item, selection)
db->executeSQL(QString("VACUUM %1;").arg(sqlb::escapeIdentifier(item->text(0))), false);
}
// Loop through all selected databases and vacuum them individually
QList<QTreeWidgetItem*> selection = ui->treeDatabases->selectedItems();
foreach(QTreeWidgetItem* item, selection)
db->executeSQL(QString("VACUUM %1;").arg(sqlb::escapeIdentifier(item->text(0))), false);

QApplication::restoreOverrideCursor();
QDialog::accept();
@@ -36,15 +36,15 @@
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Please select the objects to compact:</string>
<string>Please select the databases to co&amp;mpact:</string>
</property>
<property name="buddy">
<cstring>treeSelectedObjects</cstring>
<cstring>treeDatabases</cstring>
</property>
</widget>
</item>
<item>
<widget class="QTreeWidget" name="treeSelectedObjects">
<widget class="QTreeWidget" name="treeDatabases">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
@@ -86,7 +86,7 @@
</layout>
</widget>
<tabstops>
<tabstop>treeSelectedObjects</tabstop>
<tabstop>treeDatabases</tabstop>
<tabstop>buttonBox</tabstop>
</tabstops>
<resources/>

0 comments on commit c616b39

Please sign in to comment.