QString FLManagerModules::contentStaticDir( const QString & n ) { QString str_ret( contentFS( staticDirFiles_ + "/" + n ) ); if ( !str_ret.isEmpty() ) { QString sha( FLUtil::sha1( str_ret ) ); QString * s = 0; if ( dictKeyFiles && ( s = ( *dictKeyFiles )[ n ] ) && *s == sha ) return QString::null; else if ( dictKeyFiles && n.endsWith( ".qs" ) ) dictKeyFiles->replace( n, new QString( sha ) ); if ( n.endsWith( ".mtd" ) ) { FLTableMetaData * mtd; QDomDocument doc( n ); QDomElement docElem; if ( FLUtil::domDocumentSetContent( doc, str_ret ) ) { FLManager * mgr = db_->manager(); docElem = doc.documentElement(); mtd = mgr->metadata( &docElem, true ); if ( !mtd || mtd->isQuery() ) return str_ret; if ( !mgr->existsTable( mtd->name() ) ) mgr->createTable( mtd ); else if ( db_->canRegenTables() ) db_->regenTable( mtd->name(), mtd ); } } } return str_ret; }
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); }
bool SqliteDriver::alterTable(const QString &mtd1, const QString &mtd2, const QString &key) { #ifndef FL_QUICK_CLIENT FLTableMetaData *oldMTD = 0; FLTableMetaData *newMTD = 0; QDomDocument doc("doc"); QDomElement docElem; if (!FLUtil::domDocumentSetContent(doc, mtd1)) { #ifdef FL_DEBUG qWarning("FLManager::alterTable : " + QApplication::tr("Error al cargar los metadatos.")); #endif } else { docElem = doc.documentElement(); oldMTD = db_->manager()->metadata(&docElem, true); } if (oldMTD && oldMTD->isQuery()) return true; if (!FLUtil::domDocumentSetContent(doc, mtd2)) { #ifdef FL_DEBUG qWarning("FLManager::alterTable : " + QApplication::tr("Error al cargar los metadatos.")); #endif return false; } else { docElem = doc.documentElement(); newMTD = db_->manager()->metadata(&docElem, true); } if (!oldMTD) oldMTD = newMTD; if (oldMTD->name() != newMTD->name()) { #ifdef FL_DEBUG qWarning("FLManager::alterTable : " + QApplication::tr("Los nombres de las tablas nueva y vieja difieren.")); #endif if ((oldMTD != newMTD) && oldMTD) delete oldMTD; if (newMTD) delete newMTD; return false; } QString oldPK = oldMTD->primaryKey(), newPK = newMTD->primaryKey(); if (oldPK != newPK) { #ifdef FL_DEBUG qWarning("FLManager::alterTable : " + QApplication::tr("Los nombres de las claves primarias difieren.")); #endif if ((oldMTD != newMTD) && oldMTD) delete oldMTD; if (newMTD) delete newMTD; return false; } if (oldMTD->fieldType(oldPK) != newMTD->fieldType(newPK)) { #ifdef FL_DEBUG qWarning("FLManager::alterTable : " + QApplication::tr("Los tipos de las claves primarias difieren.")); #endif if ((oldMTD != newMTD) && oldMTD) delete oldMTD; if (newMTD) delete newMTD; return false; } if (db_->manager()->checkMetaData(oldMTD, newMTD)) { if ((oldMTD != newMTD) && oldMTD) delete oldMTD; if (newMTD) delete newMTD; return true; } if (!db_->manager()->existsTable(oldMTD->name())) { #ifdef FL_DEBUG qWarning("FLManager::alterTable : " + QApplication::tr("La tabla %1 antigua de donde importar los registros no existe.").arg(oldMTD->name())); #endif if ((oldMTD != newMTD) && oldMTD) delete oldMTD; if (newMTD) delete newMTD; return false; } FLTableMetaData::FLFieldMetaDataList *fieldList = oldMTD->fieldList(); FLFieldMetaData *oldField = 0; if (!fieldList) { #ifdef FL_DEBUG qWarning("FLManager::alterTable : " + QApplication::tr("Los antiguos metadatos no tienen campos.")); #endif if ((oldMTD != newMTD) && oldMTD) delete oldMTD; if (newMTD) delete newMTD; return false; } QString renameOld = oldMTD->name().left(6) + "alteredtable" + QDateTime::currentDateTime().toString("ddhhssz"); if (!db_->dbAux()) { if ((oldMTD != newMTD) && oldMTD) delete oldMTD; if (newMTD) delete newMTD; return false; } db_->dbAux() ->transaction(); if (!key.isEmpty() && key.length() == 40) { QSqlCursor c("flfiles", true, db_->dbAux()); c.setForwardOnly(true); QSqlRecord *buffer; c.setFilter("nombre='" + renameOld + ".mtd'"); c.select(); if (!c.next()) { buffer = c.primeInsert(); buffer->setValue("nombre", renameOld + ".mtd"); buffer->setValue("contenido", mtd1); buffer->setValue("sha", key); c.insert(); } } QSqlQuery q(QString::null, db_->dbAux()); if (!q.exec("CREATE TABLE " + renameOld + " AS SELECT * FROM " + oldMTD->name() + ";") || !q.exec("DROP TABLE " + oldMTD->name() + ";")) { #ifdef FL_DEBUG qWarning("FLManager::alterTable : " + QApplication::tr("No se ha podido renombrar la tabla antigua.")); #endif db_->dbAux() ->rollback(); if ((oldMTD != newMTD) && oldMTD) delete oldMTD; if (newMTD) delete newMTD; return false; } if (!db_->manager()->createTable(newMTD)) { db_->dbAux() ->rollback(); if ((oldMTD != newMTD) && oldMTD) delete oldMTD; if (newMTD) delete newMTD; return false; } QSqlCursor oldCursor(renameOld, true, db_->dbAux()); oldCursor.setMode(QSqlCursor::ReadOnly); QSqlCursor newCursor(newMTD->name(), true, db_->dbAux()); newCursor.setMode(QSqlCursor::Insert); oldCursor.select(); int totalSteps = oldCursor.size(); QProgressDialog progress(QApplication::tr("Reestructurando registros para %1...").arg(newMTD->alias()), 0, totalSteps, qApp->focusWidget(), 0, true); progress.setCaption(QApplication::tr("Tabla modificada")); int step = 0; QSqlRecord *newBuffer; QString sequence; fieldList = newMTD->fieldList(); FLFieldMetaData *newField = 0; if (!fieldList) { #ifdef FL_DEBUG qWarning("FLManager::alterTable : " + QApplication::tr("Los nuevos metadatos no tienen campos.")); #endif db_->dbAux() ->rollback(); if ((oldMTD != newMTD) && oldMTD) delete oldMTD; if (newMTD) delete newMTD; return false; } if (fieldList->isEmpty()) { #ifdef FL_DEBUG qWarning("FLManager::alterTable : " + QApplication::tr("Los nuevos metadatos no tienen campos.")); #endif db_->dbAux() ->rollback(); if ((oldMTD != newMTD) && oldMTD) delete oldMTD; if (newMTD) delete newMTD; return false; } QVariant v; bool ok = true; while (oldCursor.next()) { newBuffer = newCursor.primeInsert(); QDictIterator<FLFieldMetaData> it(*fieldList); while ((newField = it.current()) != 0) { ++it; oldField = oldMTD->field(newField->name()); if (!oldField || !oldCursor.field(oldField->name())) { if (!oldField) oldField = newField; v = newField->defaultValue(); v.cast(FLFieldMetaData::flDecodeType(newField->type())); } else { v = oldCursor.value(newField->name()); if ((!oldField->allowNull() || !newField->allowNull()) && (v.isNull() || !v.isValid())) { QVariant defVal(newField->defaultValue()); if (!defVal.isNull() && defVal.isValid()) v = defVal; } if (!v.cast(newBuffer->value(newField->name()).type())) { #ifdef FL_DEBUG qWarning("FLManager::alterTable : " + QApplication::tr("Los tipos del campo %1 no son compatibles. Se introducirá un valor nulo.") .arg(newField->name())); #endif } } if ((!oldField->allowNull() || !newField->allowNull()) && (v.isNull() || !v.isValid())) { switch (oldField->type()) { case QVariant::Int: case FLFieldMetaData::Serial: case QVariant::UInt: case QVariant::Bool: case FLFieldMetaData::Unlock: v = int(0); break; case QVariant::Double: v = double(0.0); break; case QVariant::Time: v = QTime::currentTime(); break; case QVariant::Date: v = QDate::currentDate(); break; default: v = QString("NULL").left(newField->length()); break; } } newBuffer->setValue(newField->name(), v); } if (!newCursor.insert()) { ok = false; break; } progress.setProgress(++step); } progress.setProgress(totalSteps); if ((oldMTD != newMTD) && oldMTD) delete oldMTD; if (newMTD) delete newMTD; if (ok) db_->dbAux() ->commit(); else { db_->dbAux() ->rollback(); return false; } #else return true; #endif //FL_QUICK_CLIENT }
FLTableMetaData *FLManager::metadata(const QString &n, bool quick) { if (n.isEmpty() || !db_->dbAux()) return 0; FLTableMetaData *ret = 0; QDomDocument doc(n); QDomElement docElem; QString key; QString *dictKey = 0; QString stream = db_->managerModules()->contentCached(n + QString::fromLatin1(".mtd"), &key); bool newTable = false; bool notSysTable = n.left(3) != "sys" && !isSystemTable(n); if (!notSysTable) dictKey = new QString(n); #ifndef FL_QUICK_CLIENT if (!quick) { if (db_->canRegenTables() && notSysTable) { QSqlRecord *buffer = 0; QString key2; delete dictKey; dictKey = dictKeyMetaData_->find(n); if (dictKey) key2 = *dictKey; if (key2.isEmpty()) { QSqlCursor c("flmetadata", true, db_->dbAux()); c.setForwardOnly(true); c.setFilter(QString::fromLatin1("tabla='") + n + QString::fromLatin1("'")); c.select(); if (c.next()) { c.primeDelete(); c.del(); } buffer = c.primeInsert(); buffer->setValue("tabla", n); if (key.isEmpty()) { buffer->setValue("xml", stream); dictKey = new QString(stream); dictKeyMetaData_->replace(n, dictKey); } else { buffer->setValue("xml", key); dictKey = new QString(key); dictKeyMetaData_->replace(n, dictKey); } newTable = true; c.insert(); } else { if (key != key2) { QString s; if (key2.left(255).find("<!DOCTYPE TMD>", 0, true) == -1) AQ_DISKCACHE_FIND(key2, s); else s = key2; bool mustAlter; if (key.isEmpty()) mustAlter = !checkMetaData(s, stream); else mustAlter = (key != key2); if (mustAlter) { if (alterTable(s, stream, key2)) { QSqlCursor c("flmetadata", true, db_->dbAux()); c.setForwardOnly(true); c.setFilter(QString::fromLatin1("tabla='") + n + QString::fromLatin1("'")); c.select(); c.next(); buffer = c.primeUpdate(); if (key.isEmpty()) { buffer->setValue("xml", stream); dictKey = new QString(stream); dictKeyMetaData_->replace(n, dictKey); } else { buffer->setValue("xml", key); dictKey = new QString(key); dictKeyMetaData_->replace(n, dictKey); } c.update(); } } } } } } else { if (key.isEmpty()) dictKey = new QString(n); else dictKey = new QString(key); } #else if (key.isEmpty()) dictKey = new QString(n); else dictKey = new QString(key); #endif //FL_QUICK_CLIENT if (dictKey) { if (cacheMetaData_ && notSysTable) { ret = cacheMetaData_->find(*dictKey); } else if (cacheMetaDataSys_ && !notSysTable) { ret = cacheMetaDataSys_->find(*dictKey); } if (ret) { FLAccessControlLists *acl = aqApp ->acl(); if (acl) acl->process(ret); if (quick) delete dictKey; return ret; } } if (!FLUtil::domDocumentSetContent(doc, stream)) { #ifdef FL_DEBUG qWarning("FLManager : " + QApplication::tr("Error al cargar los metadatos para la tabla %1").arg(n)); #endif if (quick) delete dictKey; #ifdef FL_QUICK_CLIENT else delete dictKey; #endif return 0; } docElem = doc.documentElement(); ret = metadata(&docElem, quick); if (dictKey && (!notSysTable || (!ret->isQuery() && ret->fieldsNamesUnlock().isEmpty()))) { if (cacheMetaData_ && notSysTable) { cacheMetaData_->insert(*dictKey, ret); } else if (cacheMetaDataSys_ && !notSysTable) { cacheMetaDataSys_->insert(*dictKey, ret); } if (quick) delete dictKey; #ifdef FL_QUICK_CLIENT else delete dictKey; #endif } return ret; }