bulk inserter [skip ci]

This commit is contained in:
Hamed Masafi 2019-03-07 20:18:48 +03:30
parent f555515e5e
commit 1b02d795a9
5 changed files with 59 additions and 7 deletions

View File

@ -1,20 +1,43 @@
#include "bulkinserter.h" #include "bulkinserter.h"
#include "phrases/phraselist.h" #include "phrases/phraselist.h"
#include "database.h"
#include "generators/sqlgeneratorbase_p.h"
#include "databasemodel.h"
Nut::BulkInserter::BulkInserter(QString &className) #include <QDebug>
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) void Nut::BulkInserter::setFields(const Nut::PhraseList &ph)
{ {
_fields = ph;
_fieldCount = static_cast<size_t>(ph.data.count());
} }
void Nut::BulkInserter::insert(std::initializer_list<QVariant> vars) void Nut::BulkInserter::insert(std::initializer_list<QVariant> vars)
{ {
std::initializer_list<QVariant>::iterator it; // same as: const int* it if (vars.size() != _fieldCount) {
qInfo("Number of rows mstake");
return;
}
QVariantList list;
std::initializer_list<QVariant>::iterator it;
for (it = vars.begin(); it != vars.end(); ++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();
} }

View File

@ -4,14 +4,22 @@
#include <initializer_list> #include <initializer_list>
#include <QDebug> #include <QDebug>
#include "defines.h" #include "defines.h"
#include "phrases/phraselist.h"
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
class PhraseList; class PhraseList;
class Database;
class BulkInserter class BulkInserter
{ {
Database *_database;
QString _className;
Nut::PhraseList _fields;
QList<QVariantList> variants;
size_t _fieldCount;
public: public:
BulkInserter(QString &className); BulkInserter(Database *db, QString &className);
void setFields(const PhraseList &ph); void setFields(const PhraseList &ph);
void insert(std::initializer_list<QVariant> vars); void insert(std::initializer_list<QVariant> vars);
@ -19,6 +27,7 @@ public:
void insert(Args... args) { void insert(Args... args) {
insert({args...}); insert({args...});
} }
int apply();
}; };
NUT_END_NAMESPACE NUT_END_NAMESPACE

View File

@ -123,6 +123,25 @@ QString SqlGeneratorBase::recordsPhrase(TableModel *table)
return ret; return ret;
} }
QString SqlGeneratorBase::insertBulk(const QString &tableName, const PhraseList &ph, const QList<QVariantList> &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 SqlGeneratorBase::fieldDeclare(FieldModel *field)
{ {
QString type = fieldType(field); QString type = fieldType(field);

View File

@ -104,6 +104,7 @@ public:
virtual QString recordsPhrase(TableModel *table); virtual QString recordsPhrase(TableModel *table);
virtual QString insertBulk(const QString &tableName, const PhraseList &ph, const QList<QVariantList> &vars);
virtual QString insertRecord(Table *t, QString tableName); virtual QString insertRecord(Table *t, QString tableName);
virtual QString updateRecord(Table *t, QString tableName); virtual QString updateRecord(Table *t, QString tableName);
virtual QString deleteRecord(Table *t, QString tableName); virtual QString deleteRecord(Table *t, QString tableName);

View File

@ -82,7 +82,7 @@ Q_OUTOFLINE_TEMPLATE Query<T> *TableSet<T>::query(bool autoDelete)
template<class T> template<class T>
Q_OUTOFLINE_TEMPLATE BulkInserter *TableSet<T>::bulkInserter() Q_OUTOFLINE_TEMPLATE BulkInserter *TableSet<T>::bulkInserter()
{ {
BulkInserter *bi = new BulkInserter(_childClassName); BulkInserter *bi = new BulkInserter(_database, _childClassName);
return bi; return bi;
} }