2011-05-02 14 views
5

Tengo una tabla creada como:Postgresql PQgetvalue: return array

CREATE TABLE tbl_test 
(
    id  bigserial PRIMARY KEY, 
    interest int   ARRAY[2] 
); 

que tiene PGresult* res usando PQexec(conn, "SELECT * FROM tbl_test");

Ahora, ¿cómo puedo obtener int[] de PQgetvalue(res, 0, 1).
No deseo depender de las estructuras definidas en array.h ya que pueden cambiar.

No pude encontrar ninguna API en los documentos Postgresql que pueden hacer cosas.
Por favor, asesórese.

Saludos,
Mayank

+0

Has especificado qué tipo de devolución quieres; pero actualice la pregunta para ser explícito sobre el valor * de retorno * que desea. – bignose

Respuesta

5

PQgetvalue() Devuelve la representación de cadena del valor del campo a menos que especifique un cursor binario. En cualquier caso (cadena o cursor binario) necesitará suministrar el código para manipular el resultado en la forma que desee.

Puede encontrar algunas ideas en el PostgreSQL source code.

  • src/backend/utils/adt/arrayfuncs.c
  • src/include/utils/array.h.

Y hay algo de código en contrib/intArray.

En http://doxygen.postgresql.org/, haga clic en "Archivos", luego busque "matriz".

A nivel de la cadena, que es lo PQgetvalue() devuelve, probablemente es fácil de Google hasta un cierto código que extrae los números enteros a partir de una cadena delimitada por comas.

+0

Parece que no es posible lo que necesito :) – Mayank

+0

Oh, es posible. Simplemente no hay una API para eso. Puede escribir una función en C que acepte una cadena, como "{1,2,3}", y devuelva (o llene) una matriz de int. No es simple, porque tendrías que acomodar (o renunciar a) matrices multidimensionales y matrices de tamaño arbitrario. Pero es posible. Arreglé un código para convertir "{1,2,3}" en una matriz de int, y no fue demasiado difícil. (Aprendí a odiar strtol(), sin embargo.) –

+0

Muchas gracias Catcall. Quise decir que no es posible obtener 'int *' a cambio. Convertir {x, y} es una cosa diferente. Bueno, voy a estar haciendo eso :) – Mayank