Remember when a table is only a temporary table

You can create temporary table using CREATE TEMPORARY TABLE xxx
statements. DB4S shows them as ordinary tables which is fine most of the
time. However, it wouldn't remember the temporary status when editing
them via the Edit Table dialog. This means that editing them would
create a normal, non-temporary table. This is fixed by this commit.
This commit is contained in:
Martin Kleusberg
2017-01-16 11:01:18 +01:00
parent 4ecb50277c
commit cd2f14e2dc
5 changed files with 25 additions and 14 deletions

View File

@@ -33,9 +33,11 @@ EditTableDialog::EditTableDialog(DBBrowserDB& db, const QString& tableName, bool
if(m_bNewTable == false)
{
// Existing table, so load and set the current layout
QString sTablesql = pdb.getObjectByName(curTable).getsql();
DBBrowserObject obj = pdb.getObjectByName(curTable);
QString sTablesql = obj.getsql();
QPair<sqlb::Table, bool> parse_result = sqlb::Table::parseSQL(sTablesql);
m_table = parse_result.first;
m_table.setTemporary(obj.isTemporary());
ui->labelEditWarning->setVisible(!parse_result.second);
// Set without rowid checkbox. No need to trigger any events here as we're only loading a table exactly as it is stored by SQLite, so no need

View File

@@ -1208,7 +1208,7 @@ void DBBrowserDB::updateSchema( )
if(!isOpen())
return;
QString statement = "SELECT type,name,sql,tbl_name FROM sqlite_master UNION SELECT type,name,sql,tbl_name FROM sqlite_temp_master;";
QString statement = "SELECT type,name,sql,tbl_name,'0' AS temp FROM sqlite_master UNION SELECT type,name,sql,tbl_name,'1' AS temp FROM sqlite_temp_master;";
QByteArray utf8Statement = statement.toUtf8();
err=sqlite3_prepare_v2(_db, utf8Statement, utf8Statement.length(),
@@ -1216,16 +1216,17 @@ void DBBrowserDB::updateSchema( )
if (err == SQLITE_OK){
logSQL(statement, kLogMsg_App);
while ( sqlite3_step(vm) == SQLITE_ROW ){
QString val1 = QString::fromUtf8((const char*)sqlite3_column_text(vm, 0));
QString val2 = QString::fromUtf8((const char*)sqlite3_column_text(vm, 1));
QString val3 = QString::fromUtf8((const char*)sqlite3_column_text(vm, 2));
QString val4 = QString::fromUtf8((const char*)sqlite3_column_text(vm, 3));
val3.replace("\r", "");
QString val_type = QString::fromUtf8((const char*)sqlite3_column_text(vm, 0));
QString val_name = QString::fromUtf8((const char*)sqlite3_column_text(vm, 1));
QString val_sql = QString::fromUtf8((const char*)sqlite3_column_text(vm, 2));
QString val_tblname = QString::fromUtf8((const char*)sqlite3_column_text(vm, 3));
QString val_temp = QString::fromUtf8((const char*)sqlite3_column_text(vm, 4));
val_sql.replace("\r", "");
if(val1 == "table" || val1 == "index" || val1 == "view" || val1 == "trigger")
objMap.insert(val1, DBBrowserObject(val2, val3, val1, val4));
if(val_type == "table" || val_type == "index" || val_type == "view" || val_type == "trigger")
objMap.insert(val_type, DBBrowserObject(val_name, val_sql, val_type, val_tblname, (val_temp == "1")));
else
qWarning() << tr("unknown object type %1").arg(val1);
qWarning() << tr("unknown object type %1").arg(val_type);
}
sqlite3_finalize(vm);
}else{

View File

@@ -22,20 +22,23 @@ class DBBrowserObject
{
public:
DBBrowserObject() : table(""), name( "" ) { }
DBBrowserObject( const QString& wname,const QString& wsql, const QString& wtype, const QString& tbl_name )
: table(wname), name( wname), sql( wsql ), type(wtype), table_name(tbl_name)
DBBrowserObject(const QString& wname, const QString& wsql, const QString& wtype, const QString& tbl_name, bool temp)
: table(wname), name( wname), sql( wsql ), type(wtype), table_name(tbl_name), temporary(temp)
{ }
QString getname() const { return name; }
QString getsql() const { return sql; }
QString gettype() const { return type; }
QString getTableName() const { return table_name; }
bool isTemporary() const { return temporary; }
sqlb::Table table;
private:
QString name;
QString sql;
QString type;
QString table_name; // The name of the table this object references, interesting for views, triggers and indices
bool temporary;
};
class DBBrowserDB : public QObject

View File

@@ -138,6 +138,7 @@ void Table::clear()
m_fields.clear();
m_constraints.clear();
m_virtual = QString();
m_temporary = false;
}
Table::~Table()
{
@@ -297,7 +298,7 @@ QString Table::sql() const
return QString("CREATE VIRTUAL TABLE %1 USING %2;").arg(escapeIdentifier(m_name)).arg(m_virtual);
// This is a normal table, not a virtual one
QString sql = QString("CREATE TABLE %1 (\n").arg(escapeIdentifier(m_name));
QString sql = QString("CREATE %1TABLE %2 (\n").arg(m_temporary ? QString("TEMPORARY ") : QString("")).arg(escapeIdentifier(m_name));
sql += fieldList().join(",\n");

View File

@@ -160,7 +160,7 @@ typedef QMultiHash<FieldVector, ConstraintPtr> ConstraintMap;
class Table
{
public:
explicit Table(const QString& name): m_name(name), m_rowidColumn("_rowid_") {}
explicit Table(const QString& name): m_name(name), m_rowidColumn("_rowid_"), m_temporary(false) {}
virtual ~Table();
void setName(const QString& name) { m_name = name; }
@@ -189,6 +189,9 @@ public:
QString virtualUsing() const { return m_virtual; }
bool isVirtual() const { return !m_virtual.isEmpty(); }
void setTemporary(bool temp) { m_temporary = temp; }
bool isTemporary() const { return m_temporary; }
void clear();
void addConstraint(FieldVector fields, ConstraintPtr constraint);
@@ -229,6 +232,7 @@ private:
QString m_rowidColumn;
ConstraintMap m_constraints;
QString m_virtual;
bool m_temporary;
};
/**