Skip to content

Commit e5a79ec

Browse files
committed
Code refactoring
This changes the class structure in the sqlb namespace as well as the DBBrowserObject class. The rest of the commit are changes that are required by the modifications in sqlb and DBBrowserObject. The idea behind this refactoring is this: we currently have the DBBrowserObject class which holds some basic information about the database object (name, type, SQL string, etc.). It also contains a sqlb::Table and a sqlb::Index object. Those are used if the type of the object is table or index and they contain a whole lot more information on the object than the DBBrowserObject class, including the name, the type, the SQL string, etc. So we have a duplication here. There are two class structures for storing the same information. This has historic reasons but other than that there is no point in keeping it this way. With this commit I start the work of consolidating the sqlb classes in order to get rid of the DBBrowserObject class entirely. This commit only starts this task, it doesn't finish it. This is why it is a little messy here and there, but then again the old structure was a little messy, too. We will need at least a very basic trigger and view parser before finishing this is even possible. When this is done, I hope the ode will be much easier to read and understand. But even in the current state there already is some progress: we save a little bit of memory, don't copy big objects all the time anymore, and replace a lot of unnecessary string comparisons with integer comparisons.
1 parent e3ef13a commit e5a79ec

12 files changed

+252
-164
lines changed

src/DbStructureModel.cpp

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -178,24 +178,32 @@ void DbStructureModel::reloadData()
178178
for(auto it=dbobjs.constBegin();it!=dbobjs.constEnd();++it)
179179
{
180180
// Object node
181-
QTreeWidgetItem* item = addNode(typeToParentItem.value((*it).gettype()), *it);
181+
QString type;
182+
switch((*it).gettype())
183+
{
184+
case sqlb::Object::ObjectTypes::Table: type = "table"; break;
185+
case sqlb::Object::ObjectTypes::Index: type = "index"; break;
186+
case sqlb::Object::ObjectTypes::Trigger: type = "trigger"; break;
187+
case sqlb::Object::ObjectTypes::View: type = "view"; break;
188+
}
189+
QTreeWidgetItem* item = addNode(typeToParentItem.value(type), *it);
182190

183191
// If it is a table or view add the field nodes
184-
if((*it).gettype() == "table" || (*it).gettype() == "view")
192+
if((*it).gettype() == sqlb::Object::ObjectTypes::Table || (*it).gettype() == sqlb::Object::ObjectTypes::View)
185193
{
186194
// Add extra node for browsable section
187195
addNode(typeToParentItem.value("browsable"), *it);
188196

189197
// Add field nodes
190-
sqlb::FieldVector pk = (*it).table.primaryKey();
191-
for(int i=0; i < (*it).table.fields().size(); ++i)
198+
sqlb::FieldVector pk = (*it).object.dynamicCast<sqlb::Table>()->primaryKey();
199+
for(int i=0; i < (*it).object.dynamicCast<sqlb::Table>()->fields().size(); ++i)
192200
{
193201
QTreeWidgetItem *fldItem = new QTreeWidgetItem(item);
194-
fldItem->setText(0, (*it).table.fields().at(i)->name());
202+
fldItem->setText(0, (*it).object.dynamicCast<sqlb::Table>()->fields().at(i)->name());
195203
fldItem->setText(1, "field");
196-
fldItem->setText(2, (*it).table.fields().at(i)->type());
197-
fldItem->setText(3, (*it).table.fields().at(i)->toString(" ", " "));
198-
if(pk.contains((*it).table.fields().at(i)))
204+
fldItem->setText(2, (*it).object.dynamicCast<sqlb::Table>()->fields().at(i)->type());
205+
fldItem->setText(3, (*it).object.dynamicCast<sqlb::Table>()->fields().at(i)->toString(" ", " "));
206+
if(pk.contains((*it).object.dynamicCast<sqlb::Table>()->fields().at(i)))
199207
fldItem->setIcon(0, QIcon(":/icons/field_key"));
200208
else
201209
fldItem->setIcon(0, QIcon(":/icons/field"));
@@ -279,10 +287,19 @@ bool DbStructureModel::dropMimeData(const QMimeData* data, Qt::DropAction action
279287

280288
QTreeWidgetItem* DbStructureModel::addNode(QTreeWidgetItem* parent, const DBBrowserObject& object)
281289
{
290+
QString type;
291+
switch(object.gettype())
292+
{
293+
case sqlb::Object::ObjectTypes::Table: type = "table"; break;
294+
case sqlb::Object::ObjectTypes::Index: type = "index"; break;
295+
case sqlb::Object::ObjectTypes::Trigger: type = "trigger"; break;
296+
case sqlb::Object::ObjectTypes::View: type = "view"; break;
297+
}
298+
282299
QTreeWidgetItem *item = new QTreeWidgetItem(parent);
283-
item->setIcon(0, QIcon(QString(":/icons/%1").arg(object.gettype())));
300+
item->setIcon(0, QIcon(QString(":/icons/%1").arg(type)));
284301
item->setText(0, object.getname());
285-
item->setText(1, object.gettype());
302+
item->setText(1, type);
286303
item->setText(3, object.getsql());
287304

288305
return item;

src/EditIndexDialog.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ EditIndexDialog::EditIndexDialog(DBBrowserDB& db, const QString& indexName, bool
3333
if(!newIndex)
3434
{
3535
// Load the current layour and fill in the dialog fields
36-
index = pdb.getObjectByName(curIndex).index;
36+
index = *(pdb.getObjectByName(curIndex).dynamicCast<sqlb::Index>());
3737

3838
ui->editIndexName->blockSignals(true);
3939
ui->editIndexName->setText(index.name());
@@ -69,7 +69,7 @@ void EditIndexDialog::tableChanged(const QString& new_table, bool initialLoad)
6969
}
7070

7171
// And fill the table again
72-
QStringList fields = pdb.getObjectByName(new_table).table.fieldNames();
72+
QStringList fields = pdb.getObjectByName(new_table).dynamicCast<sqlb::Table>()->fieldNames();
7373
ui->tableIndexColumns->setRowCount(fields.size());
7474
for(int i=0; i < fields.size(); ++i)
7575
{

src/EditTableDialog.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ EditTableDialog::EditTableDialog(DBBrowserDB& db, const QString& tableName, bool
3333
if(m_bNewTable == false)
3434
{
3535
// Existing table, so load and set the current layout
36-
DBBrowserObject obj = pdb.getObjectByName(curTable);
37-
QString sTablesql = obj.getsql();
38-
QPair<sqlb::Table, bool> parse_result = sqlb::Table::parseSQL(sTablesql);
39-
m_table = parse_result.first;
40-
m_table.setTemporary(obj.isTemporary());
36+
sqlb::TablePtr obj = pdb.getObjectByName(curTable).dynamicCast<sqlb::Table>();
37+
QString sTablesql = obj->originalSql();
38+
QPair<sqlb::ObjectPtr, bool> parse_result = sqlb::Table::parseSQL(sTablesql);
39+
m_table = *(parse_result.first.dynamicCast<sqlb::Table>());
40+
m_table.setTemporary(obj->isTemporary());
4141
ui->labelEditWarning->setVisible(!parse_result.second);
4242

4343
// Set without rowid and temporary checkboxex. No need to trigger any events here as we're only loading a table exactly as it is stored by SQLite, so no need
@@ -278,7 +278,7 @@ void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column)
278278
sqlb::FieldVector pk = m_table.primaryKey();
279279
foreach(const DBBrowserObject& fkobj, pdb.objMap.values("table"))
280280
{
281-
QList<sqlb::ConstraintPtr> fks = fkobj.table.constraints(sqlb::FieldVector(), sqlb::Constraint::ForeignKeyConstraintType);
281+
QList<sqlb::ConstraintPtr> fks = fkobj.object.dynamicCast<sqlb::Table>()->constraints(sqlb::FieldVector(), sqlb::Constraint::ForeignKeyConstraintType);
282282
foreach(sqlb::ConstraintPtr fkptr, fks)
283283
{
284284
QSharedPointer<sqlb::ForeignKeyClause> fk = fkptr.dynamicCast<sqlb::ForeignKeyClause>();
@@ -350,7 +350,7 @@ void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column)
350350
// to at least replace all troublesome NULL values by the default value
351351
SqliteTableModel m(pdb, this);
352352
m.setQuery(QString("SELECT COUNT(%1) FROM %2 WHERE %3 IS NULL;")
353-
.arg(sqlb::escapeIdentifier(pdb.getObjectByName(curTable).table.rowidColumn()))
353+
.arg(sqlb::escapeIdentifier(pdb.getObjectByName(curTable).dynamicCast<sqlb::Table>()->rowidColumn()))
354354
.arg(sqlb::escapeIdentifier(curTable))
355355
.arg(sqlb::escapeIdentifier(field->name())));
356356
if(m.data(m.index(0, 0)).toInt() > 0)
@@ -578,8 +578,7 @@ void EditTableDialog::removeField()
578578
QMessageBox::warning(0, QApplication::applicationName(), pdb.lastError());
579579
} else {
580580
//relayout
581-
QString sTablesql = pdb.getObjectByName(curTable).getsql();
582-
m_table = sqlb::Table::parseSQL(sTablesql).first;
581+
m_table = *(pdb.getObjectByName(curTable).dynamicCast<sqlb::Table>());
583582
populateFields();
584583
}
585584
}
@@ -662,8 +661,7 @@ void EditTableDialog::moveCurrentField(bool down)
662661
QMessageBox::warning(0, QApplication::applicationName(), pdb.lastError());
663662
} else {
664663
// Reload table SQL
665-
QString sTablesql = pdb.getObjectByName(curTable).getsql();
666-
m_table = sqlb::Table::parseSQL(sTablesql).first;
664+
m_table = *(pdb.getObjectByName(curTable).dynamicCast<sqlb::Table>());
667665
populateFields();
668666

669667
// Select old item at new position

src/ForeignKeyEditorDelegate.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ ForeignKeyEditorDelegate::ForeignKeyEditorDelegate(const DBBrowserDB& db, sqlb::
8181
{
8282
const auto objects = m_db.getBrowsableObjects();
8383
for (auto& obj : objects) {
84-
if ("table" == obj.gettype()) {
85-
QString tableName = obj.table.name();
86-
m_tablesIds.insert(tableName, obj.table.fieldNames());
84+
if (obj.gettype() == sqlb::Object::ObjectTypes::Table) {
85+
QString tableName = obj.object->name();
86+
m_tablesIds.insert(tableName, obj.object.dynamicCast<sqlb::Table>()->fieldNames());
8787
}
8888
}
8989
}

src/ImportCsvDialog.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,9 @@ void ImportCsvDialog::accept()
186186
objectMap objects = pdb->getBrowsableObjects();
187187
for(auto it=objects.constBegin();it!=objects.constEnd();++it)
188188
{
189-
if(it.value().gettype() == "table" && it.value().getname() == ui->editName->text())
189+
if(it.value().gettype() == sqlb::Object::ObjectTypes::Table && it.value().getname() == ui->editName->text())
190190
{
191-
if((size_t)it.value().table.fields().size() != csv.columns())
191+
if((size_t)it.value().object.dynamicCast<sqlb::Table>()->fields().size() != csv.columns())
192192
{
193193
QMessageBox::warning(this, QApplication::applicationName(),
194194
tr("There is already a table of that name and an import into an existing table is only possible if the number of columns match."));

src/MainWindow.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,9 @@ void MainWindow::populateStructure()
366366
{
367367
QString objectname = it.value().getname();
368368

369-
for(int i=0; i < (*it).table.fields().size(); ++i)
369+
for(int i=0; i < (*it).object.dynamicCast<sqlb::Table>()->fields().size(); ++i)
370370
{
371-
QString fieldname = (*it).table.fields().at(i)->name();
371+
QString fieldname = (*it).object.dynamicCast<sqlb::Table>()->fields().at(i)->name();
372372
tablesToColumnsMap[objectname].append(fieldname);
373373
}
374374
}
@@ -429,7 +429,7 @@ void MainWindow::populateTable()
429429
} else {
430430
QVector<QString> v;
431431
bool only_defaults = true;
432-
const sqlb::FieldVector& tablefields = db.getObjectByName(tablename).table.fields();
432+
const sqlb::FieldVector& tablefields = db.getObjectByName(tablename).dynamicCast<sqlb::Table>()->fields();
433433
for(int i=0; i<tablefields.size(); ++i)
434434
{
435435
QString format = tableIt.value().displayFormats[i+1];
@@ -498,7 +498,7 @@ void MainWindow::populateTable()
498498
}
499499

500500
// Activate the add and delete record buttons and editing only if a table has been selected
501-
bool editable = db.getObjectByName(tablename).gettype() == "table" && !db.readOnly();
501+
bool editable = db.getObjectByName(tablename)->type() == sqlb::Object::ObjectTypes::Table && !db.readOnly();
502502
ui->buttonNewRecord->setEnabled(editable);
503503
ui->buttonDeleteRecord->setEnabled(editable);
504504
ui->dataTable->setEditTriggers(editable ? QAbstractItemView::SelectedClicked | QAbstractItemView::AnyKeyPressed | QAbstractItemView::EditKeyPressed : QAbstractItemView::NoEditTriggers);
@@ -816,7 +816,7 @@ void MainWindow::doubleClickTable(const QModelIndex& index)
816816

817817
// * Don't allow editing of other objects than tables (on the browse table) *
818818
bool isEditingAllowed = (m_currentTabTableModel == m_browseTableModel) &&
819-
(db.getObjectByName(ui->comboBrowseTable->currentText()).gettype() == "table");
819+
(db.getObjectByName(ui->comboBrowseTable->currentText())->type() == sqlb::Object::ObjectTypes::Table);
820820

821821
// Enable or disable the Apply, Null, & Import buttons in the Edit Cell
822822
// dock depending on the value of the "isEditingAllowed" bool above
@@ -840,7 +840,7 @@ void MainWindow::dataTableSelectionChanged(const QModelIndex& index)
840840
}
841841

842842
bool editingAllowed = (m_currentTabTableModel == m_browseTableModel) &&
843-
(db.getObjectByName(ui->comboBrowseTable->currentText()).gettype() == "table");
843+
(db.getObjectByName(ui->comboBrowseTable->currentText())->type() == sqlb::Object::ObjectTypes::Table);
844844

845845
// Don't allow editing of other objects than tables
846846
editDock->setReadOnly(!editingAllowed);
@@ -2195,16 +2195,16 @@ void MainWindow::copyCurrentCreateStatement()
21952195
void MainWindow::jumpToRow(const QString& table, QString column, const QByteArray& value)
21962196
{
21972197
// First check if table exists
2198-
DBBrowserObject obj = db.getObjectByName(table);
2199-
if(obj.getname().size() == 0)
2198+
sqlb::TablePtr obj = db.getObjectByName(table).dynamicCast<sqlb::Table>();
2199+
if(!obj)
22002200
return;
22012201

22022202
// If no column name is set, assume the primary key is meant
22032203
if(!column.size())
2204-
column = obj.table.fields().at(obj.table.findPk())->name();
2204+
column = obj->fields().at(obj->findPk())->name();
22052205

22062206
// If column doesn't exist don't do anything
2207-
int column_index = obj.table.findField(column);
2207+
int column_index = obj->findField(column);
22082208
if(column_index == -1)
22092209
return;
22102210

@@ -2232,7 +2232,7 @@ void MainWindow::showDataColumnPopupMenu(const QPoint& pos)
22322232
void MainWindow::showRecordPopupMenu(const QPoint& pos)
22332233
{
22342234
const QString sCurrentTable = ui->comboBrowseTable->currentText();
2235-
if (!(db.getObjectByName(sCurrentTable).gettype() == "table" && !db.readOnly()))
2235+
if(!(db.getObjectByName(sCurrentTable)->type() == sqlb::Object::ObjectTypes::Table && !db.readOnly()))
22362236
return;
22372237

22382238
int row = ui->dataTable->verticalHeader()->logicalIndexAt(pos);
@@ -2257,7 +2257,7 @@ void MainWindow::editDataColumnDisplayFormat()
22572257
// column is always the rowid column. Ultimately, get the column name from the column object
22582258
QString current_table = ui->comboBrowseTable->currentText();
22592259
int field_number = sender()->property("clicked_column").toInt();
2260-
QString field_name = db.getObjectByName(current_table).table.fields().at(field_number-1)->name();
2260+
QString field_name = db.getObjectByName(current_table).dynamicCast<sqlb::Table>()->fields().at(field_number-1)->name();
22612261

22622262
// Get the current display format of the field
22632263
QString current_displayformat = browseTableSettings[current_table].displayFormats[field_number];

src/SqlExecutionArea.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,12 @@ void SqlExecutionArea::saveAsView()
9696
{
9797
name = QInputDialog::getText(this, qApp->applicationName(), tr("Please specify the view name")).trimmed();
9898
if(name.isEmpty())
99-
break;
100-
if(!db.getObjectByName(name).getname().isEmpty())
99+
return;
100+
if(db.getObjectByName(name) != nullptr)
101101
QMessageBox::warning(this, qApp->applicationName(), tr("There is already an object with that name. Please choose a different name."));
102102
else
103103
break;
104104
}
105-
if(name.isEmpty())
106-
return;
107105

108106
// Create the view
109107
if(db.executeSQL(QString("CREATE VIEW %1 AS %2;").arg(sqlb::escapeIdentifier(name)).arg(model->query())))

0 commit comments

Comments
 (0)