DataSeries updates and fixes.

This commit is contained in:
Robin Sommer 2012-05-04 21:50:20 -07:00
parent c91563fe75
commit a0575158ef
10 changed files with 169 additions and 173 deletions

View file

@ -267,4 +267,9 @@ string WriterBackend::Render(const threading::Value::subnet_t& subnet) const
return s;
}
string WriterBackend::Render(double d) const
{
char buf[256];
modp_dtoa(d, buf, 6);
return buf;
}

View file

@ -165,6 +165,14 @@ public:
*/
string Render(const threading::Value::subnet_t& subnet) const;
/** Helper method to render a double in Bro's standard precision.
*
* @param d The double.
*
* @return An ASCII representation of the double.
*/
string Render(double d) const;
protected:
friend class FinishMessage;

View file

@ -176,14 +176,9 @@ bool Ascii::DoWriteOne(ODesc* desc, Value* val, const Field* field)
desc->Add(Render(val->val.addr_val));
break;
case TYPE_DOUBLE:
case TYPE_TIME:
case TYPE_INTERVAL:
char buf[256];
modp_dtoa(val->val.double_val, buf, 6);
desc->Add(buf);
break;
case TYPE_DOUBLE:
desc->Add(val->val.double_val);
break;

View file

@ -21,29 +21,31 @@ std::string DataSeries::LogValueToString(threading::Value *val)
if( ! val->present )
return "";
std::ostringstream ostr;
switch(val->type) {
case TYPE_BOOL:
return (val->val.int_val ? "true" : "false");
case TYPE_INT:
{
std::ostringstream ostr;
ostr << val->val.int_val;
return ostr.str();
}
case TYPE_COUNT:
case TYPE_COUNTER:
case TYPE_PORT:
{
std::ostringstream ostr;
ostr << val->val.uint_val;
return ostr.str();
}
case TYPE_SUBNET:
ostr << Render(val->val.subnet_val);
return ostr.str();
return Render(val->val.subnet_val);
case TYPE_ADDR:
ostr << Render(val->val.addr_val);
return ostr.str();
return Render(val->val.addr_val);
// Note: These two cases are relatively special. We need to convert
// these values into their integer equivalents to maximize precision.
@ -57,15 +59,16 @@ std::string DataSeries::LogValueToString(threading::Value *val)
case TYPE_TIME:
case TYPE_INTERVAL:
if ( ds_use_integer_for_time )
{
std::ostringstream ostr;
ostr << (unsigned long)(DataSeries::TIME_SCALE * val->val.double_val);
return ostr.str();
}
else
ostr << val->val.double_val;
return ostr.str();
return Render(val->val.double_val);
case TYPE_DOUBLE:
ostr << val->val.double_val;
return ostr.str();
return Render(val->val.double_val);
case TYPE_ENUM:
case TYPE_STRING:
@ -190,10 +193,11 @@ std::string DataSeries::GetDSOptionsForType(const threading::Field *field)
case TYPE_TIME:
case TYPE_INTERVAL:
{
std::string s = "pack_relative=\"" + std::string(field->name) + "\"";
std::string s;
s += "pack_relative=\"" + std::string(field->name) + "\"";
if ( ! ds_use_integer_for_time )
s += " pack_scale=\"1000000\"";
s += " pack_scale=\"1000\" pack_scale_warn=\"no\"";
else
s += string(" units=\"") + TIME_UNIT() + "\" epoch=\"unix\"";
@ -250,7 +254,7 @@ bool DataSeries::OpenLog(string path)
ds_extent_size = ROW_MAX;
}
log_output = new OutputModule(*log_file, log_series, *log_type, ds_extent_size);
log_output = new OutputModule(*log_file, log_series, log_type, ds_extent_size);
return true;
}
@ -330,7 +334,7 @@ bool DataSeries::DoInit(string path, int num_fields, const threading::Field* con
Warning(Fmt("%s is not a valid compression type. Valid types are: 'lzf', 'lzo', 'gz', 'bz2', 'none', 'any'. Defaulting to 'any'", ds_compression.c_str()));
log_type = log_types.registerTypePtr(schema);
log_series.setType(*log_type);
log_series.setType(log_type);
return OpenLog(path);
}