aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/services
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2017-02-09 04:37:26 -0500
committerLibravatarUnit 193 <unit193@ubuntu.com>2017-02-09 04:37:26 -0500
commitc9d6debf9015b7853c3e061bbc64a555d85e2fcd (patch)
tree53341bc57ae9fbad2beb5b6c08d97a68bee0ec8e /SQLiteStudio3/coreSQLiteStudio/services
parentd5caba2b1f36dc3b92fa705a06097d0597fa2ddd (diff)
parentd9aa870e5d509cc7309ab82dd102a937ab58613a (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')
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/config.cpp11
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/config.h7
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.cpp71
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/impl/configimpl.h3
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.cpp107
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/impl/functionmanagerimpl.h4
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/importmanager.cpp7
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/services/importmanager.h3
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();