sau hàng giờ tài liệu/bảng/danh sách gửi thư và không có tiến bộ nào tôi có thể hỏi bạn: Làm cách nào để 'mã hóa' dữ liệu của tôi để sử dụng nó cho việc vận chuyển nhị phân bằng cách sử dụng libpq's PQexecParams(.)
?libpq của PostgreSQL: Mã hóa cho truyền tải nhị phân ARRAY [] - dữ liệu?
biến đơn giản chỉ là để về cuối lớn:
PGconn *conn;
PGresult *res;
char *paramValues[1];
int paramLengths[1];
int paramFormats[1];
conn = PQconnectdb(CONNINFO);
// -- (1) -- send a float value
float val_f = 0.123456789; // float precision: ~7 decimal digits
// alloc some memory & write float (in big endian) into
paramValues[0] = (char *) malloc(sizeof(val_f));
*((uint32_t*) paramValues[0]) = htobe32(*((uint32_t*) &val_f)); // host to big endian
paramLengths[0] = sizeof(val_f);
paramFormats[0] = 1; // binary
res = PQexecParams(conn, "SELECT $1::real ;", //
1, // number parameters
NULL, // let the backend deduce param type
paramValues, //
paramLengths, //
paramFormats, //
0); // return text
printf("sent float: %s \n", PQgetvalue(res, 0, 0));
// --> sent float: 0.123457
và như thế này cũng tăng gấp đôi, int, vv ...
Nhưng làm thế nào về mảng?
float vals_f[] = {1.23, 9.87};
// alloc some memory
paramValues[0] = (char *) malloc(sizeof(float) * 2);
// ???? paramValues[0] = ??????
paramLengths[0] = sizeof(float) * 2;
paramFormats[0] = 1; // binary
res = PQexecParams(conn, "SELECT $1::real[] ;", //
1, // number parameters
NULL, // let the backend deduce param type
paramValues, //
paramLengths, //
paramFormats, //
0); // return text
printf("sent float array: %s \n", PQgetvalue(res, 0, 0));
Có ví dụ nào về chuyển dữ liệu ARRAY ở định dạng nhị phân của PostgreSQL không? Các mã trong backend/utils/adt/
không giúp tôi nhiều (ngoại trừ bây giờ tôi biết có một ARRAYTYPE, nhưng không phải là cách để sử dụng chúng) :-(
tôi chỉ cần một hàm char* to_PQbin(float [] input, int length)
cho đi để paramValues[.]
...
Thanks a lot, Tebas
PS: cách đề nghị chuyển đổi biến đơn giản (chứ không phải htobe32(.)
của tôi) là gì