Re: Copiar contenido de campo Blob

From: Norman Mauricio Garcia <normangarcia64(at)yahoo(dot)co(dot)uk>
To: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Copiar contenido de campo Blob
Date: 2007-02-09 16:43:01
Message-ID: 501064.72136.qm@web25104.mail.ukl.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

muchas gracias por la ayuda Alvaro. Que pena la molestia. La solucion sera crear una copia exacta (necesito tener todas las versiones historicas del archivo asi que no me sirven referencias al mismo oid), pero la interfaz esta en php y creo que la forma que propones seria muy compleja asi que creo que voy a extraer todo el contenido del archivo a un directorio temporal e inmediatamente voy a crear el nuevo oid para asociarlo al registro copia.

Muchas gracias nuevamente.

----- Original Message ----
From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Norman Mauricio Garcia <normangarcia64(at)yahoo(dot)co(dot)uk>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Sent: Friday, 9 February, 2007 10:08:22 AM
Subject: Re: [pgsql-es-ayuda] Copiar contenido de campo Blob

Norman Mauricio Garcia escribió:
> Saludos lista,
>
> Tengo una tabla con un campo de tipo large object (oid me sale en la definición de la tabla). Ahora, estoy interesado en crear una copia del campo en otro registro, me explico. Digamos que estoy guardando un archivo pdf, pero quiero crear una copia de manera que si el usuario elimina el registro o cambia el archivo pdf el original siga intacto.
>
> Se que puedo extraer el contenido del oid al sistema de archivos y volver a cargarlo a la base de datos con lo_import para crear un nuevo oid, pero me gustaría saber si existe una forma de hacerlo directamente con PostgreSql.

No necesitas crear un nuevo OID para evitar que se borre. Los large
objects no se eliminan cuando se borran las referencias. Lo que puedes
hacer es simplemente crear un nuevo registro con el mismo OID.

Si alguien cambia un archivo al que hace referencia el primer registro,
entonces el segundo tambien cambiara, obviamente. Pero puedes crear un
LO que es una copia exacta de otro LO:

alvherre=# begin;
BEGIN
alvherre=# select lo_open(16403, 262144);
lo_open
---------
0
(1 fila)

alvherre=# select lo_creat(0);
lo_creat
----------
16405
(1 fila)

alvherre=# select lo_open(16405, 131072);
lo_open
---------
1
(1 fila)

alvherre=# select lowrite(1, loread(0, 8192));
lowrite
---------
356
(1 fila)
alvherre=# commit;
COMMIT

Este ultimo lo_write debes repetirlo hasta que el lo_write() retorne 0,
o menos de 8192 (o el tamaño de bloque que escojas).

Luego, en tu tabla, insertas una tupla con oid 16405, que es copia
exacta del oid 16403.

(Los valores 262144 y 131072 son INV_READ e INV_WRITE, respectivamente).

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

---------------------------(fin del mensaje)---------------------------
TIP 10: visita nuestro canal de IRC #postgresql-es en irc.freenode.net


___________________________________________________________
Copy addresses and emails from any email account to Yahoo! Mail - quick, easy and free. http://uk.docs.yahoo.com/trueswitch2.html

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alberto Cabello Sanchez 2007-02-09 17:01:08 Re: OT: Netiquette y asuntos genéricos
Previous Message Alvaro Herrera 2007-02-09 16:08:22 Re: Copiar contenido de campo Blob