gwenhywfar  5.3.0
xml2db_fromdb.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Thu Apr 02 2020
3  copyright : (C) 2020 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * *
8  * This library is free software; you can redistribute it and/or *
9  * modify it under the terms of the GNU Lesser General Public *
10  * License as published by the Free Software Foundation; either *
11  * version 2.1 of the License, or (at your option) any later version. *
12  * *
13  * This library is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16  * Lesser General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU Lesser General Public *
19  * License along with this library; if not, write to the Free Software *
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21  * MA 02111-1307 USA *
22  * *
23  ***************************************************************************/
24 
25 
26 #ifdef HAVE_CONFIG_H
27 # include <config.h>
28 #endif
29 
30 
31 
32 #include "xml2db_p.h"
33 
34 #include <gwenhywfar/debug.h>
35 #include <gwenhywfar/text.h>
36 #include <gwenhywfar/gwendate.h>
37 
38 
39 #include <ctype.h>
40 
41 
42 
43 /* ------------------------------------------------------------------------------------------------
44  * forward declarations
45  * ------------------------------------------------------------------------------------------------
46  */
47 
48 static int _handleChildren_fromDb(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode);
49 static int _dbEnter(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode);
50 static int _dbForEvery(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode);
51 static int _xmlCreateAndEnterElement(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode);
52 static int _xmlSetCharValue(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode);
53 static int _dbIfCharDataMatches(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode);
54 static int _dbIfNotCharDataMatches(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode);
55 static int _dbIfHasCharData(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode);
56 static int _dbIfNotHasCharData(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode);
57 static int _dbIfPathExists(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode);
58 static int _dbIfNotPathExists(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode);
59 
60 static int _setCharValueByPath(GWEN_XMLNODE *xmlNode, const char *path, const char *value);
61 static int _convertAndSetCharValue(GWEN_XMLNODE *xmlDocNode, GWEN_XMLNODE *xmlSchemaNode, const char *value);
62 
63 
64 
65 
66 
67 /* ------------------------------------------------------------------------------------------------
68  * implementations
69  * ------------------------------------------------------------------------------------------------
70  */
71 
72 
73 int GWEN_XmlFromDb(GWEN_XMLNODE *xmlNodeDestination,
74  GWEN_XMLNODE *xmlNodeSchema,
75  GWEN_DB_NODE *dbSource)
76 {
77  GWEN_XML2DB_CONTEXT *ctx;
78  int rv;
79 
80  ctx=GWEN_Xml2Db_Context_new(xmlNodeDestination, dbSource);
81  ctx->handleChildrenFn=_handleChildren_fromDb;
82  rv=GWEN_Xml2Db_Context_HandleChildren(ctx, xmlNodeSchema);
84 
85  if (rv<0) {
86  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
87  return rv;
88  }
89 
90  return 0;
91 }
92 
93 
94 
95 
96 
97 int _handleChildren_fromDb(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
98 {
99  GWEN_XMLNODE *n;
100 
101  n=GWEN_XMLNode_GetFirstTag(xmlNode);
102  while (n) {
103  const char *name;
104 
105  name=GWEN_XMLNode_GetData(n);
106  if (name && *name) {
107  int rv;
108 
109  DBG_INFO(GWEN_LOGDOMAIN, "Handling element \"%s\"", name);
110  if (strcasecmp(name, "DbEnter")==0)
111  rv=_dbEnter(ctx, n);
112  else if (strcasecmp(name, "DbForEvery")==0)
113  rv=_dbForEvery(ctx, n);
114  else if (strcasecmp(name, "XmlCreateAndEnterElement")==0)
115  rv=_xmlCreateAndEnterElement(ctx, n);
116  else if (strcasecmp(name, "XmlSetCharValue")==0)
117  rv=_xmlSetCharValue(ctx, n);
118  else if (strcasecmp(name, "DbIfCharDataMatches")==0)
119  rv=_dbIfCharDataMatches(ctx, n);
120  else if (strcasecmp(name, "DbIfNotCharDataMatches")==0)
121  rv=_dbIfNotCharDataMatches(ctx, n);
122  else if (strcasecmp(name, "DbIfHasCharData")==0)
123  rv=_dbIfHasCharData(ctx, n);
124  else if (strcasecmp(name, "DbIfNotHasCharData")==0)
125  rv=_dbIfNotHasCharData(ctx, n);
126  else if (strcasecmp(name, "DbIfPathExists")==0)
127  rv=_dbIfPathExists(ctx, n);
128  else if (strcasecmp(name, "DbIfNotPathExists")==0)
129  rv=_dbIfNotPathExists(ctx, n);
130  else {
131  DBG_ERROR(GWEN_LOGDOMAIN, "Unknown element \"%s\", aborting", name);
132  return GWEN_ERROR_INVALID;
133  }
134  if (rv<0) {
135  DBG_ERROR(GWEN_LOGDOMAIN, "Error in element \"%s\", aborting", name);
136  return rv;
137  }
138  }
139 
141  }
142 
143  return 0;
144 }
145 
146 
147 
148 int _dbIfPathExists(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
149 {
150  const char *name;
151  GWEN_DB_NODE *dbNew;
152  int rv;
153 
154  name=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
155  if (!(name && *name)) {
156  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or empty name in \"DbIfPathExists\"");
157  return GWEN_ERROR_INVALID;
158  }
159 
160  dbNew=GWEN_DB_GetGroup(ctx->currentDbGroup, GWEN_PATH_FLAGS_NAMEMUSTEXIST, name);
161  if (dbNew) {
162  /* handle children (nothing special here) */
163  rv=GWEN_Xml2Db_Context_HandleChildren(ctx, xmlNode);
164 
165  if (rv<0) {
166  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
167  return rv;
168  }
169  }
170 
171  return 0;
172 }
173 
174 
175 
176 int _dbIfNotPathExists(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
177 {
178  const char *name;
179  GWEN_DB_NODE *dbNew;
180  int rv;
181 
182  name=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
183  if (!(name && *name)) {
184  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or empty name in \"DbIfPathExists\"");
185  return GWEN_ERROR_INVALID;
186  }
187 
188  dbNew=GWEN_DB_GetGroup(ctx->currentDbGroup, GWEN_PATH_FLAGS_NAMEMUSTEXIST, name);
189  if (dbNew==NULL) {
190  /* handle children (nothing special here) */
191  rv=GWEN_Xml2Db_Context_HandleChildren(ctx, xmlNode);
192 
193  if (rv<0) {
194  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
195  return rv;
196  }
197  }
198 
199  return 0;
200 }
201 
202 
203 
204 int _dbEnter(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
205 {
206  const char *name;
207  GWEN_DB_NODE *dbLast;
208  GWEN_DB_NODE *dbNew;
209  int rv;
210 
211  name=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
212  if (!(name && *name)) {
213  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or empty name in \"DbEnter\"");
214  return GWEN_ERROR_INVALID;
215  }
216 
217  /* save group */
218  dbLast=ctx->currentDbGroup;
219 
220  dbNew=GWEN_DB_GetGroup(dbLast, GWEN_PATH_FLAGS_NAMEMUSTEXIST, name);
221  if (dbNew) {
222  /* push group */
223  ctx->currentDbGroup=dbNew;
224 
225  /* handle children (nothing special here) */
226  rv=GWEN_Xml2Db_Context_HandleChildren(ctx, xmlNode);
227 
228  /* pop group */
229  ctx->currentDbGroup=dbLast;
230 
231  if (rv<0) {
232  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
233  return rv;
234  }
235  }
236  else {
237  DBG_ERROR(GWEN_LOGDOMAIN, "Group \"%s\" does not exist", name);
238  return GWEN_ERROR_INVALID;
239  }
240 
241  return 0;
242 }
243 
244 
245 
246 int _dbForEvery(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
247 {
248  const char *name;
249  GWEN_DB_NODE *dbLast;
250  GWEN_DB_NODE *dbNew;
251  int rv;
252 
253  name=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
254  if (!(name && *name)) {
255  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or empty name in \"DbEnter\"");
256  return GWEN_ERROR_INVALID;
257  }
258 
259  /* save group */
260  dbLast=ctx->currentDbGroup;
261 
262  dbNew=GWEN_DB_FindFirstGroup(dbLast, name);
263  while (dbNew) {
264  /* push group */
265  ctx->currentDbGroup=dbNew;
266 
267  /* handle children (nothing special here) */
268  rv=GWEN_Xml2Db_Context_HandleChildren(ctx, xmlNode);
269 
270  /* pop group */
271  ctx->currentDbGroup=dbLast;
272 
273  if (rv<0) {
274  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
275  return rv;
276  }
277  dbNew=GWEN_DB_FindNextGroup(dbNew, name);
278  }
279 
280  return 0;
281 }
282 
283 
284 
285 int _dbIfCharDataMatches(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
286 {
287  const char *name;
288  const char *pattern;
289  const char *val;
290 
291  name=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
292  if (!(name && *name)) {
293  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or empty name in \"dbIfCharDataMatches\"");
294  return GWEN_ERROR_INVALID;
295  }
296 
297  pattern=GWEN_XMLNode_GetProperty(xmlNode, "pattern", NULL);
298  if (!(pattern && *pattern)) {
299  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or empty pattern in \"dbIfCharDataMatches\"");
300  return GWEN_ERROR_INVALID;
301  }
302 
303  val=GWEN_DB_GetCharValue(ctx->currentDbGroup, name, 0, NULL);
304  if (val && -1!=GWEN_Text_ComparePattern(val, pattern, 0)) {
305  int rv;
306 
307  /* pattern matches, handle children */
308  rv=GWEN_Xml2Db_Context_HandleChildren(ctx, xmlNode);
309  if (rv<0) {
310  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
311  return rv;
312  }
313  }
314 
315  return 0;
316 }
317 
318 
319 
320 int _dbIfNotCharDataMatches(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
321 {
322  const char *name;
323  const char *pattern;
324  const char *val;
325 
326  name=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
327  if (!(name && *name)) {
328  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or empty name in \"dbIfCharDataMatches\"");
329  return GWEN_ERROR_INVALID;
330  }
331 
332  pattern=GWEN_XMLNode_GetProperty(xmlNode, "pattern", NULL);
333  if (!(pattern && *pattern)) {
334  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or empty pattern in \"dbIfCharDataMatches\"");
335  return GWEN_ERROR_INVALID;
336  }
337 
338  val=GWEN_DB_GetCharValue(ctx->currentDbGroup, name, 0, NULL);
339  if (val==NULL || -1==GWEN_Text_ComparePattern(val, pattern, 0)) {
340  int rv;
341 
342  /* pattern matches, handle children */
343  rv=GWEN_Xml2Db_Context_HandleChildren(ctx, xmlNode);
344  if (rv<0) {
345  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
346  return rv;
347  }
348  }
349 
350  return 0;
351 }
352 
353 
354 
355 int _dbIfHasCharData(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
356 {
357  const char *name;
358  const char *val;
359 
360  name=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
361  if (!(name && *name)) {
362  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or empty name in \"dbIfCharDataMatches\"");
363  return GWEN_ERROR_INVALID;
364  }
365 
366  val=GWEN_DB_GetCharValue(ctx->currentDbGroup, name, 0, NULL);
367  if (val) {
368  int rv;
369 
370  /* pattern matches, handle children */
371  rv=GWEN_Xml2Db_Context_HandleChildren(ctx, xmlNode);
372  if (rv<0) {
373  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
374  return rv;
375  }
376  }
377 
378  return 0;
379 }
380 
381 
382 
383 int _dbIfNotHasCharData(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
384 {
385  const char *name;
386  const char *val;
387 
388  name=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
389  if (!(name && *name)) {
390  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or empty name in \"dbIfCharDataMatches\"");
391  return GWEN_ERROR_INVALID;
392  }
393 
394  val=GWEN_DB_GetCharValue(ctx->currentDbGroup, name, 0, NULL);
395  if (val==NULL) {
396  int rv;
397 
398  /* pattern matches, handle children */
399  rv=GWEN_Xml2Db_Context_HandleChildren(ctx, xmlNode);
400  if (rv<0) {
401  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
402  return rv;
403  }
404  }
405 
406  return 0;
407 }
408 
409 
410 
411 int _xmlCreateAndEnterElement(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
412 {
413  const char *path;
414  GWEN_XMLNODE *n;
415  int rv;
416 
417  path=GWEN_XMLNode_GetProperty(xmlNode, "path", NULL);
418  if (path==NULL) {
419  DBG_ERROR(GWEN_LOGDOMAIN, "Missing path in \"XmlCreateAndEnterElement\"");
420  return GWEN_ERROR_INVALID;
421  }
422 
424  if (n==NULL) {
425  DBG_ERROR(GWEN_LOGDOMAIN, "Path \"%s\" does not exist", path);
426  return GWEN_ERROR_INVALID;
427  }
428 
429  /* enter given document node */
431 
432  rv=GWEN_Xml2Db_Context_HandleChildren(ctx, xmlNode);
433  if (rv<0) {
434  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
435  return rv;
436  }
437 
438  /* leave given document node, re-select previously active one, thus restoring status from the beginning */
440  return 0;
441 }
442 
443 
444 
445 int _xmlSetCharValue(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
446 {
447  const char *path;
448  const char *value;
449 
450  path=GWEN_XMLNode_GetProperty(xmlNode, "path", NULL);
451  if (!(path && *path)) {
452  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or empty path in \"XmlSetCharValue\"");
453  return GWEN_ERROR_INVALID;
454  }
455 
456  value=GWEN_XMLNode_GetProperty(xmlNode, "value", NULL);
457  if (value) {
458  GWEN_BUFFER *dbuf;
459  int rv;
460 
461  dbuf=GWEN_Buffer_new(0, 256, 0, 1);
462  rv=GWEN_DB_ReplaceVars(ctx->currentDbGroup, value, dbuf);
463  if (rv<0) {
464  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
465  GWEN_Buffer_free(dbuf);
466  return rv;
467  }
468  _convertAndSetCharValue(ctx->currentDocNode, xmlNode, GWEN_Buffer_GetStart(dbuf));
469  GWEN_Buffer_free(dbuf);
470  }
471  else {
472  const char *name;
473 
474  name=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
475  if (!(name && *name)) {
476  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or name path in \"XmlSetCharValue\"");
477  return GWEN_ERROR_INVALID;
478  }
479 
480  value=GWEN_DB_GetCharValue(ctx->currentDbGroup, name, 0, NULL);
481  if (value && *value) {
482  _convertAndSetCharValue(ctx->currentDocNode, xmlNode, value);
483  }
484 #if 0
485  else {
486  GWEN_BUFFER *tbuf;
487 
488  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
489 
490  GWEN_XMLNode_GetXPath(NULL, ctx->currentDocNode, tbuf);
491 
492  DBG_ERROR(GWEN_LOGDOMAIN, "No value in path \"%s\" (%s)", path, GWEN_Buffer_GetStart(tbuf));
493  GWEN_Buffer_free(tbuf);
494 
495  /* GWEN_XMLNode_Dump(ctx->currentDocNode, 2); */
496  return GWEN_ERROR_INVALID;
497  }
498 #endif
499  }
500 
501  return 0;
502 }
503 
504 
505 
506 int _setCharValueByPath(GWEN_XMLNODE *xmlNode, const char *path, const char *value)
507 {
508  const char *s;
509 
510  s=strchr(path, '@');
511  if (s) {
512  int idx;
513  char *cpyOfPath;
514  char *property;
515  GWEN_XMLNODE *n;
516 
517 
518  idx=s-path;
519  cpyOfPath=strdup(path);
520  assert(cpyOfPath);
521  cpyOfPath[idx]=0;
522  property=cpyOfPath+idx+1;
523 
524  if (*cpyOfPath) {
525  n=GWEN_XMLNode_GetNodeByXPath(xmlNode, cpyOfPath, 0);
526  }
527  else
528  n=xmlNode;
529 
530  if (n) {
531  GWEN_XMLNode_SetProperty(n, property, value);
532  free(cpyOfPath);
533  return 0;
534  }
535  else {
536  DBG_ERROR(GWEN_LOGDOMAIN, "Path \"%s\" could not be created", path);
537  free(cpyOfPath);
538  return GWEN_ERROR_GENERIC;
539  }
540  }
541  else {
542  int rv;
543 
544  rv=GWEN_XMLNode_SetCharValueByPath(xmlNode, 0, path, value);
545  if (rv<0) {
546  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
547  return rv;
548  }
549  return 0;
550  }
551 }
552 
553 
554 
555 int _convertAndSetCharValue(GWEN_XMLNODE *xmlDocNode, GWEN_XMLNODE *xmlSchemaNode, const char *value)
556 {
557  if (value && *value) {
558  const char *name;
559  const char *typ;
560  int doTrim=0;
561  GWEN_BUFFER *resultBuf;
562  int rv;
563 
564  doTrim=GWEN_XMLNode_GetIntProperty(xmlSchemaNode, "trim", 0);
565  resultBuf=GWEN_Buffer_new(0, 256, 0, 1);
566 
567  name=GWEN_XMLNode_GetProperty(xmlSchemaNode, "path", NULL);
568  if (!(name && *name)) {
569  DBG_ERROR(GWEN_LOGDOMAIN, "Missing or empty path in \"XmlSetCharValue\"");
570  GWEN_Buffer_free(resultBuf);
571  return GWEN_ERROR_INVALID;
572  }
573 
574  typ=GWEN_XMLNode_GetProperty(xmlSchemaNode, "type", "string");
575  if (!(typ && *typ)) {
576  DBG_ERROR(GWEN_LOGDOMAIN, "Empty type in \"XmlSetCharValue\"");
577  GWEN_Buffer_free(resultBuf);
578  return GWEN_ERROR_INVALID;
579  }
580 
581  if (strcasecmp(typ, "string")==0) {
582  /* escape */
583  GWEN_Text_EscapeXmlToBuffer(value, resultBuf);
584  if (doTrim)
585  GWEN_Text_CondenseBuffer(resultBuf);
586  }
587  else if (strcasecmp(typ, "date")==0) {
588  const char *tmpl;
589  GWEN_DATE *dt=NULL;
590 
591  tmpl=GWEN_XMLNode_GetProperty(xmlSchemaNode, "template", "YYYYMMDD");
592  if (!(tmpl && *tmpl)) {
593  DBG_ERROR(GWEN_LOGDOMAIN, "Empty template in \"SetCharValue\"");
594  GWEN_Buffer_free(resultBuf);
595  return GWEN_ERROR_INVALID;
596  }
597 
598  dt=GWEN_Date_fromString(value);
599  if (dt) {
600  GWEN_Date_toStringWithTemplate(dt, tmpl, resultBuf);
601  GWEN_Date_free(dt);
602  }
603  else {
604  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid date string for [%s] (value=[%s], tmpl=[%s])", name, value, tmpl);
605  }
606  }
607 
608  if (GWEN_Buffer_GetUsedBytes(resultBuf)) {
609  DBG_INFO(GWEN_LOGDOMAIN, "Setting value: %s = %s", name, GWEN_Buffer_GetStart(resultBuf));
610 
611  rv=_setCharValueByPath(xmlDocNode, name, GWEN_Buffer_GetStart(resultBuf));
612  if (rv<0) {
613  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
614  GWEN_Buffer_free(resultBuf);
615  return rv;
616  }
617  }
618  else {
619  DBG_INFO(GWEN_LOGDOMAIN, "Not setting empty value for [%s]", name);
620  }
621  GWEN_Buffer_free(resultBuf);
622  }
623  return 0;
624 }
625 
626 
627 
GWEN_XML2DB_CONTEXT * GWEN_Xml2Db_Context_new(GWEN_XMLNODE *documentRoot, GWEN_DB_NODE *dbRoot)
Definition: xml2db.c:47
int GWEN_DB_ReplaceVars(GWEN_DB_NODE *db, const char *s, GWEN_BUFFER *dbuf)
Definition: db.c:1949
static int _dbIfNotPathExists(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
GWEN_DATE * GWEN_Date_fromString(const char *s)
Definition: gwendate.c:219
void GWEN_Text_CondenseBuffer(GWEN_BUFFER *buf)
Definition: text.c:1620
static int _setCharValueByPath(GWEN_XMLNODE *xmlNode, const char *path, const char *value)
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define GWEN_ERROR_INVALID
Definition: error.h:67
static int _dbEnter(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
void GWEN_Xml2Db_Context_EnterDocNode(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
Definition: xml2db.c:81
#define NULL
Definition: binreloc.c:300
#define GWEN_PATH_FLAGS_CREATE_GROUP
Definition: path.h:96
void GWEN_XMLNode_SetProperty(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:322
int GWEN_Date_toStringWithTemplate(const GWEN_DATE *t, const char *tmpl, GWEN_BUFFER *buf)
Definition: gwendate.c:656
int GWEN_Xml2Db_Context_HandleChildren(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
Definition: xml2db.c:109
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
int GWEN_XmlFromDb(GWEN_XMLNODE *xmlNodeDestination, GWEN_XMLNODE *xmlNodeSchema, GWEN_DB_NODE *dbSource)
Definition: xml2db_fromdb.c:73
static int _dbIfNotHasCharData(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
static int _dbIfHasCharData(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
int GWEN_XMLNode_GetIntProperty(const GWEN_XMLNODE *n, const char *name, int defaultValue)
Definition: xml.c:263
void GWEN_Xml2Db_Context_free(GWEN_XML2DB_CONTEXT *ctx)
Definition: xml2db.c:68
GWEN_XMLNODE * GWEN_XMLNode_GetNextTag(const GWEN_XMLNODE *n)
Definition: xml.c:672
void GWEN_Date_free(GWEN_DATE *gd)
Definition: gwendate.c:237
GWEN_XMLNODE * GWEN_XMLNode_GetNodeByXPath(GWEN_XMLNODE *n, const char *path, uint32_t flags)
Definition: xml.c:1271
#define GWEN_ERROR_GENERIC
Definition: error.h:62
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:969
static int _dbIfCharDataMatches(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
Definition: db.c:1379
int GWEN_Text_EscapeXmlToBuffer(const char *src, GWEN_BUFFER *buf)
Definition: text.c:1978
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
int GWEN_XMLNode_GetXPath(const GWEN_XMLNODE *n1, const GWEN_XMLNODE *n2, GWEN_BUFFER *nbuf)
Definition: xml.c:1057
#define GWEN_PATH_FLAGS_CREATE_VAR
Definition: path.h:103
void GWEN_Xml2Db_Context_LeaveDocNode(GWEN_XML2DB_CONTEXT *ctx)
Definition: xml2db.c:92
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition: xml.c:665
int GWEN_XMLNode_SetCharValueByPath(GWEN_XMLNODE *n, uint32_t flags, const char *name, const char *value)
Definition: xml.c:913
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
Definition: text.c:1208
static int _xmlSetCharValue(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:178
static int _xmlCreateAndEnterElement(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
GWEN_DB_NODE * GWEN_DB_FindFirstGroup(GWEN_DB_NODE *n, const char *name)
Definition: db.c:1838
static int _handleChildren_fromDb(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
Definition: xml2db_fromdb.c:97
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
Definition: path.h:84
GWEN_DB_NODE * GWEN_DB_FindNextGroup(GWEN_DB_NODE *n, const char *name)
Definition: db.c:1859
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:149
static int _convertAndSetCharValue(GWEN_XMLNODE *xmlDocNode, GWEN_XMLNODE *xmlSchemaNode, const char *value)
static int _dbIfNotCharDataMatches(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
static int _dbForEvery(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)
struct GWEN_DATE GWEN_DATE
Definition: gwendate.h:34
static int _dbIfPathExists(GWEN_XML2DB_CONTEXT *ctx, GWEN_XMLNODE *xmlNode)