diff --git a/src/locale/collation.cpp b/src/locale/collation.cpp index 8748742d..c3360483 100644 --- a/src/locale/collation.cpp +++ b/src/locale/collation.cpp @@ -89,8 +89,8 @@ GLibCollator::~GLibCollator() { auto GLibCollator::Transform(const std::string& in) -> std::string { size_t size = glib_strxfrm(NULL, in.c_str(), 0, locale_data_.get()); char* dest = new char[size + 1]{0}; - glib_strxfrm(dest, in.c_str(), size, locale_data_.get()); - std::string out{dest, strnlen(dest, size)}; + size = glib_strxfrm(dest, in.c_str(), size, locale_data_.get()); + std::string out{dest, size}; delete[] dest; return out; } diff --git a/src/tangara/database/records.cpp b/src/tangara/database/records.cpp index 6406f080..17009cd8 100644 --- a/src/tangara/database/records.cpp +++ b/src/tangara/database/records.cpp @@ -227,19 +227,15 @@ auto ParseIndexKey(const leveldb::Slice& slice) -> std::optional { return {}; } - std::istringstream in(key_data.substr(header_length + 1)); - std::stringbuf buffer{}; + key_data = key_data.substr(header_length + 1); + size_t last_sep = key_data.find_last_of('\0'); - // FIXME: what if the item contains a '\0'? Probably we make a big mess. - in.get(buffer, kFieldSeparator); - if (buffer.str().size() > 0) { - result.item = buffer.str(); + if (last_sep > 0) { + result.item = key_data.substr(0, last_sep); } - std::string id_str = - key_data.substr(header_length + 1 + buffer.str().size() + 1); - if (id_str.size() > 0) { - result.track = BytesToTrackId(id_str); + if (last_sep + 1 < key_data.size()) { + result.track = BytesToTrackId(key_data.substr(last_sep + 1)); } return result;