@@ -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