2012-01-24 15 views
5

से libpq का उपयोग करके PostgreSQL में बाइनरी बड़े ऑब्जेक्ट (BLOB) डालें, क्या आप libpq का उपयोग कर दूरस्थ मशीन से PostgreSQL डेटाबेस में बाइनरी डेटा डालने का उदाहरण दे सकते हैं। मेरा दूसरा सवाल यह है: क्या सी ++ के साथ libpq की तुलना में कोई अन्य एपीआई अधिक कुशल है। धन्यवादरिमोट मशीन

उत्तर

10

धब्बे PostgreSQL — BYTEA और Large Objects में के 2 प्रकार के होते हैं। मैं बड़ी वस्तुओं का उपयोग करने के खिलाफ अनुशंसा करता हूं क्योंकि आप उन्हें टेबल में शामिल नहीं कर सकते हैं।

BYTEA के लिए आप libpq में कुछ इस तरह का उपयोग करेंगे:

PGresult* put_data_to_tablename(
    PGconn* conn, 
    int32_t id, 
    int data_size, 
    const char* const data 
) { 
    PGresult* result; 
    const uint32_t id_big_endian = htonl((uint32_t)id); 
    const char* const paramValues[] = { &id_big_endian, data }; 
    const int nParams = sizeof(paramValues)/sizeof(paramValues[0]); 
    const int paramLenghts[] = { sizeof(id_big_endian), data_size }; 
    const int paramFormats[] = { 1, 1 }; /* binary */ 
    const int resultFormat = 0; /* text */ 

    result = PQexecParams(
    conn, 
    "insert into tablename (id, data) values ($1::integer, $2::bytea)", 
    nParams, 
    NULL, /* Types of parameters, unused as casts will define types */ 
    paramValues, 
    paramLenghts, 
    paramFormats, 
    resultFormat 
); 
    return result; 
} 
1

का उपयोग libpqxx, सी ++ यह करने के लिए जिस तरह से है, जबकि libpq सी एपीआई है।

यहाँ कैसे pqxx का उपयोग कर यह करने के लिए की एक पूरी उदाहरण है: How to insert binary data into a PostgreSQL BYTEA column using the C++ libpqxx API?

संक्षेप में, प्रासंगिक सी ++ लाइनों इस तरह दिखना libpqxx का उपयोग कर:

void * bin_data = ...; // obviously do what you need to get the binary data... 
size_t bin_size = ...; // ...and the size of the binary data 
pqxx::binarystring bin(bin_data, bin_size); 
pqxx::result r = work.prepared("test")(bin).exec(); 
work.commit(); 
+1

वहाँ ध्यान देने योग्य बात libpqxx के साथ मुद्दों उम्र बढ़ने रहे वर्थ, और नहीं, यह साइट पर बताए गए "आधिकारिक" postgresql C++ api नहीं है। – user3791372

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