33.4. Funciones en el servidor #

Las funciones en el servidor diseñadas para manipular objetos grandes desde SQL se enumeran en la Table 33.1.

Table 33.1. Funciones de objetos grandes orientadas a SQL

Función

Descripción

Ejemplo(s)

lo_from_bytea ( loid oid, data bytea ) → oid

Crea un objeto grande y almacena data en él. Si loid es cero, el sistema elegirá un OID libre; de lo contrario, se utilizará ese OID (generando un error si algún objeto grande ya tiene ese OID). En caso de éxito, se devuelve el OID del objeto grande.

lo_from_bytea(0, '\xffffff00')24528

lo_put ( loid oid, offset bigint, data bytea ) → void

Escribe data comenzando en el desplazamiento (offset) indicado dentro del objeto grande; el objeto grande se agranda si es necesario.

lo_put(24528, 1, '\xaa')

lo_get ( loid oid [, offset bigint, length integer ] ) → bytea

Extrae el contenido del objeto grande o una subcadena del mismo.

lo_get(24528, 0, 3)\xffaaff


Existen funciones adicionales en el servidor correspondientes a cada una de las funciones de cliente descritas anteriormente; de hecho, en su mayor parte, las funciones de cliente son simplemente interfaces para las funciones de servidor equivalentes. Las que son igualmente convenientes de llamar mediante comandos SQL son lo_creat, lo_create, lo_unlink, lo_import y lo_export. Aquí tienes ejemplos de su uso:

CREATE TABLE image (
    name            text,
    raster          oid
);

SELECT lo_creat(-1);       -- devuelve el OID del nuevo objeto grande vacío

SELECT lo_create(43213);   -- intenta crear un objeto grande con OID 43213

SELECT lo_unlink(173454);  -- elimina el objeto grande con OID 173454

INSERT INTO image (name, raster)
    VALUES ('beautiful image', lo_import('/etc/motd'));

INSERT INTO image (name, raster)  -- igual que arriba, pero especificando el OID a usar
    VALUES ('beautiful image', lo_import('/etc/motd', 68583));

SELECT lo_export(image.raster, '/tmp/motd') FROM image
    WHERE name = 'beautiful image';

Las funciones en el servidor lo_import y lo_export se comportan de manera considerablemente diferente a sus análogas en el cliente. Estas dos funciones leen y escriben archivos en el sistema de archivos del servidor, utilizando los permisos del usuario propietario de la base de datos. Por lo tanto, por defecto, su uso está restringido a los superusuarios. En contraste, las funciones de importación y exportación en el cliente leen y escriben archivos en el sistema de archivos del cliente, utilizando los permisos del programa cliente. Las funciones del lado del cliente no requieren ningún privilegio de base de datos, excepto el privilegio para leer o escribir el objeto grande en cuestión.

Caution

Es posible otorgar (GRANT) el uso de las funciones del lado del servidor lo_import y lo_export a no superusuarios, pero se requiere una consideración cuidadosa de las implicaciones de seguridad. Un usuario malicioso con tales privilegios podría convertirlos fácilmente en superusuario (por ejemplo, reescribiendo archivos de configuración del servidor), o podría atacar el resto del sistema de archivos del servidor sin molestarse en obtener privilegios de superusuario de la base de datos como tal. Por lo tanto, el acceso a roles que tengan tal privilegio debe protegerse con el mismo cuidado que el acceso a los roles de superusuario. No obstante, si se necesita usar lo_import o lo_export en el servidor para alguna tarea rutinaria, es más seguro usar un rol con esos privilegios que uno con privilegios de superusuario completos, ya que eso ayuda a reducir el riesgo de daños por errores accidentales.

La funcionalidad de lo_read y lo_write también está disponible mediante llamadas en el servidor, pero los nombres de las funciones en el servidor difieren de las interfaces de cliente en que no contienen guiones bajos. Debes llamar a estas funciones como loread y lowrite.