Process db better. Respect value size.

This commit is contained in:
lzwdgc 2020-09-18 22:26:57 +03:00
parent 9a9082dfb7
commit 068f0e185e

View file

@ -91,35 +91,32 @@ void value::load_fields(const tab &tab, buffer &b)
while (!data.eof()) while (!data.eof())
{ {
field_value fv; field_value fv;
try
{
READ(data, fv.field_id); READ(data, fv.field_id);
}
catch (std::exception &)
{
break;
}
READ(data, fv.size); READ(data, fv.size);
auto i = tab.fields.find(fv.field_id); auto i = tab.fields.find(fv.field_id);
if (i == tab.fields.end()) if (i == tab.fields.end())
continue; continue;
buffer data2(data, fv.size);
switch (i->second.type) switch (i->second.type)
{ {
case FieldType::String: case FieldType::String:
fv.s.resize(fv.size); fv.s.resize(fv.size);
READ_N(data, fv.s[0], fv.s.size()); READ_N(data2, fv.s[0], fv.s.size());
while (!fv.s.empty() && fv.s.back() == '\0') while (!fv.s.empty() && fv.s.back() == '\0')
fv.s.resize(fv.s.size() - 1); fv.s.resize(fv.s.size() - 1);
break; break;
case FieldType::Integer: case FieldType::Integer:
READ(data, fv.i); if (sizeof(fv.i) <= fv.size)
if (fv.size > sizeof(fv.i)) READ(data2, fv.i);
data.skip(fv.size - sizeof(fv.i)); else
std::cout << "small int field: " << fv.size << "\n";
break; break;
case FieldType::Float: case FieldType::Float:
READ(data, fv.f); if (sizeof(fv.f) <= fv.size)
if (fv.size > sizeof(fv.i)) READ(data2, fv.f);
data.skip(fv.size - sizeof(fv.i)); else
std::cout << "small float field: " << fv.size << "\n";
break; break;
default: default:
assert(false); assert(false);