gwenhywfar  5.10.1
dbio.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Wed Mar 31 2004
3  copyright : (C) 2004-2010 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 #define DISABLE_DEBUGLOG
31 
32 #include "dbio_p.h"
33 #include <gwenhywfar/gwenhywfar.h>
34 #include <gwenhywfar/misc.h>
35 #include <gwenhywfar/debug.h>
36 #include <gwenhywfar/path.h>
37 #include <gwenhywfar/text.h>
38 #include <gwenhywfar/directory.h>
39 #include <gwenhywfar/syncio.h>
40 #include <gwenhywfar/syncio_file.h>
41 #include <gwenhywfar/syncio_memory.h>
42 #include <gwenhywfar/fslock.h>
43 #include <gwenhywfar/pathmanager.h>
44 
45 
46 /* TODO: #include <gwenhywfar/plugin.h> */
47 
48 #include <stdlib.h>
49 #include <assert.h>
50 #include <string.h>
51 #include <errno.h>
52 #include <ctype.h>
53 
54 #include <sys/types.h>
55 #ifdef HAVE_SYS_STAT_H
56 # include <sys/stat.h>
57 #endif
58 #ifdef HAVE_FCNTL_H
59 # include <fcntl.h>
60 #endif
61 #ifdef HAVE_UNISTD_H
62 # include <unistd.h>
63 #endif
64 
65 
66 #ifdef OS_WIN32
67 # define DIRSEP "\\"
68 # include <windows.h>
69 #else
70 # define DIRSEP "/"
71 #endif
72 
73 
74 
77 
78 GWEN_INHERIT(GWEN_PLUGIN, GWEN_DBIO_PLUGIN)
79 
80 
82 {
84  int err;
85  GWEN_STRINGLIST *sl;
86 
89  if (err) {
90  DBG_ERROR(GWEN_LOGDOMAIN, "Could not register DBIO plugin manager");
91  return err;
92  }
93 
94  /* create plugin paths */
96  if (sl) {
98  GWEN_BUFFER *pbuf;
99 
100  pbuf=GWEN_Buffer_new(0, 256, 0, 1);
101 
103  while (se) {
106  DBG_INFO(GWEN_LOGDOMAIN, "Adding plugin path [%s]",
107  GWEN_Buffer_GetStart(pbuf));
109  GWEN_Buffer_GetStart(pbuf));
110  GWEN_Buffer_Reset(pbuf);
112  }
113  GWEN_Buffer_free(pbuf);
115  }
116 
117  return 0;
118 }
119 
120 
121 
123 {
125 
127  if (pm) {
128  int rv;
129 
131  if (rv) {
133  "Could not unregister DBIO plugin manager (%d)", rv);
134  return rv;
135  }
136  else
138  }
139 
140  return 0;
141 }
142 
143 
144 
145 
146 
148  const char *name,
149  const char *fileName)
150 {
151  GWEN_PLUGIN *pl;
152  GWEN_DBIO_PLUGIN *pldbio;
153 
154  pl=GWEN_Plugin_new(pm, name, fileName);
155  GWEN_NEW_OBJECT(GWEN_DBIO_PLUGIN, pldbio);
156  GWEN_INHERIT_SETDATA(GWEN_PLUGIN, GWEN_DBIO_PLUGIN, pl, pldbio,
158 
159  return pl;
160 }
161 
162 
163 
165 {
166  GWEN_DBIO_PLUGIN *pldbio;
167 
168  pldbio=(GWEN_DBIO_PLUGIN *)p;
169  GWEN_FREE_OBJECT(pldbio);
170 }
171 
172 
173 
175 {
176  GWEN_DBIO_PLUGIN *pldbio;
177 
178  assert(pl);
179  pldbio=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_DBIO_PLUGIN, pl);
180  assert(pldbio);
181 
182  assert(pldbio->factoryFn);
183  return pldbio->factoryFn(pl);
184 }
185 
186 
187 
190 {
191  GWEN_DBIO_PLUGIN *pldbio;
192 
193  assert(pl);
194  pldbio=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_DBIO_PLUGIN, pl);
195  assert(pldbio);
196 
197  pldbio->factoryFn=f;
198 }
199 
200 
201 
202 
203 
204 
205 
206 
207 GWEN_DBIO *GWEN_DBIO_new(const char *name, const char *descr)
208 {
209  GWEN_DBIO *dbio;
210 
211  assert(name);
212  GWEN_NEW_OBJECT(GWEN_DBIO, dbio);
213  GWEN_LIST_INIT(GWEN_DBIO, dbio);
215  dbio->name=strdup(name);
216  if (descr)
217  dbio->descr=strdup(descr);
218 
219  dbio->usage=1;
220  return dbio;
221 }
222 
223 
224 
226 {
227  if (dbio) {
228  assert(dbio->usage);
229  if (--(dbio->usage)==0) {
231  GWEN_LIST_FINI(GWEN_DBIO, dbio);
232 
233  free(dbio->name);
234  free(dbio->descr);
235 
236  GWEN_FREE_OBJECT(dbio);
237  }
238  }
239 }
240 
241 
242 
244 {
245  assert(dbio);
246  dbio->usage++;
247 }
248 
249 
250 
252  GWEN_SYNCIO *sio,
253  GWEN_DB_NODE *db,
254  GWEN_DB_NODE *params,
255  uint32_t flags)
256 {
257  assert(dbio);
258  assert(sio);
259  assert(db);
260 
262  DBG_ERROR(GWEN_LOGDOMAIN, "GWEN_SYNCIO %s not connected; did you forget to call GWEN_SyncIo_Connect()?",
264  return -1;
265  }
266 
267  if (dbio->importFn)
268  return dbio->importFn(dbio, sio, db, params, flags);
269  else {
270  DBG_INFO(GWEN_LOGDOMAIN, "No import function set");
271  return -1;
272  }
273 }
274 
275 
276 
278  GWEN_SYNCIO *sio,
279  GWEN_DB_NODE *db,
280  GWEN_DB_NODE *params,
281  uint32_t flags)
282 {
283  assert(dbio);
284  assert(sio);
285  assert(db);
286 
287  if (dbio->exportFn)
288  return dbio->exportFn(dbio, sio, db, params, flags);
289  else {
290  DBG_INFO(GWEN_LOGDOMAIN, "No export function set");
291  return -1;
292  }
293 }
294 
295 
296 
298  const char *fname)
299 {
300  assert(dbio);
301  assert(fname);
302 
303  if (dbio->checkFileFn)
304  return dbio->checkFileFn(dbio, fname);
305  else {
306  DBG_INFO(GWEN_LOGDOMAIN, "No checkFile function set");
308  }
309 }
310 
311 
312 
313 const char *GWEN_DBIO_GetName(const GWEN_DBIO *dbio)
314 {
315  assert(dbio);
316  return dbio->name;
317 }
318 
319 
320 
321 const char *GWEN_DBIO_GetDescription(const GWEN_DBIO *dbio)
322 {
323  assert(dbio);
324  return dbio->descr;
325 }
326 
327 
328 
330 {
331  assert(dbio);
332  dbio->importFn=f;
333 }
334 
335 
336 
338 {
339  assert(dbio);
340  dbio->exportFn=f;
341 }
342 
343 
345 {
346  assert(dbio);
347  dbio->checkFileFn=f;
348 }
349 
350 
351 
352 GWEN_DBIO *GWEN_DBIO_GetPlugin(const char *modname)
353 {
355  GWEN_PLUGIN *pl;
356  GWEN_DBIO *dbio;
357 
359  if (!pm) {
360  DBG_ERROR(GWEN_LOGDOMAIN, "No plugin manager for \"dbio\" found");
361  return 0;
362  }
363 
364  pl=GWEN_PluginManager_GetPlugin(pm, modname);
365  if (!pl) {
366  DBG_INFO(GWEN_LOGDOMAIN, "DBIO-Plugin \"%s\" not found", modname);
367  return 0;
368  }
369 
370  dbio=GWEN_DBIO_Plugin_Factory(pl);
371  if (!dbio) {
373  "Plugin did not create a GWEN_DBIO");
374  }
375  return dbio;
376 }
377 
378 
379 
381  const char *fname,
382  GWEN_DB_NODE *db,
383  GWEN_DB_NODE *params,
384  uint32_t dbflags)
385 {
386  int rv;
387  GWEN_FSLOCK *lck=0;
388  GWEN_SYNCIO *sio;
389 
390  /* if locking requested */
391  if (dbflags & GWEN_DB_FLAGS_LOCKFILE) {
392  GWEN_FSLOCK_RESULT res;
393 
395  assert(lck);
397  if (res!=GWEN_FSLock_ResultOk) {
399  "Could not apply lock to file \"%s\" (%d)",
400  fname, res);
401  GWEN_FSLock_free(lck);
402  return -1;
403  }
404  }
405 
406  /* open file */
408  if (dbflags & GWEN_DB_FLAGS_APPEND_FILE)
415  rv=GWEN_SyncIo_Connect(sio);
416  if (rv<0) {
417  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
418  GWEN_SyncIo_free(sio);
419  if (lck) {
420  GWEN_FSLock_Unlock(lck);
421  GWEN_FSLock_free(lck);
422  }
423  return rv;
424  }
425 
426  rv=GWEN_DBIO_Export(dbio, sio, db, params, dbflags);
427  if (rv<0) {
428  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
430  GWEN_SyncIo_free(sio);
431  if (lck) {
432  GWEN_FSLock_Unlock(lck);
433  GWEN_FSLock_free(lck);
434  }
435  return rv;
436  }
437 
438  rv=GWEN_SyncIo_Disconnect(sio);
439  if (rv<0) {
440  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
441  GWEN_SyncIo_free(sio);
442  if (lck) {
443  GWEN_FSLock_Unlock(lck);
444  GWEN_FSLock_free(lck);
445  }
446  return rv;
447  }
448  GWEN_SyncIo_free(sio);
449 
450  /* remove lock, if any */
451  if (lck) {
452  GWEN_FSLOCK_RESULT res;
453 
454  res=GWEN_FSLock_Unlock(lck);
455  if (res!=GWEN_FSLock_ResultOk) {
457  "Could not remove lock on file \"%s\" (%d)",
458  fname, res);
459  }
460  GWEN_FSLock_free(lck);
461  }
462 
463  return 0;
464 }
465 
466 
467 
469  GWEN_BUFFER *buf,
470  GWEN_DB_NODE *db,
471  GWEN_DB_NODE *params,
472  uint32_t flags)
473 {
474  GWEN_SYNCIO *sio;
475  int rv;
476 
477  /* create SyncIO, don't take over buf */
478  sio=GWEN_SyncIo_Memory_new(buf, 0);
479  rv=GWEN_DBIO_Export(dbio, sio, db, params, flags);
480  if (rv<0) {
481  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
482  GWEN_SyncIo_free(sio);
483  return rv;
484  }
485 
486  GWEN_SyncIo_free(sio);
487  return 0;
488 }
489 
490 
491 
493  const char *fname,
494  GWEN_DB_NODE *db,
495  GWEN_DB_NODE *params,
496  uint32_t dbflags)
497 {
498  GWEN_SYNCIO *sio;
499  int rv;
500  GWEN_FSLOCK *lck=0;
501 
502  /* if locking requested */
503  if (dbflags & GWEN_DB_FLAGS_LOCKFILE) {
504  GWEN_FSLOCK_RESULT res;
505 
507  assert(lck);
509  if (res!=GWEN_FSLock_ResultOk) {
511  "Could not apply lock to file \"%s\" (%d)",
512  fname, res);
513  GWEN_FSLock_free(lck);
514  return GWEN_ERROR_IO;
515  }
516  }
517 
520  rv=GWEN_SyncIo_Connect(sio);
521  if (rv<0) {
522  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
523  GWEN_SyncIo_free(sio);
524  if (lck) {
525  GWEN_FSLock_Unlock(lck);
526  GWEN_FSLock_free(lck);
527  }
528  return rv;
529  }
530 
531  /* read from file */
532  rv=GWEN_DBIO_Import(dbio, sio, db, params, dbflags);
533  if (rv<0) {
534  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
536  GWEN_SyncIo_free(sio);
537  if (lck) {
538  GWEN_FSLock_Unlock(lck);
539  GWEN_FSLock_free(lck);
540  }
541  return rv;
542  }
543 
544  /* close io layer */
546  GWEN_SyncIo_free(sio);
547 
548  /* remove lock, if any */
549  if (lck) {
550  GWEN_FSLOCK_RESULT res;
551 
552  res=GWEN_FSLock_Unlock(lck);
553  if (res!=GWEN_FSLock_ResultOk) {
555  "Could not remove lock on file \"%s\" (%d)",
556  fname, res);
557  }
558  GWEN_FSLock_free(lck);
559  }
560 
561  return 0;
562 }
563 
564 
565 
566 
567 
568 
569 
570 
571 
572 
573 
574 
575 
576 
GWENHYWFAR_API void GWEN_FSLock_free(GWEN_FSLOCK *fl)
struct GWEN_PLUGIN_MANAGER GWEN_PLUGIN_MANAGER
Definition: plugin.h:40
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:53
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition: syncio.c:97
int GWEN_DBIO_ModuleFini(void)
Definition: dbio.c:122
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:207
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
Definition: syncio_file.h:54
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition: syncio_file.h:53
void GWEN_DBIO_Attach(GWEN_DBIO *dbio)
Definition: dbio.c:243
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
void GWEN_PluginManager_free(GWEN_PLUGIN_MANAGER *pm)
Definition: plugin.c:200
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
Definition: syncio_file.h:58
int(* GWEN_DBIO_EXPORTFN)(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t flags)
Definition: dbio_be.h:46
void GWEN_DBIO_SetCheckFileFn(GWEN_DBIO *dbio, GWEN_DBIO_CHECKFILEFN f)
Definition: dbio.c:344
#define GWEN_DBIO_FOLDER
Definition: dbio.h:56
#define DBG_WARN(dbg_logger, format, args...)
Definition: debug.h:125
GWEN_PLUGIN * GWEN_PluginManager_GetPlugin(GWEN_PLUGIN_MANAGER *pm, const char *s)
Definition: plugin.c:529
#define GWEN_LOGDOMAIN
Definition: logger.h:35
void GWEN_DBIO_SetImportFn(GWEN_DBIO *dbio, GWEN_DBIO_IMPORTFN f)
Definition: dbio.c:329
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
GWEN_PLUGIN_MANAGER * GWEN_PluginManager_FindPluginManager(const char *s)
Definition: plugin.c:548
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:390
#define GWEN_ERROR_IO
Definition: error.h:123
int(* GWEN_DBIO_IMPORTFN)(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t flags)
Definition: dbio_be.h:40
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
#define GWEN_DB_DEFAULT_LOCK_TIMEOUT
Definition: db.h:218
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:406
int GWEN_DBIO_Export(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t flags)
Definition: dbio.c:277
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
GWENHYWFAR_API GWEN_FSLOCK * GWEN_FSLock_new(const char *fname, GWEN_FSLOCK_TYPE t)
GWEN_SYNCIO * GWEN_SyncIo_Memory_new(GWEN_BUFFER *buffer, int take)
Definition: syncio_memory.c:50
int GWEN_DBIO_Import(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t flags)
Definition: dbio.c:251
#define GWENHYWFAR_CB
Definition: gwenhywfarapi.h:89
GWEN_PLUGIN_MANAGER * GWEN_PluginManager_new(const char *name, const char *destLib)
Definition: plugin.c:180
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:56
const char * GWEN_DBIO_GetDescription(const GWEN_DBIO *dbio)
Definition: dbio.c:321
void GWENHYWFAR_CB GWEN_DBIO_Plugin_FreeData(GWEN_UNUSED void *bp, void *p)
Definition: dbio.c:164
GWEN_SYNCIO_STATUS GWEN_SyncIo_GetStatus(const GWEN_SYNCIO *sio)
Definition: syncio.c:197
GWEN_FSLOCK_RESULT
Definition: fslock.h:71
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
Definition: syncio_file.h:59
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
int GWEN_PluginManager_Register(GWEN_PLUGIN_MANAGER *pm)
Definition: plugin.c:564
GWENHYWFAR_API GWEN_FSLOCK_RESULT GWEN_FSLock_Lock(GWEN_FSLOCK *fl, int timeout, uint32_t gid)
int GWEN_DBIO_ImportFromFile(GWEN_DBIO *dbio, const char *fname, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t dbflags)
Definition: dbio.c:492
#define GWEN_DB_FLAGS_APPEND_FILE
Definition: db.h:147
GWEN_STRINGLIST * GWEN_PathManager_GetPaths(const char *destLib, const char *pathName)
Definition: pathmanager.c:494
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
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:78
void GWEN_DBIO_free(GWEN_DBIO *dbio)
Definition: dbio.c:225
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition: syncio.c:179
#define DIRSEP
Definition: dbio.c:70
void GWEN_DBIO_Plugin_SetFactoryFn(GWEN_PLUGIN *pl, GWEN_DBIO_PLUGIN_FACTORYFN f)
Definition: dbio.c:188
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
struct GWEN_DBIO GWEN_DBIO
Definition: dbio.h:43
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:109
void GWEN_DBIO_SetExportFn(GWEN_DBIO *dbio, GWEN_DBIO_EXPORTFN f)
Definition: dbio.c:337
int GWEN_DBIO_ModuleInit(void)
Definition: dbio.c:81
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:398
#define GWEN_DB_FLAGS_LOCKFILE
Definition: db.h:155
GWEN_DBIO_CHECKFILE_RESULT
Definition: dbio.h:79
#define GWEN_PM_PLUGINDIR
Definition: gwenhywfar.h:53
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
GWEN_DBIO_CHECKFILE_RESULT(* GWEN_DBIO_CHECKFILEFN)(GWEN_DBIO *dbio, const char *fname)
Definition: dbio_be.h:52
#define GWEN_PM_LIBNAME
Definition: gwenhywfar.h:42
const char * GWEN_SyncIo_GetTypeName(const GWEN_SYNCIO *sio)
Definition: syncio.c:215
#define GWEN_LIST_INIT(t, element)
Definition: list1.h:465
const char * GWEN_DBIO_GetName(const GWEN_DBIO *dbio)
Definition: dbio.c:313
struct GWEN_FSLOCK GWEN_FSLOCK
Definition: fslock.h:59
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
int GWEN_PluginManager_Unregister(GWEN_PLUGIN_MANAGER *pm)
Definition: plugin.c:595
int GWEN_PluginManager_AddPath(GWEN_PLUGIN_MANAGER *pm, const char *callingLib, const char *s)
Definition: plugin.c:223
#define GWEN_INHERIT(bt, t)
Definition: inherit.h:264
GWEN_DBIO *(* GWEN_DBIO_PLUGIN_FACTORYFN)(GWEN_PLUGIN *pl)
Definition: dbio.h:92
#define GWEN_LIST_FUNCTIONS(t, pr)
Definition: list1.h:366
GWENHYWFAR_API GWEN_FSLOCK_RESULT GWEN_FSLock_Unlock(GWEN_FSLOCK *fl)
GWEN_DBIO_CHECKFILE_RESULT GWEN_DBIO_CheckFile(GWEN_DBIO *dbio, const char *fname)
Definition: dbio.c:297
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
Definition: inherit.h:292
int GWEN_DBIO_ExportToFile(GWEN_DBIO *dbio, const char *fname, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t dbflags)
Definition: dbio.c:380
GWEN_DBIO * GWEN_DBIO_GetPlugin(const char *modname)
Definition: dbio.c:352
#define GWEN_LIST_FINI(t, element)
Definition: list1.h:474
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
int GWEN_DBIO_ExportToBuffer(GWEN_DBIO *dbio, GWEN_BUFFER *buf, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t flags)
Definition: dbio.c:468
GWEN_DBIO * GWEN_DBIO_Plugin_Factory(GWEN_PLUGIN *pl)
Definition: dbio.c:174
GWEN_PLUGIN * GWEN_Plugin_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName)
Definition: plugin.c:81
#define GWEN_UNUSED
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
#define GWEN_SYNCIO_FILE_FLAGS_APPEND
Definition: syncio_file.h:55
#define GWEN_INHERIT_GETDATA(bt, t, element)
Definition: inherit.h:271
GWEN_PLUGIN * GWEN_DBIO_Plugin_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName)
Definition: dbio.c:147