Re: Copiar contenido de campo Blob

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
Subject: Re: Copiar contenido de campo Blob
Date: 2007-02-09 16:08:22
Message-ID: 20070209160822.GH4253@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Norman Mauricio Garcia 2007-02-09 16:43:01 Re: Copiar contenido de campo Blob
Previous Message Norman Mauricio Garcia 2007-02-09 15:33:40 Copiar contenido de campo Blob