El comando copy de Postgres tiene opciones para leer y escribir en la conexión de red utilizada por libpq++. Por esta razon, se necesitan funciones para acceder a esta conexión de red directamente, de forma que las aplicaciones puedan tomar ventajas completas de esta capacidad.
PgDatabase::GetLine lee una linea de caracteres terminada con "nueva línea" (transmitida por el servidor) en una zona de almacenamiento (un buffer) string de tamaño length.
int PgDatabase::GetLine(char* string, int length) |
Como la rutina de sistema de Unix fgets (3), esta rutina copia length-1 caracteres en string. Es como gets (3), sin embargo, en que convierte la terminación "nueva línea" en un caracter null.
PgDatabase::GetLine Devuelve EOF al final de un fichero, 0 si se ha leido la línea entera, y 1 si la zona de almacenamiento de ha llenado pero no se ha leído aún el carácter "nueva línea" de terminación.
Nótese que la aplicación debe comprobar si la nueva línea consiste simplemente en único punto ("."), lo que indicaría que el servidor ha terminado de enviar el resultado de copy. Por ello, si la aplicación siempre espera recibir líneas que tienen más de length-1 caracteres de longitud, la aplicación deberá asegurarse de comprobar el valor de retorno de PgDatabase::GetLine muy cuidadosamente.
PgDatabase::PutLine Envía un string terminado en null al servidor.
void PgDatabase::PutLine(char* string) |
La aplicación debe enviar explícitamente un único punto (".") para indicar al servidor que ha terminado de enviar sus datos.
PgDatabase::EndCopy sincroniza con el servidor.
int PgDatabase::EndCopy() |
El valor devuelto es 0 cuando se completa con éxito, y distinto de cero en otro caso.
As an example:
PgDatabase data; data.Exec("create table foo (a int4, b char(16), d float8)"); data.Exec("copy foo from stdin"); data.putline("3\etHello World\et4.5\en"); data.putline("4\etGoodbye World\et7.11\en"); &... data.putline(".\en"); data.endcopy(); |