aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/sqlitestudiocli/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SQLiteStudio3/sqlitestudiocli/main.cpp')
-rw-r--r--SQLiteStudio3/sqlitestudiocli/main.cpp106
1 files changed, 92 insertions, 14 deletions
diff --git a/SQLiteStudio3/sqlitestudiocli/main.cpp b/SQLiteStudio3/sqlitestudiocli/main.cpp
index 3ffc2e3..14867cf 100644
--- a/SQLiteStudio3/sqlitestudiocli/main.cpp
+++ b/SQLiteStudio3/sqlitestudiocli/main.cpp
@@ -1,22 +1,28 @@
#include "cli.h"
#include "clicommandexecutor.h"
-#include "sqlitestudio.h"
#include "commands/clicommand.h"
#include "cli_config.h"
#include "cliutils.h"
#include "qio.h"
#include "climsghandler.h"
#include "completionhelper.h"
-#include "services/updatemanager.h"
#include "services/pluginmanager.h"
+#include "sqlfileexecutor.h"
#include <QCoreApplication>
#include <QtGlobal>
#include <QCommandLineParser>
#include <QCommandLineOption>
-bool listPlugins = false;
+namespace CliOpts
+{
+ bool listPlugins = false;
+ QString sqlScriptToExecute;
+ QString dbToOpen;
+ QString sqlScriptCodec;
+ bool ignoreErrors = false;
+}
-QString cliHandleCmdLineArgs()
+bool cliHandleCmdLineArgs()
{
QCommandLineParser parser;
parser.setApplicationDescription(QObject::tr("Command line interface to SQLiteStudio, a SQLite manager."));
@@ -25,10 +31,28 @@ QString cliHandleCmdLineArgs()
QCommandLineOption debugOption({"d", "debug"}, QObject::tr("Enables debug messages on standard error output."));
QCommandLineOption lemonDebugOption("debug-lemon", QObject::tr("Enables Lemon parser debug messages for SQL code assistant."));
- QCommandLineOption listPluginsOption("list-plugins", QObject::tr("Lists plugins installed in the SQLiteStudio and quits."));
+ QCommandLineOption listPluginsOption({"lp", "list-plugins"}, QObject::tr("Lists plugins installed in the SQLiteStudio and quits."));
+ QCommandLineOption execSqlOption({"e", "execute-sql-file"},
+ QObject::tr("Executes provided SQL file (including all rich features of SQLiteStudio's query executor) "
+ "on the specified database file and quits. "
+ "The database parameter becomes mandatory if this option is used."),
+ QObject::tr("SQL file"));
+ QCommandLineOption sqlFileCodecOption({"c", "file-codec"}, QObject::tr("Character encoding to use when reading SQL file (-e option). "
+ "Use -cl to list available codecs. "
+ "Defaults to %1.").arg(defaultCodecName()),
+ QObject::tr("codec"));
+ QCommandLineOption codecListOption({"lc", "list-codecs"}, QObject::tr("Lists available codecs to be used with -c option and quits."));
+ QCommandLineOption ignoreErrorsOption({"ie", "ignore-errors"},
+ QObject::tr("When used together with -e option, the execution will not stop on an error, "
+ "but rather continue until the end, ignoring errors."));
+
parser.addOption(debugOption);
parser.addOption(lemonDebugOption);
parser.addOption(listPluginsOption);
+ parser.addOption(execSqlOption);
+ parser.addOption(sqlFileCodecOption);
+ parser.addOption(codecListOption);
+ parser.addOption(ignoreErrorsOption);
parser.addPositionalArgument(QObject::tr("file"), QObject::tr("Database file to open"));
@@ -37,16 +61,66 @@ QString cliHandleCmdLineArgs()
if (parser.isSet(debugOption))
setCliDebug(true);
+ if (parser.isSet(codecListOption))
+ {
+ for (QString& codec : textCodecNames())
+ qOut << codec << "\n";
+
+ qOut.flush();
+ return true;
+ }
+
+ if (parser.isSet((sqlFileCodecOption)))
+ {
+ CliOpts::sqlScriptCodec = parser.value(sqlFileCodecOption);
+ if (!textCodecNames().contains(CliOpts::sqlScriptCodec))
+ {
+ qErr << QObject::tr("Invalid codec: %1. Use -cl option to list available codecs.").arg(CliOpts::sqlScriptCodec) << "\n";
+ qErr.flush();
+ return true;
+ }
+ }
+ else
+ CliOpts::sqlScriptCodec = defaultCodecName();
+
+ if (parser.isSet(ignoreErrorsOption))
+ CliOpts::ignoreErrors = true;
+
+ if (parser.isSet(execSqlOption))
+ CliOpts::sqlScriptToExecute = parser.value(execSqlOption);
+
if (parser.isSet(listPluginsOption))
- listPlugins = true;
+ CliOpts::listPlugins = true;
CompletionHelper::enableLemonDebug = parser.isSet(lemonDebugOption);
QStringList args = parser.positionalArguments();
if (args.size() > 0)
- return args[0];
+ CliOpts::dbToOpen = args[0];
- return QString();
+ return false;
+}
+
+int cliExecSqlFromFile(const QString& dbToOpen)
+{
+ if (dbToOpen.isEmpty())
+ {
+ qErr << QObject::tr("Database file argument is mandatory when executing SQL file.") << "\n";
+ qErr.flush();
+ return 1;
+ }
+ if (!CLI::getInstance()->openDbFile(dbToOpen))
+ {
+ qErr << QObject::tr("Could not open specified database for executing SQL file. You may try using -d option to find out more details.") << "\n";
+ qErr.flush();
+ return 1;
+ }
+
+ Db* db = CLI::getInstance()->getCurrentDb();
+
+ SqlFileExecutor executor;
+ executor.execSqlFromFile(db, CliOpts::sqlScriptToExecute, CliOpts::ignoreErrors, CliOpts::sqlScriptCodec, false);
+ return 0;
}
int main(int argc, char *argv[])
@@ -58,30 +132,34 @@ int main(int argc, char *argv[])
qInstallMessageHandler(cliMessageHandler);
- QString dbToOpen = cliHandleCmdLineArgs();
+ if (cliHandleCmdLineArgs())
+ return 0;
- CliResultsDisplay::staticInit();
initCliUtils();
+ CliResultsDisplay::staticInit();
SQLITESTUDIO->setInitialTranslationFiles({"coreSQLiteStudio", "sqlitestudiocli"});
SQLITESTUDIO->init(a.arguments(), false);
SQLITESTUDIO->initPlugins();
- if (listPlugins)
+ if (CliOpts::listPlugins)
{
- for (const PluginManager::PluginDetails& details : PLUGINS->getAllPluginDetails())
+ for (PluginManager::PluginDetails& details : PLUGINS->getAllPluginDetails())
qOut << details.name << " " << details.versionString << "\n";
return 0;
}
+ if (!CliOpts::sqlScriptToExecute.isNull())
+ return cliExecSqlFromFile(CliOpts::dbToOpen);
+
CliCommandExecutor executor;
QObject::connect(CLI::getInstance(), &CLI::execCommand, &executor, &CliCommandExecutor::execCommand);
QObject::connect(&executor, &CliCommandExecutor::executionComplete, CLI::getInstance(), &CLI::executionComplete);
- if (!dbToOpen.isEmpty())
- CLI::getInstance()->openDbFile(dbToOpen);
+ if (!CliOpts::dbToOpen.isEmpty())
+ CLI::getInstance()->openDbFile(CliOpts::dbToOpen);
CLI::getInstance()->start();
int res = a.exec();