grammar: Introduce basic View class stub · jackyspeed/sqlitebrowser@d236f6d · GitHub
Skip to content

Commit d236f6d

Browse files
committed
grammar: Introduce basic View class stub
Parsing views or generating a CREATE VIEW statement isn't implemented yet. Also unify the process by which it's possible to retrieve information on the fields of a database object.
1 parent ebc3869 commit d236f6d

5 files changed

Lines changed: 130 additions & 24 deletions

File tree

‎src/DbStructureModel.cpp‎

Lines changed: 14 additions & 6 deletions

‎src/MainWindow.cpp‎

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

370-
for(int i=0; i < (*it).object.dynamicCast<sqlb::Table>()->fields().size(); ++i)
371-
{
372-
QString fieldname = (*it).object.dynamicCast<sqlb::Table>()->fields().at(i)->name();
373-
tablesToColumnsMap[objectname].append(fieldname);
374-
}
370+
sqlb::FieldInfoList fi = it->object->fieldInformation();
371+
foreach(const sqlb::FieldInfo& f, fi)
372+
tablesToColumnsMap[objectname].append(f.name);
375373
}
376374
SqlTextEdit::sqlLexer->setTableNames(tablesToColumnsMap);
377375
ui->editLogApplication->reloadKeywords();

‎src/sqlitedb.cpp‎

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,27 +1253,28 @@ void DBBrowserDB::updateSchema( )
12531253
continue;
12541254

12551255
DBBrowserObject obj(val_name, val_sql, type, val_tblname);
1256-
if((type == sqlb::Object::Types::Table || type == sqlb::Object::Types::Index) && !val_sql.isEmpty())
1256+
if((type == sqlb::Object::Types::Table || type == sqlb::Object::Types::Index || type == sqlb::Object::Types::View) && !val_sql.isEmpty())
12571257
{
12581258
obj.object = sqlb::Object::parseSQL(type, val_sql);
12591259
if(val_temp == "1")
12601260
obj.object->setTemporary(true);
12611261

1262-
// For virtual tables query the column list using the SQLite pragma
1263-
if(type == sqlb::Object::Types::Table && obj.object.dynamicCast<sqlb::Table>()->isVirtual())
1262+
// For virtual tables and views query the column list using the SQLite pragma because for both we can't yet rely on our grammar parser
1263+
if((type == sqlb::Object::Types::Table && obj.object.dynamicCast<sqlb::Table>()->isVirtual()) || type == sqlb::Object::Types::View)
12641264
{
1265-
sqlb::TablePtr tab = obj.object.dynamicCast<sqlb::Table>();
12661265
auto columns = queryColumnInformation(val_name);
1267-
foreach(const auto& column, columns)
1268-
tab->addField(sqlb::FieldPtr(new sqlb::Field(column.first, column.second)));
1266+
1267+
if(type == sqlb::Object::Types::Table)
1268+
{
1269+
sqlb::TablePtr tab = obj.object.dynamicCast<sqlb::Table>();
1270+
foreach(const auto& column, columns)
1271+
tab->addField(sqlb::FieldPtr(new sqlb::Field(column.first, column.second)));
1272+
} else {
1273+
sqlb::ViewPtr view = obj.object.dynamicCast<sqlb::View>();
1274+
foreach(const auto& column, columns)
1275+
view->addField(sqlb::FieldPtr(new sqlb::Field(column.first, column.second)));
1276+
}
12691277
}
1270-
} else if(type == sqlb::Object::Types::View) {
1271-
// For views we currently can't rely on our grammar parser to get the column list. Use the pragma offered by SQLite instead
1272-
auto columns = queryColumnInformation(val_name);
1273-
sqlb::Table* view_dummy = new sqlb::Table("");
1274-
foreach(const auto& column, columns)
1275-
view_dummy->addField(sqlb::FieldPtr(new sqlb::Field(column.first, column.second)));
1276-
obj.object = sqlb::TablePtr(view_dummy);
12771278
}
12781279
objMap.insert(val_type, obj);
12791280
}

‎src/sqlitetypes.cpp‎

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ ObjectPtr Object::parseSQL(Object::Types type, const QString& sSQL)
7676
case Object::Types::Index:
7777
result = Index::parseSQL(sSQL);
7878
break;
79+
case Object::Types::View:
80+
result = View::parseSQL(sSQL);
81+
break;
7982
default:
8083
return ObjectPtr(nullptr);
8184
}
@@ -310,6 +313,14 @@ QStringList Table::fieldNames() const
310313
return sl;
311314
}
312315

316+
FieldInfoList Table::fieldInformation() const
317+
{
318+
FieldInfoList result;
319+
foreach(FieldPtr f, m_fields)
320+
result.append({f->name(), f->type(), f->toString(" ", " ")});
321+
return result;
322+
}
323+
313324
bool Table::hasAutoIncrement() const
314325
{
315326
foreach(FieldPtr f, m_fields) {
@@ -1132,4 +1143,52 @@ void CreateIndexWalker::parsecolumn(Index* index, antlr::RefAST c)
11321143
index->addColumn(IndexedColumnPtr(new IndexedColumn(name, isExpression, order)));
11331144
}
11341145

1146+
1147+
1148+
View::~View()
1149+
{
1150+
clear();
1151+
}
1152+
1153+
ObjectPtr View::parseSQL(const QString& /*sSQL*/)
1154+
{
1155+
// TODO
1156+
1157+
return ViewPtr(new View(""));
1158+
}
1159+
1160+
void View::clear()
1161+
{
1162+
m_fields.clear();
1163+
}
1164+
1165+
void View::addField(const FieldPtr& f)
1166+
{
1167+
m_fields.append(FieldPtr(f));
1168+
}
1169+
1170+
void View::setFields(const FieldVector& fields)
1171+
{
1172+
clear();
1173+
m_fields = fields;
1174+
}
1175+
1176+
QStringList View::fieldNames() const
1177+
{
1178+
QStringList sl;
1179+
1180+
foreach(FieldPtr f, m_fields)
1181+
sl << f->name();
1182+
1183+
return sl;
1184+
}
1185+
1186+
FieldInfoList View::fieldInformation() const
1187+
{
1188+
FieldInfoList result;
1189+
foreach(FieldPtr f, m_fields)
1190+
result.append({f->name(), f->type(), f->toString(" ", " ")});
1191+
return result;
1192+
}
1193+
11351194
} //namespace sqlb

‎src/sqlitetypes.h‎

Lines changed: 40 additions & 0 deletions

0 commit comments

Comments
 (0)