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); }