[SOLUCIONADO]Trabajar con 2 Archivos bytea

Buenas tarde a todos:
estoy trabajando con 2 archivos (imagenes), cuando hago una nueva fila y los set_blob correspondiente para c/u en simultaneo, funciona correcto. Cuando edito esos blob uno a la vez tambien funciona correcto, el problema es cuando quiero editar ambas imagenes, es decir tengo o no imagenes en el registro, si edito y selecciono ambas al guardar me guarda la ultima.
Aca va el codigo para que vean:

	
function set_persona($datos)
	{	
		if ($datos['huella']['tmp_name']!='') {
			$fp_huella = fopen($datos['huella']['tmp_name'], 'rb');
			$this->dep('dr_principal')->tabla('dt_persona')->set_blob('huella', $fp_huella);
		}  
		if ($datos['foto']['tmp_name']!='') {
			$fp_foto = fopen($datos['foto']['tmp_name'], 'rb');
			$this->dep('dr_principal)->tabla('dt_persona')->set_blob('foto', $fp_foto);
		} 
		$this->dep('dr_principal')->tabla('dt_persona)->set($datos);
  
	}

Alguna sugerencia?

Hola Gustavo,

Te pediria si me podes pegar aca la region del log que indica cual es la SQL que ejecutara el DT al sincronizarse, de todas maneras… probaste colocando el 'tabla(‘dt_persona)->set($datos);’ antes de setear los blobs?

Saludos

Richard:
pobre con el set de los datos antes de setear los blob y es lo mismo. No se como capturar el sql al sincronizar, revise los logs de apache y postgres pero solo me guarda cuando tengo error.
Saludos

Hola Gustavo,

lo de invertir las sentencias era para descartar algo medio loco que se me ocurrio, ya que los blob se llevan separados de los datos comunes dentro del DT.

Por otro lado, yo me referia a los logs de toba, desde el editor podes acceder mediante el icono que esta justo a la izquierda del que usas para desloguearte. Otra forma es directamente buscando en el archivo que se genera, el mismo se encuentra en ‘toba_dir/instalacion/i__nombre_instancia/p__nombre_proyecto/logs’.

Una ultima cosa que me queda por preguntarte, veo que vos estas abriendo el recurso a partir de su nombre temporal. Probaste moviendo el archivo a una carpeta propia y luego abrirlo desde ahi?.
El motivo de esto es que una vez terminado el pedido de pagina, al ser un archivo temporal… tranquilamente podria eliminarse del disco, en algunos casos funca y se mantiene pero no es algo constante para todas las versiones de PHP.

Saludos

Richard:
Esto es lo que se dispara en el evento modificacion

componente(5000109): [ registrar_evento ] 'modificacion' -> [ evt__formulario_persona__modificacion ]
array (
  0 => 
  array (
     'foto' => 
    array (
      'name' => 'curriculum-bitae_1.png',
      'type' => 'image/png',
      'tmp_name' => '/tmp/phpFcaXTX',
      'error' => 0,
      'size' => 78754,
    ),
    'huella' => 
    array (
      'name' => 'huella.jpeg',
      'type' => 'image/jpeg',
      'tmp_name' => '/tmp/phpc391A2',
      'error' => 0,
      'size' => 14686,
    ),
    'apellido' => 'Gonzales',
    'nombres' => 'Fernando',
    'idtipo_documento' => '12',
    'nro_documento' => '12400369',
    'idestado_civil' => '13',
    'sexo' => 'M',
    'idpais' => '10',
    'idprovincia' => '12',
    'idlocalidad' => '18',
    'calle' => NULL,
    'nro_propiedad' => NULL,
    'piso' => NULL,
    'dpto' => NULL,
     'idpais_nacimiento' => '9',
    'idprovincia_nacimiento' => '9',
    'idlocalidad_nacimiento' => '17',
   
  ),
)

Y aca esta la transaccion

************ ABRIR transaccion (sgp@localhost) ****************
UPDATE persona
SET foto = ?,
	huella = ?
WHERE idapersona = '11'
	AND apellido = 'Gonzales'
	AND nombres = 'Fernando'
	AND idtipo_documento = '12'
	AND nro_documento = '12400369'
	AND calle IS NULL
	AND nro_propiedad IS NULL
	AND piso IS NULL
	AND dpto IS NULL
	AND email_personal IS NULL
	AND fecha_nacimiento = '1975-10-15'
	AND idlocalidad = '18'
	AND idestado_civil = '13'
	AND sexo = 'M'
	AND idlocalidad_nacimiento = '17'

El recurso lo abro a partir de su nombre temporal por que si lo quiero abrir a desde su nombre original me tira este error

Las columnas binarias o BLOB esperan un "resource", producto generalmente de un "fopen" del archivo a subir a la base 

Lo que no probe es mover el archivo a una carpeta propia, por que cuando hago nueva fila funciona bien y muestra bien. Solo pasa esto en el caso de modificar el registro y pasarle las 2 imagenes juntas, por que cuando se las pasa por separado funciona bien. Te todas maneras estoy moviendo a la carpeta tmp del proyecto.
Otro cosa probe en el motor haciendo lo siguiente

select * 
from persona
where 
foto=huella

y me devuele el registro de esa persona.
Supongo que postgres compara bien los archivos binario.

Hola Gustavo,

estuve probando y efectivamente se trataba de un bug que solamente ocurria en la modificacion y cuando habia mas de un blob en la misma sentencia. Se estaba ciclando directamente sobre el arreglo que contiene los blobs, en lugar de ciclar por sus claves, aparentemente al hacer la copia de datos para el foreach no se mantenian correctamente las referencias a los recursos abiertos.

En cualquier caso, acabo de subir el fix a las diferentes ramas de desarrollo.

Saludos y gracias por el aviso :wink:

Hola Richard:
queria preguntarte si subiste a esta rama http://repositorio.siu.edu.ar/svn/toba/trunk_versiones/2.1 por q hice el up e incluso reinstale el toba y no pude cargar 2 fotos en simultaneo en la edicion.
Saludos

Richard:
acá estoy renuevo, creo que encontré otro error, en la tabla donde seteo los blobs cree un index unique con tipo y nro de documento, cuando quiero insertar otro registro que contenga los mismos tipo y nro de documento sin cargar ningún blob funciona bien, se captura el código de error y se personaliza los mensajes, pero cuando hago lo mismo y cargo blob no me captura el error me devuelve un notice diciendo que se esta violando la restricción.
Saludos

Hola Gustavo ,

Sip, el cambio se subio en la revision 5340.

Vos estas usando un manejador de errores personalizado para esa fuente de datos?. Me fijo si el SQL_STATE cambia… no deberia, ya que salta por un indice.

Saludos

Richard:
te muestro como capturo los errores

try{
             $this->cn()->guardar();
         } catch (toba_error_db $error) {
			$codigo = $error->get_sqlstate();
			clase_excepcion::get_mensaje_error($codigo, ' Personal ', 'EL ');
			$this->cn()->resetear();
			
         }

la clase excepción lo único que hace es armar el mensaje y lanzarlo, tengo una tabla con los mensajes según el código de error, prove incluso sacar el guardar del try catch y me devuelve el sqlstate pero en forma de mensaje, y cuando hago el setblob me lo muestra en forma de notice. Eso es lo que no entiendo.
Saludos

Hola Gustavo,

primeramente pedirte disculpas por el pifie que pegue, efectivamente tenias razon vos… subi el cambio a una rama equivocada del svn. Ahora si deberias poder verlo en la rama de desarrollo de la version 2.1.

Por otro lado, con respecto al tema de la excepcion… tengo un fix que me gustaria testear un toque mas ya que esta a nivel de toba_db. Basicamente lo que hace es lanzar una excepcion toba_error, por como esta hasta ahora lo que se dispara es directamente una excepcion de PDO, por eso es que no lo captura tu manejador.

Cierro esto y sale la version 2.1.2 con fritas.

Saludos

PD: Ya subi el fix, en un rato sale la version.

Richard:
ya esta funcionando el fix en la rama. Te pido disculpas pense que te había contestado.
Saludos