/*************************************************************************
* (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
* by Michael Pounov <misho@aitbg.com>
*
* $Author: misho $
* $Id: xmler.c,v 1.1.2.10 2010/09/29 16:51:14 misho Exp $
*
*************************************************************************/
#include "global.h"
#include <axl.h>
#include <axl_ns.h>
#include <axl_decl.h>
#include "xmler.h"
int Verbose;
extern char compiled[], compiledby[], compilehost[];
static void
Usage()
{
printf( "XMLer is tool for managment R/W operation with XMLs\n"
"=== %s === %s@%s ===\n\n"
" Syntax: xmler [options] <file.xml> [data]\n\n"
"\t-v\t\tVerbose ...\n"
"\t-l <av_pair>\tList node\n"
"\t-d <av_pair>\tDelete node\n"
"\t-s <av_pair>\tSet node command\n"
"\t-g <av_pair>\tGet node command\n"
"*\"av_pair\" format: [ns:]node[[|attribute[=value]]?data]\n"
"\n", compiled, compiledby, compilehost);
}
static int
ShowXML(axlDoc *doc, const char *csNode)
{
axlNode *node = NULL;
int ctxlen;
char *ctx = NULL;
if (csNode) {
if (!(node = axl_doc_find_called(doc, csNode))) {
printf("GET:: node %s - not found!\n", csNode);
return 1;
}
axl_node_dump_pretty(node, &ctx, &ctxlen, 4);
VERB(1) printf("Verbose:: Node length=%d\n", ctxlen);
} else {
axl_doc_dump_pretty(doc, &ctx, &ctxlen, 4);
VERB(1) printf("Verbose:: Document length=%d\n", ctxlen);
}
VERB(1) printf("\n");
if (ctx) {
printf("%s", ctx);
free(ctx);
}
VERB(1) printf("\n");
return 0;
}
static int
ShowItem(axlNode *node, int lvl)
{
register int i;
int ctxlen;
axlNode *child;
for (i = 0; i < axl_node_get_child_num(node); i++) {
child = axl_node_get_child_nth(node, i);
if (!lvl)
printf("%s %s \"%s\"", axl_node_get_name(node), axl_node_get_name(child),
axl_node_get_content(child, &ctxlen));
else
printf(" %s \"%s\"", axl_node_get_name(child), axl_node_get_content(child, &ctxlen));
ShowItem(child, 1);
if (!lvl)
printf("\n");
}
return 0;
}
int
main(int argc, char **argv)
{
char ch, str[STRSIZ], szName[MAXPATHLEN], *ctx = NULL, m = 0;
int ctxlen, n, ret = 0;
axlDoc *doc = NULL;
axlError *err = NULL;
axlNode *nnode = NULL, *node = NULL;
struct tagReqXML xr;
memset(str, 0, STRSIZ);
memset(&xr, 0, sizeof xr);
while ((ch = getopt(argc, argv, "hvl:s:g:d:")) != -1)
switch (ch) {
case 'v':
Verbose++;
break;
case 'l':
if (m) {
Usage();
return 1;
} else
m = 'l';
strlcpy(str, optarg, STRSIZ);
if ((ret = ioXMLGet(str, &xr)) < 1) {
printf("Error:: in XML request %s\n", str);
return 1;
}
VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
break;
case 'd':
if (m) {
Usage();
return 1;
} else
m = 'd';
strlcpy(str, optarg, STRSIZ);
if ((ret = ioXMLGet(str, &xr)) < 1) {
printf("Error:: in XML request %s\n", str);
return 1;
}
VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
break;
case 's':
if (m) {
Usage();
return 1;
} else
m = 's';
strlcpy(str, optarg, STRSIZ);
if ((ret = ioXMLGet(str, &xr)) < 1) {
printf("Error:: in XML request %s\n", str);
return 1;
}
VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
break;
case 'g':
if (m) {
Usage();
return 1;
} else
m = 'g';
strlcpy(str, optarg, STRSIZ);
if ((ret = ioXMLGet(str, &xr)) < 1) {
printf("Error:: in XML request %s\n", str);
return 1;
}
VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret);
break;
case 'h':
default:
Usage();
return 1;
}
argc -= optind;
argv += optind;
if (!argc) {
Usage();
return 1;
} else
strlcpy(szName, *argv, MAXPATHLEN);
if (argc > 1 && argv[1]) {
xr.xml_data.value = argv[1];
xr.xml_data.vallen = strlen(argv[1]);
}
axl_init();
if (!(doc = axl_doc_parse_from_file(szName, &err))) {
printf("Error:: xml file %s #%d - %s\n", szName,
axl_error_get_code(err), axl_error_get(err));
axl_error_free(err);
axl_end();
return 2;
}
if (!axl_ns_doc_validate(doc, &err)) {
printf("Error:: xml file %s namespace validation #%d - %s\n", szName,
axl_error_get_code(err), axl_error_get(err));
axl_error_free(err);
axl_end();
return 2;
}
switch (m) {
case 'g':
if (!xr.xml_namespace.vallen) {
if (ret == 32) {
if (!(ctx = (char*) axl_doc_get_content_at(doc, xr.xml_node.path.value, &ctxlen))) {
printf("GET:: path %s - not found!\n", xr.xml_node.path.value);
ret = 1;
goto end;
}
} else {
if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
printf("GET:: node %s - not found!\n", xr.xml_node.container.value);
ret = 1;
goto end;
}
}
} else {
strlcpy(str, xr.xml_namespace.value, sizeof str);
strlcat(str, ":", sizeof str);
strlcat(str, xr.xml_node.container.value, sizeof str);
if (ret == 32) {
if (!(ctx = (char*) axl_doc_get_content_at(doc, str, &ctxlen))) {
printf("GET:: path %s:%s - not found!\n", xr.xml_namespace.value,
xr.xml_node.path.value);
ret = 1;
goto end;
}
} else {
if (!(node = axl_doc_find_called(doc, str))) {
printf("GET:: node %s:%s - not found!\n", xr.xml_namespace.value,
xr.xml_node.container.value);
ret = 1;
goto end;
}
}
}
if (!(ret & 32) && xr.xml_data.vallen) {
if (!(ctx = (char*) axl_node_get_content(node, &ctxlen))) {
printf("GET:: data %s for node %s - not found!\n",
xr.xml_data.value, xr.xml_node.container.value);
ret = 1;
goto end;
} else
VERB(3) printf("Verbose(3):: Returned bytes %d\n", ctxlen);
VERB(1) printf("\n");
if (!strcmp(ctx, xr.xml_data.value))
printf("DATA::1\n");
else
printf("DATA::0\n");
}
if (!(ret & 32) && xr.xml_attribute.vallen) {
if ((n = axl_node_num_attributes(node)) < 1) {
printf("GET:: attribute %s for node %s - not found!\n",
xr.xml_attribute.value, xr.xml_node.container.value);
ret = 1;
goto end;
} else {
VERB(1) printf("Verbose:: node have %d attributes\n", n);
if (!(ctx = (char*) axl_node_get_attribute_value(node, xr.xml_attribute.value))) {
printf("GET:: attribute %s for node %s - not found!\n",
xr.xml_attribute.value, xr.xml_node.container.value);
ret = 1;
goto end;
}
if (xr.xml_value.vallen) {
if (!strcmp(ctx, xr.xml_value.value))
ctx = "VALUE::1";
else
ctx = "VALUE::0";
}
}
} else {
if (!(ret & 32) && !(ctx = (char*) axl_node_get_content(node, &ctxlen))) {
printf("GET:: data for node %s - not found!\n", xr.xml_node.container.value);
ret = 1;
goto end;
} else
VERB(3) printf("Verbose(3):: Returned bytes %d\n", ctxlen);
}
VERB(1) printf("\n");
printf("%s\n", ctx);
ret = 0;
break;
case 'd':
if (!xr.xml_namespace.vallen) {
if (ret == 32) {
if (!(node = axl_doc_get(doc, xr.xml_node.path.value))) {
printf("DEL:: path %s - not found!\n", xr.xml_node.path.value);
ret = 1;
goto end;
}
} else {
if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
printf("DEL:: node %s - not found!\n", xr.xml_node.container.value);
ret = 1;
goto end;
}
}
} else {
strlcpy(str, xr.xml_namespace.value, sizeof str);
strlcat(str, ":", sizeof str);
strlcat(str, xr.xml_node.container.value, sizeof str);
if (ret == 32) {
if (!(node = axl_doc_get(doc, str))) {
printf("DEL:: path %s:%s - not found!\n", xr.xml_namespace.value,
xr.xml_node.path.value);
ret = 1;
goto end;
}
} else {
if (!(node = axl_doc_find_called(doc, str))) {
printf("DEL:: node %s:%s - not found!\n", xr.xml_namespace.value,
xr.xml_node.container.value);
ret = 1;
goto end;
}
}
}
axl_node_remove(node, 1);
ret = ShowXML(doc, NULL);
break;
case 's':
if (ret == 32) {
if (!xr.xml_data.vallen || !(nnode = axl_node_create(xr.xml_data.value))) {
printf("SET:: container %s at path %s - Error!\n",
xr.xml_data.value, xr.xml_node.path.value);
ret = 1;
goto end;
}
}
if (!xr.xml_namespace.vallen) {
if (ret == 32) {
// insert new
if (!(node = axl_doc_get(doc, xr.xml_node.path.value))) {
printf("SET:: path %s - not found!\n", xr.xml_node.path.value);
axl_node_free(nnode);
ret = 1;
goto end;
}
} else {
// update old
if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
printf("SET:: node %s - not found!\n", xr.xml_node.container.value);
ret = 1;
goto end;
}
}
} else {
strlcpy(str, xr.xml_namespace.value, sizeof str);
strlcat(str, ":", sizeof str);
strlcat(str, xr.xml_node.container.value, sizeof str);
if (ret == 32) {
// insert new
if (!(node = axl_doc_get(doc, str))) {
printf("SET:: path %s:%s - not found!\n", xr.xml_namespace.value,
xr.xml_node.path.value);
axl_node_free(nnode);
ret = 1;
goto end;
}
} else {
// update old
if (!(node = axl_doc_find_called(doc, str))) {
printf("SET:: node %s:%s - not found!\n", xr.xml_namespace.value,
xr.xml_node.container.value);
ret = 1;
goto end;
}
}
}
if (!(ret & 32) && xr.xml_data.vallen) {
axl_node_set_is_empty(node, 1);
axl_node_set_content(node, xr.xml_data.value, xr.xml_data.vallen);
}
if (!(ret & 32) && xr.xml_attribute.vallen) {
axl_node_remove_attribute(node, xr.xml_attribute.value);
axl_node_set_attribute(node, xr.xml_attribute.value, xr.xml_value.value);
}
if (ret & 32)
axl_node_set_child(node, nnode);
ret = ShowXML(doc, NULL);
break;
case 'l':
if (!xr.xml_namespace.vallen) {
if (ret == 32) {
if (!(node = axl_doc_get(doc, xr.xml_node.path.value))) {
printf("LST:: path %s - not found!\n", xr.xml_node.path.value);
ret = 1;
goto end;
}
} else {
if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) {
printf("LST:: node %s - not found!\n", xr.xml_node.container.value);
ret = 1;
goto end;
}
}
} else {
strlcpy(str, xr.xml_namespace.value, sizeof str);
strlcat(str, ":", sizeof str);
strlcat(str, xr.xml_node.container.value, sizeof str);
if (ret == 32) {
if (!(node = axl_doc_get(doc, str))) {
printf("LST:: path %s:%s - not found!\n", xr.xml_namespace.value,
xr.xml_node.path.value);
ret = 1;
goto end;
}
} else {
if (!(node = axl_doc_find_called(doc, str))) {
printf("LST:: node %s:%s - not found!\n", xr.xml_namespace.value,
xr.xml_node.container.value);
ret = 1;
goto end;
}
}
}
ret = ShowItem(node, 0);
break;
default:
ret = ShowXML(doc, xr.xml_data.vallen ? xr.xml_data.value : NULL);
}
end:
axl_doc_free(doc);
axl_end();
return ret;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>