aboutsummaryrefslogtreecommitdiffstats
path: root/Plugins/CsvImport/csvimport.cpp
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2014-12-06 17:33:25 -0500
committerLibravatarUnit 193 <unit193@ubuntu.com>2014-12-06 17:33:25 -0500
commit7167ce41b61d2ba2cdb526777a4233eb84a3b66a (patch)
treea35c14143716e1f2c98f808c81f89426045a946f /Plugins/CsvImport/csvimport.cpp
Imported Upstream version 2.99.6upstream/2.99.6
Diffstat (limited to 'Plugins/CsvImport/csvimport.cpp')
-rw-r--r--Plugins/CsvImport/csvimport.cpp206
1 files changed, 206 insertions, 0 deletions
diff --git a/Plugins/CsvImport/csvimport.cpp b/Plugins/CsvImport/csvimport.cpp
new file mode 100644
index 0000000..cec81df
--- /dev/null
+++ b/Plugins/CsvImport/csvimport.cpp
@@ -0,0 +1,206 @@
+#include "csvimport.h"
+#include "services/importmanager.h"
+#include "sqlitestudio.h"
+#include "services/notifymanager.h"
+#include <QVariant>
+#include <QFile>
+#include <QTextStream>
+
+CsvImport::CsvImport()
+{
+}
+
+QString CsvImport::getDataSourceTypeName() const
+{
+ return "CSV";
+}
+
+ImportManager::StandardConfigFlags CsvImport::standardOptionsToEnable() const
+{
+ return ImportManager::CODEC|ImportManager::FILE_NAME;
+}
+
+bool CsvImport::beforeImport(const ImportManager::StandardImportConfig& config)
+{
+ defineCsvFormat();
+
+ file = new QFile(config.inputFileName);
+ if (!file->open(QFile::ReadOnly) || !file->isReadable())
+ {
+ notifyError(tr("Cannot read file %1").arg(config.inputFileName));
+ safe_delete(file);
+ return false;
+ }
+
+ stream = new QTextStream(file);
+ stream->setCodec(config.codec.toLatin1().data());
+
+ if (!extractColumns())
+ {
+ safe_delete(stream);
+ safe_delete(file);
+ return false;
+ }
+
+ return true;
+}
+
+void CsvImport::afterImport()
+{
+ safe_delete(stream);
+ safe_delete(file);
+}
+
+bool CsvImport::extractColumns()
+{
+ QString line = stream->readLine();
+ while (line.trimmed().isEmpty() && !stream->atEnd())
+ line = stream->readLine();
+
+ if (line.trimmed().isEmpty())
+ {
+ notifyError(tr("Could not find any data in the file %1.").arg(file->fileName()));
+ return false;
+ }
+
+ QStringList deserialized = CsvSerializer::deserialize(line.trimmed(), csvFormat).first();
+ if (cfg.CsvImport.FirstRowAsColumns.get())
+ {
+ columnNames = deserialized;
+ }
+ else
+ {
+ static const QString colTmp = QStringLiteral("column%1");
+ columnNames.clear();
+ for (int i = 1, total = deserialized.size(); i <= total; ++i)
+ columnNames << colTmp.arg(i);
+
+ stream->seek(0);
+ }
+
+ return true;
+}
+
+void CsvImport::defineCsvFormat()
+{
+ csvFormat = CsvFormat();
+ csvFormat.rowSeparator = '\n';
+
+ switch (cfg.CsvImport.Separator.get())
+ {
+ case 0:
+ csvFormat.columnSeparator = ',';
+ break;
+ case 1:
+ csvFormat.columnSeparator = ';';
+ break;
+ case 2:
+ csvFormat.columnSeparator = '\t';
+ break;
+ case 3:
+ csvFormat.columnSeparator = ' ';
+ break;
+ default:
+ csvFormat.columnSeparator = cfg.CsvImport.CustomSeparator.get();
+ break;
+ }
+}
+
+QList<ImportPlugin::ColumnDefinition> CsvImport::getColumns() const
+{
+ QList<ImportPlugin::ColumnDefinition> columnList;
+ for (const QString& colName : columnNames)
+ columnList << ImportPlugin::ColumnDefinition(colName, QString());
+
+ return columnList;
+}
+
+QList<QVariant> CsvImport::next()
+{
+ QString line = stream->readLine();
+ if (line.isNull())
+ return QList<QVariant>();
+
+ QList<QVariant> values;
+ QList<QStringList> deserialized = CsvSerializer::deserialize(line, csvFormat);
+ if (deserialized.size() > 0)
+ {
+ if (cfg.CsvImport.NullValues.get())
+ {
+ QString nullVal = cfg.CsvImport.NullValueString.get();
+ for (const QString& val : deserialized.first())
+ {
+ if (val == nullVal)
+ values << QVariant(QVariant::String);
+ else
+ values << val;
+ }
+ }
+ else
+ {
+ for (const QString& val : deserialized.first())
+ values << val;
+ }
+ }
+
+ return values;
+}
+
+CfgMain* CsvImport::getConfig()
+{
+ return &cfg;
+}
+
+QString CsvImport::getImportConfigFormName() const
+{
+ return "csvImportOptions";
+}
+
+bool CsvImport::validateOptions()
+{
+ bool isValid = true;
+ if (cfg.CsvImport.Separator.get() >= 4)
+ {
+ IMPORT_MANAGER->updateVisibilityAndEnabled(cfg.CsvImport.CustomSeparator, true, true);
+
+ bool valid = !cfg.CsvImport.CustomSeparator.get().isEmpty();
+ IMPORT_MANAGER->handleValidationFromPlugin(valid, cfg.CsvImport.CustomSeparator, tr("Enter the custom separator character."));
+ isValid &= valid;
+ }
+ else
+ {
+ IMPORT_MANAGER->updateVisibilityAndEnabled(cfg.CsvImport.CustomSeparator, true, false);
+ IMPORT_MANAGER->handleValidationFromPlugin(true, cfg.CsvImport.CustomSeparator);
+ }
+
+ if (cfg.CsvImport.NullValues.get())
+ {
+ IMPORT_MANAGER->updateVisibilityAndEnabled(cfg.CsvImport.NullValueString, true, true);
+
+ bool valid = !cfg.CsvImport.NullValueString.get().isEmpty();
+ IMPORT_MANAGER->handleValidationFromPlugin(valid, cfg.CsvImport.NullValueString, tr("Enter the value that will be interpreted as a NULL."));
+ isValid &= valid;
+ }
+ else
+ {
+ IMPORT_MANAGER->updateVisibilityAndEnabled(cfg.CsvImport.NullValueString, true, false);
+ IMPORT_MANAGER->handleValidationFromPlugin(true, cfg.CsvImport.NullValueString);
+ }
+ return isValid;
+}
+
+QString CsvImport::getFileFilter() const
+{
+ return tr("CSV files (*.csv);;Text files (*.txt);;All files (*)");
+}
+
+bool CsvImport::init()
+{
+ Q_INIT_RESOURCE(csvimport);
+ return GenericPlugin::init();
+}
+
+void CsvImport::deinit()
+{
+ Q_CLEANUP_RESOURCE(csvimport);
+}