function serializeObject()

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;
}