This commit is contained in:
Hamed Masafi 2019-07-18 11:39:31 +04:30
parent 65b94d363b
commit 4e0731f50d
2 changed files with 27 additions and 21 deletions

View File

@ -102,14 +102,15 @@ public slots:
Q_PROPERTY(keytype name##Id READ read##Id WRITE write##Id) \ Q_PROPERTY(keytype name##Id READ read##Id WRITE write##Id) \
public: \ public: \
Nut::Row<type> read() const; \ Nut::Row<type> read() const; \
void write(Nut::Row<type> name); \ keytype read##Id() const; \
static NUT_WRAP_NAMESPACE(FieldPhrase<keytype>)& name##Id ## Field(){ \ static NUT_WRAP_NAMESPACE(FieldPhrase<keytype>)& name##Id ## Field(){ \
static NUT_WRAP_NAMESPACE(FieldPhrase<keytype>) f = \ static NUT_WRAP_NAMESPACE(FieldPhrase<keytype>) f = \
NUT_WRAP_NAMESPACE(FieldPhrase<keytype>) \ NUT_WRAP_NAMESPACE(FieldPhrase<keytype>) \
(staticMetaObject.className(), #name); \ (staticMetaObject.className(), #name); \
return f; \ return f; \
} \ } \
keytype read##Id() const; \ public slots: \
void write(Nut::Row<type> name); \
void write##Id(keytype name##Id); void write##Id(keytype name##Id);
#define NUT_FOREIGN_KEY_IMPLEMENT(class, type, keytype, name, read, write) \ #define NUT_FOREIGN_KEY_IMPLEMENT(class, type, keytype, name, read, write) \

View File

@ -288,34 +288,35 @@ Q_OUTOFLINE_TEMPLATE RowList<T> Query<T>::toList(int count)
data.lastKeyValue = q.value(data.keyFiledname); data.lastKeyValue = q.value(data.keyFiledname);
//create table row //create table row
Table *tbl; Table *table;
Row<Table> table; Row<Table> tablePointer;
const QMetaObject *childMetaObject;
if (data.table->className() == d->className) { if (data.table->className() == d->className) {
tbl = new T; table = new T;
childMetaObject = &T::staticMetaObject;
// table = Nut::create<T>(); // table = Nut::create<T>();
#ifdef NUT_SHARED_POINTER #ifdef NUT_SHARED_POINTER
table.reset(tbl); tablePointer.reset(table);
returnList.append(qSharedPointerCast<T>(table)); returnList.append(qSharedPointerCast<T>(tablePointer));
#else #else
returnList.append(qobject_cast<T>(table1)); returnList.append(qobject_cast<T>(table1));
#endif #endif
d->tableSet->add(table); d->tableSet->add(tablePointer);
// table->setParentTableSet(d->tableSet); // table->setParentTableSet(d->tableSet);
} else { } else {
const QMetaObject *childMetaObject childMetaObject = QMetaType::metaObjectForType(data.table->typeId());
= QMetaType::metaObjectForType(data.table->typeId()); table = qobject_cast<Table *>(childMetaObject->newInstance());
tbl = qobject_cast<Table *>(childMetaObject->newInstance()); if (!table)
if (!tbl)
qFatal("Could not create instance of %s", qFatal("Could not create instance of %s",
qPrintable(data.table->name())); qPrintable(data.table->name()));
table.reset(tbl); tablePointer.reset(table);
} }
QList<FieldModel*> childFields = data.table->fields(); QList<FieldModel*> childFields = data.table->fields();
foreach (FieldModel *field, childFields) foreach (FieldModel *field, childFields)
table->setProperty(field->name.toLatin1().data(), tablePointer->setProperty(field->name.toLatin1().data(),
d->database->sqlGenertor()->unescapeValue( d->database->sqlGenertor()->unescapeValue(
field->type, field->type,
q.value(data.table->name() + "." + field->name))); q.value(data.table->name() + "." + field->name)));
@ -325,7 +326,11 @@ Q_OUTOFLINE_TEMPLATE RowList<T> Query<T>::toList(int count)
#ifdef NUT_SHARED_POINTER #ifdef NUT_SHARED_POINTER
QString mName = QString("set%1").arg(levels[master].lastRow->metaObject()->className()); QString mName = QString("set%1").arg(levels[master].lastRow->metaObject()->className());
QString type = QString("Nut::Row<%1>").arg(levels[master].lastRow->metaObject()->className()); QString type = QString("Nut::Row<%1>").arg(levels[master].lastRow->metaObject()->className());
bool ok = tbl->metaObject()->invokeMethod(tbl, for (int i = 0; i < table->metaObject()->methodCount(); ++i) {
QMetaMethod m = table->metaObject()->method(i);
qDebug() << m.name();
}
bool ok = table->metaObject()->invokeMethod(table,
mName.toLocal8Bit().data(), mName.toLocal8Bit().data(),
QGenericArgument(type.toLatin1().data(), levels[master].lastRow)); QGenericArgument(type.toLatin1().data(), levels[master].lastRow));
#else #else
@ -335,22 +340,22 @@ Q_OUTOFLINE_TEMPLATE RowList<T> Query<T>::toList(int count)
if (!ok) if (!ok)
qWarning("Unable to set property %s::%s", qWarning("Unable to set property %s::%s",
table->metaObject()->className(), data.masterFields[i].toLocal8Bit().data()); tablePointer->metaObject()->className(), data.masterFields[i].toLocal8Bit().data());
auto tableset = levels[master].lastRow->childTableSet( auto tableset = levels[master].lastRow->childTableSet(
data.table->className()); data.table->className());
// table->setParentTableSet(tableset); // table->setParentTableSet(tableset);
//#ifdef NUT_SHARED_POINTER //#ifdef NUT_SHARED_POINTER
tableset->add(table); tableset->add(tablePointer);
//#endif //#endif
} }
table->setStatus(Table::FeatchedFromDB); tablePointer->setStatus(Table::FeatchedFromDB);
table->setParent(this); tablePointer->setParent(this);
table->clear(); tablePointer->clear();
//set last created row //set last created row
data.lastRow = tbl;///*QSharedPointer<Table>*/(table.data()); data.lastRow = table;///*QSharedPointer<Table>*/(table.data());
} //while } //while
} // while } // while