aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/services/impl
diff options
context:
space:
mode:
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/services/impl')
-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
4 files changed, 184 insertions, 1 deletions
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;