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) |