Code

store: Fixed handling of metric store values.
[sysdb.git] / src / core / time.c
index fe57384a2aac81572021925b3c09e0eda75c9167..d0ed0b8dd9917d11596fa54da2f65071026c968f 100644 (file)
@@ -34,6 +34,7 @@
 
 #include <time.h>
 
+#include <stdbool.h>
 #include <stdio.h>
 #include <string.h>
 
@@ -41,7 +42,7 @@
  * public API
  */
 
-/* 1 second (in micro-seconds) */
+/* 1 second (in nano-seconds) */
 #define SEC 1000000000L
 
 const sdb_time_t SDB_INTERVAL_YEAR   = 3652425L   * 24L * 60L * 60L * 100000L;
@@ -98,7 +99,7 @@ sdb_strfinterval(char *s, size_t len, sdb_time_t interval)
        size_t i;
 
        /* special case the optional fractional part for seconds */
-       _Bool have_seconds = 0;
+       bool have_seconds = 0;
 
        struct {
                sdb_time_t  interval;
@@ -115,16 +116,16 @@ sdb_strfinterval(char *s, size_t len, sdb_time_t interval)
 #define LEN (len > n ? len - n : 0)
        for (i = 0; i < SDB_STATIC_ARRAY_LEN(specs); ++i) {
                if (interval >= specs[i].interval) {
-                       n += snprintf(s + n, LEN, "%"PRIscTIME"%s",
+                       n += snprintf(s + n, LEN, "%"PRIsdbTIME"%s",
                                        interval / specs[i].interval, specs[i].suffix);
                        interval %= specs[i].interval;
-                       if (i == SDB_STATIC_ARRAY_LEN(specs) - 1)
+                       if (specs[i].interval == SDB_INTERVAL_SECOND)
                                have_seconds = 1;
                }
        }
 
        if (interval) {
-               n += snprintf(s + n, LEN, ".%09"PRIscTIME, interval);
+               n += snprintf(s + n, LEN, ".%09"PRIsdbTIME, interval);
                have_seconds = 1;
 
                /* removing trailing zeroes */
@@ -147,5 +148,31 @@ sdb_strfinterval(char *s, size_t len, sdb_time_t interval)
        return n;
 } /* sdb_strfinterval */
 
+sdb_time_t
+sdb_strpunit(const char *s)
+{
+       struct {
+               const char *s;
+               sdb_time_t unit;
+       } units[] = {
+               { "Y", SDB_INTERVAL_YEAR },
+               { "M", SDB_INTERVAL_MONTH },
+               { "D", SDB_INTERVAL_DAY },
+               { "h", SDB_INTERVAL_HOUR },
+               { "m", SDB_INTERVAL_MINUTE },
+               { "s", SDB_INTERVAL_SECOND },
+               { "ms", SDB_INTERVAL_SECOND / 1000L },
+               { "us", SDB_INTERVAL_SECOND / 1000000L },
+               { "ns", 1 },
+       };
+
+       size_t i;
+
+       for (i = 0; i < SDB_STATIC_ARRAY_LEN(units); ++i)
+               if (! strcmp(s, units[i].s))
+                       return units[i].unit;
+       return 0;
+} /* sdb_strpunit */
+
 /* vim: set tw=78 sw=4 ts=4 noexpandtab : */