diff options
| author | 2017-02-09 04:37:26 -0500 | |
|---|---|---|
| committer | 2017-02-09 04:37:26 -0500 | |
| commit | c9d6debf9015b7853c3e061bbc64a555d85e2fcd (patch) | |
| tree | 53341bc57ae9fbad2beb5b6c08d97a68bee0ec8e /SQLiteStudio3/coreSQLiteStudio/services | |
| parent | d5caba2b1f36dc3b92fa705a06097d0597fa2ddd (diff) | |
| parent | d9aa870e5d509cc7309ab82dd102a937ab58613a (diff) | |
Merge tag 'upstream/3.1.1+dfsg1'
Upstream version 3.1.1+dfsg1
# gpg: Signature made Thu 09 Feb 2017 04:37:24 AM EST
# gpg: using RSA key 5001E1B09AA3744B
# gpg: issuer "unit193@ubuntu.com"
# gpg: Good signature from "Unit 193 <unit193@ubuntu.com>" [unknown]
# gpg: aka "Unit 193 <unit193@gmail.com>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg: There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 8DB3 E586 865D 2B4A 2B18 5A5C 5001 E1B0 9AA3 744B
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/services')
8 files changed, 207 insertions, 6 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/services/config.cpp b/SQLiteStudio3/coreSQLiteStudio/services/config.cpp index 1fef317..60a80d5 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/config.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/services/config.cpp @@ -3,7 +3,18 @@ CFG_DEFINE(Core) static const QString DB_FILE_NAME = QStringLiteral("settings3"); +static QString MASTER_CONFIG_FILE = QString(); Config::~Config() { } + +void Config::setMasterConfigFile(const QString &path) +{ + MASTER_CONFIG_FILE = path; +} + +QString Config::getMasterConfigFile() +{ + return MASTER_CONFIG_FILE; +} diff --git a/SQLiteStudio3/coreSQLiteStudio/services/config.h b/SQLiteStudio3/coreSQLiteStudio/services/config.h index c7bebf3..1e4c410 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/config.h +++ b/SQLiteStudio3/coreSQLiteStudio/services/config.h @@ -14,7 +14,7 @@ #include <QSharedPointer> #include <QDateTime> -const int SQLITESTUDIO_CONFIG_VERSION = 1; +const int SQLITESTUDIO_CONFIG_VERSION = 2; CFG_CATEGORIES(Core, CFG_CATEGORY(General, @@ -104,6 +104,9 @@ class API_EXPORT Config : public QObject typedef QSharedPointer<ReportHistoryEntry> ReportHistoryEntryPtr; + static void setMasterConfigFile(const QString& path); + static QString getMasterConfigFile(); + virtual void init() = 0; virtual void cleanUp() = 0; virtual const QString& getConfigDir() const = 0; @@ -166,7 +169,7 @@ class API_EXPORT Config : public QObject signals: void massSaveBegins(); - void massSaveCommited(); + void massSaveCommitted(); void sqlHistoryRefreshNeeded(); void ddlHistoryRefreshNeeded(); void reportsHistoryRefreshNeeded(); diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp b/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp index 5aed863..cf8b115 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp @@ -28,6 +28,8 @@ void ConfigImpl::init() { initDbFile(); initTables(); + updateConfigDb(); + mergeMasterConfig(); sqlite3Version = db->exec("SELECT sqlite_version()")->getSingleCell().toString(); @@ -72,7 +74,7 @@ void ConfigImpl::commitMassSave() return; db->exec("COMMIT;"); - emit massSaveCommited(); + emit massSaveCommitted(); massSaving = false; } @@ -791,6 +793,73 @@ void ConfigImpl::asyncClearReportHistory() emit reportsHistoryRefreshNeeded(); } +void ConfigImpl::mergeMasterConfig() +{ + QString masterConfigFile = Config::getMasterConfigFile(); + if (masterConfigFile.isEmpty()) + return; + + qInfo() << "Updating settings from master configuration file: " << masterConfigFile; + + Db* masterDb = new DbSqlite3("SQLiteStudio master settings", masterConfigFile, {{DB_PURE_INIT, true}}); + if (!masterDb->open()) + { + safe_delete(masterDb); + qWarning() << "Could not open master config database:" << masterConfigFile; + return; + } + + SqlQueryPtr results = masterDb->exec("SELECT [group], key, value FROM settings"); + if (results->isError()) + { + qWarning() << "Could not query master config database:" << masterConfigFile << ", error details:" << results->getErrorText(); + safe_delete(masterDb); + return; + } + + static_qstring(insertSql, "INSERT OR IGNORE INTO settings ([group], key, value) VALUES (?, ?, ?)"); + db->begin(); + SqlResultsRowPtr row; + while (results->hasNext()) + { + row = results->next(); + if (row->value("group") == "General" && row->value("key") == "Session") + continue; // Don't copy session + + db->exec(insertSql, row->valueList()); + } + db->commit(); + + masterDb->close(); + safe_delete(masterDb); +} + +void ConfigImpl::updateConfigDb() +{ + SqlQueryPtr result = db->exec("SELECT version FROM version LIMIT 1"); + int dbVersion = result->getSingleCell().toInt(); + if (dbVersion >= SQLITESTUDIO_CONFIG_VERSION) + return; + + db->begin(); + switch (dbVersion) + { + case 1: + { + // 1->2 + db->exec("UPDATE settings SET [key] = 'DataUncommittedError' WHERE [key] = 'DataUncommitedError'"); + db->exec("UPDATE settings SET [key] = 'DataUncommitted' WHERE [key] = 'DataUncommited'"); + } + // Add cases here for next versions, + // without a "break" instruction, + // in order to update from certain + // version to latest at once. + } + + db->exec("UPDATE version SET version = ?", {SQLITESTUDIO_CONFIG_VERSION}); + db->commit(); +} + void ConfigImpl::refreshSqlHistory() { if (sqlHistoryModel) diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h b/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h index bd31f0b..08bcec7 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h +++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h @@ -111,6 +111,9 @@ class API_EXPORT ConfigImpl : public Config void asyncDeleteReport(int id); void asyncClearReportHistory(); + void mergeMasterConfig(); + void updateConfigDb(); + static Config* instance; static qint64 sqlHistoryId; diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp b/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp index da732bd..826b34b 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp @@ -9,12 +9,14 @@ #include "services/dbmanager.h" #include "db/queryexecutor.h" #include "db/sqlquery.h" +#include "services/importmanager.h" #include <QVariantList> #include <QHash> #include <QDebug> #include <QRegularExpression> #include <QFile> #include <QUrl> +#include <plugins/importplugin.h> FunctionManagerImpl::FunctionManagerImpl() { @@ -269,6 +271,10 @@ void FunctionManagerImpl::initNativeFunctions() registerNativeFunction("sha3_256", {"data"}, FunctionManagerImpl::nativeSha3_256); registerNativeFunction("sha3_384", {"data"}, FunctionManagerImpl::nativeSha3_384); registerNativeFunction("sha3_512", {"data"}, FunctionManagerImpl::nativeSha3_512); + registerNativeFunction("import", {"file", "format", "table", "charset", "options"}, FunctionManagerImpl::nativeImport); + registerNativeFunction("import_formats", {}, FunctionManagerImpl::nativeImportFormats); + registerNativeFunction("import_options", {"format"}, FunctionManagerImpl::nativeImportOptions); + registerNativeFunction("charsets", {}, FunctionManagerImpl::nativeCharsets); } void FunctionManagerImpl::refreshFunctionsByKey() @@ -654,6 +660,107 @@ QVariant FunctionManagerImpl::nativeSha3_512(const QList<QVariant>& args, Db* db return nativeCryptographicFunction(args, db, ok, QCryptographicHash::Sha3_512); } +QVariant FunctionManagerImpl::nativeImport(const QList<QVariant> &args, Db *db, bool &ok) +{ + if (args.size() < 3) + { + ok = false; + return 0; + } + + ImportManager::StandardImportConfig stdConfig; + stdConfig.inputFileName = args[0].toString(); + stdConfig.ignoreErrors = true; + stdConfig.skipTransaction = true; + if (args.size() > 3) + stdConfig.codec = args[3].toString(); + + if (args.size() > 4) + { + // Parsing plugin options + int idx; + QString option; + QString value; + CfgEntry* cfg; + QStringList lines = args[4].toString().split(QRegExp("[\r\n]+")); + for (const QString& line : lines) + { + idx = line.indexOf("="); + if (idx == -1) + { + qDebug() << "Invalid options entry for import() function call:" << line; + continue; + } + option = line.left(idx).trimmed(); + cfg = CfgMain::getEntryByPath(option); + if (!cfg) + { + qDebug() << "Invalid option name for import() function call:" << option; + continue; + } + value = line.mid(idx + 1); + cfg->set(value); + } + } + + QString format = args[1].toString(); + QString table = args[2].toString(); + + IMPORT_MANAGER->configure(format, stdConfig); + IMPORT_MANAGER->importToTable(db, table, false); + return 1; +} + +QVariant FunctionManagerImpl::nativeImportFormats(const QList<QVariant> &args, Db *db, bool &ok) +{ + UNUSED(args); + UNUSED(db); + UNUSED(ok); + QStringList formats; + QList<ImportPlugin*> importPlugins = PLUGINS->getLoadedPlugins<ImportPlugin>(); + for (ImportPlugin* plugin : importPlugins) + formats << plugin->getDataSourceTypeName(); + + return formats.join(" "); +} + +QVariant FunctionManagerImpl::nativeImportOptions(const QList<QVariant> &args, Db *db, bool &ok) +{ + UNUSED(db); + if (args.size() != 1) + { + qDebug() << "Missing 'type' parameter to import_options() function call."; + ok = false; + return QVariant(); + } + + QString type = args[0].toString(); + + QList<ImportPlugin*> importPlugins = PLUGINS->getLoadedPlugins<ImportPlugin>(); + ImportPlugin* thePlugin = findFirst<ImportPlugin>(importPlugins, [type](ImportPlugin* plugin) -> bool {return plugin->getDataSourceTypeName() == type;}); + if (!thePlugin) + { + ok = false; + qDebug() << "No import plugin handling format (in call to import_options()):" << type; + return QVariant(); + } + + static_qstring(tpl, "%1=%2"); + QStringList opts; + for (CfgEntry* entry : thePlugin->getConfig()->getEntries()) + opts << tpl.arg(entry->getFullKey(), entry->get().toString()); + + return opts.join("\n"); +} + +QVariant FunctionManagerImpl::nativeCharsets(const QList<QVariant> &args, Db *db, bool &ok) +{ + UNUSED(args); + UNUSED(db); + UNUSED(ok); + return textCodecNames().join(" "); +} + QStringList FunctionManagerImpl::getArgMarkers(int argCount) { QStringList argMarkers; diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.h b/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.h index d8734e6..0e5e103 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.h +++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.h @@ -83,6 +83,10 @@ class API_EXPORT FunctionManagerImpl : public FunctionManager static QVariant nativeSha3_256(const QList<QVariant>& args, Db* db, bool& ok); static QVariant nativeSha3_384(const QList<QVariant>& args, Db* db, bool& ok); static QVariant nativeSha3_512(const QList<QVariant>& args, Db* db, bool& ok); + static QVariant nativeImport(const QList<QVariant>& args, Db* db, bool& ok); + static QVariant nativeImportFormats(const QList<QVariant>& args, Db* db, bool& ok); + static QVariant nativeImportOptions(const QList<QVariant>& args, Db* db, bool& ok); + static QVariant nativeCharsets(const QList<QVariant>& args, Db* db, bool& ok); QList<ScriptFunction*> functions; QHash<Key,ScriptFunction*> functionsByKey; diff --git a/SQLiteStudio3/coreSQLiteStudio/services/importmanager.cpp b/SQLiteStudio3/coreSQLiteStudio/services/importmanager.cpp index 53803e5..b9aa947 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/importmanager.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/services/importmanager.cpp @@ -38,7 +38,7 @@ void ImportManager::configure(const QString& dataSourceType, const ImportManager importConfig = config; } -void ImportManager::importToTable(Db* db, const QString& table) +void ImportManager::importToTable(Db* db, const QString& table, bool async) { this->db = db; this->table = table; @@ -71,7 +71,10 @@ void ImportManager::importToTable(Db* db, const QString& table) connect(worker, SIGNAL(createdTable(Db*,QString)), this, SLOT(handleTableCreated(Db*,QString))); connect(this, SIGNAL(orderWorkerToInterrupt()), worker, SLOT(interrupt())); - QThreadPool::globalInstance()->start(worker); + if (async) + QThreadPool::globalInstance()->start(worker); + else + worker->run(); } void ImportManager::interrupt() diff --git a/SQLiteStudio3/coreSQLiteStudio/services/importmanager.h b/SQLiteStudio3/coreSQLiteStudio/services/importmanager.h index 2401e78..5c6a73e 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/importmanager.h +++ b/SQLiteStudio3/coreSQLiteStudio/services/importmanager.h @@ -38,6 +38,7 @@ class API_EXPORT ImportManager : public PluginServiceBase QString inputFileName; bool ignoreErrors = false; + bool skipTransaction = false; }; enum StandardConfigFlag @@ -54,7 +55,7 @@ class API_EXPORT ImportManager : public PluginServiceBase ImportPlugin* getPluginForDataSourceType(const QString& dataSourceType) const; void configure(const QString& dataSourceType, const StandardImportConfig& config); - void importToTable(Db* db, const QString& table); + void importToTable(Db* db, const QString& table, bool async = true); static bool isAnyPluginAvailable(); |
