void FLAccessControlTable::setFromObject(QObject *obj) { FLTableMetaData *tm = ::qt_cast<FLTableMetaData *>(obj); if (!tm) return; if (acosPerms_) { acosPerms_->clear(); delete acosPerms_; } acosPerms_ = new QDict < QString >(31); acosPerms_->setAutoDelete(true); const FLTableMetaData::FLFieldMetaDataList *fL = tm->fieldList(); if (!fL) return; FLFieldMetaData *field; QChar permR, permW; QDictIterator<FLFieldMetaData> it(*fL); while ((field = it.current()) != 0) { ++it; permR = '-'; permW = '-'; if (field->visible()) permR = 'r'; if (field->editable()) permW = 'w'; acosPerms_->replace(field->name(), new QString(QString(permR) + permW)); } }
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; }