31 #define DISABLE_DEBUGLOG 33 #include <gwenhywfar/text.h> 34 #include <gwenhywfar/debug.h> 35 #include <gwenhywfar/stringlist.h> 36 #include <gwenhywfar/dbio_be.h> 37 #include <gwenhywfar/syncio_file.h> 42 #include <sys/types.h> 70 static int _getNameAndIndex(
const char *name,
char *buffer,
unsigned int size);
110 const char *groupName;
126 DBG_ERROR(0,
"Error in configuration: No columns specified");
131 if (strcasecmp(p,
"TAB")==0)
133 else if (strcasecmp(p,
"SPACE")==0)
143 for (column=1; ; column++) {
166 DBG_INFO(0,
"Error in configuration: Bad name for column %d",
175 if (strlen(namebuffer)+strlen(numbuffer)+1>=
sizeof(namebuffer)) {
176 DBG_ERROR(0,
"Internal: namebuffer too small");
180 strcat(namebuffer, numbuffer);
230 for (column=1; ; column++) {
271 snprintf(valbuffer,
sizeof(valbuffer),
"%d", iv);
342 const char *groupName;
363 DBG_ERROR(0,
"Error in configuration: No columns specified");
368 if (strcasecmp(p,
"TAB")==0)
370 else if (strcasecmp(p,
"SPACE")==0)
374 delimiters[0]=delimiter;
408 if (lines<ignoreLines) {
481 "Found %d columns, file might be supported", i);
490 "Found no columns, file might not be supported");
504 unsigned int llength;
523 t=(
char *)malloc(w+1);
529 for (j=w-1; j>=0; j--) {
530 if ((
unsigned char)(t[j])>32) {
567 snprintf(nbuff,
sizeof(nbuff)-1,
"%i", col);
568 nbuff[
sizeof(nbuff)-1]=0;
576 bracket=strchr(vcol,
'[');
594 const char *delimiter;
621 const char *delimiters=
";\t,";
660 if (strchr(delimiters, *s))
680 while (name[i] && name[i]!=
'[' && i<size) {
686 DBG_INFO(0,
"Name too long (%d>=%d)", i, size);
698 while (name[i] && name[i]!=
']' && j<
sizeof(numbuffer)) {
699 numbuffer[j]=name[i];
703 if (j>=
sizeof(numbuffer)) {
704 DBG_INFO(0,
"Index number too long (%u>=%d)", j,
705 (
int)(
sizeof(numbuffer)));
GWEN_STRINGLIST * GWEN_StringList_fromString2(const char *str, const char *delimiters, int checkDouble, uint32_t flags)
struct GWEN_PLUGIN_MANAGER GWEN_PLUGIN_MANAGER
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
#define GWEN_TEXT_FLAGS_DEL_TRAILING_BLANKS
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
struct GWEN_DB_NODE GWEN_DB_NODE
struct GWEN_PLUGIN GWEN_PLUGIN
GWEN_DBIO * GWEN_DBIO_new(const char *name, const char *descr)
#define GWEN_ERROR_INVALID
#define GWEN_SYNCIO_FILE_FLAGS_READ
int GWEN_FastBuffer_ReadLineToBuffer(GWEN_FAST_BUFFER *fb, GWEN_BUFFER *buf)
#define DBG_VERBOUS(dbg_logger, format, args...)
void GWEN_DBIO_SetCheckFileFn(GWEN_DBIO *dbio, GWEN_DBIO_CHECKFILEFN f)
static GWEN_DBIO * _csvFactory(GWEN_PLUGIN *pl)
static int _getNameAndIndex(const char *name, char *buffer, unsigned int size)
void GWEN_FastBuffer_free(GWEN_FAST_BUFFER *fb)
#define DBG_ERROR_ERR(dbg_logger, dbg_err)
static void _stringListToDb(GWEN_STRINGLIST *sl, GWEN_DB_NODE *colgr, GWEN_DB_NODE *dbData)
void GWEN_DBIO_SetImportFn(GWEN_DBIO *dbio, GWEN_DBIO_IMPORTFN f)
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
#define GWEN_FASTBUFFER_FLUSH(fb, var)
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
static GWEN_STRINGLIST * _splitFixedWithStringIntoStringlist(const char *s, int condense, GWEN_DB_NODE *cfg)
static int _csvExport(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags)
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
int GWEN_DB_AddGroup(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
struct GWEN_SYNCIO GWEN_SYNCIO
#define GWEN_TEXT_FLAGS_NULL_IS_DELIMITER
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
#define DBG_DEBUG(dbg_logger, format, args...)
const char * GWEN_DB_GroupName(GWEN_DB_NODE *n)
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
#define GWEN_ERROR_GENERIC
GWEN_DB_NODE * GWEN_DB_GetNextGroup(GWEN_DB_NODE *n)
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
int GWEN_DB_VariableExists(GWEN_DB_NODE *n, const char *path)
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
int GWEN_Text_NumToString(int num, char *buffer, unsigned int bufsize, int fillchar)
#define GWENHYWFAR_EXPORT
unsigned int GWEN_StringList_Count(const GWEN_STRINGLIST *sl)
void GWEN_DBIO_Plugin_SetFactoryFn(GWEN_PLUGIN *pl, GWEN_DBIO_PLUGIN_FACTORYFN f)
#define DBG_ERROR(dbg_logger, format, args...)
struct GWEN_DBIO GWEN_DBIO
#define GWEN_FASTBUFFER_WRITEFORCED(fb, var, p, len)
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
void GWEN_DBIO_SetExportFn(GWEN_DBIO *dbio, GWEN_DBIO_EXPORTFN f)
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
#define GWEN_FASTBUFFER_WRITEBYTE(fb, var, chr)
GWEN_DBIO_CHECKFILE_RESULT
GWEN_DB_NODE_TYPE GWEN_DB_GetValueTypeByPath(GWEN_DB_NODE *n, const char *path, unsigned int i)
#define DBG_INFO(dbg_logger, format, args...)
#define GWEN_TEXT_FLAGS_DEL_QUOTES
static int _readCsvLine(GWEN_FAST_BUFFER *fb, GWEN_STRINGLIST *sl)
int GWEN_Text_GetWordToBuffer(const char *src, const char *delims, GWEN_BUFFER *buf, uint32_t flags, const char **next)
#define GWEN_TEXT_FLAGS_DEL_LEADING_BLANKS
int GWEN_DB_GetIntValue(GWEN_DB_NODE *n, const char *path, int idx, int defVal)
int GWEN_Buffer_AppendBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
#define GWEN_FASTBUFFER_WRITELINE(fb, var, p)
GWEN_DB_NODE * GWEN_DB_GetFirstGroup(GWEN_DB_NODE *n)
GWENHYWFAR_EXPORT GWEN_PLUGIN * dbio_csv_factory(GWEN_PLUGIN_MANAGER *pm, const char *modName, const char *fileName)
GWEN_FAST_BUFFER * GWEN_FastBuffer_new(uint32_t bsize, GWEN_SYNCIO *io)
GWEN_STRINGLIST * GWEN_StringList_new(void)
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
static GWEN_DBIO_CHECKFILE_RESULT _csvCheckFile(GWEN_DBIO *dbio, const char *fname)
#define GWEN_DB_FLAGS_DEFAULT
GWEN_PLUGIN * GWEN_DBIO_Plugin_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName)
static int _csvImport(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags)