Encode buffers as bytea hex strings

This commit is contained in:
Eugene Ware 2013-09-20 00:33:22 +10:00
parent 4662d41972
commit cd29f806f1

View File

@ -891,6 +891,14 @@ private:
paramValues[i] = cString;
} else if(val->IsNull()) {
paramValues[i] = NULL;
} else if(val->IsObject() && Buffer::HasInstance(val)) {
char *cHexString = MallocCHexString(val);
if(!cHexString) {
LOG("ArgToCStringArray: OUT OF MEMORY OR SOMETHING BAD!");
ReleaseCStringArray(paramValues, i-1);
return 0;
}
paramValues[i] = cHexString;
} else {
//a paramter was not a string
LOG("Parameter not a string");
@ -921,6 +929,27 @@ private:
strcpy(cString, *utf8String);
return cString;
}
//helper function to Malloc a Bytea encoded Hex string from a buffer
static char* MallocCHexString(v8::Handle<Value> buf)
{
char* bufferData = Buffer::Data(buf);
size_t hexStringLen = Buffer::Length(buf)*2 + 3;
char *cHexString = (char *) malloc(hexStringLen);
if(!cHexString) {
return cHexString;
}
strcpy(cHexString, "\\x");
for (uint32_t i = 0, k = 2; k < hexStringLen; i += 1, k += 2) {
static const char hex[] = "0123456789abcdef";
uint8_t val = static_cast<uint8_t>(bufferData[i]);
cHexString[k + 0] = hex[val >> 4];
cHexString[k + 1] = hex[val & 15];
}
cHexString[hexStringLen-1] = 0;
return cHexString;
}
void SendCopyFromChunk(Handle<Object> chunk) {
PQputCopyData(connection_, Buffer::Data(chunk), Buffer::Length(chunk));
}