]> granicus.if.org Git - vnstat/commitdiff
first draft of new data caching functions for the daemon
authorTeemu Toivola <git@humdi.net>
Mon, 2 Jan 2017 21:48:37 +0000 (23:48 +0200)
committerTeemu Toivola <git@humdi.net>
Mon, 2 Jan 2017 21:48:37 +0000 (23:48 +0200)
Makefile.am
Makefile.in
src/datacache.c [new file with mode: 0644]
src/datacache.h [new file with mode: 0644]
tests/datacache_tests.c [new file with mode: 0644]
tests/datacache_tests.h [new file with mode: 0644]
tests/vnstat_tests.c

index 533995fcbe08bb19335bac642bf346f46cf3a769..e60b28f4b3aeb127a1879dc87f781d82b01714cb 100644 (file)
@@ -32,6 +32,7 @@ vnstatd_SOURCES = src/vnstatd.c src/vnstatd.h \
   src/dbsql.c src/dbsql.h \
   src/dbaccess.c src/dbaccess.h \
   src/dbcache.c src/dbcache.h \
+  src/datacache.c src/datacache.h \
   src/common.c src/common.h \
   src/misc.c src/misc.h \
   src/cfg.c src/cfg.h \
@@ -64,6 +65,7 @@ check_vnstat_LDADD = @CHECK_LIBS@
 check_vnstat_SOURCES = tests/vnstat_tests.c tests/vnstat_tests.h \
   tests/common_tests.c tests/common_tests.h \
   tests/dbsql_tests.c tests/dbsql_tests.h \
+  tests/datacache_tests.c tests/datacache_tests.h \
   tests/config_tests.c tests/config_tests.h \
   tests/fs_tests.c tests/fs_tests.h \
   tests/id_tests.c tests/id_tests.h
@@ -85,6 +87,7 @@ check_vnstat_SOURCES += src/cfg.c src/cfg.h \
   src/dbsql.c src/dbsql.h \
   src/dbaccess.c src/dbaccess.h \
   src/dbcache.c src/dbcache.h \
+  src/datacache.c src/datacache.h \
   src/dbjson.c src/dbjson.h \
   src/dbmerge.c src/dbmerge.h \
   src/dbshow.c src/dbshow.h \
index 76b66563035eeeb114efd3ad7064e70bc83ab64d..0f84106632ff64d73c46646d49b45f5b3bed3666 100644 (file)
@@ -99,21 +99,24 @@ am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" \
 PROGRAMS = $(sbin_PROGRAMS)
 am__check_vnstat_SOURCES_DIST = tests/vnstat_tests.c \
        tests/vnstat_tests.h tests/common_tests.c tests/common_tests.h \
-       tests/dbsql_tests.c tests/dbsql_tests.h tests/config_tests.c \
-       tests/config_tests.h tests/fs_tests.c tests/fs_tests.h \
-       tests/id_tests.c tests/id_tests.h src/cfg.c src/cfg.h \
-       src/common.c src/common.h src/daemon.c src/daemon.h \
+       tests/dbsql_tests.c tests/dbsql_tests.h \
+       tests/datacache_tests.c tests/datacache_tests.h \
+       tests/config_tests.c tests/config_tests.h tests/fs_tests.c \
+       tests/fs_tests.h tests/id_tests.c tests/id_tests.h src/cfg.c \
+       src/cfg.h src/common.c src/common.h src/daemon.c src/daemon.h \
        src/dbsql.c src/dbsql.h src/dbaccess.c src/dbaccess.h \
-       src/dbcache.c src/dbcache.h src/dbjson.c src/dbjson.h \
-       src/dbmerge.c src/dbmerge.h src/dbshow.c src/dbshow.h \
-       src/dbxml.c src/dbxml.h src/ibw.c src/ibw.h src/ifinfo.c \
-       src/ifinfo.h src/misc.c src/misc.h src/fs.c src/fs.h src/id.c \
-       src/id.h src/traffic.c src/traffic.h
+       src/dbcache.c src/dbcache.h src/datacache.c src/datacache.h \
+       src/dbjson.c src/dbjson.h src/dbmerge.c src/dbmerge.h \
+       src/dbshow.c src/dbshow.h src/dbxml.c src/dbxml.h src/ibw.c \
+       src/ibw.h src/ifinfo.c src/ifinfo.h src/misc.c src/misc.h \
+       src/fs.c src/fs.h src/id.c src/id.h src/traffic.c \
+       src/traffic.h
 am__dirstamp = $(am__leading_dot)dirstamp
 @HAVE_CHECK_TRUE@am_check_vnstat_OBJECTS =  \
 @HAVE_CHECK_TRUE@      tests/check_vnstat-vnstat_tests.$(OBJEXT) \
 @HAVE_CHECK_TRUE@      tests/check_vnstat-common_tests.$(OBJEXT) \
 @HAVE_CHECK_TRUE@      tests/check_vnstat-dbsql_tests.$(OBJEXT) \
+@HAVE_CHECK_TRUE@      tests/check_vnstat-datacache_tests.$(OBJEXT) \
 @HAVE_CHECK_TRUE@      tests/check_vnstat-config_tests.$(OBJEXT) \
 @HAVE_CHECK_TRUE@      tests/check_vnstat-fs_tests.$(OBJEXT) \
 @HAVE_CHECK_TRUE@      tests/check_vnstat-id_tests.$(OBJEXT) \
@@ -123,6 +126,7 @@ am__dirstamp = $(am__leading_dot)dirstamp
 @HAVE_CHECK_TRUE@      src/check_vnstat-dbsql.$(OBJEXT) \
 @HAVE_CHECK_TRUE@      src/check_vnstat-dbaccess.$(OBJEXT) \
 @HAVE_CHECK_TRUE@      src/check_vnstat-dbcache.$(OBJEXT) \
+@HAVE_CHECK_TRUE@      src/check_vnstat-datacache.$(OBJEXT) \
 @HAVE_CHECK_TRUE@      src/check_vnstat-dbjson.$(OBJEXT) \
 @HAVE_CHECK_TRUE@      src/check_vnstat-dbmerge.$(OBJEXT) \
 @HAVE_CHECK_TRUE@      src/check_vnstat-dbshow.$(OBJEXT) \
@@ -139,9 +143,10 @@ check_vnstat_LINK = $(CCLD) $(check_vnstat_CFLAGS) $(CFLAGS) \
        $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am_vnstatd_OBJECTS = src/vnstatd.$(OBJEXT) src/ifinfo.$(OBJEXT) \
        src/dbsql.$(OBJEXT) src/dbaccess.$(OBJEXT) \
-       src/dbcache.$(OBJEXT) src/common.$(OBJEXT) src/misc.$(OBJEXT) \
-       src/cfg.$(OBJEXT) src/ibw.$(OBJEXT) src/fs.$(OBJEXT) \
-       src/id.$(OBJEXT) src/daemon.$(OBJEXT)
+       src/dbcache.$(OBJEXT) src/datacache.$(OBJEXT) \
+       src/common.$(OBJEXT) src/misc.$(OBJEXT) src/cfg.$(OBJEXT) \
+       src/ibw.$(OBJEXT) src/fs.$(OBJEXT) src/id.$(OBJEXT) \
+       src/daemon.$(OBJEXT)
 vnstatd_OBJECTS = $(am_vnstatd_OBJECTS)
 vnstatd_LDADD = $(LDADD)
 AM_V_P = $(am__v_P_@AM_V@)
@@ -591,6 +596,7 @@ vnstatd_SOURCES = src/vnstatd.c src/vnstatd.h \
   src/dbsql.c src/dbsql.h \
   src/dbaccess.c src/dbaccess.h \
   src/dbcache.c src/dbcache.h \
+  src/datacache.c src/datacache.h \
   src/common.c src/common.h \
   src/misc.c src/misc.h \
   src/cfg.c src/cfg.h \
@@ -620,19 +626,21 @@ vnstatd_SOURCES = src/vnstatd.c src/vnstatd.h \
 @HAVE_CHECK_TRUE@check_vnstat_SOURCES = tests/vnstat_tests.c \
 @HAVE_CHECK_TRUE@      tests/vnstat_tests.h tests/common_tests.c \
 @HAVE_CHECK_TRUE@      tests/common_tests.h tests/dbsql_tests.c \
-@HAVE_CHECK_TRUE@      tests/dbsql_tests.h tests/config_tests.c \
+@HAVE_CHECK_TRUE@      tests/dbsql_tests.h tests/datacache_tests.c \
+@HAVE_CHECK_TRUE@      tests/datacache_tests.h tests/config_tests.c \
 @HAVE_CHECK_TRUE@      tests/config_tests.h tests/fs_tests.c \
 @HAVE_CHECK_TRUE@      tests/fs_tests.h tests/id_tests.c \
 @HAVE_CHECK_TRUE@      tests/id_tests.h src/cfg.c src/cfg.h \
 @HAVE_CHECK_TRUE@      src/common.c src/common.h src/daemon.c \
 @HAVE_CHECK_TRUE@      src/daemon.h src/dbsql.c src/dbsql.h \
 @HAVE_CHECK_TRUE@      src/dbaccess.c src/dbaccess.h src/dbcache.c \
-@HAVE_CHECK_TRUE@      src/dbcache.h src/dbjson.c src/dbjson.h \
-@HAVE_CHECK_TRUE@      src/dbmerge.c src/dbmerge.h src/dbshow.c \
-@HAVE_CHECK_TRUE@      src/dbshow.h src/dbxml.c src/dbxml.h \
-@HAVE_CHECK_TRUE@      src/ibw.c src/ibw.h src/ifinfo.c src/ifinfo.h \
-@HAVE_CHECK_TRUE@      src/misc.c src/misc.h src/fs.c src/fs.h \
-@HAVE_CHECK_TRUE@      src/id.c src/id.h src/traffic.c src/traffic.h
+@HAVE_CHECK_TRUE@      src/dbcache.h src/datacache.c src/datacache.h \
+@HAVE_CHECK_TRUE@      src/dbjson.c src/dbjson.h src/dbmerge.c \
+@HAVE_CHECK_TRUE@      src/dbmerge.h src/dbshow.c src/dbshow.h \
+@HAVE_CHECK_TRUE@      src/dbxml.c src/dbxml.h src/ibw.c src/ibw.h \
+@HAVE_CHECK_TRUE@      src/ifinfo.c src/ifinfo.h src/misc.c \
+@HAVE_CHECK_TRUE@      src/misc.h src/fs.c src/fs.h src/id.c \
+@HAVE_CHECK_TRUE@      src/id.h src/traffic.c src/traffic.h
 all: all-recursive
 
 .SUFFIXES:
@@ -759,6 +767,8 @@ tests/check_vnstat-common_tests.$(OBJEXT): tests/$(am__dirstamp) \
        tests/$(DEPDIR)/$(am__dirstamp)
 tests/check_vnstat-dbsql_tests.$(OBJEXT): tests/$(am__dirstamp) \
        tests/$(DEPDIR)/$(am__dirstamp)
+tests/check_vnstat-datacache_tests.$(OBJEXT): tests/$(am__dirstamp) \
+       tests/$(DEPDIR)/$(am__dirstamp)
 tests/check_vnstat-config_tests.$(OBJEXT): tests/$(am__dirstamp) \
        tests/$(DEPDIR)/$(am__dirstamp)
 tests/check_vnstat-fs_tests.$(OBJEXT): tests/$(am__dirstamp) \
@@ -783,6 +793,8 @@ src/check_vnstat-dbaccess.$(OBJEXT): src/$(am__dirstamp) \
        src/$(DEPDIR)/$(am__dirstamp)
 src/check_vnstat-dbcache.$(OBJEXT): src/$(am__dirstamp) \
        src/$(DEPDIR)/$(am__dirstamp)
+src/check_vnstat-datacache.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
 src/check_vnstat-dbjson.$(OBJEXT): src/$(am__dirstamp) \
        src/$(DEPDIR)/$(am__dirstamp)
 src/check_vnstat-dbmerge.$(OBJEXT): src/$(am__dirstamp) \
@@ -816,6 +828,8 @@ src/dbaccess.$(OBJEXT): src/$(am__dirstamp) \
        src/$(DEPDIR)/$(am__dirstamp)
 src/dbcache.$(OBJEXT): src/$(am__dirstamp) \
        src/$(DEPDIR)/$(am__dirstamp)
+src/datacache.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
 src/common.$(OBJEXT): src/$(am__dirstamp) \
        src/$(DEPDIR)/$(am__dirstamp)
 src/misc.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
@@ -842,6 +856,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-cfg.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-common.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-daemon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-datacache.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-dbaccess.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-dbcache.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-dbjson.Po@am__quote@
@@ -857,6 +872,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-traffic.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/common.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/daemon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/datacache.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/dbaccess.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/dbcache.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/dbsql.Po@am__quote@
@@ -868,6 +884,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vnstatd.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/check_vnstat-common_tests.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/check_vnstat-config_tests.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/check_vnstat-datacache_tests.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/check_vnstat-dbsql_tests.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/check_vnstat-fs_tests.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/check_vnstat-id_tests.Po@am__quote@
@@ -931,6 +948,20 @@ tests/check_vnstat-dbsql_tests.obj: tests/dbsql_tests.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o tests/check_vnstat-dbsql_tests.obj `if test -f 'tests/dbsql_tests.c'; then $(CYGPATH_W) 'tests/dbsql_tests.c'; else $(CYGPATH_W) '$(srcdir)/tests/dbsql_tests.c'; fi`
 
+tests/check_vnstat-datacache_tests.o: tests/datacache_tests.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT tests/check_vnstat-datacache_tests.o -MD -MP -MF tests/$(DEPDIR)/check_vnstat-datacache_tests.Tpo -c -o tests/check_vnstat-datacache_tests.o `test -f 'tests/datacache_tests.c' || echo '$(srcdir)/'`tests/datacache_tests.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) tests/$(DEPDIR)/check_vnstat-datacache_tests.Tpo tests/$(DEPDIR)/check_vnstat-datacache_tests.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='tests/datacache_tests.c' object='tests/check_vnstat-datacache_tests.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o tests/check_vnstat-datacache_tests.o `test -f 'tests/datacache_tests.c' || echo '$(srcdir)/'`tests/datacache_tests.c
+
+tests/check_vnstat-datacache_tests.obj: tests/datacache_tests.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT tests/check_vnstat-datacache_tests.obj -MD -MP -MF tests/$(DEPDIR)/check_vnstat-datacache_tests.Tpo -c -o tests/check_vnstat-datacache_tests.obj `if test -f 'tests/datacache_tests.c'; then $(CYGPATH_W) 'tests/datacache_tests.c'; else $(CYGPATH_W) '$(srcdir)/tests/datacache_tests.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) tests/$(DEPDIR)/check_vnstat-datacache_tests.Tpo tests/$(DEPDIR)/check_vnstat-datacache_tests.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='tests/datacache_tests.c' object='tests/check_vnstat-datacache_tests.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o tests/check_vnstat-datacache_tests.obj `if test -f 'tests/datacache_tests.c'; then $(CYGPATH_W) 'tests/datacache_tests.c'; else $(CYGPATH_W) '$(srcdir)/tests/datacache_tests.c'; fi`
+
 tests/check_vnstat-config_tests.o: tests/config_tests.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT tests/check_vnstat-config_tests.o -MD -MP -MF tests/$(DEPDIR)/check_vnstat-config_tests.Tpo -c -o tests/check_vnstat-config_tests.o `test -f 'tests/config_tests.c' || echo '$(srcdir)/'`tests/config_tests.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) tests/$(DEPDIR)/check_vnstat-config_tests.Tpo tests/$(DEPDIR)/check_vnstat-config_tests.Po
@@ -1057,6 +1088,20 @@ src/check_vnstat-dbcache.obj: src/dbcache.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o src/check_vnstat-dbcache.obj `if test -f 'src/dbcache.c'; then $(CYGPATH_W) 'src/dbcache.c'; else $(CYGPATH_W) '$(srcdir)/src/dbcache.c'; fi`
 
+src/check_vnstat-datacache.o: src/datacache.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT src/check_vnstat-datacache.o -MD -MP -MF src/$(DEPDIR)/check_vnstat-datacache.Tpo -c -o src/check_vnstat-datacache.o `test -f 'src/datacache.c' || echo '$(srcdir)/'`src/datacache.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/check_vnstat-datacache.Tpo src/$(DEPDIR)/check_vnstat-datacache.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/datacache.c' object='src/check_vnstat-datacache.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o src/check_vnstat-datacache.o `test -f 'src/datacache.c' || echo '$(srcdir)/'`src/datacache.c
+
+src/check_vnstat-datacache.obj: src/datacache.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT src/check_vnstat-datacache.obj -MD -MP -MF src/$(DEPDIR)/check_vnstat-datacache.Tpo -c -o src/check_vnstat-datacache.obj `if test -f 'src/datacache.c'; then $(CYGPATH_W) 'src/datacache.c'; else $(CYGPATH_W) '$(srcdir)/src/datacache.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/check_vnstat-datacache.Tpo src/$(DEPDIR)/check_vnstat-datacache.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/datacache.c' object='src/check_vnstat-datacache.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o src/check_vnstat-datacache.obj `if test -f 'src/datacache.c'; then $(CYGPATH_W) 'src/datacache.c'; else $(CYGPATH_W) '$(srcdir)/src/datacache.c'; fi`
+
 src/check_vnstat-dbjson.o: src/dbjson.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT src/check_vnstat-dbjson.o -MD -MP -MF src/$(DEPDIR)/check_vnstat-dbjson.Tpo -c -o src/check_vnstat-dbjson.o `test -f 'src/dbjson.c' || echo '$(srcdir)/'`src/dbjson.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/$(DEPDIR)/check_vnstat-dbjson.Tpo src/$(DEPDIR)/check_vnstat-dbjson.Po
diff --git a/src/datacache.c b/src/datacache.c
new file mode 100644 (file)
index 0000000..cf1075f
--- /dev/null
@@ -0,0 +1,172 @@
+#include "common.h"
+#include "datacache.h"
+
+int datacache_add(datacache **dc, const char *interface, const short sync)
+{
+       datacache *newdc;
+
+       newdc = malloc(sizeof(datacache));
+       if (newdc == NULL) {
+               return 0;
+       }
+       newdc->next = *dc;
+       *dc = newdc;
+
+       strncpy_nt((*dc)->interface, interface, 32);
+       (*dc)->active = 0;
+       (*dc)->filled = 0;
+       (*dc)->syncneeded = sync;
+       (*dc)->currx = 0;
+       (*dc)->curtx = 0;
+       (*dc)->updated = time(NULL);
+       (*dc)->log = NULL;
+
+       return 1;
+}
+
+int datacache_seek(datacache **dc, const char *interface)
+{
+       while (*dc != NULL) {
+               if (strcmp((*dc)->interface, interface) == 0) {
+                       return 1;
+               }
+               *dc = (*dc)->next;
+       }
+       return 0;
+}
+
+int datacache_remove(datacache **dc, const char *interface)
+{
+       int ret = 0;
+       datacache *dc_prev, *dc_head;
+
+       dc_head = *dc;
+       dc_prev = *dc;
+
+       if (*dc == NULL) {
+               return ret;
+       }
+
+       /* handle list head remove */
+       if (strcmp((*dc)->interface, interface) == 0) {
+               *dc = (*dc)->next;
+               xferlog_clear(&dc_prev->log);
+               free(dc_prev);
+               return 1;
+       }
+
+       *dc = (*dc)->next;
+
+       /* handle other locations */
+       while (*dc != NULL) {
+               if (strcmp((*dc)->interface, interface) == 0) {
+                       dc_prev->next = (*dc)->next;
+                       xferlog_clear(&(*dc)->log);
+                       free(*dc);
+                       ret = 1;
+                       break;
+               }
+               dc_prev = *dc;
+               *dc = (*dc)->next;
+       }
+
+       *dc = dc_head;
+       return ret;
+}
+
+void datacache_clear(datacache **dc)
+{
+       datacache *dc_prev;
+
+       while (*dc != NULL) {
+               dc_prev = *dc;
+               *dc = (*dc)->next;
+               xferlog_clear(&dc_prev->log);
+               free(dc_prev);
+       }
+}
+
+int datacache_count(datacache **dc)
+{
+       int count = 0;
+       datacache *cacheiterator = *dc;
+
+       while (cacheiterator != NULL) {
+               count++;
+               cacheiterator = cacheiterator->next;
+       }
+       return count;
+}
+
+int datacache_activecount(datacache **dc)
+{
+       int count = 0;
+       datacache *cacheiterator = *dc;
+
+       while (cacheiterator != NULL) {
+               if (cacheiterator->active) {
+                       count++;
+               }
+               cacheiterator = cacheiterator->next;
+       }
+       return count;
+}
+
+void datacache_debug(datacache **dc)
+{
+       int i = 1;
+       datacache *cacheiterator = *dc;
+
+       while (cacheiterator != NULL) {
+               printf("datacache %d: %s\n", i, cacheiterator->interface);
+               xferlog_debug(&cacheiterator->log);
+               cacheiterator = cacheiterator->next;
+               i++;
+       }
+}
+
+int xferlog_add(xferlog **log, const time_t timestamp, const uint64_t rx, const uint64_t tx)
+{
+       xferlog *newlog;
+
+       if (*log == NULL || (*log)->timestamp != timestamp) {
+               newlog = malloc(sizeof(xferlog));
+               if (newlog == NULL) {
+                       return 0;
+               }
+               newlog->next = *log;
+               *log = newlog;
+
+               newlog->timestamp = timestamp;
+               newlog->rx = 0;
+               newlog->tx = 0;
+       }
+
+       (*log)->rx += rx;
+       (*log)->tx += tx;
+
+       return 1;
+}
+
+void xferlog_clear(xferlog **log)
+{
+       xferlog *log_prev;
+
+       while (*log != NULL) {
+               log_prev = *log;
+               *log = (*log)->next;
+               free(log_prev);
+       }
+}
+
+void xferlog_debug(xferlog **log)
+{
+       int i = 1;
+       xferlog *logiterator = *log;
+
+       while (logiterator != NULL) {
+               printf("  xferlog %d: %"PRIu64": %"PRIu64" / %"PRIu64"\n", i, (uint64_t)logiterator->timestamp, logiterator->rx, logiterator->tx);
+               logiterator = logiterator->next;
+               i++;
+       }
+}
diff --git a/src/datacache.h b/src/datacache.h
new file mode 100644 (file)
index 0000000..873ca7c
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef DATACACHE_H
+#define DATACACHE_H
+
+typedef struct datacache {
+       char interface[32];
+       short active;
+       short filled;
+       short syncneeded;
+       uint64_t currx, curtx;
+       time_t updated;
+       struct xferlog *log;
+       struct datacache *next;
+} datacache;
+
+typedef struct xferlog {
+       time_t timestamp;
+       uint64_t rx, tx;
+       struct xferlog *next;
+} xferlog;
+
+int datacache_add(datacache **dc, const char *interface, const short sync);
+int datacache_seek(datacache **dc, const char *interface);
+int datacache_remove(datacache **dc, const char *interface);
+void datacache_clear(datacache **dc);
+int datacache_count(datacache **dc);
+int datacache_activecount(datacache **dc);
+void datacache_debug(datacache **dc);
+
+int xferlog_add(xferlog **log, const time_t timestamp, const uint64_t rx, const uint64_t tx);
+void xferlog_clear(xferlog **log);
+void xferlog_debug(xferlog **log);
+
+#endif
diff --git a/tests/datacache_tests.c b/tests/datacache_tests.c
new file mode 100644 (file)
index 0000000..d7091ee
--- /dev/null
@@ -0,0 +1,394 @@
+#include "vnstat_tests.h"
+#include "datacache_tests.h"
+#include "common.h"
+#include "datacache.h"
+
+START_TEST(datacache_can_clear_empty_cache)
+{
+       datacache *dc = NULL;
+
+       datacache_clear(&dc);
+       ck_assert_ptr_eq(dc, NULL);
+}
+END_TEST
+
+START_TEST(datacache_can_add_to_cache)
+{
+       int ret;
+       datacache *dc = NULL;
+
+       ret = datacache_add(&dc, "eth0", 0);
+       ck_assert_int_eq(ret, 1);
+       ck_assert_str_eq(dc->interface, "eth0");
+       ck_assert_int_eq(dc->active, 0);
+       ck_assert_int_eq(dc->filled, 0);
+       ck_assert_int_eq(dc->syncneeded, 0);
+       ck_assert_int_eq(dc->currx, 0);
+       ck_assert_int_eq(dc->curtx, 0);
+       ck_assert_ptr_eq(dc->log, NULL);
+       ck_assert_ptr_eq(dc->next, NULL);
+
+       datacache_clear(&dc);
+       ck_assert_ptr_eq(dc, NULL);
+}
+END_TEST
+
+START_TEST(datacache_can_add_to_cache_consistently)
+{
+       int ret;
+       datacache *dc = NULL;
+       datacache *bookmark = NULL;
+
+       ret = datacache_add(&dc, "eth0", 0);
+       ck_assert_int_eq(ret, 1);
+       ck_assert_str_eq(dc->interface, "eth0");
+       ck_assert_int_eq(dc->active, 0);
+       ck_assert_int_eq(dc->filled, 0);
+       ck_assert_int_eq(dc->syncneeded, 0);
+       ck_assert_int_eq(dc->currx, 0);
+       ck_assert_int_eq(dc->curtx, 0);
+       ck_assert_ptr_eq(dc->log, NULL);
+       ck_assert_ptr_eq(dc->next, NULL);
+
+       bookmark = dc;
+
+       ret = datacache_add(&dc, "eth1", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ck_assert_str_eq(dc->interface, "eth1");
+       ck_assert_int_eq(dc->active, 0);
+       ck_assert_int_eq(dc->filled, 0);
+       ck_assert_int_eq(dc->syncneeded, 0);
+       ck_assert_int_eq(dc->currx, 0);
+       ck_assert_int_eq(dc->curtx, 0);
+       ck_assert_ptr_eq(dc->log, NULL);
+       ck_assert_ptr_ne(dc->next, NULL);
+
+       ck_assert_str_eq(bookmark->interface, "eth0");
+
+       bookmark = dc;
+       ck_assert_str_eq(bookmark->interface, "eth1");
+
+       bookmark = bookmark->next;
+       ck_assert_str_eq(bookmark->interface, "eth0");
+
+       datacache_clear(&dc);
+       ck_assert_ptr_eq(dc, NULL);
+}
+END_TEST
+
+START_TEST(datacache_knows_how_to_count)
+{
+       int ret;
+       datacache *dc = NULL;
+
+       ret = datacache_add(&dc, "eth0", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_count(&dc);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_add(&dc, "eth1", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_count(&dc);
+       ck_assert_int_eq(ret, 2);
+
+       ret = datacache_activecount(&dc);
+       ck_assert_int_eq(ret, 0);
+
+       dc->active = 1;
+
+       ret = datacache_activecount(&dc);
+       ck_assert_int_eq(ret, 1);
+
+       datacache_clear(&dc);
+       ck_assert_ptr_eq(dc, NULL);
+
+       ret = datacache_count(&dc);
+       ck_assert_int_eq(ret, 0);
+
+       ret = datacache_activecount(&dc);
+       ck_assert_int_eq(ret, 0);
+}
+END_TEST
+
+START_TEST(datacache_can_seek)
+{
+       int ret;
+       datacache *dc = NULL;
+       datacache *iter = NULL;
+
+       ret = datacache_add(&dc, "eth0", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_add(&dc, "eth1", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_add(&dc, "eth2", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_add(&dc, "eth3", 0);
+       ck_assert_int_eq(ret, 1);
+
+       iter = dc;
+       ck_assert_str_eq(iter->interface, "eth3");
+       ret = datacache_seek(&iter, "eth3");
+       ck_assert_int_eq(ret, 1);
+       ck_assert_str_eq(iter->interface, "eth3");
+
+       iter = dc;
+       ck_assert_str_eq(iter->interface, "eth3");
+       ret = datacache_seek(&iter, "eth1");
+       ck_assert_int_eq(ret, 1);
+       ck_assert_str_eq(iter->interface, "eth1");
+
+       iter = dc;
+       ck_assert_str_eq(iter->interface, "eth3");
+       ret = datacache_seek(&iter, "eth0");
+       ck_assert_int_eq(ret, 1);
+       ck_assert_str_eq(iter->interface, "eth0");
+
+       iter = dc;
+       ck_assert_str_eq(iter->interface, "eth3");
+       ret = datacache_seek(&iter, "eth");
+       ck_assert_int_eq(ret, 0);
+
+       datacache_clear(&dc);
+       ck_assert_ptr_eq(dc, NULL);
+}
+END_TEST
+
+START_TEST(datacache_can_remove)
+{
+       int ret;
+       datacache *dc = NULL;
+
+       ret = datacache_add(&dc, "eth0", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_add(&dc, "eth1", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_add(&dc, "eth2", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_add(&dc, "eth3", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_count(&dc);
+       ck_assert_int_eq(ret, 4);
+
+       /* invalid removal doesn't cause issues */
+       ret = datacache_remove(&dc, "eth4");
+       ck_assert_int_eq(ret, 0);
+       ret = datacache_count(&dc);
+       ck_assert_int_eq(ret, 4);
+       ck_assert_str_eq(dc->interface, "eth3");
+
+       /* head removal */
+       ret = datacache_remove(&dc, "eth3");
+       ck_assert_int_eq(ret, 1);
+       ret = datacache_count(&dc);
+       ck_assert_int_eq(ret, 3);
+       ck_assert_str_eq(dc->interface, "eth2");
+
+       /* middle removal */
+       ret = datacache_remove(&dc, "eth1");
+       ck_assert_int_eq(ret, 1);
+       ret = datacache_count(&dc);
+       ck_assert_int_eq(ret, 2);
+       ck_assert_str_eq(dc->interface, "eth2");
+
+       /* tail removal */
+       ret = datacache_remove(&dc, "eth0");
+       ck_assert_int_eq(ret, 1);
+       ret = datacache_count(&dc);
+       ck_assert_int_eq(ret, 1);
+       ck_assert_str_eq(dc->interface, "eth2");
+
+       datacache_clear(&dc);
+       ck_assert_ptr_eq(dc, NULL);
+}
+END_TEST
+
+START_TEST(datacache_can_do_stuff)
+{
+       int ret, i;
+       datacache *dc = NULL;
+       datacache *iter = NULL;
+
+       ret = datacache_add(&dc, "eth0", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_add(&dc, "eth1", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = xferlog_add(&dc->log, 2, 1, 2);
+       ck_assert_int_eq(ret, 1);
+
+       ret = xferlog_add(&dc->log, 2, 10, 15);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_add(&dc, "eth2", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_add(&dc, "eth3", 0);
+       ck_assert_int_eq(ret, 1);
+
+       ret = xferlog_add(&dc->log, 2, 2, 2);
+       ck_assert_int_eq(ret, 1);
+
+       ret = datacache_count(&dc);
+       ck_assert_int_eq(ret, 4);
+
+       iter = dc;
+       ret = datacache_seek(&iter, "eth1");
+       ck_assert_int_eq(ret, 1);
+       ck_assert_int_eq(iter->log->timestamp, 2);
+       ck_assert_int_eq(iter->log->rx, 11);
+       ck_assert_int_eq(iter->log->tx, 17);
+       ret = xferlog_add(&iter->log, 2, 10, 20);
+       ck_assert_int_eq(ret, 1);
+       ck_assert_int_eq(iter->log->rx, 21);
+       ck_assert_int_eq(iter->log->tx, 37);
+
+       iter = dc;
+       ret = datacache_seek(&iter, "eth0");
+       ck_assert_ptr_eq(iter->log, NULL);
+       ret = xferlog_add(&iter->log, 2, 12, 34);
+       ck_assert_int_eq(ret, 1);
+       ck_assert_int_eq(iter->log->timestamp, 2);
+       ck_assert_int_eq(iter->log->rx, 12);
+       ck_assert_int_eq(iter->log->tx, 34);
+
+       iter = dc;
+       ret = datacache_seek(&iter, "eth1");
+       ck_assert_int_eq(ret, 1);
+       ck_assert_int_eq(iter->log->timestamp, 2);
+       ck_assert_int_eq(iter->log->rx, 21);
+       ck_assert_int_eq(iter->log->tx, 37);
+       ret = xferlog_add(&iter->log, 10, 12, 34);
+       ck_assert_int_eq(ret, 1);
+       ck_assert_int_eq(iter->log->timestamp, 10);
+       ck_assert_int_eq(iter->log->rx, 12);
+       ck_assert_int_eq(iter->log->tx, 34);
+
+       iter = dc;
+       ret = datacache_seek(&iter, "eth3");
+       for (i=1; i<=10; i++) {
+               ret = xferlog_add(&iter->log, i, i*10, i*20);
+               ck_assert_int_eq(ret, 1);
+       }
+       ck_assert_int_eq(iter->log->timestamp, 10);
+       ck_assert_int_eq(iter->log->rx, 100);
+       ck_assert_int_eq(iter->log->tx, 200);
+
+       /* suppress output to validate that debug function doesn't cause a crash */
+       suppress_output();
+       datacache_debug(&dc);
+       printf("\n");
+
+       ret = datacache_remove(&dc, "eth1");
+       ck_assert_int_eq(ret, 1);
+       ret = datacache_count(&dc);
+       ck_assert_int_eq(ret, 3);
+
+       datacache_debug(&dc);
+       printf("\n");
+
+       datacache_clear(&dc);
+       ck_assert_ptr_eq(dc, NULL);
+       datacache_debug(&dc);
+       ret = datacache_count(&dc);
+       ck_assert_int_eq(ret, 0);
+}
+END_TEST
+
+START_TEST(xferlog_can_clear_empty_log)
+{
+       xferlog *log = NULL;
+
+       xferlog_clear(&log);
+       ck_assert_ptr_eq(log, NULL);
+}
+END_TEST
+
+START_TEST(xferlog_can_log)
+{
+       int ret;
+       xferlog *log = NULL;
+
+       ret = xferlog_add(&log, 1, 1, 1);
+       ck_assert_int_eq(ret, 1);
+
+       ck_assert_ptr_ne(log, NULL);
+
+       xferlog_clear(&log);
+       ck_assert_ptr_eq(log, NULL);
+}
+END_TEST
+
+START_TEST(xferlog_can_handle_multiple_entries)
+{
+       int ret;
+       xferlog *log = NULL;
+       xferlog *bookmark = NULL;
+
+       ret = xferlog_add(&log, 1, 1, 1);
+       ck_assert_int_eq(ret, 1);
+       ck_assert_int_eq(log->timestamp, 1);
+       ck_assert_int_eq(log->rx, 1);
+       ck_assert_int_eq(log->tx, 1);
+
+       bookmark = log;
+
+       ret = xferlog_add(&log, 1, 1, 2);
+       ck_assert_int_eq(ret, 1);
+       ck_assert_int_eq(log->timestamp, 1);
+       ck_assert_int_eq(log->rx, 2);
+       ck_assert_int_eq(log->tx, 3);
+
+       ret = xferlog_add(&log, 4, 5, 5);
+       ck_assert_int_eq(ret, 1);
+       ck_assert_int_eq(log->timestamp, 4);
+       ck_assert_int_eq(log->rx, 5);
+       ck_assert_int_eq(log->tx, 5);
+
+       ret = xferlog_add(&log, 7, 4, 4);
+       ck_assert_int_eq(ret, 1);
+       ck_assert_int_eq(log->timestamp, 7);
+       ck_assert_int_eq(log->rx, 4);
+       ck_assert_int_eq(log->tx, 4);
+
+       ret = xferlog_add(&log, 1, 1, 1);
+       ck_assert_int_eq(ret, 1);
+       ck_assert_int_eq(log->timestamp, 1);
+       ck_assert_int_eq(log->rx, 1);
+       ck_assert_int_eq(log->tx, 1);
+
+       /* check that new addition with same timestamp doesn't modify old record */
+       ck_assert_int_eq(bookmark->timestamp, 1);
+       ck_assert_int_eq(bookmark->rx, 2);
+       ck_assert_int_eq(bookmark->tx, 3);
+
+       xferlog_clear(&log);
+       ck_assert_ptr_eq(log, NULL);
+}
+END_TEST
+
+void add_datacache_tests(Suite *s)
+{
+       TCase *tc_datacache = tcase_create("Datacache");
+       tcase_add_test(tc_datacache, datacache_can_clear_empty_cache);
+       tcase_add_test(tc_datacache, datacache_can_add_to_cache);
+       tcase_add_test(tc_datacache, datacache_can_add_to_cache_consistently);
+       tcase_add_test(tc_datacache, datacache_knows_how_to_count);
+       tcase_add_test(tc_datacache, datacache_can_seek);
+       tcase_add_test(tc_datacache, datacache_can_remove);
+       tcase_add_test(tc_datacache, datacache_can_do_stuff);
+       tcase_add_test(tc_datacache, xferlog_can_clear_empty_log);
+       tcase_add_test(tc_datacache, xferlog_can_log);
+       tcase_add_test(tc_datacache, xferlog_can_handle_multiple_entries);
+       suite_add_tcase(s, tc_datacache);
+}
diff --git a/tests/datacache_tests.h b/tests/datacache_tests.h
new file mode 100644 (file)
index 0000000..d2d46dd
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef DATACACHE_TESTS_H
+#define DATACACHE_TESTS_H
+
+void add_datacache_tests(Suite *s);
+
+#endif
index bcb86f78452a2852804766713d83d68cf1e7c09d..6cb8f367b71d080d57be7dc53b86a78f008dc8ba 100644 (file)
@@ -6,6 +6,7 @@
 //#include "ifinfo_tests.h"
 //#include "misc_tests.h"
 //#include "daemon_tests.h"
+#include "datacache_tests.h"
 #include "fs_tests.h"
 #include "id_tests.h"
 #include "common.h"
@@ -41,6 +42,7 @@ Suite *test_suite(void)
        //add_ifinfo_tests(s);
        //add_misc_tests(s);
        //add_daemon_tests(s);
+       add_datacache_tests(s);
        add_fs_tests(s);
        add_id_tests(s);