2012-09-21 8 views
9

मैं PostgreSQL सी एपीआई, libpq के साथ काम कर रहा हूँ। मुझे रूबी में PGresult* में उनके समकक्ष डेटा प्रकारों में मानों को रूपांतरित करने में सक्षम होना चाहिए। मैं वर्तमान में बस सभी डेटा का चयन कर रहा हूं और PQgetvalue() का उपयोग कर रहा हूं, जो मुझे char* देता है जिसे मैं रूबी स्ट्रिंग में परिवर्तित कर सकता हूं। यह आसान है। लेकिन PQftype() द्वारा लौटाए गए ओआईडी के मुताबिक char* से , float या double से कोई भी प्रकार का रूपांतरण साझा कर सकता है?रूपांतरण टाइप करें। सी में libpq में PostgreSQL ओआईडी मान के साथ मैं क्या करूँ?

असल में, मुझे नहीं पता कि ओआईडी और the documentation की व्याख्या कैसे करें किसी भी पॉइंटर्स को नहीं लगता है। मुझे this page मिला, लेकिन यह सीआईपी में एक प्रकार के रूपांतरण करने के लिए इस ओआईडी का उपयोग करने के तरीके को समझने में मदद नहीं करता है। मुझे लगता है कि वहां स्थिरांक की एक सूची है जहां से मैं एक बड़ा स्विच स्टेटमेंट कर सकता हूं?

उत्तर

3

एक OID से प्रकार का नाम प्राप्त करने के लिए, बस इसे regtype लिए डाली:

SELECT 700::oid::regtype -- real 

किसी भी स्तंभ के प्रकार के प्राप्त करने के लिए (या plpgsql में चर), pg_typeof() का उपयोग करें:

SELECT pg_typeof(1::real) -- real 

आपको regtype का उत्तर देता है जो displayedtext psql या pgAdmin में है। आप स्पष्ट रूप से text करने के लिए इसे डाल सकता अगर जरूरत:

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

भी इस "बड़ी सूची", vulgo सूची तालिका pg_type, जहां प्रकार पंजीकृत हैं नहीं है।

SELECT * from pg_type LIMIT 10; 

More info in the excellent manual.

+1

धन्यवाद, हालांकि क्या आपको पता है कि प्रत्येक परिणाम में प्रत्येक कॉलम के लिए सर्वर पर राउंड-ट्रिपिंग के बजाय सी एपीआई से इसे प्राप्त करने का कोई तरीका है या नहीं? मुझे केवल मूल प्रकारों में दिलचस्पी है, न कि उपयोगकर्ता प्रकार। – d11wtq

+0

आप पोस्टग्रेस प्रत्येक परिणाम के साथ इस जानकारी को भेज सकते हैं, बस चयन आइटम जोड़ें - हालांकि यह अनावश्यक (प्रति पंक्ति) होगा। मैं सी एपीआई से परिचित नहीं हूँ। –

+0

कोई नाटक नहीं। आपकी सहायता के लिए धन्यवाद. मैं क्लाइंट लाइब्रेरी को कार्यान्वित कर रहा हूं, इसलिए उपयोगकर्ता क्वेरी को संशोधित नहीं करना चाहूंगा, या सर्वर को अत्यधिक अतिरिक्त अनुरोध नहीं भेजूंगा। मुझे लगता है कि मैंने इसे अब पाया है, वास्तव में, सूची में/pg_type.h :) – d11wtq

11

मैं इस पूछ के बाद जवाब मिला: यह बड़ा हो सकता है, एक झलक है। असल में libpq-fe.h और postgres.h के साथ कैटलॉग/pg_type.h नामक एक फ़ाइल है। आप libpq-fe.h और postgres.h सहित, तो आप, TEXTOID तरह परिभाषाओं का उपयोग कर सकते BOOLOID, INT4OID आदि के बाद शामिल करने की ज़रूरत

#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 
    } 
} 

आप को pg_type.h में सभी OIDs में देखने की जरूरत है असल में एक व्यापक सूची है, या केवल परीक्षण करें कि आप मूल SELECT 't'::boolean प्रकार पूछताछ आदि क्या कर रहे हैं और स्विच को केवल तभी बनाएं जब आपको एक नए प्रकार के समर्थन की आवश्यकता हो।

+2

ये शीर्षलेख libpq क्लाइंट कोड के बजाय पोस्टग्रेस सर्वर कोड का हिस्सा हैं। पोस्टग्रेज़ रिलीज़ के बीच मान बदलते हैं? – KayEss

संबंधित मुद्दे