in src/dxapi/native/tickdb/data_writer.cpp [178:234]
INLINE void DataWriterInternal::putInterval(uint32 value)
{
if (INTERVAL_NULL == value) {
putByte(INTERVAL_NULL);
return;
}
if (value > 0x7FFFFFFF) {
THROW_DBGLOG("putInterval() : Intervals greater then 0x7FFFFFFF are not supported. value = %u", value);
}
/*
enum Granularity {
SECONDS = 0, // Interval length is divisible by 1000
MINUTES = 1 << 6, // Interval length is divisible by 60 * 1000 = 60000
HOURS = 2 << 6, // Interval length is divisible by 60 * 60 * 1000 = 3600000
OTHER = 3 << 6 // Arbitrary length
};
*/
unsigned v, scale;
if (0 == value % 60000) { // 2**5 * 3 * 5**4
if (0 == value % 3600000) { // 2**7 * 3**2 * 5**5
v = value / 3600000;
scale = INTERVAL_HEADER(HOURS);
}
else {
v = value / 60000;
scale = INTERVAL_HEADER(MINUTES);
}
}
else if (0 == value % 1000) { // 2**3 * 5**3
v = value / 1000;
scale = INTERVAL_HEADER(SECONDS);
}
else {
putByte(INTERVAL_HEADER(OTHER));
putUInt32(value);
setNotNull();
return;
}
// It is impossible for v to be == 0 at this point
assert(v > 0);
// Fits into 6 bits?
if (v < (1 << 6)) {
putByte((byte)v);
}
else {
putByte(INTERVAL_HEADER(OTHER));
putUInt32(value);
}
setNotNull();
}