in jones-ndb/impl/src/ndb/NdbTypeEncoders.cpp [1101:1159]
Local<Value> CharReader(const NdbDictionary::Column *col,
char *buffer, uint32_t offset) {
char * str = buffer+offset;
Local<String> string;
int len = col->getLength();
const EncoderCharset * csinfo = getEncoderCharsetForColumn(col);
if(csinfo->isAscii ||
(! csinfo->isMultibyte && stringIsAscii((const unsigned char *) str, len))) {
stats.read_strings_externalized++;
while(str[--len] == ' ') ; // skip past space padding
len++; // undo 1 place
ExternalizedAsciiString *ext = new ExternalizedAsciiString(str, len);
string = String::NewExternal(isolate, ext);
//DEBUG_PRINT("(A): External ASCII");
}
else if(csinfo->isUtf16le) {
len /= 2;
stats.read_strings_externalized++;
uint16_t * buf = (uint16_t *) str;
while(buf[--len] == ' ') {}; len++; // skip padding, then undo 1
ExternalizedUnicodeString * ext = new ExternalizedUnicodeString(buf, len);
string = String::NewExternal(isolate, ext);
//DEBUG_PRINT("(B): External UTF-16-LE");
}
else if(csinfo->isUtf8) {
stats.read_strings_created++;
while(str[--len] == ' ') {}; len++; // skip padding, then undo 1
string = String::NewFromUtf8(isolate, str, String::kNormalString, len);
//DEBUG_PRINT("(C): New From UTF-8");
}
else {
stats.read_strings_created++;
stats.read_strings_recoded++;
CharsetMap csmap;
int recode_size = getUtf8BufferSizeForColumn(len, csinfo);
char * recode_buffer = new char[recode_size];
/* Recode from the buffer into the UTF8 stack */
int32_t lengths[2];
lengths[0] = len;
lengths[1] = recode_size;
csmap.recode(lengths,
col->getCharsetNumber(),
csmap.getUTF8CharsetNumber(),
str, recode_buffer);
len = lengths[1];
while(recode_buffer[--len] == ' ') {}; len++; // skip padding, then undo 1
/* Create a new JS String from the UTF-8 recode buffer */
string = String::NewFromUtf8(isolate, recode_buffer, String::kNormalString, len);
delete[] recode_buffer;
//DEBUG_PRINT("(D.2): Recode to UTF-8 and create new");
}
return string;
}