in jones-ndb/impl/src/ndb/NdbTypeEncoders.cpp [1172:1215]
Local<Value> varcharReader(const NdbDictionary::Column *col,
char *buffer, uint32_t offset) {
LOAD_ALIGNED_DATA(LENGTHTYPE, length, buffer+offset);
char * str = buffer+offset+sizeof(length);
Local<String> string;
const EncoderCharset * csinfo = getEncoderCharsetForColumn(col);
if(csinfo->isAscii ||
(! csinfo->isMultibyte && stringIsAscii((const unsigned char *) str, length))) {
stats.read_strings_externalized++;
ExternalizedAsciiString *ext = new ExternalizedAsciiString(str, length);
string = String::NewExternal(isolate, ext);
//DEBUG_PRINT("(A): External ASCII [size %d]", length);
}
else if(csinfo->isUtf16le) {
stats.read_strings_externalized++;
uint16_t * buf = (uint16_t *) str;
ExternalizedUnicodeString * ext = new ExternalizedUnicodeString(buf, length/2);
string = String::NewExternal(isolate, ext);
//DEBUG_PRINT("(B): External UTF-16-LE [size %d]", length);
}
else if(csinfo->isUtf8) {
stats.read_strings_created++;
string = String::NewFromUtf8(isolate, str, String::kNormalString, length);
//DEBUG_PRINT("(C): New From UTF-8 [size %d]", length);
}
else {
stats.read_strings_created++;
stats.read_strings_recoded++;
CharsetMap csmap;
int recode_size = getUtf8BufferSizeForColumn(length, csinfo);
char * recode_buffer = new char[recode_size];
int32_t lengths[2];
lengths[0] = length;
lengths[1] = recode_size;
csmap.recode(lengths,
col->getCharsetNumber(), csmap.getUTF8CharsetNumber(),
str, recode_buffer);
string = String::NewFromUtf8(isolate, recode_buffer, String::kNormalString, lengths[1]);
delete[] recode_buffer;
//DEBUG_PRINT("(D.2): Recode to UTF-8 and create new [size %d]", length);
}
return string;
}