if (cacheget(s->datalist)==0) {
/* try to read data from file if not cached */
- if (readdb(s->datalist->data.interface, s->dirname)==0) {
+ if (readdb(s->datalist->data.interface, s->dirname, 0)==0) {
/* mark cache as filled on read success and force interface status update */
s->datalist->filled = 1;
s->dbhash = 0;
return 0;
}
- if (!validatedb()) { /* TODO: write test to simulate corrupted cached data */
+ if (!validatedb()) {
snprintf(errorstring, 512, "Cached data for interface \"%s\" failed validation. Reloading data from file.", s->datalist->data.interface);
printe(PT_Error);
- if (readdb(s->datalist->data.interface, s->dirname)==0) {
+ if (readdb(s->datalist->data.interface, s->dirname, 0)==0) {
cacheupdate();
return 1;
}
#include "fs.h"
#include "dbaccess.h"
-int readdb(const char *iface, const char *dirname)
+int readdb(const char *iface, const char *dirname, const int force)
{
FILE *db;
char file[512], backup[512];
}
if (data.version == DBVERSION) {
- if (!validatedb()) {
+ if (!validatedb() && !force) {
data.version=-1;
if (debug) {
printf("db: Database for interface \"%s\" fails to validate, trying with backup\n", data.interface);
{
int i;
- if (readdb(iface, dirname)!=0) {
+ if (readdb(iface, dirname, 0)!=0) {
exit(EXIT_FAILURE);
}
{
int i;
- if (readdb(iface, dirname)!=0) {
+ if (readdb(iface, dirname, 0)!=0) {
exit(EXIT_FAILURE);
}
#ifndef DBACCESS_H
#define DBACCESS_H
-int readdb(const char *iface, const char *dirname);
+int readdb(const char *iface, const char *dirname, const int force);
void initdb(void);
int writedb(const char *iface, const char *dirname, int newdb);
int backupdb(const char *current, const char *backup);
if (debug)
printf("merging %s:\n", ifaceptr);
- if (readdb(ifaceptr, dirname)!=0) {
+ if (readdb(ifaceptr, dirname, 0)!=0) {
printf("Merge \"%s\" failed.\n", mergedata.interface);
return 0;
}
} else if ((strcmp(argv[currentarg],"-h")==0) || (strcmp(argv[currentarg],"--hours")==0)) {
cfg.qmode=7;
} else if ((strcmp(argv[currentarg],"--exportdb")==0) || (strcmp(argv[currentarg],"--dumpdb")==0)) {
- cfg.qmode=4; /* TODO: provide some way of forcing export even if database doesn't validate */
+ cfg.qmode=4;
} else if (strcmp(argv[currentarg],"--oneline")==0) {
cfg.qmode=9;
} else if (strcmp(argv[currentarg],"--xml")==0) {
int synccounters(const char *iface, const char *dirname)
{
- readdb(iface, dirname);
+ readdb(iface, dirname, 0);
if (!getifinfo(iface)) {
printf("Error: Unable to sync unavailable interface \"%s\".", iface);
return 0;
printf("Error: Not enough free diskspace available.\n");
exit(EXIT_FAILURE);
}
- readdb(p->interface, p->dirname);
+ readdb(p->interface, p->dirname, 0);
data.currx=0;
data.curtx=0;
writedb(p->interface, p->dirname, 0);
printf("Error: Not enough free diskspace available.\n");
exit(EXIT_FAILURE);
}
- p->newdb=readdb(p->interface, p->dirname);
+ p->newdb=readdb(p->interface, p->dirname, 0);
if (!data.active && !p->newdb) {
data.active=1;
writedb(p->interface, p->dirname, 0);
printf("Error: Not enough free diskspace available.\n");
exit(EXIT_FAILURE);
}
- p->newdb=readdb(p->interface, p->dirname);
+ p->newdb=readdb(p->interface, p->dirname, 0);
if (data.active && !p->newdb) {
data.active=0;
writedb(p->interface, p->dirname, 0);
strncpy_nt(p->interface, di->d_name, 32);
if (debug)
printf("\nProcessing file \"%s/%s\"...\n", p->dirname, p->interface);
- p->newdb=readdb(p->interface, p->dirname);
+ p->newdb=readdb(p->interface, p->dirname, 0);
if (!data.active) {
if (debug)
/* update only selected file */
} else {
- p->newdb=readdb(p->interface, p->dirname);
+ p->newdb=readdb(p->interface, p->dirname, 0);
if (!data.active) {
if (debug)
strncpy_nt(p->interface, di->d_name, 32);
if (debug)
printf("\nProcessing file \"%s/%s\"...\n", p->dirname, p->interface);
- p->newdb=readdb(p->interface, p->dirname);
+ p->newdb=readdb(p->interface, p->dirname, p->force);
if (p->newdb) {
continue;
}
void showoneinterface(PARAMS *p, const char *interface)
{
if (!p->merged) {
- p->newdb=readdb(interface, p->dirname);
+ p->newdb=readdb(interface, p->dirname, p->force);
}
if (p->newdb) {
return;
exit(EXIT_FAILURE);
}
} else {
- if (readdb(p->interface, p->dirname)==1) {
+ if (readdb(p->interface, p->dirname, 0)==1) {
exit(EXIT_FAILURE);
}
}
cfg.flock = 1;
ck_assert_int_eq(clean_testdbdir(), 1);
ck_assert_int_eq(create_zerosize_dbfile("existingdb"), 1);
- ck_assert_int_eq(readdb("existingdb", TESTDBDIR), -1);
+ ck_assert_int_eq(readdb("existingdb", TESTDBDIR, 0), -1);
}
END_TEST
ck_assert_int_eq(clean_testdbdir(), 1);
ck_assert_int_eq(create_zerosize_dbfile("existingdb"), 1);
ck_assert_int_eq(create_zerosize_dbfile(".existingdb"), 1);
- ck_assert_int_eq(readdb("existingdb", TESTDBDIR), -1);
+ ck_assert_int_eq(readdb("existingdb", TESTDBDIR, 0), -1);
}
END_TEST
cfg.flock = 1;
strcpy(data.interface, "none");
ck_assert_int_eq(clean_testdbdir(), 1);
- ck_assert_int_eq(readdb("existingdb", TESTDBDIR), 1);
+ ck_assert_int_eq(readdb("existingdb", TESTDBDIR, 0), 1);
ck_assert_str_eq(data.interface, "existingdb");
ck_assert_str_eq(data.nick, "existingdb");
}
ck_assert_int_eq(check_dbfile_exists("ethtest", sizeof(DATA)), 1);
strcpy(data.interface, "none");
- ck_assert_int_eq(readdb("ethtest", TESTDBDIR), 0);
+ ck_assert_int_eq(readdb("ethtest", TESTDBDIR, 0), 0);
ck_assert_str_eq(data.interface, "ethtest");
}
END_TEST
ck_assert_int_eq(check_dbfile_exists("1234567890123456789012345678901", sizeof(DATA)), 1);
strcpy(data.interface, "none");
- ck_assert_int_eq(readdb("1234567890123456789012345678901", TESTDBDIR), 0);
+ ck_assert_int_eq(readdb("1234567890123456789012345678901", TESTDBDIR, 0), 0);
ck_assert_str_eq(data.interface, "1234567890123456789012345678901");
}
END_TEST
strcpy(data.interface, "none");
strcpy(data.nick, "none");
- ck_assert_int_eq(readdb("ethtest2", TESTDBDIR), 0);
+ ck_assert_int_eq(readdb("ethtest2", TESTDBDIR, 0), 0);
ck_assert_str_eq(data.interface, "ethtest2");
ck_assert_str_eq(data.nick, "ethtest2");
}
strcpy(data.interface, "none");
strcpy(data.nick, "none");
- ck_assert_int_eq(readdb("1234567890123456789012345678901XX", TESTDBDIR), 0);
+ ck_assert_int_eq(readdb("1234567890123456789012345678901XX", TESTDBDIR, 0), 0);
ck_assert_str_eq(data.interface, "1234567890123456789012345678901");
ck_assert_str_eq(data.nick, "1234567890123456789012345678901");
}