Skip to content

Commit cd29f80

Browse files
committed
Encode buffers as bytea hex strings
1 parent 4662d41 commit cd29f80

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

src/binding.cc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,14 @@ class Connection : public ObjectWrap {
891891
paramValues[i] = cString;
892892
} else if(val->IsNull()) {
893893
paramValues[i] = NULL;
894+
} else if(val->IsObject() && Buffer::HasInstance(val)) {
895+
char *cHexString = MallocCHexString(val);
896+
if(!cHexString) {
897+
LOG("ArgToCStringArray: OUT OF MEMORY OR SOMETHING BAD!");
898+
ReleaseCStringArray(paramValues, i-1);
899+
return 0;
900+
}
901+
paramValues[i] = cHexString;
894902
} else {
895903
//a paramter was not a string
896904
LOG("Parameter not a string");
@@ -921,6 +929,27 @@ class Connection : public ObjectWrap {
921929
strcpy(cString, *utf8String);
922930
return cString;
923931
}
932+
933+
//helper function to Malloc a Bytea encoded Hex string from a buffer
934+
static char* MallocCHexString(v8::Handle<Value> buf)
935+
{
936+
char* bufferData = Buffer::Data(buf);
937+
size_t hexStringLen = Buffer::Length(buf)*2 + 3;
938+
char *cHexString = (char *) malloc(hexStringLen);
939+
if(!cHexString) {
940+
return cHexString;
941+
}
942+
strcpy(cHexString, "\\x");
943+
for (uint32_t i = 0, k = 2; k < hexStringLen; i += 1, k += 2) {
944+
static const char hex[] = "0123456789abcdef";
945+
uint8_t val = static_cast<uint8_t>(bufferData[i]);
946+
cHexString[k + 0] = hex[val >> 4];
947+
cHexString[k + 1] = hex[val & 15];
948+
}
949+
cHexString[hexStringLen-1] = 0;
950+
return cHexString;
951+
}
952+
924953
void SendCopyFromChunk(Handle<Object> chunk) {
925954
PQputCopyData(connection_, Buffer::Data(chunk), Buffer::Length(chunk));
926955
}

0 commit comments

Comments
 (0)