bulk inserter [skip ci]
This commit is contained in:
parent
f555515e5e
commit
1b02d795a9
|
|
@ -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 <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)
|
||||
{
|
||||
|
||||
_fields = ph;
|
||||
_fieldCount = static_cast<size_t>(ph.data.count());
|
||||
}
|
||||
|
||||
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)
|
||||
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 <QDebug>
|
||||
#include "defines.h"
|
||||
#include "phrases/phraselist.h"
|
||||
|
||||
NUT_BEGIN_NAMESPACE
|
||||
|
||||
class PhraseList;
|
||||
class Database;
|
||||
class BulkInserter
|
||||
{
|
||||
Database *_database;
|
||||
QString _className;
|
||||
Nut::PhraseList _fields;
|
||||
QList<QVariantList> variants;
|
||||
size_t _fieldCount;
|
||||
|
||||
public:
|
||||
BulkInserter(QString &className);
|
||||
BulkInserter(Database *db, QString &className);
|
||||
void setFields(const PhraseList &ph);
|
||||
|
||||
void insert(std::initializer_list<QVariant> vars);
|
||||
|
|
@ -19,6 +27,7 @@ public:
|
|||
void insert(Args... args) {
|
||||
insert({args...});
|
||||
}
|
||||
int apply();
|
||||
};
|
||||
|
||||
NUT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -123,6 +123,25 @@ QString SqlGeneratorBase::recordsPhrase(TableModel *table)
|
|||
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 type = fieldType(field);
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@ public:
|
|||
|
||||
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 updateRecord(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>
|
||||
Q_OUTOFLINE_TEMPLATE BulkInserter *TableSet<T>::bulkInserter()
|
||||
{
|
||||
BulkInserter *bi = new BulkInserter(_childClassName);
|
||||
BulkInserter *bi = new BulkInserter(_database, _childClassName);
|
||||
return bi;
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue