gwenhywfar  4.99.8beta
xmldb.c
Go to the documentation of this file.
1 /***************************************************************************
2  $RCSfile$
3  -------------------
4  cvs : $Id: xmldb.c 1020 2006-03-26 17:16:05Z aquamaniac $
5  begin : Thu Oct 30 2003
6  copyright : (C) 2003 by Martin Preuss
7  email : martin@libchipcard.de
8 
9  ***************************************************************************
10  * *
11  * This library is free software; you can redistribute it and/or *
12  * modify it under the terms of the GNU Lesser General Public *
13  * License as published by the Free Software Foundation; either *
14  * version 2.1 of the License, or (at your option) any later version. *
15  * *
16  * This library is distributed in the hope that it will be useful, *
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
19  * Lesser General Public License for more details. *
20  * *
21  * You should have received a copy of the GNU Lesser General Public *
22  * License along with this library; if not, write to the Free Software *
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
24  * MA 02111-1307 USA *
25  * *
26  ***************************************************************************/
27 
28 
29 #ifdef HAVE_CONFIG_H
30 # include <config.h>
31 #endif
32 
33 #include "xmldb_p.h"
34 #include <gwenhywfar/text.h>
35 #include <gwenhywfar/debug.h>
36 #include <gwenhywfar/stringlist.h>
37 #include <gwenhywfar/xml.h>
38 #include <gwenhywfar/dbio_be.h>
39 #include <gwenhywfar/syncio_file.h>
40 
41 #include <stdlib.h>
42 #include <string.h>
43 #include <assert.h>
44 #include <sys/types.h>
45 #include <sys/stat.h>
46 #include <fcntl.h>
47 #include <string.h>
48 #include <errno.h>
49 
50 
51 
52 
53 
54 
56  uint32_t flags,
57  GWEN_DB_NODE *data,
58  GWEN_DB_NODE *cfg,
59  GWEN_XMLNODE *node) {
60  GWEN_XMLNODE *n;
61 
62  assert(node);
64  while(n) {
65  const char *tname;
66  const char *s;
67 
68  tname=GWEN_XMLNode_GetData(n);
69  assert(tname && *tname);
70  s=GWEN_XMLNode_GetProperty(n, "type", 0);
71  if (s) {
72  if (strcasecmp(s, "group")==0) {
73  GWEN_DB_NODE *db;
74  int rv;
75 
76  db=GWEN_DB_GetGroup(data, flags, tname);
77  if (db==0) {
78  DBG_INFO(GWEN_LOGDOMAIN, "here");
79  return GWEN_ERROR_INVALID;
80  }
81  rv=GWEN_DBIO__XmlDb_ImportGroup(dbio, flags, db, cfg, n);
82  if (rv) {
83  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
84  return rv;
85  }
86  }
87  else if (strcasecmp(s, "var")==0) {
88  int rv;
89 
90  rv=GWEN_DBIO__XmlDb_ImportVar(dbio, flags, data, cfg, n);
91  if (rv) {
92  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
93  return rv;
94  }
95  }
96  else {
97  DBG_ERROR(GWEN_LOGDOMAIN, "Unexpected type \"%s\"", s);
98  return GWEN_ERROR_INVALID;
99  }
100  }
101 
103  }
104 
105  return 0;
106 }
107 
108 
109 
111  GWEN_XMLNODE *ndata;
112  GWEN_BUFFER *tbuf;
113  int rv;
114 
115  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
116  ndata=GWEN_XMLNode_GetFirstData(node);
117  while(ndata) {
118  const char *s;
119 
120  s=GWEN_XMLNode_GetData(ndata);
121  if (s) {
122  if (GWEN_Buffer_GetUsedBytes(tbuf))
123  GWEN_Buffer_AppendByte(tbuf, ' ');
124  GWEN_Buffer_AppendString(tbuf, s);
125  }
126  ndata=GWEN_XMLNode_GetNextData(node);
127  }
129  if (rv<0) {
130  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
131  }
132  GWEN_Buffer_free(tbuf);
133 }
134 
135 
136 
138  uint32_t flags,
139  GWEN_DB_NODE *data,
140  GWEN_DB_NODE *cfg,
141  GWEN_XMLNODE *node) {
142  GWEN_XMLNODE *n;
143  const char *vname;
144  GWEN_BUFFER *tbuf;
145 
146  assert(node);
147  vname=GWEN_XMLNode_GetData(node);
148  assert(vname && *vname);
149  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
150  n=GWEN_XMLNode_FindFirstTag(node, "value", 0, 0);
151  while(n) {
152  const char *s;
153  const char *d;
154  int rv;
155 
157  d=GWEN_Buffer_GetStart(tbuf);
158  if (*d) {
160  assert(s && *s);
161  s=GWEN_XMLNode_GetProperty(n, "type", 0);
162  if (s) {
163  if (strcasecmp(s, "char")==0) {
164  rv=GWEN_DB_SetCharValue(data, flags, vname, d);
165  if (rv) {
166  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
167  GWEN_Buffer_free(tbuf);
168  return rv;
169  }
170  }
171  else if (strcasecmp(s, "int")==0) {
172  int val;
173 
174  if (1!=sscanf(d, "%i", &val)) {
175  DBG_INFO(GWEN_LOGDOMAIN, "Non-integer value [%s]", d);
176  GWEN_Buffer_free(tbuf);
177  return GWEN_ERROR_INVALID;
178  }
179  rv=GWEN_DB_SetIntValue(data, flags, vname, val);
180  if (rv) {
181  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
182  GWEN_Buffer_free(tbuf);
183  return rv;
184  }
185  }
186  else if (strcasecmp(s, "bin")==0) {
187  GWEN_BUFFER *xbuf;
188 
189  xbuf=GWEN_Buffer_new(0, 256, 0, 1);
190  rv=GWEN_Text_FromHexBuffer(d, xbuf);
191  if (rv) {
192  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
193  GWEN_Buffer_free(xbuf);
194  GWEN_Buffer_free(tbuf);
195  return rv;
196  }
197 
198  rv=GWEN_DB_SetBinValue(data, flags, vname,
199  GWEN_Buffer_GetStart(xbuf),
201  GWEN_Buffer_free(xbuf);
202  if (rv) {
203  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
204  GWEN_Buffer_free(tbuf);
205  return rv;
206  }
207  }
208  else {
210  "Unhandled value type \"%s\"", s);
211  GWEN_Buffer_free(tbuf);
212  return GWEN_ERROR_INVALID;
213  }
214  }
215  }
216  else {
217  DBG_DEBUG(GWEN_LOGDOMAIN, "Empty value");
218  }
219  GWEN_Buffer_Reset(tbuf);
220 
221  n=GWEN_XMLNode_FindNextTag(n, "value", 0, 0);
222  }
223  GWEN_Buffer_free(tbuf);
224 
225  return 0;
226 }
227 
228 
229 
230 
232  GWEN_SYNCIO *sio,
233  GWEN_DB_NODE *data,
234  GWEN_DB_NODE *cfg,
235  uint32_t flags) {
236  int rv;
237  GWEN_XMLNODE *root;
238  GWEN_XMLNODE *n;
239  const char *rootName=0;
240  GWEN_XML_CONTEXT *ctx;
241 
242  assert(data);
243 
244  if (cfg)
245  rootName=GWEN_DB_GetCharValue(cfg, "rootElement", 0, 0);
246 
248  ctx=GWEN_XmlCtxStore_new(root,
251  rv=GWEN_XMLContext_ReadFromIo(ctx, sio);
252  if (rv) {
253  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
254  GWEN_XmlCtx_free(ctx);
255  GWEN_XMLNode_free(root);
256  return rv;
257  }
258  GWEN_XmlCtx_free(ctx);
259 
260  if (rootName) {
261  n=GWEN_XMLNode_FindFirstTag(root, rootName, 0, 0);
262  if (!n) {
264  "Root node in XML file is not \"%s\"", rootName);
265  GWEN_XMLNode_free(root);
266  return GWEN_ERROR_BAD_DATA;
267  }
268  }
269  else {
270  n=GWEN_XMLNode_GetFirstTag(root);
271  if (!n) {
273  "No root node in XML file");
274  GWEN_XMLNode_free(root);
275  return GWEN_ERROR_BAD_DATA;
276  }
277  }
278 
279  rv=GWEN_DBIO__XmlDb_ImportGroup(dbio, flags, data, cfg, n);
280  if (rv) {
281  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
282  GWEN_XMLNode_free(root);
283  return rv;
284  }
285 
286  GWEN_XMLNode_free(root);
287  return 0;
288 }
289 
290 
291 
293  GWEN_DB_NODE *data,
294  GWEN_XMLNODE *node,
295  const char *newName) {
296  const char *s;
297  GWEN_XMLNODE *n;
298  GWEN_DB_NODE *dbT;
299  int rv;
300 
301  if (newName)
302  s=newName;
303  else
304  s=GWEN_DB_GroupName(data);
305  assert(s && *s);
306 
308  GWEN_XMLNode_SetProperty(n, "type", "group");
309  GWEN_XMLNode_AddChild(node, n);
310 
311  /* store variables */
312  dbT=GWEN_DB_GetFirstVar(data);
313  while(dbT) {
315  rv=GWEN_DBIO_XmlDb__ExportVar(dbio, dbT, n);
316  if (rv) {
317  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
318  return rv;
319  }
320  }
321  dbT=GWEN_DB_GetNextVar(dbT);
322  }
323 
324  /* store groups */
325  dbT=GWEN_DB_GetFirstGroup(data);
326  while(dbT) {
328  rv=GWEN_DBIO_XmlDb__ExportGroup(dbio, dbT, n, 0);
329  if (rv) {
330  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
331  return rv;
332  }
333  }
334  dbT=GWEN_DB_GetNextGroup(dbT);
335  }
336 
337  return 0;
338 }
339 
340 
341 
343  GWEN_DB_NODE *data,
344  GWEN_XMLNODE *node) {
345  const char *s;
346  GWEN_XMLNODE *n;
347  GWEN_DB_NODE *dbT;
348  int rv;
349 
350  s=GWEN_DB_VariableName(data);
351  assert(s && *s);
352 
354  GWEN_XMLNode_SetProperty(n, "type", "var");
355  GWEN_XMLNode_AddChild(node, n);
356 
357  /* store variables */
358  dbT=GWEN_DB_GetFirstValue(data);
359  while(dbT) {
362  GWEN_XMLNODE *vn;
363 
364  vt=GWEN_DB_GetValueType(dbT);
365  switch(vt) {
366 
369  if (s && *s) {
370  GWEN_XMLNODE *dn;
371  GWEN_BUFFER *tbuf;
372 
374  GWEN_XMLNode_SetProperty(vn, "type", "char");
375  GWEN_XMLNode_AddChild(n, vn);
376 
377  tbuf=GWEN_Buffer_new(0, 64, 0, 1);
378  rv=GWEN_Text_EscapeXmlToBuffer(s, tbuf);
379  if (rv<0) {
380  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
381  GWEN_Buffer_free(tbuf);
382  return rv;
383  }
385  GWEN_Buffer_free(tbuf);
386  GWEN_XMLNode_AddChild(vn, dn);
387  }
388  break;
389 
391  char nbuf[32];
392  GWEN_XMLNODE *dn;
393 
394  snprintf(nbuf, sizeof(nbuf), "%i", GWEN_DB_GetIntValueFromNode(dbT));
395 
397  GWEN_XMLNode_SetProperty(vn, "type", "int");
398  GWEN_XMLNode_AddChild(n, vn);
399 
401  GWEN_XMLNode_AddChild(vn, dn);
402 
403  break;
404  }
405 
407  const void *vp;
408  unsigned int vsize;
409 
410  vp=GWEN_DB_GetBinValueFromNode(dbT, &vsize);
411  if (vp && vsize) {
412  GWEN_BUFFER *bbuf;
413  GWEN_XMLNODE *dn;
414 
415  bbuf=GWEN_Buffer_new(0, vsize*2, 0, 1);
416  rv=GWEN_Text_ToHexBuffer((const char*)vp,
417  vsize,
418  bbuf,
419  0, 0, 0);
420  if (rv) {
421  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
422  GWEN_Buffer_free(bbuf);
423  return rv;
424  }
425 
427  GWEN_XMLNode_SetProperty(vn, "type", "bin");
428  GWEN_XMLNode_AddChild(n, vn);
429 
431  GWEN_Buffer_GetStart(bbuf));
432  GWEN_Buffer_free(bbuf);
433  GWEN_XMLNode_AddChild(vn, dn);
434  }
435 
436  break;
437  }
438 
440  DBG_DEBUG(GWEN_LOGDOMAIN, "Not storing pointer value");
441  break;
442 
443  default:
445  "Unsupported variable type %d",
446  vt);
447  return GWEN_ERROR_INVALID;
448  }
449  } /* if non-volatile */
450 
451  dbT=GWEN_DB_GetNextValue(dbT);
452  }
453 
454  return 0;
455 }
456 
457 
458 
460  GWEN_SYNCIO *sio,
461  GWEN_DB_NODE *data,
462  GWEN_DB_NODE *cfg,
463  uint32_t flags) {
464  GWEN_XMLNODE *root;
465  GWEN_XMLNODE *nh;
466  int rv;
467  const char *rootName=0;
468  GWEN_XML_CONTEXT *ctx;
469 
470  if (cfg)
471  rootName=GWEN_DB_GetCharValue(cfg, "rootElement", 0, 0);
472 
475  GWEN_XMLNode_SetProperty(nh, "version", "1.0");
476  GWEN_XMLNode_SetProperty(nh, "encoding", "utf-8");
477  GWEN_XMLNode_AddHeader(root, nh);
478 
479  rv=GWEN_DBIO_XmlDb__ExportGroup(dbio, data, root, rootName);
480  if (rv) {
481  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
482  GWEN_XMLNode_free(root);
483  return rv;
484  }
485 
486 
487  ctx=GWEN_XmlCtxStore_new(root,
491 
492  rv=GWEN_XMLNode_WriteToStream(root, ctx, sio);
493  if (rv) {
494  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
495  GWEN_XmlCtx_free(ctx);
496  GWEN_XMLNode_free(root);
497  return rv;
498  }
499  GWEN_XmlCtx_free(ctx);
500  GWEN_XMLNode_free(root);
501 
502  return 0;
503 }
504 
505 
506 
508  const char *fname){
509  GWEN_SYNCIO *sio;
510  int rv;
511  uint8_t tbuf[256];
512 
513  assert(dbio);
514  assert(fname);
515 
518  rv=GWEN_SyncIo_Connect(sio);
519  if (rv<0) {
520  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
521  GWEN_SyncIo_free(sio);
523  }
524 
525 
526  rv=GWEN_SyncIo_Read(sio, tbuf, sizeof(tbuf)-1);
527  if (rv<1) {
529  "File \"%s\" is not supported by this plugin",
530  fname);
532  GWEN_SyncIo_free(sio);
534  }
535  tbuf[rv-1]=0;
536  if (-1!=GWEN_Text_ComparePattern((const char*) tbuf, "*<?xml*", 0)) {
537  /* match */
539  "File \"%s\" is supported by this plugin",
540  fname);
542  GWEN_SyncIo_free(sio);
543  /* don't be too sure about this, we *may* support the file,
544  * so we dont say we don't support this file */
546  }
548  GWEN_SyncIo_free(sio);
550 }
551 
552 
553 
555  GWEN_DBIO *dbio;
556 
557  dbio=GWEN_DBIO_new("XmlDb", "Imports and exports XML data");
561  return dbio;
562 }
563 
564 
565 
567  const char *modName,
568  const char *fileName) {
569  GWEN_PLUGIN *pl;
570 
571  pl=GWEN_DBIO_Plugin_new(pm, modName, fileName);
572  assert(pl);
573 
575 
576  return pl;
577 
578 }
579 
580 
581 
struct GWEN_PLUGIN_MANAGER GWEN_PLUGIN_MANAGER
Definition: plugin.h:40
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:223
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition: syncio.c:94
void GWEN_XMLNode_AddHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
Definition: xml.c:1230
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
struct GWEN_PLUGIN GWEN_PLUGIN
Definition: plugin.h:39
GWEN_DBIO * GWEN_DBIO_new(const char *name, const char *descr)
Definition: dbio.c:201
#define GWEN_XML_FLAGS_DEFAULT
Definition: xml.h:110
#define GWEN_ERROR_INVALID
Definition: error.h:67
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:266
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition: syncio_file.h:53
#define GWEN_XML_FLAGS_SIMPLE
Definition: xml.h:89
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:228
GWEN_XMLNODE * GWEN_XMLNode_GetNextData(const GWEN_XMLNODE *n)
Definition: xml.c:652
int GWEN_DBIO__XmlDb_ImportVar(GWEN_DBIO *dbio, uint32_t flags, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, GWEN_XMLNODE *node)
Definition: xmldb.c:137
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:712
int GWEN_SyncIo_Read(GWEN_SYNCIO *sio, uint8_t *buffer, uint32_t size)
Definition: syncio.c:127
GWEN_XMLNODE * GWEN_XMLNode_GetFirstData(const GWEN_XMLNODE *n)
Definition: xml.c:646
uint32_t GWEN_DB_GetNodeFlags(const GWEN_DB_NODE *n)
Definition: db.c:1627
void GWEN_XMLNode_SetProperty(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:308
void GWEN_DBIO_SetCheckFileFn(GWEN_DBIO *dbio, GWEN_DBIO_CHECKFILEFN f)
Definition: dbio.c:327
GWEN_DB_NODE * GWEN_DB_GetNextValue(GWEN_DB_NODE *n)
Definition: db.c:482
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWENHYWFAR_API int GWEN_XMLNode_WriteToStream(const GWEN_XMLNODE *n, GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *sio)
Definition: xmlrw.c:220
void GWEN_DBIO_SetImportFn(GWEN_DBIO *dbio, GWEN_DBIO_IMPORTFN f)
Definition: dbio.c:314
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:137
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:38
GWEN_DBIO * GWEN_DBIO_XmlDb_Factory(GWEN_PLUGIN *pl)
Definition: xmldb.c:554
GWEN_DBIO_CHECKFILE_RESULT GWEN_DBIO_XmlDb_CheckFile(GWEN_DBIO *dbio, const char *fname)
Definition: xmldb.c:507
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:684
int GWEN_DBIO_XmlDb__ExportGroup(GWEN_DBIO *dbio, GWEN_DB_NODE *data, GWEN_XMLNODE *node, const char *newName)
Definition: xmldb.c:292
void GWEN_XmlCtx_free(GWEN_XML_CONTEXT *ctx)
Definition: xmlctx.c:66
#define GWEN_ERROR_BAD_DATA
Definition: error.h:121
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:695
GWEN_DB_NODE * GWEN_DB_GetFirstVar(GWEN_DB_NODE *n)
Definition: db.c:423
int GWEN_DB_SetBinValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const void *val, unsigned int valSize)
Definition: db.c:1151
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:192
const char * GWEN_DB_GroupName(GWEN_DB_NODE *n)
Definition: db.c:1286
GWEN_XMLNODE * GWEN_XMLNode_GetNextTag(const GWEN_XMLNODE *n)
Definition: xml.c:635
GWEN_DB_NODE * GWEN_DB_GetNextGroup(GWEN_DB_NODE *n)
Definition: db.c:406
const void * GWEN_DB_GetBinValueFromNode(const GWEN_DB_NODE *n, unsigned int *size)
Definition: db.c:570
GWEN_XML_CONTEXT * GWEN_XmlCtxStore_new(GWEN_XMLNODE *n, uint32_t flags)
Definition: xmlctx.c:318
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:380
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:897
const char * GWEN_DB_VariableName(GWEN_DB_NODE *n)
Definition: db.c:1776
int GWEN_Text_UnescapeXmlToBuffer(const char *src, GWEN_BUFFER *buf)
Definition: text.c:1794
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
Definition: db.c:1260
void GWEN_DBIO__XmlDb_ReadDataTags(GWEN_XMLNODE *node, GWEN_BUFFER *buf)
Definition: xmldb.c:110
int GWEN_Text_EscapeXmlToBuffer(const char *src, GWEN_BUFFER *buf)
Definition: text.c:1915
GWEN_PLUGIN * dbio_xmldb_factory(GWEN_PLUGIN_MANAGER *pm, const char *modName, const char *fileName)
Definition: xmldb.c:566
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:83
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:152
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:41
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:76
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition: syncio.c:169
int GWEN_DBIO_XmlDb_Export(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags)
Definition: xmldb.c:459
void GWEN_DBIO_Plugin_SetFactoryFn(GWEN_PLUGIN *pl, GWEN_DBIO_PLUGIN_FACTORYFN f)
Definition: dbio.c:183
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition: xml.c:629
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:351
struct GWEN_DBIO GWEN_DBIO
Definition: dbio.h:43
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:105
GWENHYWFAR_API int GWEN_XMLContext_ReadFromIo(GWEN_XML_CONTEXT *ctx, GWEN_SYNCIO *io)
Definition: xmlrw.c:882
void GWEN_DBIO_SetExportFn(GWEN_DBIO *dbio, GWEN_DBIO_EXPORTFN f)
Definition: dbio.c:321
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
Definition: text.c:1162
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:922
int GWEN_DBIO_XmlDb__ExportVar(GWEN_DBIO *dbio, GWEN_DB_NODE *data, GWEN_XMLNODE *node)
Definition: xmldb.c:342
GWEN_DB_NODE * GWEN_DB_GetFirstValue(GWEN_DB_NODE *n)
Definition: db.c:460
GWEN_DBIO_CHECKFILE_RESULT
Definition: dbio.h:79
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:164
GWEN_DB_NODE * GWEN_DB_GetNextVar(GWEN_DB_NODE *n)
Definition: db.c:443
#define GWEN_DB_NODE_FLAGS_VOLATILE
Definition: db.h:209
GWEN_DB_NODE_TYPE
Definition: db.h:233
#define GWEN_XML_FLAGS_HANDLE_HEADERS
Definition: xml.h:94
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
GWEN_DB_NODE * GWEN_DB_GetFirstGroup(GWEN_DB_NODE *n)
Definition: db.c:386
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1086
int GWEN_DBIO__XmlDb_ImportGroup(GWEN_DBIO *dbio, uint32_t flags, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, GWEN_XMLNODE *node)
Definition: xmldb.c:55
int GWEN_DB_GetIntValueFromNode(const GWEN_DB_NODE *n)
Definition: db.c:544
int GWEN_Text_FromHexBuffer(const char *src, GWEN_BUFFER *buf)
Definition: text.c:858
int GWEN_DBIO_XmlDb_Import(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags)
Definition: xmldb.c:231
int GWEN_Text_ToHexBuffer(const char *src, unsigned l, GWEN_BUFFER *buf, unsigned int groupsize, char delimiter, int skipLeadingZeroes)
Definition: text.c:740
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:148
struct GWEN_XML_CONTEXT GWEN_XML_CONTEXT
Definition: xmlctx.h:39
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:1014
GWEN_DB_NODE_TYPE GWEN_DB_GetValueType(GWEN_DB_NODE *n)
Definition: db.c:503
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:398
GWEN_PLUGIN * GWEN_DBIO_Plugin_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName)
Definition: dbio.c:145
const char * GWEN_DB_GetCharValueFromNode(const GWEN_DB_NODE *n)
Definition: db.c:517