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