bulk inserter [skip ci]
This commit is contained in:
parent
f555515e5e
commit
1b02d795a9
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue