Esempio n. 1
0
 public function insert($tableName, $obj)
 {
     // FIXME: obj deberia ser una matriz de valores, no un PO. A DAL no deverian llegar POs.
     //        Y todas las operaciones sobre el PO deberian hacerse tambien en PM.
     Logger::getInstance()->dal_log("DAL::insert " . $obj->getClass() . " in table={$tableName}");
     // =======================================================================
     // FIXME: deberia estar en PM
     // Soporte para multiple table inheritance mapping.
     // Si el objeto no tiene mti simplemente se devuelve un array con el mismo objeto de entrada.
     // El primero es siempre el que corresponde con la superclase de nivel 1
     $pinss = MultipleTableInheritanceSupport::getPartialInstancesToSave($obj);
     //Logger::getInstance()->dal_log("insert_query count MTI ". count($pinss) . " " . __FILE__ . " " . __LINE__ );
     //Logger::struct( $pinss );
     // ======================================================================================================
     // http://code.google.com/p/yupp/issues/detail?id=111
     // New: todas las subclases en MTI tienen el mismo identificador que la superclase de nivel 1,
     //      asi hay que generar un solo identificador, ahorrando multiples consultas.
     // Necesito la tabla para la superclase, no la del objeto ($tableName)
     // Si viene un ObjectReference, no resuelve bien su nombre de tabla porque es calculado, entonces dejo el tableName que viene.
     $superTableName = $tableName;
     if ($obj->getClass() != 'ObjectReference') {
         $superTableName = YuppConventions::tableName($pinss[0]);
     }
     $id = $this->generateNewId($superTableName);
     // Pide sobre la tableName de la superclase
     $obj->setId($id);
     if (count($pinss) == 1) {
         //Logger::struct( $pinss, "DAL.insert 1 ($tableName)" ); // OBS: si obj es comentario, pinss tiene un objeto que es Entrada, no Comentario.
         //Logger::struct( $obj, "DAL.insert 1 ($tableName)" );
         // Ahora inserta...
         //Logger::getInstance()->dal_log("insert_query call " . __FILE__ . " " . __LINE__ );
         $this->insert_query($obj, $tableName);
     } else {
         //Logger::struct( $pinss, "DAL.insert 2 ($tableName)" );
         // ESTO SE DEBERIA HACER EN PM!
         // Procesa el modelo, arma instancias parciales, setea ids...
         foreach ($pinss as &$partialInstance) {
             // Como tableName es el nombre de la tabla del objeto que quiero salvar,
             // y posiblemente alguna superclase de obj se guarde en otra tabla,
             // para esas instancias parciales tengo que generar el nombre de la tabla.
             // Aunque para la tambla del objeto tengo el nombre, lo genero de nuevo para simplificar logica, de todos modos es el mismo...
             // Esta tabla no se usa! abajo en insert_query se saca el nombre de la tabla del propio objeto
             //$tableName = YuppConventions::tableName( $partialInstance );
             // Todas las instancias parciales usan el mismo id
             $partialInstance->setId($id);
             // Seteo la clase real en cada una de las instancias parciales, para poder cargar (get, list, find) desde una instancia parcial.
             $partialInstance->setClass($obj->getClass());
         }
         // foreach
         foreach ($pinss as &$partialInstance) {
             //Logger::getInstance()->dal_log("insert_query MTI call " . __FILE__ . " " . __LINE__ );
             $this->insert_query($partialInstance);
             // Saca la tabla del objeto, por eso no se la paso
         }
         // foreach
     }
     // si es mti
     Logger::getInstance()->dal_log("/DAL::insert");
     return $obj->getId();
     // Devuelvo el id generado...
 }
 /**
  * Salva solo un objeto (sin las asociaciones)
  */
 public function save_object(PersistentObject $obj, $sessId)
 {
     Logger::getInstance()->pm_log("PM:save_object " . get_class($obj));
     $tableName = YuppConventions::tableName($obj);
     if (!$obj->getId()) {
         // FIXME: PO no se le deberia pasar a DAL, deberia transformarse a datos aqui.
         $this->dal->insert($tableName, $obj);
         // Salva los objetos, con sus datos simples.
     } else {
         // Nuevo: si se modificaron campos simples o asociaciones hasone hago udate, si no, no.
         if ($obj->isDirty() || $obj->isDirtyOne()) {
             // El primero es siempre el que corresponde con la superclase de nivel 1
             $pinss = MultipleTableInheritanceSupport::getPartialInstancesToSave($obj);
             foreach ($pinss as $partialInstance) {
                 $tableName = YuppConventions::tableName($partialInstance);
                 // ========================================================================================
                 // Con el nuevo esquema de identificacion, el id del objeto es el mismo que el de todos
                 // los objetos parciales de MTI, por lo que no es necesario hacer esto de pedir los ids.
                 // Igualmente, como es update, tampoco lo veo necesario, porque la instancia parcial ya
                 // tendria el identificador del padre, para que setearselo de nuevo? y tambienm, para que
                 // setearle la class de nuevo si ya la tiene?
                 // El id de todas las instancias parciales es el mismo.
                 $id = $obj->getId();
                 $partialInstance->setId($id);
                 $partialInstance->setClass($obj->getClass());
                 // En ambos casos tengo que colocar la clase correcta porque getPartialInstancesToSave me devuelve solo las clases que generan tabla... y si tengo C1 me va a devolver C, y la clase se la tengo que setear en C1 aunque se mapee en la misma tabla.
                 //Logger::struct( $partialInstance, "PARTIAL INSTANCE" );
                 //Logger::struct( $this->getDataFromObject($partialInstance), "PARTIAL INSTANCE" );
                 // 2: Si existe, hace update
                 if ($this->dal->exists($tableName, $id)) {
                     $this->dal->update($tableName, $this->getDataFromObject($partialInstance));
                 } else {
                     Logger::getInstance()->dal_log("DAL::update NO EXISTE " . $tableName . " " . $id . " " . __LINE__);
                 }
             }
             // foreach ( $pinss as $partialInstance )
         }
         // si esta dirty
     }
     $obj->setSessId($sessId);
 }