Remove memory leak in lmdb.cc while passing data from MDB_val to VariableValue

- add new VariableValue constructors for rvalue strings
 - decrease number of memory copies between lmdb and VariableValue
This commit is contained in:
Tomasz Ziolkowski 2021-02-24 12:38:25 +01:00 committed by Felipe Zimmerle
parent 3bfe4b81af
commit a4798f7f56
2 changed files with 22 additions and 6 deletions

View File

@ -47,6 +47,13 @@ class VariableValue {
m_value(value != nullptr?*value:"") m_value(value != nullptr?*value:"")
{ } { }
VariableValue(std::string&& key,
std::string&& value)
: m_collection(""),
m_key(std::move(key)),
m_value(std::move(value))
{ m_keyWithCollection = m_key; }
VariableValue(const std::string *collection, VariableValue(const std::string *collection,
const std::string *key, const std::string *key,
const std::string *value) const std::string *value)
@ -56,6 +63,14 @@ class VariableValue {
m_value(*value) m_value(*value)
{ } { }
VariableValue(const std::string *collection,
std::string&& key,
std::string&& value)
: m_collection(*collection),
m_key(std::move(key)),
m_value(std::move(value))
{ m_keyWithCollection = m_collection + ":" + m_key; }
explicit VariableValue(const VariableValue *o) : explicit VariableValue(const VariableValue *o) :
m_collection(o->m_collection), m_collection(o->m_collection),
m_key(o->m_key), m_key(o->m_key),

View File

@ -291,6 +291,7 @@ void LMDB::resolveSingleMatch(const std::string& var,
reinterpret_cast<char *>(mdb_value_ret.mv_data), reinterpret_cast<char *>(mdb_value_ret.mv_data),
mdb_value_ret.mv_size); mdb_value_ret.mv_size);
VariableValue *v = new VariableValue(&var, a); VariableValue *v = new VariableValue(&var, a);
delete a;
l->push_back(v); l->push_back(v);
} }
@ -498,9 +499,9 @@ void LMDB::resolveMultiMatches(const std::string& var,
while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
l->insert(l->begin(), new VariableValue( l->insert(l->begin(), new VariableValue(
&m_name, &m_name,
new std::string(reinterpret_cast<char *>(key.mv_data), std::string(reinterpret_cast<char *>(key.mv_data),
key.mv_size), key.mv_size),
new std::string(reinterpret_cast<char *>(data.mv_data), std::string(reinterpret_cast<char *>(data.mv_data),
data.mv_size))); data.mv_size)));
} }
} else { } else {
@ -509,9 +510,9 @@ void LMDB::resolveMultiMatches(const std::string& var,
if (strncmp(var.c_str(), a, keySize) == 0) { if (strncmp(var.c_str(), a, keySize) == 0) {
l->insert(l->begin(), new VariableValue( l->insert(l->begin(), new VariableValue(
&m_name, &m_name,
new std::string(reinterpret_cast<char *>(key.mv_data), std::string(reinterpret_cast<char *>(key.mv_data),
key.mv_size), key.mv_size),
new std::string(reinterpret_cast<char *>(data.mv_data), std::string(reinterpret_cast<char *>(data.mv_data),
data.mv_size))); data.mv_size)));
} }
} }
@ -569,9 +570,9 @@ void LMDB::resolveRegularExpression(const std::string& var,
} }
VariableValue *v = new VariableValue( VariableValue *v = new VariableValue(
new std::string(reinterpret_cast<char *>(key.mv_data), std::string(reinterpret_cast<char *>(key.mv_data),
key.mv_size), key.mv_size),
new std::string(reinterpret_cast<char *>(data.mv_data), std::string(reinterpret_cast<char *>(data.mv_data),
data.mv_size)); data.mv_size));
l->insert(l->begin(), v); l->insert(l->begin(), v);
} }