Logo Search packages:      
Sourcecode: facturalux version File versions  Download package

bool FLManager::alterTable ( const QString &  mtd1,
const QString &  mtd2 
) [static]

Esta función es esencialmente igual a la anterior, se proporciona por conveniencia.

Modifica la estructura de una tabla dada, preservando los datos. La nueva estructura y la vieja se pasan en cadenas de caracteres con la descripcion XML.

Parameters:
n Nombre de la tabla a reconstruir.
mtd1 Descripcion en XML de la vieja estructura.
mtd2 Descripcion en XML de la nueva estructura.
Returns:
TRUE si la modificación tuvo éxito.

Definition at line 303 of file FLManager.cpp.

References createTable(), existsTable(), FLTableMetaData::field(), FLTableMetaData::fieldList(), metadata(), FLFieldMetaData::name(), and FLTableMetaData::name().

{
  FLTableMetaData *oldMTD;
  FLTableMetaData *newMTD;
  QDomDocument doc ("doc");
  QDomElement docElem;

  if (!doc.setContent (mtd1))
      {
        qWarning ("FLManager : " + qApp->tr ("Error al cargar los meta datos en método alterTable"));
        return false;
      }
  else
      {
        docElem = doc.documentElement ();
        oldMTD = metadata (&docElem);
      }

  if (!doc.setContent (mtd2))
      {
        qWarning ("FLManager : " + qApp->tr ("Error al cargar los meta datos en método alterTable"));
        return false;
      }
  else
      {
        docElem = doc.documentElement ();
        newMTD = metadata (&docElem);
      }

  if (oldMTD->name () != newMTD->name ())
      {
        qWarning ("FLManager : " + qApp->tr ("En método alterTable, los nombres de las tablas nueva y vieja difieren."));
        return false;
      }

  if (!existsTable (oldMTD->name ()))
      {
        qWarning ("FLManager : " + qApp->tr ("En método alterTable, la tabla ") + oldMTD->name () +
                        qApp->tr (" antigua de donde importar los registros no existe."));
        return false;
      }

  FLTableMetaData::FLFieldMetaDataList * fieldList = oldMTD->fieldList ();
  FLFieldMetaData *oldField;

  QString renameOld = oldMTD->name ().left (6) + QDateTime::currentDateTime ().toString ("ddhhssz");
  QSqlQuery q;

  if (!q.exec ("ALTER TABLE " + oldMTD->name () + " RENAME TO " + renameOld + ";"))
      {
        qWarning ("FLManager : " + qApp->tr ("En método alterTable, no se ha podido renombrar la tabla antigua."));
        return false;
      }

  if (!q.exec ("DROP INDEX " + oldMTD->name () + "_pkey;"))
      {
        qWarning ("FLManager : " + qApp->tr ("En método alterTable, no se ha podido borrar el índice de la tabla antigua."));
        return false;
      }

  if (!createTable (newMTD))
      return false;

  QSqlCursor oldCursor (renameOld);
  oldCursor.setMode (QSqlCursor::ReadOnly);
  QSqlCursor newCursor (newMTD->name ());
  newCursor.setMode (QSqlCursor::Insert);

  QApplication::setOverrideCursor (Qt::WaitCursor);
  oldCursor.select ();
  int totalSteps = oldCursor.size ();
  QProgressDialog progress (qApp->tr ("Reestructurando registros..."), 0, totalSteps, qApp->mainWidget (), 0, true);
  progress.setCaption (qApp->tr ("Tabla modificada"));

  int step = 0;
  QSqlRecord *oldBuffer;
  QSqlRecord *newBuffer;
  QString sequence;
  fieldList = newMTD->fieldList ();
  FLFieldMetaData *newField;

  if (!fieldList)
      {
        qWarning ("FLManager : " + qApp->tr ("En método alterTable, los nuevos metadatos no tienen campos."));
        return false;
      }

  if (fieldList->isEmpty ())
      {
        qWarning ("FLManager : " + qApp->tr ("En método alterTable, los nuevos metadatos no tienen campos."));
        return false;
      }

  while (oldCursor.next ())
      {
        oldBuffer = oldCursor.editBuffer (true);
        newBuffer = newCursor.primeInsert ();

        for (unsigned int i = 0; i < fieldList->count (); i++)
            {
              newField = fieldList->at (i);
              oldField = oldMTD->field (newField->name ());
              if (!oldField)
                  continue;
              newBuffer->setValue (newField->name (), oldBuffer->value (newField->name ()));
            }

        newCursor.insert (false);

        progress.setProgress (++step);
      }

  progress.setProgress (totalSteps);

  if (newMTD)
      delete newMTD;

  if (oldMTD)
      delete oldMTD;

  QApplication::restoreOverrideCursor ();

  return true;
}


Generated by  Doxygen 1.6.0   Back to index