QString FLManager::formatAssignValue(FLFieldMetaData *fMD, const QVariant &v, const bool upper) { if (!fMD) return "1 = 1"; FLTableMetaData *mtd = fMD->metadata(); QString fieldName(fMD->name()); if (mtd && mtd->isQuery()) { QString prefixTable(mtd->name()); FLSqlQuery *qry = query(mtd->query()); if (qry) { QStringList fL(qry->fieldList()); for (QStringList::Iterator it = fL.begin(); it != fL.end(); ++it) { prefixTable = (*it).section('.', 0, 0); if ((*it).section('.', 1, 1) == fieldName) break; } qry->deleteLater(); } fieldName.prepend(prefixTable + "."); } return formatAssignValue(fieldName, fMD->type(), v, upper); }
FLTableMetaData *FLManager::metadata(QDomElement *mtd, bool quick) { if (!mtd) return 0; QString name, a, q; bool v = true, ed = true, cw = true, dl = false; QDomNode no = mtd->firstChild(); while (!no.isNull()) { QDomElement e = no.toElement(); if (!e.isNull()) { if (e.tagName() == "field") { no = no.nextSibling(); continue; } if (e.tagName() == "name") { name = e.text(); no = no.nextSibling(); continue; } if (e.tagName() == "query") { q = e.text(); no = no.nextSibling(); continue; } if (e.tagName() == "alias") { a = e.text().mid(30, e.text().length() - 32); a = FLUtil::translate("MetaData", a); no = no.nextSibling(); continue; } if (e.tagName() == "visible") { v = (e.text() == "true"); no = no.nextSibling(); continue; } if (e.tagName() == "editable") { ed = (e.text() == "true"); no = no.nextSibling(); continue; } if (e.tagName() == "concurWarn") { cw = (e.text() == "true"); no = no.nextSibling(); continue; } if (e.tagName() == "detectLocks") { dl = (e.text() == "true"); no = no.nextSibling(); continue; } } no = no.nextSibling(); } FLTableMetaData *tmd = new FLTableMetaData(name, a, q); FLCompoundKey *cK = 0; QStringList assocs; tmd->setConcurWarn(cw); tmd->setDetectLocks(dl); no = mtd->firstChild(); while (!no.isNull()) { QDomElement e = no.toElement(); if (!e.isNull()) { if (e.tagName() == "field") { FLFieldMetaData *f = metadataField(&e, v, ed); if (!tmd) tmd = new FLTableMetaData(name, a, q); tmd->addFieldMD(f); if (f->isCompoundKey()) { if (!cK) cK = new FLCompoundKey(); cK->addFieldMD(f); } if (!f->associatedFieldName().isEmpty()) { assocs.append(f->associatedFieldName()); assocs.append(f->associatedFieldFilterTo()); assocs.append(f->name()); } no = no.nextSibling(); continue; } } no = no.nextSibling(); } tmd->setCompoundKey(cK); QString aWith, aBy; for (QStringList::Iterator it = assocs.begin(); it != assocs.end(); ++it) { aWith = (*it); ++it; aBy = (*it); ++it; tmd->field((*it))->setAssociatedField(tmd->field(aWith), aBy); } if (!q.isEmpty() && !quick) { FLSqlQuery *qry = query(q, tmd); if (qry) { QStringList fL = qry->fieldList(); QString table, field; QString fields = tmd->fieldsNames(); for (QStringList::Iterator it = fL.begin(); it != fL.end(); ++it) { table = (*it).section('.', 0, 0); field = (*it).section('.', 1, 1); if (table == name || fields.contains(field.lower())) continue; FLTableMetaData *mtdAux = metadata(table, true); if (mtdAux) { FLFieldMetaData *fmtdAux = mtdAux->field(field); if (fmtdAux) { int typeAux = fmtdAux->type(); if (typeAux == FLFieldMetaData::Serial) typeAux = QVariant::UInt; tmd->addFieldMD(new FLFieldMetaData(field, fmtdAux->alias(), true, false, typeAux, fmtdAux->length(), false, fmtdAux->visible(), fmtdAux->editable(), fmtdAux->partInteger(), fmtdAux->partDecimal(), false, false, false, QVariant(), false, QString::null, fmtdAux->visibleGrid(), true, false)); } } } qry->deleteLater(); } } FLAccessControlLists *acl = aqApp ->acl(); if (acl) acl->process(tmd); return tmd; }