Exemple #1
0
 /**
  * @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);
     }
 }