Local getBufferForText()

in jones-ndb/impl/src/ndb/NdbTypeEncoders.cpp [985:1036]


Local<Object> getBufferForText(const NdbDictionary::Column *col,
                               Handle<String> str) {
  const EncoderCharset * csinfo = getEncoderCharsetForColumn(col);
  int length, utf8Length;
  Local<Object> buffer;
  char * data;

  /* Fully Externalized Value; no copying.
  */
  if(   (str->IsExternalAscii() && ! csinfo->isMultibyte)
     || (str->IsExternal() && csinfo->isUtf16le))
  {
    DEBUG_PRINT("getBufferForText: fully externalized");
    stats.externalized_text_writes++;
    return LOCAL_BUFFER(node::Buffer::New(isolate, str));
  }

  length = str->Length();
  DEBUG_PRINT("getBufferForText: %s %d", col->getName(), length);
  utf8Length = str->Utf8Length();
  bool valueIsAscii = (utf8Length == length);
     
  if(csinfo->isAscii || (valueIsAscii && ! csinfo->isMultibyte)) {
    stats.direct_writes++;
    buffer = LOCAL_BUFFER(node::Buffer::New(isolate, length));
    data = node::Buffer::Data(buffer);
    str->WriteOneByte((uint8_t*) data, 0, length);
  } else if(csinfo->isUtf16le) {
    stats.direct_writes++;
    buffer = LOCAL_BUFFER(node::Buffer::New(isolate, length * 2));
    uint16_t * mbdata = (uint16_t*) node::Buffer::Data(buffer);
    str->Write(mbdata, 0, length);
  } else if(csinfo->isUtf8) {
    stats.direct_writes++;
    buffer = LOCAL_BUFFER(node::Buffer::New(isolate, utf8Length));
    data = node::Buffer::Data(buffer);
    str->WriteUtf8(data, utf8Length);
  } else {
    /* Recode */
    stats.recode_writes++;
    char * recode_buffer = new char[utf8Length];    
    str->WriteUtf8(recode_buffer, utf8Length, 0, String::NO_NULL_TERMINATION);
    int buflen = getRecodeBufferSize(length, utf8Length, csinfo);
    data = (char *) malloc(buflen);
    int result_len = recodeFromUtf8(recode_buffer, utf8Length,
                                    data, buflen, col->getCharsetNumber());
    buffer = LOCAL_BUFFER(node::Buffer::New(isolate, data, result_len, freeBufferContentsFromJs, 0));
    delete[] recode_buffer;
  }
  
  return buffer;
}