added updates/erase tests
This commit is contained in:
parent
419deb4b22
commit
3b7e513405
@ -1,5 +1,5 @@
|
|||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char rcsid [] = "@(#$Id: conftree.cpp,v 1.12 2007-10-01 06:19:21 dockes Exp $ (C) 2003 J.F.Dockes";
|
static char rcsid [] = "@(#$Id: conftree.cpp,v 1.13 2007-10-01 15:57:48 dockes Exp $ (C) 2003 J.F.Dockes";
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -549,6 +549,8 @@ int ConfTree::get(const std::string &name, string &value, const string &sk)
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -561,6 +563,121 @@ using namespace std;
|
|||||||
|
|
||||||
static char *thisprog;
|
static char *thisprog;
|
||||||
|
|
||||||
|
static void caterrno(string *reason)
|
||||||
|
{
|
||||||
|
#define ERRBUFSZ 200
|
||||||
|
char errbuf[ERRBUFSZ];
|
||||||
|
if (reason) {
|
||||||
|
#ifdef sun
|
||||||
|
// Note: sun strerror is noted mt-safe ??
|
||||||
|
*reason += string("file_to_string: open failed: ") + strerror(errno);
|
||||||
|
#else
|
||||||
|
strerror_r(errno, errbuf, ERRBUFSZ);
|
||||||
|
*reason += string("file_to_string: open failed: ") + errbuf;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static bool file_to_string(const string &fn, string &data, string *reason)
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
int fd = open(fn.c_str(), O_RDONLY);
|
||||||
|
if (fd < 0) {
|
||||||
|
caterrno(reason);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
char buf[4096];
|
||||||
|
for (;;) {
|
||||||
|
int n = read(fd, buf, 4096);
|
||||||
|
if (n < 0) {
|
||||||
|
caterrno(reason);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (n == 0)
|
||||||
|
break;
|
||||||
|
try {
|
||||||
|
data.append(buf, n);
|
||||||
|
} catch (...) {
|
||||||
|
caterrno(reason);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = true;
|
||||||
|
out:
|
||||||
|
if (fd >= 0)
|
||||||
|
close(fd);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool complex_updates(const string& fn)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
if ((fd = open(fn.c_str(), O_RDWR|O_TRUNC|O_CREAT, 0666)) < 0) {
|
||||||
|
perror("open/create");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
ConfTree conf(fn.c_str());
|
||||||
|
if (!conf.ok()) {
|
||||||
|
cerr << "Config init failed" << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
conf.set("nm-1", "val-1", "");
|
||||||
|
conf.set("nm-2", "val-2", "");
|
||||||
|
|
||||||
|
conf.set("nm-1", "val1-1", "/dir1");
|
||||||
|
conf.set("nm-2", "val1-2", "/dir1");
|
||||||
|
|
||||||
|
conf.set("nm-1", "val2-1", "/dir2");
|
||||||
|
conf.set("nm-2", "val2-2", "/dir2");
|
||||||
|
|
||||||
|
conf.set("nm-1", "val11-1", "/dir1/dir1");
|
||||||
|
conf.set("nm-2", "val11-2", "/dir1/dir1");
|
||||||
|
|
||||||
|
conf.eraseKey("/dir2");
|
||||||
|
conf.set("nm-1", "val2-1", "/dir2");
|
||||||
|
conf.set("nm-2", "val2-2", "/dir2");
|
||||||
|
|
||||||
|
conf.erase("nm-1", "");
|
||||||
|
conf.erase("nm-2", "");
|
||||||
|
conf.eraseKey("/dir1");
|
||||||
|
conf.eraseKey("/dir2");
|
||||||
|
conf.eraseKey("/dir1/dir1");
|
||||||
|
|
||||||
|
conf.set("nm-1", "val1-1", "/dir1");
|
||||||
|
conf.set("nm-2", "val1-2", "/dir1");
|
||||||
|
conf.set("nm-1", "val-1", "");
|
||||||
|
|
||||||
|
conf.set("nm-1", "val2-1", "/dir2");
|
||||||
|
conf.set("nm-2", "val2-2", "/dir2");
|
||||||
|
|
||||||
|
conf.set("nm-1", "val11-1", "/dir1/dir1");
|
||||||
|
conf.set("nm-2", "val11-2", "/dir1/dir1");
|
||||||
|
|
||||||
|
conf.erase("nm-1", "/dir2");
|
||||||
|
conf.erase("nm-2", "/dir2");
|
||||||
|
conf.erase("nm-1", "/dir1/dir1");
|
||||||
|
conf.erase("nm-2", "/dir1/dir1");
|
||||||
|
|
||||||
|
string data;
|
||||||
|
file_to_string(fn, data, 0);
|
||||||
|
const string ref =
|
||||||
|
"nm-1 = val-1\n"
|
||||||
|
"[/dir1]\n"
|
||||||
|
"nm-1 = val1-1\n"
|
||||||
|
"nm-2 = val1-2\n"
|
||||||
|
;
|
||||||
|
if (data.compare(ref)) {
|
||||||
|
cerr << "Final file:" << endl << data << endl << "Differs from ref:" <<
|
||||||
|
endl << ref << endl;
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
cout << "Updates test Ok" << endl;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
ConfSimple::WalkerCode mywalker(void *, const string &nm, const string &value)
|
ConfSimple::WalkerCode mywalker(void *, const string &nm, const string &value)
|
||||||
{
|
{
|
||||||
if (nm.empty())
|
if (nm.empty())
|
||||||
@ -700,8 +817,9 @@ static char usage [] =
|
|||||||
"-q nm sect : subsection test: look for nm in 'sect' which can be ''\n"
|
"-q nm sect : subsection test: look for nm in 'sect' which can be ''\n"
|
||||||
"-d nm sect : delete nm in 'sect' which can be ''\n"
|
"-d nm sect : delete nm in 'sect' which can be ''\n"
|
||||||
"-E sect : erase key (and all its names)\n"
|
"-E sect : erase key (and all its names)\n"
|
||||||
"[-S] : string io test. No filename in this case\n"
|
"-S : string io test. No filename in this case\n"
|
||||||
"[-V] : volatile config test. No filename in this case\n"
|
"-V : volatile config test. No filename in this case\n"
|
||||||
|
"-U : complex update test. Will erase the named file parameter\n"
|
||||||
;
|
;
|
||||||
|
|
||||||
void Usage() {
|
void Usage() {
|
||||||
@ -719,6 +837,7 @@ static int op_flags;
|
|||||||
#define OPT_a 0x80
|
#define OPT_a 0x80
|
||||||
#define OPT_k 0x100
|
#define OPT_k 0x100
|
||||||
#define OPT_E 0x200
|
#define OPT_E 0x200
|
||||||
|
#define OPT_U 0x400
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -767,7 +886,8 @@ int main(int argc, char **argv)
|
|||||||
goto b1;
|
goto b1;
|
||||||
case 's': op_flags |= OPT_s; break;
|
case 's': op_flags |= OPT_s; break;
|
||||||
case 'S': op_flags |= OPT_S; break;
|
case 'S': op_flags |= OPT_S; break;
|
||||||
case 'V': op_flags |= OPT_S; break;
|
case 'V': op_flags |= OPT_V; break;
|
||||||
|
case 'U': op_flags |= OPT_U; break;
|
||||||
case 'w': op_flags |= OPT_w; break;
|
case 'w': op_flags |= OPT_w; break;
|
||||||
|
|
||||||
default: Usage(); break;
|
default: Usage(); break;
|
||||||
@ -796,6 +916,9 @@ int main(int argc, char **argv)
|
|||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
Usage();
|
Usage();
|
||||||
|
|
||||||
|
if (op_flags & OPT_U) {
|
||||||
|
exit(!complex_updates(argv[0]));
|
||||||
|
}
|
||||||
list<string> flist;
|
list<string> flist;
|
||||||
while (argc--) {
|
while (argc--) {
|
||||||
flist.push_back(*argv++);
|
flist.push_back(*argv++);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user