in database-jones/Adapter/common/MySQLSerialize.js [454:508]
function serializeObject(jsObject) {
var binary = new Binary(TYPE_SMALL_OBJ, jsObject);
var keyList = new List(binary, keyEntrySizeArray, KeyEntry);
var valueList = new List(binary, valueEntrySizeArray, ValueEntry);
var sortedKeys;
var sortedValues = [];
var validityCheck = [];
var size;
var valueEntryStartPos, keyDataStartPos, valueDataStartPos;
/* Build an ordered list of keys */
sortedKeys = Object.keys(jsObject).sort(sortKeys);
/* Build a list of values in key order */
sortedKeys.forEach(function(key, index) {
sortedValues[index] = jsObject[key];
});
/* Encode the values, skipping those that cannot be serialized */
sortedValues.forEach(function(item, index) {
var bin = serialize(item);
var valid = ! bin.isUndefined;
validityCheck[index] = valid;
if(valid) {
valueList.push(bin);
}
});
/* Encode the keys */
sortedKeys.forEach(function(key, index) {
if(validityCheck[index]) {
keyList.push(serializeKey(key));
}
});
size = binary.headerSize + valueList.getTotalSize() + keyList.getTotalSize();
if(size > 65535) {
binary.setLarge(); // then recalculate sizes:
size = binary.headerSize + valueList.getTotalSize() + keyList.getTotalSize();
}
/* object ::= element-count size key-entries value-entries keys values */
valueEntryStartPos = binary.headerSize + keyList.getSizeOfEntries();
keyDataStartPos = valueEntryStartPos+ valueList.getSizeOfEntries();
valueDataStartPos = keyDataStartPos + keyList.data.length;
binary.buffer = Buffer.concat( [
binary.writeHeader(valueList.entries.length, size),
keyList.writeEntries(keyDataStartPos),
valueList.writeEntries(valueDataStartPos),
keyList.data,
valueList.data
] );
assert.equal(binary.buffer.length, size);
return binary;
}