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

FLTableMetaData * FLManager::createTable ( FLTableMetaData tmd  )  [static]

Crea una tabla en la base de datos.

Parameters:
tmd Metadatos de la tabla
Returns:
Un objeto FLTableMetaData con los metadatos de la tabla que se ha creado, o 0 si no se pudo crear la tabla

Definition at line 54 of file FLManager.cpp.

References FLFieldMetaData::allowNull(), createSequence(), FLTableMetaData::fieldList(), FLFieldMetaData::isPrimaryKey(), FLFieldMetaData::isUnique(), FLFieldMetaData::length(), FLFieldMetaData::name(), FLTableMetaData::name(), FLFieldMetaData::Serial, and FLFieldMetaData::type().

{
  if (!tmd)
      return 0;

  QString primaryKey (QString::null);
  QString sql = "CREATE TABLE " + tmd->name () + "(";
  QString seq;
  QSqlQuery q;

  FLFieldMetaData *field;

  FLTableMetaData::FLFieldMetaDataList * fieldList = tmd->fieldList ();

  // Codigo para comprobar que no hay más de un campo tipo Unlock
  // por Andrés Otón Urbano
  unsigned int unlocks = 0;
  for (unsigned int i = 0; i < fieldList->count (); i++)
      {
        field = fieldList->at (i);
        if (field->type () == FLFieldMetaData::Unlock)
            unlocks++;
      }
  if (unlocks > 1)
      {
        qWarning ("FLManager : " + qApp->tr ("No se ha podido crear la tabla ") + tmd->name ());
        qWarning ("FLManager : " + qApp->tr ("Hay más de un campo tipo unlock. Solo puede haber uno."));
        return 0;
      }
  //Fin del codigo de comprobación

  for (unsigned int i = 0; i < fieldList->count (); i++)
      {
        field = fieldList->at (i);
        if (field->type () == FLFieldMetaData::Sequence)    // Las secuencias tienen un tratamiento especial
            {
              createSequence (tmd->name () + "_" + field->name ());
            }
        sql += field->name ();
        switch (field->type ())
            {
            case QVariant::Int:
              sql += " INT2";
              break;

            case QVariant::UInt:
            case FLFieldMetaData::Sequence:     // Se crean igual que el tipo uint
              sql += " INT4";
              break;

            case QVariant::Bool:
            case FLFieldMetaData::Unlock: //Tipo bool para bloqueo de registros (Andrés Otón Urbano)
              sql += " BOOLEAN";
              break;

            case QVariant::Double:
              sql += " FLOAT8";
              break;

            case QVariant::Time:
              sql += " TIME";
              break;

            case QVariant::Date:
              sql += " DATE";
              break;

            case QVariant::Pixmap:
              sql += " TEXT";
              break;

            case QVariant::String:
              sql += " VARCHAR";
              break;

            case QVariant::StringList:
              sql += " TEXT";
              break;

            case FLFieldMetaData::Serial:
              seq = tmd->name () + "_" + field->name () + "_seq";
              q.exec ("SELECT relname FROM pg_class WHERE relname='" + seq + "';");
              if (!q.next ())
                  q.exec ("CREATE SEQUENCE " + seq + ";");
              sql += " INT4 DEFAULT NEXTVAL('" + seq + "')";
              break;
            }

        int longitud = field->length ();

        if (longitud > 0)
            sql += "(" + QString::number (longitud) + ")";

        if (field->isUnique ())
            sql += " UNIQUE";

        if (!field->allowNull ())
            sql += " NOT NULL";
        else
            sql += " NULL";

        if (field->isPrimaryKey ())
            {
              if (primaryKey.isEmpty ())
                  {
                    sql += " PRIMARY KEY";
                    primaryKey = field->name ();
                  }
              else
                  {
                    qWarning (qApp->tr ("FLManager : Tabla -> ") + tmd->name () +
                                    qApp->tr
                                    (" . Se ha intentado poner una segunda clave primaria para el campo ")
                                    + field->name () + qApp->tr (" , pero el campo ") +
                                    primaryKey +
                                    qApp->tr
                                    (" ya es clave primaria. Sólo puede existir una clave primaria en FLTableMetaData, use FLCompoundKey para crear claves compuestas."));
                    return 0;
                  }
            }

        if (fieldList->next () != 0)
            sql += ",";
      }

  sql += ");";

  if (!q.exec (sql))
      {
        qWarning ("FLManager : " + qApp->tr ("No se ha podido crear la tabla ") + tmd->name ());
        qWarning ("FLManager : SQL - " + sql);
        return 0;
      }

  return tmd;
}


Generated by  Doxygen 1.6.0   Back to index