В настоящее время я выделяю обычный буфер 2N + 1 при использовании mysql_real_escape_string, но мне было интересно, могу ли я разделить исходную строку на несколько фрагментов и использовать небольшой буфер в стеке для их обработки. меньшие шаги (которые затем будут добавлены к фактической строке запроса).
Я придумал это урезанное (непроверенное), но затем заглянул в исходный код соединителя mariadb для mysql_real_escape_string и кажется, что многобайтовые символы используют какую-то специальную обработку, и теперь я не уверен, что это правильно.
struct MySQLFmtBlob {
MYSQL *mysql;
const void *data;
usize size;
};
template
struct fmt::formatter {
constexpr auto parse(format_parse_context &ctx) {
auto it = ctx.begin(), end = ctx.end();
if(it != end && *it != '}')
throw format_error("invalid format");
return it;
}
auto format(const MySQLFmtBlob &blob, fmt::format_context &ctx) const {
auto iter = ctx.out();
MYSQL *mysql = blob.mysql; ASSERT(mysql);
const char *ptr = (const char*)blob.data;
usize remainder = blob.size;
while(remainder > 0){
constexpr unsigned long N = KB(1);
char out[N * 2 + 1];
unsigned long inLen = (N
Подробнее здесь: https://stackoverflow.com/questions/793 ... -chunks-of