QStringList FLUtil::nombreCampos( const QString & tabla ) { QStringList res; if ( FLSqlConnections::database()->managerModules()->shaOfFile( tabla + ".mtd" ).isEmpty() ) return res; FLSqlCursor c( tabla ); FLTableMetaData * tmd = c.metadata(); if ( !tmd ) return res; res = QStringList::split( ",", tmd->fieldsNames() ); res.prepend( QString::number( res.size() ) ); return res; }
QSqlRecordInfo SqliteDriver::recordInfo(const QString &tablename) const { QSqlRecordInfo info; if (!isOpen() || !dataBase_) return info; QDomDocument doc(tablename); QDomElement docElem; QString stream = db_->managerModules()->contentCached(tablename + ".mtd"); if (!FLUtil::domDocumentSetContent(doc, stream)) { #ifdef FL_DEBUG qWarning("FLManager : " + QApplication::tr("Error al cargar los metadatos para la tabla %1").arg(tablename)); #endif return recordInfo2(tablename); } docElem = doc.documentElement(); FLTableMetaData *mtd = db_->manager()->metadata(&docElem, true); if (!mtd) return recordInfo2(tablename); FLTableMetaData::FLFieldMetaDataList *fl = mtd->fieldList(); if (!fl) { delete mtd; return recordInfo2(tablename); } if (fl->isEmpty()) { delete mtd; return recordInfo2(tablename); } QStringList fieldsNames = QStringList::split(",", mtd->fieldsNames()); for (QStringList::Iterator it = fieldsNames.begin(); it != fieldsNames.end(); ++it) { FLFieldMetaData *field = mtd->field((*it)); info.append(QSqlFieldInfo(field->name(), FLFieldMetaData::flDecodeType(field->type()))); } delete mtd; return info; }
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; }