2010-05-06 4 views
2

J'utilise la bibliothèque libpq en C pour accéder à ma base de données PostgreSQL. Donc, quand je fais res = PQexec (conn, "SELECT point FROM test_point3d"); Je ne sais pas comment convertir le PGresult que j'ai obtenu à mon type de données personnalisé. Je sais que je peux utiliser la fonction PQgetValue, mais encore une fois, je ne sais pas comment convertir la chaîne de retour en mon type de données personnalisé.Comment convertir un PGresult en type de données personnalisé avec libpq (PostgreSQL)

+0

Quel est votre type de données personnalisé? –

+0

Quelque chose comme ceci: typedef struct Point3D { \t char id [50]; \t int idnull; \t double x; \t double y; \t double z; \t } \t Point3D; Je pense que je dois analyser la chaîne de retour de PQgetValue. Je travaille sur ceci donc si cela fonctionne je l'afficherai ici. : D – mocopera

+0

Presque tout est renvoyé sous forme de chaîne. Les [tableaux] de Postgres (http://www.postgresql.org/docs/current/static/arrays.html#ARRAYS-IO) sont un bon exemple pour quelque chose qui est retourné sous forme de chaîne et qui doit être analysé par l'application pour être utile . En fonction de "test_point3d.point" et de la manière dont il est représenté en tant que/convert to string par Postgres, vous devrez analyser cette chaîne et la convertir en votre type de données. –

Répondre

4

La meilleure façon de penser à cela est que les types de données interagissent avec les applications sur une interface textuelle. Libpq renvoie une chaîne à partir de n'importe quoi. Le programmeur a la responsabilité d'analyser la chaîne et de créer un type de données à partir de celle-ci. Je sais que l'auteur a probablement abandonné la question, mais je travaille sur quelque chose de similaire et il vaut la peine de documenter quelques astuces importantes qui sont utiles dans certains cas.

De toute évidence, s'il s'agit d'un langage de type C, avec sa propre représentation d'entrée et de sortie, vous devrez alors analyser la chaîne comme vous le feriez normalement.

Toutefois, pour les tableaux et les tuples, la notation est essentiellement

[open_type_identifier][csv_string][close_type_identifier] 

Par exemple, un tuple peut être représenté comme:

(35,65,1111111,f,f,2011-10-06,"2011-10-07 13:11:24.324195",186,chris,f,,,,f) 

Cela rend plus facile à analyser. Vous pouvez généralement utiliser les processeurs csv existants une fois que vous avez décoché le premier et le dernier caractère. De plus, pensez à:

select row('test', 'testing, inc', array['test', 'testing, inc']); 
         row      
------------------------------------------------- 
(test,"testing, inc","{test,""testing, inc""}") 
(1 row) 

Comme cela montre que vous avez CSV la norme s'échappant à l'intérieur des attributs imbriqués, de sorte que vous pouvez, en effet, déterminer que le troisième attribut est un tableau, puis (après avoir undoubled les guillemets), l'analyser comme un tableau. De cette façon, les structures de données imbriquées peuvent être traitées d'une manière à peu près similaire à ce que vous pourriez attendre avec un format comme JSON. L'astuce est que c'est un CSV imbriqué.

+0

le '(' et ')' sont utilisés dans les données personnalisées types aussi, mais pas pour les types natifs – user3791372

Questions connexes