Las herramientas que Postgres proporciona para acceder a los objetos grandes, tanto en el backend como parte de funciones definidas por el usuario como en el frontend como parte de una aplicación que utiliza la interfaz, se describen más abajo. Para los usuarios familiarizados con Postgres 4.2, PostgreSQL tiene un nuevo conjunto de funciones que proporcionan una interfaz más coherente.
Toda manipulación de objetos grandes debe ocurrir dentro de una transacción SQL. Este requerimiento es obligatorio a partir de Postgres v6.5, a pesar que en versiones anteriores era un requerimiento implícito, e ignorarlo resultará en un comportamiento impredecible. |
La interfaz de objetos grandes en Postgres está diseñada en forma parecida a la interfaz del sistema de archivos de Unix, con funciones análogas como open(2), read(2), write(2), lseek(2), etc. Las funciones de usuario llaman a estas rutinas para obtener sólo los datos de interés de un objeto grande. Por ejemplo, si existe un tipo de objeto grande llamado foto_sorpresa que almacena fotografías de caras, entonces puede definirse una función llamada barba sobre los datos de foto_sorpresa. Barba puede mirar el tercio inferior de una fotografía, y determinar el color de la barba que aparece, si es que hubiera. El contenido total del objeto grande no necesita ser puesto en un búfer, ni siquiera examinado por la función barba. Los objetos grandes pueden ser accedidos desde funciones C cargadas dinámicamente o programas clientes de bases de datos enlazados con la librería. Postgres proporciona un conjunto de rutinas que soportan la apertura, lectura, escritura, cierre y posicionamiento en objetos grandes.
La rutina
Oid lo_creat(PGconn *conexion, int modo) |
inv_oid = lo_creat(INV_READ|INV_WRITE|INV_ARCHIVE); |
Para importar un archivo de UNIX como un objeto grande, puede llamar a la función
Oid lo_import(PGconn *conexion, const char *nombre_de_archivo) |
Para exportar un objeto grande dentro de un archivo de UNIX, puede llamar a la función
int lo_export(PGconn *conexion, Oid lobjId, const char *nombre_de_archivo) |
Para abrir un objeto grande existente, llame a la función
int lo_open(PGconn *conexion, Oid lobjId, int modo) |
La rutina
int lo_write(PGconn *conexion, int fd, const char *buf, size_t largo) |
La rutina
int lo_read(PGconn *conexion, int fd, char *buf, size_t largo) |
Para cambiar la ubicación actual de lectura o escritura en un objeto grande, utilice la función
int lo_lseek(PGconn *conexion, int fd, int desplazamiento, int desde_donde) |
Un objeto grande puede cerrarse llamando a
int lo_close(PGconn *conexion, int fd) |