From kde-commits Tue Jun 05 22:32:33 2018 From: Jaroslaw Staniek Date: Tue, 05 Jun 2018 22:32:33 +0000 To: kde-commits Subject: [kexi] /: Skip table name if physical table is non-existing, use the new tableNames API in migration Message-Id: X-MARC-Message: https://marc.info/?l=kde-commits&m=152823796530483 Git commit 83a672c348ca9d263e9739bb3ee5566ca8d5d702 by Jaroslaw Staniek. Committed on 05/06/2018 at 22:32. Pushed by staniek into branch 'master'. Skip table name if physical table is non-existing, use the new tableNames A= PI in migration Summary: BUG:392112 FIXED-IN:3.2.0 Note: functionality of migration is not affected, it's just the code cleanu= p thanks to the new API. Test Plan: Open kdb.git/autotests/data/missingTableTest.kexi, it should not= list persons table anymore. Reviewers: piggz Tags: #kexi Differential Revision: https://phabricator.kde.org/D11549 M +1 -1 CMakeLists.txt M +37 -11 src/core/kexiproject.cpp M +3 -15 src/migration/KexiSqlMigrate.cpp M +0 -3 src/migration/KexiSqlMigrate.h M +0 -1 src/migration/mysql/mysqlmigrate.cpp M +0 -1 src/migration/postgresql/PostgresqlMigrate.cpp https://commits.kde.org/kexi/83a672c348ca9d263e9739bb3ee5566ca8d5d702 diff --git a/CMakeLists.txt b/CMakeLists.txt index d10d4beba..6c5a015db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,7 +147,7 @@ set(KEXI_EXAMPLES_INSTALL_DIR ${SHARE_INSTALL_PREFIX}/$= {KEXI_BASE_PATH}/examples ############################ ########################### = -set(KEXI_FRAMEWORKS_MIN_VERSION 3.1.0) +set(KEXI_FRAMEWORKS_MIN_VERSION 3.1.90) = ## ## Test for KDb diff --git a/src/core/kexiproject.cpp b/src/core/kexiproject.cpp index f813c3aa0..944d58495 100644 --- a/src/core/kexiproject.cpp +++ b/src/core/kexiproject.cpp @@ -1,6 +1,6 @@ /* This file is part of the KDE project Copyright (C) 2003 Lucijan Busch - Copyright (C) 2003-2016 Jaros=C5=82aw Staniek + Copyright (C) 2003-2018 Jaros=C5=82aw Staniek = This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -793,6 +793,7 @@ bool KexiProject::retrieveItems() int recentTypeId =3D -1000; QString pluginId; KexiPart::ItemDict *dict =3D 0; + QSet tableNamesSet; for (cursor->moveFirst(); !cursor->eof(); cursor->moveNext()) { bool ok; const int typeId =3D cursor->value(3).toInt(&ok); @@ -802,8 +803,9 @@ bool KexiProject::retrieveItems() continue; } if (recentTypeId =3D=3D typeId) { - if (pluginId.isEmpty()) // still the same unknown plugin ID + if (pluginId.isEmpty()) { // still the same unknown plugin ID continue; + } } else { // a new type ID: create another plugin items dict if it's an = ID for a known type @@ -813,20 +815,44 @@ bool KexiProject::retrieveItems() continue; dict =3D new KexiPart::ItemDict(); d->itemDicts.insert(pluginId, dict); + if (typeId =3D=3D KDb::TableObjectType) { + // Starting to load table names: initialize. + // This list since 3.2 does not contain names without phys= ical tables so we can + // catch these cases below. + const QStringList tableNames(d->connection->tableNames(fal= se /*public*/, &ok)); + if (!ok) { + m_result =3D KDbResult(ERR_OBJECT_NOT_FOUND, xi18n("Co= uld not load list of tables.")); + qDeleteAll(d->itemDicts); + return false; + } + for (const QString &name : tableNames) { + tableNamesSet.insert(name.toLower()); + } + } } const int ident =3D cursor->value(0).toInt(&ok); const QString objName(cursor->value(1).toString()); - if (ok && (ident > 0) && !d->connection->isInternalTableSchema(obj= Name) - && KDb::isIdentifier(objName)) + if (!ok || ident <=3D 0 || !KDb::isIdentifier(objName)) { - KexiPart::Item *it =3D new KexiPart::Item(); - it->setIdentifier(ident); - it->setPluginId(pluginId); - it->setName(objName); - it->setCaption(cursor->value(2).toString()); - dict->insert(it->identifier(), it); + continue; // invalid ID or invalid name + } + if (typeId =3D=3D KDb::TableObjectType) { + if (d->connection->isInternalTableSchema(objName)) { + qInfo() << "table" << objName << "id=3D" << ident << "is i= nternal, skipping"; + continue; + } + if (!tableNamesSet.contains(objName.toLower())) { + qInfo() << "table" << objName << "id=3D" << ident + << "does not correspondent with physical table"; + continue; + } } - //qDebug() << "ITEM ADDED =3D=3D "<setIdentifier(ident); + it->setPluginId(pluginId); + it->setName(objName); + it->setCaption(cursor->value(2).toString()); + dict->insert(it->identifier(), it); } = d->connection->deleteCursor(cursor); diff --git a/src/migration/KexiSqlMigrate.cpp b/src/migration/KexiSqlMigrat= e.cpp index 117922915..749cc8182 100644 --- a/src/migration/KexiSqlMigrate.cpp +++ b/src/migration/KexiSqlMigrate.cpp @@ -86,21 +86,9 @@ bool KexiSqlMigrate::drv_readTableSchema( = bool KexiSqlMigrate::drv_tableNames(QStringList *tableNames) { - QSharedPointer result =3D sourceConnection()->prepareSql= (m_tableNamesSql); - if (!result || result->fieldsCount() < 1) { - return false; - } - Q_FOREVER { - QSharedPointer record =3D result->fetchRecord(); - if (!record) { - if (result->lastResult().isError()) { - return false; - } - break; - } - tableNames->append(record->stringValue(0)); - } - return true; + bool ok; + *tableNames =3D sourceConnection()->drv_getTableNames(&ok); + return ok; } = tristate KexiSqlMigrate::drv_queryStringListFromSql( diff --git a/src/migration/KexiSqlMigrate.h b/src/migration/KexiSqlMigrate.h index f15b23834..1cda1c23e 100644 --- a/src/migration/KexiSqlMigrate.h +++ b/src/migration/KexiSqlMigrate.h @@ -76,9 +76,6 @@ protected: QSharedPointer drv_readFromTable(const QString & tableNa= me) Q_DECL_OVERRIDE; = const QString m_kdbDriverId; - - //! Used by drv_tableNames, should be filled in constructor of a subcl= ass - KDbEscapedString m_tableNamesSql; }; = #endif diff --git a/src/migration/mysql/mysqlmigrate.cpp b/src/migration/mysql/mys= qlmigrate.cpp index 411c87f69..7edadd983 100644 --- a/src/migration/mysql/mysqlmigrate.cpp +++ b/src/migration/mysql/mysqlmigrate.cpp @@ -29,7 +29,6 @@ KEXI_PLUGIN_FACTORY(MysqlMigrate, "keximigrate_mysql.json= ") MysqlMigrate::MysqlMigrate(QObject *parent, const QVariantList& args) : KexiSqlMigrate(QLatin1String("org.kde.kdb.mysql"), parent, args) { - m_tableNamesSql =3D KDbEscapedString("SHOW TABLES"); } = MysqlMigrate::~MysqlMigrate() diff --git a/src/migration/postgresql/PostgresqlMigrate.cpp b/src/migration= /postgresql/PostgresqlMigrate.cpp index be2a12f29..6e24e6e87 100644 --- a/src/migration/postgresql/PostgresqlMigrate.cpp +++ b/src/migration/postgresql/PostgresqlMigrate.cpp @@ -29,7 +29,6 @@ KEXI_PLUGIN_FACTORY(PostgresqlMigrate, "keximigrate_postg= resql.json") PostgresqlMigrate::PostgresqlMigrate(QObject *parent, const QVariantList& = args) : KexiSqlMigrate(QLatin1String("org.kde.kdb.postgresql"), parent, args) { - m_tableNamesSql =3D KDbEscapedString("SELECT table_name FROM informati= on_schema.tables WHERE table_type =3D 'BASE TABLE' AND table_schema NOT IN = ('pg_catalog', 'information_schema')"); } = PostgresqlMigrate::~PostgresqlMigrate()