diff --git a/src/database.cpp b/src/database.cpp index f277f23..b2ad6b6 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -308,6 +308,7 @@ Database::Database(QObject *parent) // d->changeLogs->sett DatabasePrivate::lastId++; // m__change_logs = new TableSet(this); + qDebug() << "normal constructor called in database"; } Database::Database(const Database &other, QObject *parent) @@ -323,6 +324,7 @@ Database::Database(const Database &other, QObject *parent) setUserName(other.userName()); setPassword(other.password()); + qDebug() << "copy constructor called in database"; // m__change_logs = new TableSet(this); } diff --git a/src/query.h b/src/query.h index 1c3b02b..8771079 100644 --- a/src/query.h +++ b/src/query.h @@ -48,12 +48,15 @@ public: ~Query(); - QList toList(int count = -1); int remove(); T *first(); int count(); + QList toList(int count = -1); + + template + QList select(const FieldPhrase f); QVariant max(FieldPhrase &f); QVariant min(FieldPhrase &f); QVariant average(FieldPhrase &f); @@ -104,7 +107,7 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) // QSqlQuery q = d->database->exec(d->database->sqlGenertor()->selectCommand(d->wheres, d->orders, d->tableName, d->joinClassName)); QString sql = d->database->sqlGenertor()->selectCommand( - SqlGeneratorBase::SelectALl, + SqlGeneratorBase::SelectAll, "", d->wheres, d->orderPhrases, @@ -179,6 +182,30 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) return result; } +template +template +Q_OUTOFLINE_TEMPLATE QList Query::select(const FieldPhrase f) +{ + Q_D(Query); + QList ret; + QString sql = d->database->sqlGenertor()->selectCommand( + SqlGeneratorBase::SignleField, + f.data()->text, + d->wheres, + d->orderPhrases, + d->tableName, + d->joinClassName); + QSqlQuery q = d->database->exec(sql); + + while (q.next()) { + QVariant v = q.value(f.data()->text); + ret.append(v.value()); + } + + deleteLater(); + return ret; +} + template Q_OUTOFLINE_TEMPLATE T *Query::first() { diff --git a/src/sqlgeneratorbase.cpp b/src/sqlgeneratorbase.cpp index 3c69fe5..ee8d269 100644 --- a/src/sqlgeneratorbase.cpp +++ b/src/sqlgeneratorbase.cpp @@ -220,7 +220,7 @@ QString SqlGeneratorBase::deleteRecord(Table *t, QString tableName) QString SqlGeneratorBase::agregateText(const AgregateType &t, const QString &arg) const { switch (t) { - case SelectALl: + case SelectAll: return "*"; break; @@ -240,6 +240,10 @@ QString SqlGeneratorBase::agregateText(const AgregateType &t, const QString &arg return "COUNT(" + arg + ")"; break; + case SignleField: + return arg; + break; + default: return QString::null; } @@ -309,6 +313,34 @@ QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t, QStrin return sql; } +QString SqlGeneratorBase::selectCommand(QString selectPhrase, QString agregateArg, + QList &wheres, QList &orders, + QString tableName, QString joinClassName) +{ + QString where = createWhere(wheres); + QString order = ""; + QString from = fromTableText(tableName, joinClassName, order); + + foreach(WherePhrase p, orders){ + if(order != "") + order.append(", "); + order.append(phraseOrder(p.data())); + } + + QString sql = "SELECT " + selectPhrase + " FROM " + from; + + if(where != "") + sql.append(" WHERE " + where); + + if(order != "") + sql.append(" ORDER BY " + order); + + for(int i = 0; i < _database->model().count(); i++) + sql = sql.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + "."); + + return sql; +} + QString SqlGeneratorBase::selectCommand(QList &wheres, QHash &orders, QString tableName, QString joinClassName) { return selectCommand("*", wheres, orders, tableName, joinClassName); diff --git a/src/sqlgeneratorbase_p.h b/src/sqlgeneratorbase_p.h index c309c9d..e9e5c56 100644 --- a/src/sqlgeneratorbase_p.h +++ b/src/sqlgeneratorbase_p.h @@ -48,11 +48,12 @@ public: Delete }; enum AgregateType{ - SelectALl, + SelectAll, Count, Min, Max, - Average + Average, + SignleField }; SqlGeneratorBase(Database *parent); @@ -79,6 +80,10 @@ public: QList &wheres, QList &orders, QString tableName, QString joinClassName); + virtual QString selectCommand(QString selectPhrase, QString agregateArg, + QList &wheres, QList &orders, + QString tableName, QString joinClassName); + virtual QString selectCommand(QList &wheres, QHash &orders, QString tableName, QString joinClassName); virtual QString selectCommand(QString selectPhrase,