aboutsummaryrefslogtreecommitdiffstats
path: root/Plugins/CsvExport
diff options
context:
space:
mode:
Diffstat (limited to 'Plugins/CsvExport')
-rw-r--r--Plugins/CsvExport/CsvExport.pro29
-rw-r--r--Plugins/CsvExport/CsvExport.ui100
-rw-r--r--Plugins/CsvExport/csvexport.cpp191
-rw-r--r--Plugins/CsvExport/csvexport.h56
-rw-r--r--Plugins/CsvExport/csvexport.json7
-rw-r--r--Plugins/CsvExport/csvexport.qrc5
-rw-r--r--Plugins/CsvExport/csvexport_global.h12
7 files changed, 400 insertions, 0 deletions
diff --git a/Plugins/CsvExport/CsvExport.pro b/Plugins/CsvExport/CsvExport.pro
new file mode 100644
index 0000000..9ffc8f9
--- /dev/null
+++ b/Plugins/CsvExport/CsvExport.pro
@@ -0,0 +1,29 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2014-06-14T16:04:07
+#
+#-------------------------------------------------
+
+include($$PWD/../../SQLiteStudio3/plugins.pri)
+
+QT -= gui
+
+TARGET = CsvExport
+TEMPLATE = lib
+
+DEFINES += CSVEXPORT_LIBRARY
+
+SOURCES += csvexport.cpp
+
+HEADERS += csvexport.h\
+ csvexport_global.h
+
+FORMS += \
+ CsvExport.ui
+
+OTHER_FILES += \
+ csvexport.json
+
+RESOURCES += \
+ csvexport.qrc
+
diff --git a/Plugins/CsvExport/CsvExport.ui b/Plugins/CsvExport/CsvExport.ui
new file mode 100644
index 0000000..ec80b57
--- /dev/null
+++ b/Plugins/CsvExport/CsvExport.ui
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>CsvExport</class>
+ <widget class="QWidget" name="CsvExport">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>312</width>
+ <height>90</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="3">
+ <widget class="QCheckBox" name="columnsCheck">
+ <property name="text">
+ <string>Column names in first row</string>
+ </property>
+ <property name="cfg" stdset="0">
+ <string>CsvExport.ColumnsInFirstRow</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Column separator:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QComboBox" name="comboBox">
+ <property name="cfg" stdset="0">
+ <string>CsvExport.Separator</string>
+ </property>
+ <item>
+ <property name="text">
+ <string>, (comma)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>; (semicolon)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>\t (tab)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string> (whitespace)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Custom:</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLineEdit" name="lineEdit">
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="cfg" stdset="0">
+ <string>CsvExport.CustomSeparator</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Export NULL values as:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="2">
+ <widget class="QLineEdit" name="lineEdit_2">
+ <property name="placeholderText">
+ <string>Empty string</string>
+ </property>
+ <property name="cfg" stdset="0">
+ <string>CsvExport.NullValueString</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Plugins/CsvExport/csvexport.cpp b/Plugins/CsvExport/csvexport.cpp
new file mode 100644
index 0000000..bdaf729
--- /dev/null
+++ b/Plugins/CsvExport/csvexport.cpp
@@ -0,0 +1,191 @@
+#include "csvexport.h"
+#include "common/unused.h"
+#include "services/exportmanager.h"
+#include "csvserializer.h"
+
+CsvExport::CsvExport()
+{
+}
+
+QString CsvExport::getFormatName() const
+{
+ return QStringLiteral("CSV");
+}
+
+ExportManager::StandardConfigFlags CsvExport::standardOptionsToEnable() const
+{
+ return ExportManager::CODEC;
+}
+
+ExportManager::ExportModes CsvExport::getSupportedModes() const
+{
+ return ExportManager::FILE|ExportManager::TABLE|ExportManager::QUERY_RESULTS|ExportManager::CLIPBOARD;
+}
+
+QString CsvExport::getExportConfigFormName() const
+{
+ return QStringLiteral("CsvExport");
+}
+
+CfgMain* CsvExport::getConfig()
+{
+ return &cfg;
+}
+
+void CsvExport::validateOptions()
+{
+ if (cfg.CsvExport.Separator.get() >= 4)
+ {
+ EXPORT_MANAGER->updateVisibilityAndEnabled(cfg.CsvExport.CustomSeparator, true, true);
+
+ bool valid = !cfg.CsvExport.CustomSeparator.get().isEmpty();
+ EXPORT_MANAGER->handleValidationFromPlugin(valid, cfg.CsvExport.CustomSeparator, tr("Enter the custom separator character."));
+ }
+ else
+ {
+ EXPORT_MANAGER->updateVisibilityAndEnabled(cfg.CsvExport.CustomSeparator, true, false);
+ EXPORT_MANAGER->handleValidationFromPlugin(true, cfg.CsvExport.CustomSeparator);
+ }
+}
+
+QString CsvExport::defaultFileExtension() const
+{
+ return QStringLiteral("csv");
+}
+
+bool CsvExport::beforeExportQueryResults(const QString& query, QList<QueryExecutor::ResultColumnPtr>& columns, const QHash<ExportManager::ExportProviderFlag, QVariant> providedData)
+{
+ UNUSED(query);
+ UNUSED(providedData);
+ defineCsvFormat();
+
+ QStringList cols;
+ for (QueryExecutor::ResultColumnPtr resCol : columns)
+ cols << resCol->displayName;
+
+ writeln(CsvSerializer::serialize(cols, format));
+ return true;
+}
+
+bool CsvExport::exportQueryResultsRow(SqlResultsRowPtr row)
+{
+ exportTableRow(row);
+ return true;
+}
+
+bool CsvExport::exportTable(const QString& database, const QString& table, const QStringList& columnNames, const QString& ddl, SqliteCreateTablePtr createTable, const QHash<ExportManager::ExportProviderFlag, QVariant> providedData)
+{
+ UNUSED(database);
+ UNUSED(table);
+ UNUSED(ddl);
+ UNUSED(providedData);
+ UNUSED(createTable);
+ return exportTable(columnNames);
+}
+
+bool CsvExport::exportVirtualTable(const QString& database, const QString& table, const QStringList& columnNames, const QString& ddl, SqliteCreateVirtualTablePtr createTable, const QHash<ExportManager::ExportProviderFlag, QVariant> providedData)
+{
+ UNUSED(database);
+ UNUSED(table);
+ UNUSED(ddl);
+ UNUSED(providedData);
+ UNUSED(createTable);
+ return exportTable(columnNames);
+}
+
+bool CsvExport::exportTable(const QStringList& columnNames)
+{
+ if (!isTableExport())
+ return false;
+
+ defineCsvFormat();
+ writeln(CsvSerializer::serialize(columnNames, format));
+ return true;
+}
+
+bool CsvExport::exportTableRow(SqlResultsRowPtr data)
+{
+ QStringList valList;
+ QString nl = cfg.CsvExport.NullValueString.get();
+ for (const QVariant& val : data->valueList())
+ valList << (val.isNull() ? nl : val.toString());
+
+ writeln(CsvSerializer::serialize(valList, format));
+ return true;
+}
+
+bool CsvExport::beforeExportDatabase(const QString& database)
+{
+ UNUSED(database);
+ return false;
+}
+
+bool CsvExport::exportIndex(const QString& database, const QString& name, const QString& ddl, SqliteCreateIndexPtr createIndex)
+{
+ UNUSED(database);
+ UNUSED(name);
+ UNUSED(ddl);
+ UNUSED(createIndex);
+ if (isTableExport())
+ return true;
+
+ return false;
+}
+
+bool CsvExport::exportTrigger(const QString& database, const QString& name, const QString& ddl, SqliteCreateTriggerPtr createTrigger)
+{
+ UNUSED(database);
+ UNUSED(name);
+ UNUSED(ddl);
+ UNUSED(createTrigger);
+ if (isTableExport())
+ return true;
+
+ return false;
+}
+
+bool CsvExport::exportView(const QString& database, const QString& name, const QString& ddl, SqliteCreateViewPtr createView)
+{
+ UNUSED(database);
+ UNUSED(name);
+ UNUSED(ddl);
+ UNUSED(createView);
+ return false;
+}
+
+void CsvExport::defineCsvFormat()
+{
+ format = CsvFormat();
+ format.rowSeparator = '\n';
+
+ switch (cfg.CsvExport.Separator.get())
+ {
+ case 0:
+ format.columnSeparator = ',';
+ break;
+ case 1:
+ format.columnSeparator = ';';
+ break;
+ case 2:
+ format.columnSeparator = '\t';
+ break;
+ case 3:
+ format.columnSeparator = ' ';
+ break;
+ default:
+ format.columnSeparator = cfg.CsvExport.CustomSeparator.get();
+ break;
+ }
+}
+
+
+bool CsvExport::init()
+{
+ Q_INIT_RESOURCE(csvexport);
+ return GenericExportPlugin::init();
+}
+
+void CsvExport::deinit()
+{
+ Q_CLEANUP_RESOURCE(csvexport);
+}
diff --git a/Plugins/CsvExport/csvexport.h b/Plugins/CsvExport/csvexport.h
new file mode 100644
index 0000000..7ecde7c
--- /dev/null
+++ b/Plugins/CsvExport/csvexport.h
@@ -0,0 +1,56 @@
+#ifndef CSVEXPORT_H
+#define CSVEXPORT_H
+
+#include "csvexport_global.h"
+#include "plugins/genericexportplugin.h"
+#include "config_builder.h"
+#include "csvformat.h"
+
+CFG_CATEGORIES(CsvExportConfig,
+ CFG_CATEGORY(CsvExport,
+ CFG_ENTRY(bool, ColumnsInFirstRow, false)
+ CFG_ENTRY(int, Separator, 0)
+ CFG_ENTRY(QString, CustomSeparator, QString())
+ CFG_ENTRY(QString, NullValueString, QString())
+ )
+)
+
+class CSVEXPORTSHARED_EXPORT CsvExport : public GenericExportPlugin
+{
+ Q_OBJECT
+ SQLITESTUDIO_PLUGIN("csvexport.json")
+
+ public:
+ CsvExport();
+
+ QString getFormatName() const;
+ ExportManager::StandardConfigFlags standardOptionsToEnable() const;
+ ExportManager::ExportModes getSupportedModes() const;
+ QString getExportConfigFormName() const;
+ CfgMain* getConfig();
+ void validateOptions();
+ QString defaultFileExtension() const;
+ bool beforeExportQueryResults(const QString& query, QList<QueryExecutor::ResultColumnPtr>& columns,
+ const QHash<ExportManager::ExportProviderFlag,QVariant> providedData);
+ bool exportQueryResultsRow(SqlResultsRowPtr row);
+ bool exportTable(const QString& database, const QString& table, const QStringList& columnNames, const QString& ddl, SqliteCreateTablePtr createTable,
+ const QHash<ExportManager::ExportProviderFlag,QVariant> providedData);
+ bool exportVirtualTable(const QString& database, const QString& table, const QStringList& columnNames, const QString& ddl, SqliteCreateVirtualTablePtr createTable,
+ const QHash<ExportManager::ExportProviderFlag,QVariant> providedData);
+ bool exportTableRow(SqlResultsRowPtr data);
+ bool beforeExportDatabase(const QString& database);
+ bool exportIndex(const QString& database, const QString& name, const QString& ddl, SqliteCreateIndexPtr createIndex);
+ bool exportTrigger(const QString& database, const QString& name, const QString& ddl, SqliteCreateTriggerPtr createTrigger);
+ bool exportView(const QString& database, const QString& name, const QString& ddl, SqliteCreateViewPtr createView);
+ bool init();
+ void deinit();
+
+ private:
+ bool exportTable(const QStringList& columnNames);
+ void defineCsvFormat();
+
+ CFG_LOCAL(CsvExportConfig, cfg)
+ CsvFormat format;
+};
+
+#endif // CSVEXPORT_H
diff --git a/Plugins/CsvExport/csvexport.json b/Plugins/CsvExport/csvexport.json
new file mode 100644
index 0000000..57def5c
--- /dev/null
+++ b/Plugins/CsvExport/csvexport.json
@@ -0,0 +1,7 @@
+{
+ "type": "ExportPlugin",
+ "title": "CSV export",
+ "description": "Provides CSV format for exporting",
+ "version": 10000,
+ "author": "SalSoft"
+}
diff --git a/Plugins/CsvExport/csvexport.qrc b/Plugins/CsvExport/csvexport.qrc
new file mode 100644
index 0000000..21d7213
--- /dev/null
+++ b/Plugins/CsvExport/csvexport.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/forms">
+ <file>CsvExport.ui</file>
+ </qresource>
+</RCC>
diff --git a/Plugins/CsvExport/csvexport_global.h b/Plugins/CsvExport/csvexport_global.h
new file mode 100644
index 0000000..8bdf173
--- /dev/null
+++ b/Plugins/CsvExport/csvexport_global.h
@@ -0,0 +1,12 @@
+#ifndef CSVEXPORT_GLOBAL_H
+#define CSVEXPORT_GLOBAL_H
+
+#include <QtCore/qglobal.h>
+
+#if defined(CSVEXPORT_LIBRARY)
+# define CSVEXPORTSHARED_EXPORT Q_DECL_EXPORT
+#else
+# define CSVEXPORTSHARED_EXPORT Q_DECL_IMPORT
+#endif
+
+#endif // CSVEXPORT_GLOBAL_H