/** * @param mixed $id_registro Clave interna del registro * @ignore */ protected function ejecutar_sql_update($id_registro, $tabla = null, $where = null, $cols_tabla = array(), $tabla_ext = false) { $binarios = array(); $registro = $this->datos[$id_registro]; $cambios_reales = $this->objeto_tabla->get_cambios_fila($id_registro, $registro); $tabla = is_null($tabla) ? $this->_tabla : $tabla; $columnas = empty($cols_tabla) ? $this->_columnas : $cols_tabla; //Genero las sentencias de la clausula SET para cada columna $set = array(); $db = toba::db($this->_fuente); foreach ($columnas as $columna) { $col = $columna['columna']; $es_binario = $columna['tipo'] == 'B'; $es_secuencia = $columna['secuencia'] != ""; $es_externa = $columna['externa'] == 1; $es_clave = $columna['pk'] == 1; //columna modificable: realmente se modifico, no es secuencia, no es externa, $es_modificable = !$es_secuencia && !$es_externa && isset($cambios_reales[$col]) && (!$es_clave || $es_clave && $this->get_flag_mod_clave()); // no es PK (excepto que se se declare explicitamente la alteracion de PKs) if ($es_modificable) { if ($es_binario) { $blob = $this->objeto_tabla->_get_blob_transaccion($id_registro, $col); if ($blob === false) { //-- Si no esta seteado es un blob nulo $set[] = "{$col} = NULL"; } elseif (is_resource($blob)) { $binarios[] = $blob; $set[] = "{$col} = ?"; } else { //No tocar nada } } elseif (!isset($registro[$col]) || $registro[$col] === NULL) { $set[] = "{$col} = NULL"; } elseif (is_bool($registro[$col])) { $valor = $registro[$col] ? 1 : 0; $set[] = "{$col} = '{$valor}'"; } else { if ($this->_hacer_trim_datos) { $set[] = "{$col} = " . $db->quote(trim($registro[$col])); } else { $set[] = "{$col} = " . $db->quote($registro[$col]); } } } } if (empty($set)) { $this->log('No hay campos para hacer el UPDATE'); return null; } //Armo el SQL $where = is_null($where) ? $this->generar_sql_where_registro($id_registro) : $where; $sql = "UPDATE " . $this->agregar_schema($tabla, $tabla_ext) . "\nSET " . implode(",\n\t", $set) . "\nWHERE " . implode("\n\tAND ", $where) . ";"; $this->log("registro: {$id_registro}\n " . $sql); if (empty($binarios)) { $this->ejecutar_sql($sql, $id_registro); } else { $this->ejecutar_con_binarios($sql, $binarios, $id_registro); } }
/** * Reconecta las columnas relacionadas entre las tablas recien clonadas * @param array $dep_nuevas Objetos toba_datos_tabla_info con la informacion de la nuevas tablas * @param array $dep_viejas Objetos toba_datos_tabla_info con la informacion de las originales * @param toba_datos_tabla $tabla_dr Objeto que representa la tabla de relacion de columnas */ function clonar_relacion_columnas($dep_nuevas, $dep_viejas, $tabla_dr) { $relaciones_disponibles = $tabla_dr->get_filas(null, true, false); foreach ($relaciones_disponibles as $id_fila => $rel_columnas) { //Obtengo los ids de las tablas padre e hija. $tabla_padre = $rel_columnas['padre_objeto']; $tabla_hija = $rel_columnas['hijo_objeto']; //Obtengo los datos originales de las columnas padre e hija. $original_padre = current($dep_viejas[$tabla_padre]->get_info_columnas(array('col_id' => $rel_columnas['padre_clave']))); $original_hijo = current($dep_viejas[$tabla_hija]->get_info_columnas(array('col_id' => $rel_columnas['hijo_clave']))); //Ahora busco los datos para la misma columna pero entre los nuevos $nuevo_padre = current($dep_nuevas[$tabla_padre]->get_info_columnas(array('columna' => $original_padre['columna']))); $nuevo_hijo = current($dep_nuevas[$tabla_hija]->get_info_columnas(array('columna' => $original_hijo['columna']))); //Genero la nueva fila con los datos modificados $nva_fila = array('padre_objeto' => $nuevo_padre['objeto'], 'padre_clave' => $nuevo_padre['col_id'], 'hijo_objeto' => $nuevo_hijo['objeto'], 'hijo_clave' => $nuevo_hijo['col_id']); $tabla_dr->modificar_fila($id_fila, $nva_fila); } }