public function test1()
 {
     PersistentManager::getInstance()->generateAll();
     echo YuppConventions::tableName('Pagina') . "<br/>";
     /**
      * Resultado>
      * 
      * CREATE TABLE test_a004_pagina (id INT(11) DEFAULT 1 PRIMARY KEY, titulo VARCHAR(255) NULL, contenido MEDIUMTEXT NULL, class TEXT NOT NULL, deleted BOOL NOT NULL, owner_id INT(11) NULL);
      * 
      * CREATE TABLE test_a004_pagina_subpages_test_a004_pagina (id INT(11) DEFAULT 1 PRIMARY KEY, owner_id INT(11) NOT NULL, ref_id INT(11) NOT NULL, type INT(11) NOT NULL, deleted BOOL NOT NULL, class TEXT NOT NULL, ord INT(11) NULL);
      * 
      * ALTER TABLE test_a004_pagina_subpages_test_a004_pagina ADD FOREIGN KEY (owner_id) REFERENCES test_a004_pagina(id);
      * 
      * ALTER TABLE test_a004_pagina_subpages_test_a004_pagina ADD FOREIGN KEY (ref_id) REFERENCES test_a004_pagina(id);
      * 
      * ALTER TABLE test_a004_pagina ADD FOREIGN KEY (owner_id) REFERENCES test_a004_pagina(id);
      * 
      */
     // TODO: verificar si la tabla para Nariz y Cara fue creada.
     //$dal = DAL::getInstance();
     $dal = new DAL('tests');
     $this->assert($dal->tableExists(YuppConventions::tableName('Pagina')), 'TestCaseA004: Test generar tabla');
 }
Exemplo n.º 2
0
 private function test1()
 {
     PersistentManager::getInstance()->generateAll();
     echo YuppConventions::tableName('M010_Persona') . "<br/>";
     /**
      * Resultado>
      * 
      * CREATE TABLE test_m010_persona (
      *   id INT(11) DEFAULT 1 PRIMARY KEY,
      *   nombre TEXT NULL,
      *   class TEXT NOT NULL,
      *   deleted BOOL NOT NULL
      * );
      * 
      * CREATE TABLE test_m010_persona_hijos_test_m010_persona (
      *   id INT(11) DEFAULT 1 PRIMARY KEY,
      *   owner_id INT(11) NOT NULL,
      *   ref_id INT(11) NOT NULL,
      *   type INT(11) NOT NULL,
      *   deleted BOOL NOT NULL,
      *   class TEXT NOT NULL,
      *   ord INT(11) NULL
      * );
      * 
      */
     // TODO: verificar si la tabla para Nariz y Cara fue creada.
     //$dal = DAL::getInstance();
     $dal = new DAL('tests');
     if ($dal->tableExists(YuppConventions::tableName('M010_Persona'))) {
         echo "Test 1 correcto";
     } else {
         echo "Test 1 Incorrecto";
     }
 }
Exemplo n.º 3
0
 private function test1()
 {
     PersistentManager::getInstance()->generateAll();
     echo YuppConventions::tableName('Contenido1') . "<br/>";
     echo YuppConventions::tableName('Recipiente1') . "<br/>";
     echo YuppConventions::tableName('Vaso1') . "<br/>";
     /**
      * Resultado>
      * 
      * CREATE TABLE test_i006_contenido1 (id INT(11) DEFAULT 1 PRIMARY KEY, elemento VARCHAR(30) NULL, volumen FLOAT NULL, class TEXT NOT NULL, deleted BOOL NOT NULL);
      * 
      * CREATE TABLE test_i005_contenido (
      *   id INT(11) DEFAULT 1 PRIMARY KEY,
      *   elemento VARCHAR(30) NULL,
      *   volumen FLOAT NULL,
      *   class TEXT NOT NULL,
      *   deleted BOOL NOT NULL
      * );
      * 
      * CREATE TABLE test_i006_vaso1 (id INT(11) DEFAULT 1 PRIMARY KEY, marca TEXT NULL, class TEXT NOT NULL, deleted BOOL NOT NULL, contenido_id INT(11) NULL, super_id_recipiente1 INT(11) NOT NULL);
      * 
      * CREATE TABLE test_i005_vaso (
      *   id INT(11) DEFAULT 1 PRIMARY KEY,
      *   marca TEXT NULL,
      *   class TEXT NOT NULL,
      *   deleted BOOL NOT NULL,
      *   contenido_id INT(11) NULL,
      *   super_id_recipiente INT(11) NOT NULL
      * );
      * 
      * CREATE TABLE test_i006_recipiente1 (id INT(11) DEFAULT 1 PRIMARY KEY, material VARCHAR(30) NULL, capacidad FLOAT NULL, tieneTapa BOOL NULL, class TEXT NOT NULL, deleted BOOL NOT NULL);
      * 
      * CREATE TABLE test_i005_recipiente (
      *   id INT(11) DEFAULT 1 PRIMARY KEY,
      *   material VARCHAR(30) NULL,
      *   capacidad FLOAT NULL,
      *   tieneTapa BOOL NULL,
      *   class TEXT NOT NULL,
      *   deleted BOOL NOT NULL
      * );
      * 
      * ALTER TABLE test_i006_vaso1 ADD FOREIGN KEY (super_id_recipiente1) REFERENCES test_i006_recipiente1(id);
      * 
      * ALTER TABLE test_i005_vaso
      *   ADD FOREIGN KEY (super_id_recipiente)
      *   REFERENCES test_i005_recipiente(id);
      * 
      * ALTER TABLE test_i006_vaso1 ADD FOREIGN KEY (contenido_id) REFERENCES test_i005_contenido(id);
      * 
      * ALTER TABLE test_i005_vaso
      *   ADD FOREIGN KEY (contenido_id)
      *   REFERENCES test_i005_contenido(id);
      */
     // TODO: verificar si la tabla para Nariz y Cara fue creada.
     //$dal = DAL::getInstance();
     $dal = new DAL('tests');
     if ($dal->tableExists(YuppConventions::tableName('Contenido1'))) {
         echo "Test 1 correcto";
     } else {
         echo "Test 1 Incorrecto";
     }
     if ($dal->tableExists(YuppConventions::tableName('Recipiente1'))) {
         echo "Test 1 correcto";
     } else {
         echo "Test 1 Incorrecto";
     }
     if ($dal->tableExists(YuppConventions::tableName('Vaso1'))) {
         echo "Test 1 correcto";
     } else {
         echo "Test 1 Incorrecto";
     }
 }
 public function dbStatusAction()
 {
     $yupp = new Yupp();
     $appNames = $yupp->getAppNames();
     $appModelClasses = array();
     // [appName][class][tablename,creada o no]
     // Incluye todas las clases del modelo de todas las apps
     YuppLoader::loadModel();
     // Para saber si se crearon las tablas para todas las
     // clases del modelo de todas las aplicaciones.
     $allTablesCreated = true;
     $fn = new FileNames();
     // http://code.google.com/p/yupp/issues/detail?id=123
     $createDatabaseForApps = array();
     // Aplicaciones a las que se sugiere que se cree su base de datos
     foreach ($appNames as $appName) {
         $app = new App($appName);
         $modelClassFileNames = $app->getModel();
         // no incluye las clases, solo obtiene los nombres
         //print_r($modelClassFileNames);
         // Necesito que sea plano el array, si no, tengo que hacer recorrida recursiva.
         // Esto no seria necesario si modifico la recorrida en la vista, para mostrar
         // la estructura interna de paquetes del modelo de la aplicacion.
         $modelClassFileNames = $this->array_flatten($modelClassFileNames);
         //print_r($modelClassFileNames);
         // Toda la informacion de las clases y tablas creadas para esta app
         $appModelClasses[$appName] = array();
         // http://code.google.com/p/yupp/issues/detail?id=123
         try {
             $dal = new DAL($appName);
             // Falla sino existe la base para la app $appName
         } catch (Exception $e) {
             if ($e->getCode() == 666) {
                 $createDatabaseForApps[] = $appName;
             }
             continue;
             // Para el for appNames
         }
         foreach ($modelClassFileNames as $classFileName) {
             $fileInfo = $fn->getFileNameInfo($classFileName);
             $className = $fileInfo['name'];
             // Para incluir las clases (por si no estan incluidas)
             // Ticket: http://code.google.com/p/yupp/issues/detail?id=71
             YuppLoader::load($fileInfo['package'], $className);
             $tableName = YuppConventions::tableName($className);
             if ($dal->tableExists($tableName)) {
                 $appModelClasses[$appName][$className] = array('tableName' => $tableName, 'created' => "CREADA");
             } else {
                 $appModelClasses[$appName][$className] = array('tableName' => $tableName, 'created' => "NO CREADA");
                 $allTablesCreated = false;
             }
         }
     }
     $this->params['allTablesCreated'] = $allTablesCreated;
     $this->params['appModelClasses'] = $appModelClasses;
     $this->params['createDatabaseForApps'] = $createDatabaseForApps;
     return $this->render("dbStatus");
 }
 public function test1()
 {
     $dal = new DAL('tests');
     $this->assert($dal->tableExists(YuppConventions::tableName('Entidad')), 'Test 003.1.1 existe tabla');
     $this->assert($dal->tableExists(YuppConventions::tableName('TestPersona')), 'Test 003.1.2 existe tabla');
 }
Exemplo n.º 6
0
 private function test1()
 {
     PersistentManager::getInstance()->generateAll();
     echo YuppConventions::tableName('Dedo') . "<br/>";
     echo YuppConventions::tableName('Mano') . "<br/>";
     /**
      * Resultado>
      * 
      * CREATE TABLE test_m003_dedo (
      *   id INT(11) DEFAULT 1 PRIMARY KEY,
      *   uniaLarga BOOL NULL,
      *   class TEXT NOT NULL,
      *   deleted BOOL NOT NULL
      * );
      * 
      * CREATE TABLE test_m003_mano (
      *   id INT(11) DEFAULT 1 PRIMARY KEY,
      *   tamanio TEXT NULL,
      *   class TEXT NOT NULL,
      *   deleted BOOL NOT NULL
      * );
      * 
      * CREATE TABLE test_m003_mano_dedos_test_m003_dedo (
      *   id INT(11) DEFAULT 1 PRIMARY KEY,
      *   owner_id INT(11) NOT NULL,
      *   ref_id INT(11) NOT NULL,
      *   type INT(11) NOT NULL,
      *   deleted BOOL NOT NULL,
      *   class TEXT NOT NULL,
      *   ord INT(11) NULL
      * );
      * 
      * ALTER TABLE test_m003_mano_dedos_test_m003_dedo
      *   ADD FOREIGN KEY (owner_id)
      *   REFERENCES test_m003_mano(id);
      * 
      * ALTER TABLE test_m003_mano_dedos_test_m003_dedo
      *   ADD FOREIGN KEY (ref_id)
      *   REFERENCES test_m003_dedo(id);
      * 
      */
     // TODO: verificar si la tabla para Nariz y Cara fue creada.
     //$dal = DAL::getInstance();
     $dal = new DAL('tests');
     if ($dal->tableExists(YuppConventions::tableName('Dedo'))) {
         echo "Test 1 correcto";
     } else {
         echo "Test 1 Incorrecto";
     }
     if ($dal->tableExists(YuppConventions::tableName('Mano'))) {
         echo "Test 1 correcto";
     } else {
         echo "Test 1 Incorrecto";
     }
 }
Exemplo n.º 7
0
 /**
  * generateAll
  * Genera todas las tablas correspondientes al modelo previamente cargado.
  * 
  * @pre Deberia haber cargado, antes de llamar, todas las clases persistentes.
  */
 public static function generateAll()
 {
     Logger::getInstance()->pm_log("TableGen::generateAll ======");
     $yupp = new Yupp();
     $appNames = $yupp->getAppNames();
     foreach ($appNames as $appName) {
         $dalForApp = new DAL($appName);
         // No puedo usar this->dal porque esta configurada para 'core'
         // Todas las clases del primer nivel del modelo.
         $A = ModelUtils::getSubclassesOf('PersistentObject', $appName);
         // FIXME> no es recursiva!
         // Se utiliza luego para generar FKs.
         $generatedPOs = array();
         foreach ($A as $clazz) {
             $struct = MultipleTableInheritanceSupport::getMultipleTableInheritanceStructureToGenerateModel($clazz);
             // struct es un mapeo por clave las clases que generan una tabla y valor las clases que se mapean a esa tabla.
             foreach ($struct as $class => $subclassesOnSameTable) {
                 // Instancia que genera tabla
                 $c_ins = new $class();
                 // FIXME: supongo que ya tiene withTable, luego veo el caso que no se le ponga WT a la superclase...
                 // FIXME: como tambien tiene los atributos de las superclases y como van en otra tabla, hay que sacarlos.
                 // Para cara subclase que se mapea en la misma tabla
                 foreach ($subclassesOnSameTable as $subclass) {
                     $sc_ins = new $subclass();
                     // Para setear los atributos.
                     $props = $sc_ins->getAttributeTypes();
                     $hone = $sc_ins->getHasOne();
                     $hmany = $sc_ins->getHasMany();
                     // FIXME: si el artibuto no es de una subclase parece que tambien pone nullable true...
                     // Agrega constraint nullable true, para que los atributos de las subclases
                     // puedan ser nulos en la tabla, para que funcione bien el mapeo de herencia de una tabla.
                     //Logger::getInstance()->pm_log( "Para cada attr de: $subclass " . __FILE__ . " " . __LINE__);
                     foreach ($props as $attr => $type) {
                         // FIXME: esta parte seria mas facil si simplemente cuando la clase tiene la constraint
                         // y le seteo otra del mismo tipo para el mismo atributo, sobreescriba la anterior.
                         $constraint = $sc_ins->getConstraintOfClass($attr, 'Nullable');
                         if ($constraint !== NULL) {
                             //Logger::getInstance()->log( "CONTRAINT NULLABLE EXISTE!");
                             // Si hay, setea en true
                             $constraint->setValue(true);
                         } else {
                             // Si no hay, agrega nueva
                             //Logger::getInstance()->log( "CONTRAINT NULLABLE NO EXISTE!, LA AGREGA");
                             $sc_ins->addConstraints($attr, array(Constraint::nullable(true)));
                         }
                     }
                     //Logger::getInstance()->pm_log( "Termina con las constraints ======= " . __FILE__ . " " . __LINE__);
                     // Se toma luego de modificar las restricciones
                     $constraints = $sc_ins->getConstraints();
                     foreach ($props as $name => $type) {
                         $c_ins->addAttribute($name, $type);
                     }
                     foreach ($hone as $name => $type) {
                         $c_ins->addHasOne($name, $type);
                     }
                     foreach ($hmany as $name => $type) {
                         $c_ins->addHasMany($name, $type);
                     }
                     // Agrego las constraints al final porque puedo referenciar atributos que todavia no fueron agregados.
                     foreach ($constraints as $attr => $constraintList) {
                         $c_ins->addConstraints($attr, $constraintList);
                     }
                 }
                 $parent_class = get_parent_class($c_ins);
                 if ($parent_class !== 'PersistentObject') {
                     // La superclase de c_ins se mapea en otra tabla, saco esos atributos...
                     $suc_ins = new $parent_class();
                     $c_ins = PersistentObject::less($c_ins, $suc_ins);
                     // Saco los atributos de la superclase
                 }
                 $tableName = YuppConventions::tableName($c_ins);
                 // FIXME: esta operacion necesita instanciar una DAL por cada aplicacion.
                 // La implementacion esta orientada a la clase, no a la aplicacion, hay que modificarla.
                 // Si la tabla ya existe, no la crea.
                 if (!$dalForApp->tableExists($tableName)) {
                     // FIXME: c_ins no tiene las restricciones sobre los atributos inyectados.
                     self::generate($c_ins, $dalForApp);
                     // Para luego generar FKs.
                     $generatedPOs[] = $c_ins;
                 }
             }
             // foreach ($struct as $class => $subclassesOnSameTable)
         }
         // foreach( $A as $clazz )
         // ======================================================================
         // Crear FKs en la base.
         //Logger::struct( $generatedPOs, "GENERATED OBJS" );
         foreach ($generatedPOs as $ins) {
             $tableName = YuppConventions::tableName($ins);
             $fks = array();
             // FKs hasOne
             $ho_attrs = $ins->getHasOne();
             foreach ($ho_attrs as $attr => $refClass) {
                 // Problema: pasa lo mismo que pasaba en YuppConventions.relTableName, esta tratando
                 // de inyectar la FK en la tabla incorrecta porque la instancia es de una superclase
                 // de la clase donde se declara la relacion HasOne, entonces hay que verificar si una
                 // subclase no tiene ya el atributo hasOne declarado, para asegurarse que es de la
                 // instancia actual y no intentar generar la FK si no lo es.
                 $instConElAtributoHasOne = NULL;
                 $subclasses = ModelUtils::getAllAncestorsOf($ins->getClass());
                 foreach ($subclasses as $aclass) {
                     $ains = new $aclass();
                     if ($ains->hasOneOfThis($refClass)) {
                         //Logger::getInstance()->log( $ains->getClass() . " TIENE UNO DE: $refClass" );
                         $instConElAtributoHasOne = $ains;
                         // EL ATRIBUTO ES DE OTRA INSTANCIA!
                         break;
                     }
                 }
                 // Si el atributo de FK hasOne es de la instancia actual, se genera:
                 if ($instConElAtributoHasOne === NULL) {
                     // Para ChasOne esta generando "chasOne", y el nombre de la tabla que aparece en la tabla es "chasone".
                     $refTableName = YuppConventions::tableName($refClass);
                     $fks[] = array('name' => DatabaseNormalization::simpleAssoc($attr), 'table' => $refTableName, 'refName' => 'id');
                 }
             }
             // FKs tablas intermedias HasMany
             $hasMany = $ins->getHasMany();
             foreach ($hasMany as $attr => $assocClassName) {
                 //Logger::getInstance()->pm_log("AssocClassName: $assocClassName, attr: $attr");
                 if ($ins->isOwnerOf($attr)) {
                     $hm_fks = array();
                     $hasManyTableName = YuppConventions::relTableName($ins, $attr, new $assocClassName());
                     // "owner_id", "ref_id" son FKs.
                     // ===============================================================================
                     // El nombre de la tabla owner para la FK debe ser el de la clase
                     // donde se declara el attr hasMany,
                     // no para el ultimo de la estructura de MTI (como pasaba antes).
                     $classes = ModelUtils::getAllAncestorsOf($ins->getClass());
                     //Logger::struct( $classes, "Superclases de " . $ins1->getClass() );
                     $instConElAtributoHasMany = $ins;
                     // En ppio pienso que la instancia es la que tiene el atributo masMany.
                     foreach ($classes as $aclass) {
                         $_ins = new $aclass();
                         if ($_ins->hasManyOfThis($assocClassName)) {
                             //Logger::getInstance()->log("TIENE MANY DE " . $ins2->getClass());
                             $instConElAtributoHasMany = $_ins;
                             break;
                         }
                         //Logger::struct( $ins, "Instancia de $aclass" );
                     }
                     // ===============================================================================
                     $hm_fks[] = array('name' => 'owner_id', 'table' => YuppConventions::tableName($instConElAtributoHasMany->getClass()), 'refName' => 'id');
                     $hm_fks[] = array('name' => 'ref_id', 'table' => YuppConventions::tableName($assocClassName), 'refName' => 'id');
                     // Genera FKs
                     $dalForApp->addForeignKeys($hasManyTableName, $hm_fks);
                 }
             }
             // foreach hasMany
             // Genera FKs
             $dalForApp->addForeignKeys($tableName, $fks, false);
         }
         // foreach PO
     }
     // foreach app
 }