00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00031 #ifndef GWENHYWFAR_DB_H
00032 #define GWENHYWFAR_DB_H
00033
00034 #include <gwenhywfar/gwenhywfarapi.h>
00035 #include <gwenhywfar/path.h>
00036 #include <gwenhywfar/bufferedio.h>
00037 #include <gwenhywfar/types.h>
00038 #include <stdio.h>
00039
00040 #ifdef __cplusplus
00041 extern "C" {
00042 #endif
00043
00044
00105 #define GWEN_DB_LINE_MAXSIZE 1024
00106
00122 #define GWEN_DB_FLAGS_OVERWRITE_VARS 0x00010000
00123
00124 #define GWEN_DB_FLAGS_OVERWRITE_GROUPS 0x00020000
00125
00126 #define GWEN_DB_FLAGS_QUOTE_VARNAMES 0x00040000
00127
00128 #define GWEN_DB_FLAGS_QUOTE_VALUES 0x00080000
00129
00130 #define GWEN_DB_FLAGS_WRITE_SUBGROUPS 0x00100000
00131
00132 #define GWEN_DB_FLAGS_DETAILED_GROUPS 0x00200000
00133
00135 #define GWEN_DB_FLAGS_INDEND 0x00400000
00136
00138 #define GWEN_DB_FLAGS_ADD_GROUP_NEWLINES 0x00800000
00139
00141 #define GWEN_DB_FLAGS_USE_COLON 0x01000000
00142
00143 #define GWEN_DB_FLAGS_STOP_ON_EMPTY_LINE 0x02000000
00144
00146 #define GWEN_DB_FLAGS_OMIT_TYPES 0x04000000
00147
00148 #define GWEN_DB_FLAGS_APPEND_FILE 0x08000000
00149
00150 #define GWEN_DB_FLAGS_ESCAPE_CHARVALUES 0x10000000
00151
00153 #define GWEN_DB_FLAGS_UNESCAPE_CHARVALUES 0x10000000
00154
00156 #define GWEN_DB_FLAGS_LOCKFILE 0x20000000
00157
00161 #define GWEN_DB_FLAGS_INSERT 0x40000000
00162
00167 #define GWEN_DB_FLAGS_DOSMODE 0x80000000
00168
00170 #define GWEN_DB_FLAGS_DEFAULT \
00171 (\
00172 GWEN_DB_FLAGS_QUOTE_VALUES | \
00173 GWEN_DB_FLAGS_WRITE_SUBGROUPS | \
00174 GWEN_DB_FLAGS_DETAILED_GROUPS | \
00175 GWEN_DB_FLAGS_INDEND | \
00176 GWEN_DB_FLAGS_ADD_GROUP_NEWLINES | \
00177 GWEN_DB_FLAGS_ESCAPE_CHARVALUES | \
00178 GWEN_DB_FLAGS_UNESCAPE_CHARVALUES\
00179 )
00180
00181
00184 #define GWEN_DB_FLAGS_COMPACT \
00185 (\
00186 GWEN_DB_FLAGS_QUOTE_VALUES | \
00187 GWEN_DB_FLAGS_WRITE_SUBGROUPS | \
00188 GWEN_DB_FLAGS_ESCAPE_CHARVALUES | \
00189 GWEN_DB_FLAGS_UNESCAPE_CHARVALUES\
00190 )
00191
00195 #define GWEN_DB_FLAGS_HTTP \
00196 (\
00197 GWEN_DB_FLAGS_USE_COLON |\
00198 GWEN_DB_FLAGS_STOP_ON_EMPTY_LINE |\
00199 GWEN_DB_FLAGS_OMIT_TYPES | \
00200 GWEN_DB_FLAGS_DOSMODE \
00201 )
00202
00209 #define GWEN_DB_NODE_FLAGS_DIRTY 0x00000001
00210
00211 #define GWEN_DB_NODE_FLAGS_VOLATILE 0x00000002
00212
00214 #define GWEN_DB_NODE_FLAGS_INHERIT_HASH_MECHANISM 0x00000004
00215
00225 typedef union GWEN_DB_NODE GWEN_DB_NODE;
00226
00230 typedef enum {
00232 GWEN_DB_VALUETYPE_UNKNOWN=0,
00234 GWEN_DB_VALUETYPE_CHAR,
00236 GWEN_DB_VALUETYPE_INT,
00238 GWEN_DB_VALUETYPE_BIN,
00240 GWEN_DB_VALUETYPE_PTR
00241 } GWEN_DB_VALUETYPE;
00242
00243
00248
00255 GWENHYWFAR_API
00256 GWEN_DB_NODE *GWEN_DB_Group_new(const char *name);
00257
00263 GWENHYWFAR_API
00264 void GWEN_DB_Group_free(GWEN_DB_NODE *n);
00265
00266
00273 GWENHYWFAR_API
00274 GWEN_DB_NODE *GWEN_DB_Group_dup(const GWEN_DB_NODE *n);
00275
00293 GWENHYWFAR_API
00294 GWEN_DB_NODE *GWEN_DB_GetFirstGroup(GWEN_DB_NODE *n);
00295
00318 GWENHYWFAR_API
00319 GWEN_DB_NODE *GWEN_DB_GetNextGroup(GWEN_DB_NODE *n);
00320
00321
00333 GWENHYWFAR_API
00334 GWEN_DB_NODE *GWEN_DB_FindFirstGroup(GWEN_DB_NODE *n, const char *name);
00335
00354 GWENHYWFAR_API
00355 GWEN_DB_NODE *GWEN_DB_FindNextGroup(GWEN_DB_NODE *n, const char *name);
00356
00357
00368 typedef void *(*GWEN_DB_NODES_CB)(GWEN_DB_NODE *node, void *user_data);
00369
00386 GWENHYWFAR_API
00387 void *GWEN_DB_Groups_Foreach(GWEN_DB_NODE *node, GWEN_DB_NODES_CB func,
00388 void *user_data);
00389
00393 GWENHYWFAR_API
00394 unsigned int GWEN_DB_Groups_Count(const GWEN_DB_NODE *node);
00452 GWENHYWFAR_API
00453 const char *GWEN_DB_GetCharValue(GWEN_DB_NODE *n,
00454 const char *path,
00455 int idx,
00456 const char *defVal);
00465 GWENHYWFAR_API
00466 int GWEN_DB_SetCharValue(GWEN_DB_NODE *n,
00467 GWEN_TYPE_UINT32 flags,
00468 const char *path,
00469 const char *val);
00470
00471
00482 GWENHYWFAR_API
00483 int GWEN_DB_AddCharValue(GWEN_DB_NODE *n,
00484 const char *path,
00485 const char *val,
00486 int senseCase,
00487 int check);
00488
00489
00499 GWENHYWFAR_API
00500 int GWEN_DB_RemoveCharValue(GWEN_DB_NODE *n,
00501 const char *path,
00502 const char *val,
00503 int senseCase);
00504
00505
00513 GWENHYWFAR_API
00514 int GWEN_DB_GetIntValue(GWEN_DB_NODE *n,
00515 const char *path,
00516 int idx,
00517 int defVal);
00518
00527 GWENHYWFAR_API
00528 int GWEN_DB_SetIntValue(GWEN_DB_NODE *n,
00529 GWEN_TYPE_UINT32 flags,
00530 const char *path,
00531 int val);
00532
00533
00545 GWENHYWFAR_API
00546 const void *GWEN_DB_GetBinValue(GWEN_DB_NODE *n,
00547 const char *path,
00548 int idx,
00549 const void *defVal,
00550 unsigned int defValSize,
00551 unsigned int *returnValueSize);
00552
00563 GWENHYWFAR_API
00564 int GWEN_DB_SetBinValue(GWEN_DB_NODE *n,
00565 GWEN_TYPE_UINT32 flags,
00566 const char *path,
00567 const void *val,
00568 unsigned int valSize);
00569
00570
00578 GWENHYWFAR_API
00579 void *GWEN_DB_GetPtrValue(GWEN_DB_NODE *n,
00580 const char *path,
00581 int idx,
00582 void *defVal);
00583
00593 GWENHYWFAR_API
00594 int GWEN_DB_SetPtrValue(GWEN_DB_NODE *n,
00595 GWEN_TYPE_UINT32 flags,
00596 const char *path,
00597 void *val);
00606
00616 GWENHYWFAR_API
00617 GWEN_DB_NODE *GWEN_DB_GetGroup(GWEN_DB_NODE *n,
00618 GWEN_TYPE_UINT32 flags,
00619 const char *path);
00620
00624 GWENHYWFAR_API
00625 const char *GWEN_DB_GroupName(GWEN_DB_NODE *n);
00626
00632 GWENHYWFAR_API
00633 void GWEN_DB_GroupRename(GWEN_DB_NODE *n, const char *newname);
00634
00649 GWENHYWFAR_API
00650 int GWEN_DB_AddGroup(GWEN_DB_NODE *parent, GWEN_DB_NODE *node);
00651
00667 GWENHYWFAR_API
00668 int GWEN_DB_InsertGroup(GWEN_DB_NODE *parent, GWEN_DB_NODE *node);
00669
00679 GWENHYWFAR_API
00680 int GWEN_DB_AddGroupChildren(GWEN_DB_NODE *n, GWEN_DB_NODE *nn);
00681
00691 GWENHYWFAR_API
00692 void GWEN_DB_UnlinkGroup(GWEN_DB_NODE *n);
00693
00700 GWENHYWFAR_API
00701 int GWEN_DB_DeleteGroup(GWEN_DB_NODE *n,
00702 const char *path);
00710 GWENHYWFAR_API
00711 int GWEN_DB_ClearGroup(GWEN_DB_NODE *n,
00712 const char *path);
00713
00720 GWENHYWFAR_API
00721 int GWEN_DB_IsGroup(const GWEN_DB_NODE *n);
00722
00734 GWENHYWFAR_API
00735 GWEN_TYPE_UINT32 GWEN_DB_GetNodeFlags(const GWEN_DB_NODE *n);
00736
00742 GWENHYWFAR_API
00743 void GWEN_DB_SetNodeFlags(GWEN_DB_NODE *n,
00744 GWEN_TYPE_UINT32 flags);
00745
00754 GWENHYWFAR_API
00755 void GWEN_DB_ModifyBranchFlagsUp(GWEN_DB_NODE *n,
00756 GWEN_TYPE_UINT32 newflags,
00757 GWEN_TYPE_UINT32 mask);
00758
00767 GWENHYWFAR_API
00768 void GWEN_DB_ModifyBranchFlagsDown(GWEN_DB_NODE *n,
00769 GWEN_TYPE_UINT32 newflags,
00770 GWEN_TYPE_UINT32 mask);
00771
00785
00793 GWENHYWFAR_API
00794 int GWEN_DB_ReadFromStream(GWEN_DB_NODE *n,
00795 GWEN_BUFFEREDIO *bio,
00796 GWEN_TYPE_UINT32 dbflags);
00797
00805 GWENHYWFAR_API
00806 int GWEN_DB_ReadFile(GWEN_DB_NODE *n,
00807 const char *fname,
00808 GWEN_TYPE_UINT32 dbflags);
00809
00813 GWENHYWFAR_API
00814 int GWEN_DB_ReadFromString(GWEN_DB_NODE *n,
00815 const char *str,
00816 GWEN_TYPE_UINT32 dbflags);
00817
00825 GWENHYWFAR_API
00826 int GWEN_DB_WriteToStream(GWEN_DB_NODE *n,
00827 GWEN_BUFFEREDIO *bio,
00828 GWEN_TYPE_UINT32 dbflags);
00829
00838 GWENHYWFAR_API
00839 int GWEN_DB_WriteFile(GWEN_DB_NODE *n,
00840 const char *fname,
00841 GWEN_TYPE_UINT32 dbflags);
00842
00846 GWENHYWFAR_API
00847 int GWEN_DB_WriteToBuffer(GWEN_DB_NODE *n,
00848 GWEN_BUFFER *buf,
00849 GWEN_TYPE_UINT32 dbflags);
00850
00851
00862 GWENHYWFAR_API
00863 int GWEN_DB_ReadFileAs(GWEN_DB_NODE *n,
00864 const char *fname,
00865 const char *type,
00866 GWEN_DB_NODE *params,
00867 GWEN_TYPE_UINT32 dbflags);
00868
00879 GWENHYWFAR_API
00880 int GWEN_DB_WriteFileAs(GWEN_DB_NODE *n,
00881 const char *fname,
00882 const char *type,
00883 GWEN_DB_NODE *params,
00884 GWEN_TYPE_UINT32 dbflags);
00897 GWENHYWFAR_API
00898 GWEN_DB_NODE *GWEN_DB_GetFirstVar(GWEN_DB_NODE *n);
00899
00900
00922 GWENHYWFAR_API
00923 GWEN_DB_NODE *GWEN_DB_GetNextVar(GWEN_DB_NODE *n);
00924
00929 GWENHYWFAR_API
00930 const char *GWEN_DB_VariableName(GWEN_DB_NODE *n);
00931
00932
00933 GWENHYWFAR_API
00934 void GWEN_DB_VariableRename(GWEN_DB_NODE *n, const char *newname);
00935
00952 GWENHYWFAR_API
00953 void *GWEN_DB_Variables_Foreach(GWEN_DB_NODE *node, GWEN_DB_NODES_CB func,
00954 void *user_data);
00955
00960 GWENHYWFAR_API
00961 unsigned int GWEN_DB_Variables_Count(const GWEN_DB_NODE *node);
00962
00968 GWENHYWFAR_API
00969 GWEN_DB_VALUETYPE GWEN_DB_GetVariableType(GWEN_DB_NODE *n,
00970 const char *p);
00971
00978 GWENHYWFAR_API
00979 int GWEN_DB_DeleteVar(GWEN_DB_NODE *n,
00980 const char *path);
00981
00988 GWENHYWFAR_API
00989 int GWEN_DB_VariableExists(GWEN_DB_NODE *n,
00990 const char *path);
00991
00999 GWENHYWFAR_API
01000 int GWEN_DB_ValueExists(GWEN_DB_NODE *n,
01001 const char *path,
01002 unsigned int idx);
01003
01010 GWENHYWFAR_API
01011 int GWEN_DB_IsVariable(const GWEN_DB_NODE *n);
01012
01013
01025 GWENHYWFAR_API
01026 GWEN_DB_NODE *GWEN_DB_FindFirstVar(GWEN_DB_NODE *n, const char *name);
01027
01046 GWENHYWFAR_API
01047 GWEN_DB_NODE *GWEN_DB_FindNextVar(GWEN_DB_NODE *n, const char *name);
01048
01061 GWENHYWFAR_API
01062 GWEN_DB_NODE *GWEN_DB_GetFirstValue(GWEN_DB_NODE *n);
01063
01080 GWENHYWFAR_API
01081 GWEN_DB_NODE *GWEN_DB_GetNextValue(GWEN_DB_NODE *n);
01082
01099 GWENHYWFAR_API
01100 void *GWEN_DB_Values_Foreach(GWEN_DB_NODE *node, GWEN_DB_NODES_CB func,
01101 void *user_data);
01102
01106 GWENHYWFAR_API
01107 unsigned int GWEN_DB_Values_Count(const GWEN_DB_NODE *node);
01108
01113 GWENHYWFAR_API
01114 GWEN_DB_VALUETYPE GWEN_DB_GetValueType(GWEN_DB_NODE *n);
01115
01116 GWENHYWFAR_API
01117 GWEN_DB_VALUETYPE GWEN_DB_GetValueTypeByPath(GWEN_DB_NODE *n,
01118 const char *p,
01119 unsigned int i);
01120
01125 GWENHYWFAR_API
01126 const char *GWEN_DB_GetCharValueFromNode(const GWEN_DB_NODE *n);
01127
01132 GWENHYWFAR_API
01133 int GWEN_DB_SetCharValueInNode(GWEN_DB_NODE *n, const char *s);
01134
01135 GWENHYWFAR_API
01136 int GWEN_DB_GetIntValueFromNode(const GWEN_DB_NODE *n);
01137
01138 GWENHYWFAR_API
01139 const void *GWEN_DB_GetBinValueFromNode(const GWEN_DB_NODE *n,
01140 unsigned int *size);
01141
01142
01149 GWENHYWFAR_API
01150 int GWEN_DB_IsValue(const GWEN_DB_NODE *n);
01164
01171 GWENHYWFAR_API
01172 void GWEN_DB_Dump(GWEN_DB_NODE *n, FILE *f, int insert);
01185 typedef struct GWEN_DB_HASH_MECHANISM GWEN_DB_HASH_MECHANISM;
01186
01187 typedef int (*GWEN_DB_HASH_INITNODE_FN)(GWEN_DB_HASH_MECHANISM *hm,
01188 GWEN_DB_NODE *node,
01189 void **hashData);
01190 typedef int (*GWEN_DB_HASH_FININODE_FN)(GWEN_DB_HASH_MECHANISM *hm,
01191 GWEN_DB_NODE *node,
01192 void **hashData);
01193 typedef int (*GWEN_DB_HASH_ADDNODE_FN)(GWEN_DB_HASH_MECHANISM *hm,
01194 GWEN_DB_NODE *parent,
01195 GWEN_DB_NODE *node,
01196 int appendOrInsert,
01197 void *hashData);
01198 typedef int (*GWEN_DB_HASH_UNLINKNODE_FN)(GWEN_DB_HASH_MECHANISM *hm,
01199 GWEN_DB_NODE *parent,
01200 GWEN_DB_NODE *node,
01201 void *hashData);
01202 typedef GWEN_DB_NODE* (*GWEN_DB_HASH_GETNODE_FN)(GWEN_DB_HASH_MECHANISM *hm,
01203 GWEN_DB_NODE *parent,
01204 const char *name,
01205 int idx,
01206 void *hashData);
01207
01208 GWENHYWFAR_API
01209 GWEN_DB_HASH_MECHANISM *GWEN_DB_HashMechanism_new();
01210
01211 GWENHYWFAR_API
01212 void GWEN_DB_HashMechanism_Attach(GWEN_DB_HASH_MECHANISM *hm);
01213
01214 GWENHYWFAR_API
01215 void GWEN_DB_HashMechanism_free(GWEN_DB_HASH_MECHANISM *hm);
01216
01217
01218 GWENHYWFAR_API
01219 void GWEN_DB_HashMechanism_SetInitNodeFn(GWEN_DB_HASH_MECHANISM *hm,
01220 GWEN_DB_HASH_INITNODE_FN f);
01221
01222 GWENHYWFAR_API
01223 void GWEN_DB_HashMechanism_SetFiniNodeFn(GWEN_DB_HASH_MECHANISM *hm,
01224 GWEN_DB_HASH_FININODE_FN f);
01225
01226 GWENHYWFAR_API
01227 void GWEN_DB_HashMechanism_SetAddNodeFn(GWEN_DB_HASH_MECHANISM *hm,
01228 GWEN_DB_HASH_ADDNODE_FN f);
01229
01230 GWENHYWFAR_API
01231 void GWEN_DB_HashMechanism_SetUnlinkNodeFn(GWEN_DB_HASH_MECHANISM *hm,
01232 GWEN_DB_HASH_UNLINKNODE_FN f);
01233
01234 GWENHYWFAR_API
01235 void GWEN_DB_HashMechanism_SetGetNodeFn(GWEN_DB_HASH_MECHANISM *hm,
01236 GWEN_DB_HASH_GETNODE_FN f);
01237
01238
01253 GWENHYWFAR_API
01254 int GWEN_DB_Group_SetHashMechanism(GWEN_DB_NODE *node,
01255 GWEN_DB_HASH_MECHANISM *hm);
01256
01261
01262
01263 #ifdef __cplusplus
01264 }
01265 #endif
01266
01267
01268 #endif
01269
01270
01271