INLINE void DataWriterInternal::putInterval()

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();
}