2012-09-21 10 views
9

Pracuję z C API PostgreSQL, libpq. Muszę być w stanie przekonwertować wartości w PGresult* na ich równoważne typy danych w Ruby. Właśnie wybieram wszystkie dane i używam PQgetvalue(), co daje mi char*, którą mogę przekonwertować na ciąg ruby. To łatwe. Ale czy są jakieś przykłady, które ktoś może udostępnić, które dokonują konwersji typu z char* na, powiedzmy, int, float lub double, zgodnie z OID zwróconym przez PQftype()?Konwersja typu. Co mam zrobić z wartością OID PostgreSQL w libpq w C?

Właściwie, w skrócie, nie mam pojęcia, jak interpretować OID i the documentation nie wydaje się dawać żadnych wskazówek. Znalazłem this page, ale to nie pomaga zrozumieć, jak używać tego OID do konwersji typu w C API. Zgaduję, że istnieje lista stałych gdzieś, gdzie mogę dokonać dużej zmiany?

Odpowiedz

3

Aby uzyskać nazwę typu z OID, po prostu oddanych do regtype:

SELECT 700::oid::regtype -- real 

Aby uzyskać typ jakichkolwiek kolumn (lub zmienna w plpgsql), użyj pg_typeof():

SELECT pg_typeof(1::real) -- real 

Daje odpowiedź typu regtype, która jest displayed jako text w psql lub pgAdmin. można oddać go do text wyraźnie razie potrzeby:

SELECT pg_typeof(1::real)::text -- real 

Jest też ta „wielka lista”, vulgo stół Katalog pg_type, gdzie są zarejestrowane typy. To może być wielki, mają okiem:

SELECT * from pg_type LIMIT 10; 

More info in the excellent manual.

+1

Dzięki, czy wiesz, czy istnieje sposób na uzyskanie tego z interfejsu API C zamiast potykać się do serwera dla każdej kolumny w każdym wyniku? Interesują mnie tylko typy podstawowe, a nie typy użytkowników. – d11wtq

+0

Możesz mieć Postgres wysłać te informacje z każdym wynikiem, po prostu dodać elementy SELECT - choć byłoby to zbyteczne (w jednym rzędzie). Nie znam C API. –

+0

Brak dramatów. Dzięki za pomoc. Wdrażam bibliotekę klienta, więc wolałbym nie modyfikować zapytań użytkowników lub przesyłać nadmiernych dodatkowych żądań do serwera. Myślę, że znalazłem go teraz, w katalogu/pg_type.h :) – d11wtq

11

znalazłem odpowiedź po zadaniu tego. Zasadniczo istnieje plik o nazwie katalog/pg_type.h, obok libpq-fe.h i postgres.h. Trzeba to po tym libpq-fe.h i postgres.h, a następnie można przejść do definicji jak TEXTOID, BOOLOID, INT4OID itp

#include <stdio.h> 
#include <postgres.h> 
#include <libpq-fe.h> 
#include <catalog/pg_type.h> 

// ... snip ... 

if (PQgetisnull(result, row, col)) { 
    // value is NULL, nothing more to do 
} else { 
    char * value = PQgetvalue(result, row, col); 
    int length = PQgetlength(result, row, col); 

    switch (PQftype(result, col)) { 
    case INT2OID: 
    case INT4OID: 
    case INT8OID: 
     // process value as an integer 
     break; 

    default: 
     // just default to a text representation 
    } 
} 

trzeba spojrzeć na wszystkie OID w pg_type.h do faktycznie masz obszerną listę lub po prostu przetestuj, co otrzymujesz, wykonując podstawowe zapytania typu SELECT 't'::boolean i zbuduj przełącznik tylko wtedy, gdy potrzebujesz nowego typu.

+2

Te nagłówki są częścią kodu serwera postgres, a nie kodu klienta libpq. Czy wartości zmieniają się między wydaniami postgreS? – KayEss

Powiązane problemy