From 1b02d795a997f1ad1e3a3a4d39ea44b929ebf939 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Thu, 7 Mar 2019 20:18:48 +0330 Subject: [PATCH] bulk inserter [skip ci] --- src/bulkinserter.cpp | 33 ++++++++++++++++++++++++----- src/bulkinserter.h | 11 +++++++++- src/generators/sqlgeneratorbase.cpp | 19 +++++++++++++++++ src/generators/sqlgeneratorbase_p.h | 1 + src/tableset.h | 2 +- 5 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/bulkinserter.cpp b/src/bulkinserter.cpp index 43bbc6d..f39f7e9 100644 --- a/src/bulkinserter.cpp +++ b/src/bulkinserter.cpp @@ -1,20 +1,43 @@ #include "bulkinserter.h" #include "phrases/phraselist.h" +#include "database.h" +#include "generators/sqlgeneratorbase_p.h" +#include "databasemodel.h" -Nut::BulkInserter::BulkInserter(QString &className) +#include + +Nut::BulkInserter::BulkInserter(Nut::Database *db, QString &className) + : _database(db), _fieldCount(0) { - + foreach (TableModel *m, db->model()) + if (m->className() == className) + _className = m->name(); } void Nut::BulkInserter::setFields(const Nut::PhraseList &ph) { - + _fields = ph; + _fieldCount = static_cast(ph.data.count()); } void Nut::BulkInserter::insert(std::initializer_list vars) { - std::initializer_list::iterator it; // same as: const int* it + if (vars.size() != _fieldCount) { + qInfo("Number of rows mstake"); + return; + } + + QVariantList list; + std::initializer_list::iterator it; for (it = vars.begin(); it != vars.end(); ++it) - qDebug() << *it; + list.append(*it); + variants.append(list); +} + +int Nut::BulkInserter::apply() +{ + auto sql = _database->sqlGenertor()->insertBulk(_className, _fields, variants); + QSqlQuery q = _database->exec(sql); + return q.numRowsAffected(); } diff --git a/src/bulkinserter.h b/src/bulkinserter.h index 03d0dab..04df4b2 100644 --- a/src/bulkinserter.h +++ b/src/bulkinserter.h @@ -4,14 +4,22 @@ #include #include #include "defines.h" +#include "phrases/phraselist.h" NUT_BEGIN_NAMESPACE class PhraseList; +class Database; class BulkInserter { + Database *_database; + QString _className; + Nut::PhraseList _fields; + QList variants; + size_t _fieldCount; + public: - BulkInserter(QString &className); + BulkInserter(Database *db, QString &className); void setFields(const PhraseList &ph); void insert(std::initializer_list vars); @@ -19,6 +27,7 @@ public: void insert(Args... args) { insert({args...}); } + int apply(); }; NUT_END_NAMESPACE diff --git a/src/generators/sqlgeneratorbase.cpp b/src/generators/sqlgeneratorbase.cpp index 72a30cd..1c9cafe 100644 --- a/src/generators/sqlgeneratorbase.cpp +++ b/src/generators/sqlgeneratorbase.cpp @@ -123,6 +123,25 @@ QString SqlGeneratorBase::recordsPhrase(TableModel *table) return ret; } +QString SqlGeneratorBase::insertBulk(const QString &tableName, const PhraseList &ph, const QList &vars) +{ + QString sql; + foreach (QVariantList list, vars) { + QStringList values; + foreach (QVariant v, list) + values.append(escapeValue(v)); + + if (!sql.isEmpty()) + sql.append(", "); + sql.append("(" + values.join(", ") + ")"); + } + sql = "INSERT INTO " + tableName + "(" + createFieldPhrase(ph) + + ") VALUES" + sql; + + removeTableNames(sql); + return sql; +} + QString SqlGeneratorBase::fieldDeclare(FieldModel *field) { QString type = fieldType(field); diff --git a/src/generators/sqlgeneratorbase_p.h b/src/generators/sqlgeneratorbase_p.h index fc35110..bb67f9c 100644 --- a/src/generators/sqlgeneratorbase_p.h +++ b/src/generators/sqlgeneratorbase_p.h @@ -104,6 +104,7 @@ public: virtual QString recordsPhrase(TableModel *table); + virtual QString insertBulk(const QString &tableName, const PhraseList &ph, const QList &vars); virtual QString insertRecord(Table *t, QString tableName); virtual QString updateRecord(Table *t, QString tableName); virtual QString deleteRecord(Table *t, QString tableName); diff --git a/src/tableset.h b/src/tableset.h index 5ae6525..6442403 100644 --- a/src/tableset.h +++ b/src/tableset.h @@ -82,7 +82,7 @@ Q_OUTOFLINE_TEMPLATE Query *TableSet::query(bool autoDelete) template Q_OUTOFLINE_TEMPLATE BulkInserter *TableSet::bulkInserter() { - BulkInserter *bi = new BulkInserter(_childClassName); + BulkInserter *bi = new BulkInserter(_database, _childClassName); return bi; }