From cd29f806f10d3bceaaa932583892725e96683499 Mon Sep 17 00:00:00 2001 From: Eugene Ware Date: Fri, 20 Sep 2013 00:33:22 +1000 Subject: [PATCH] Encode buffers as bytea hex strings --- src/binding.cc | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/binding.cc b/src/binding.cc index a9a7943f..92d6f958 100644 --- a/src/binding.cc +++ b/src/binding.cc @@ -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 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(bufferData[i]); + cHexString[k + 0] = hex[val >> 4]; + cHexString[k + 1] = hex[val & 15]; + } + cHexString[hexStringLen-1] = 0; + return cHexString; + } + void SendCopyFromChunk(Handle chunk) { PQputCopyData(connection_, Buffer::Data(chunk), Buffer::Length(chunk)); }