ze-filter  (ze-filter-0.8.0-develop-180218)
zeDb.h
Go to the documentation of this file.
1 /*
2  *
3  * ze-filter - Mail Server Filter for sendmail
4  *
5  * Copyright (c) 2001-2018 - Jose-Marcio Martins da Cruz
6  *
7  * Auteur : Jose Marcio Martins da Cruz
8  * jose.marcio.mc@gmail.org
9  *
10  * Historique :
11  * Creation : janvier 2002
12  *
13  * This program is free software, but with restricted license :
14  *
15  *
16  * This program 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.
19  *
20  * More details about ze-filter license can be found at ze-filter
21  * web site : http://foss.jose-marcio.org
22  */
23 
24 #ifndef __ZE_DB_H
25 
31 #if USE_BerkeleyDB
32 #define DB_VERSION ((DB_VERSION_MAJOR << 16) | \
33  (DB_VERSION_MINOR << 8) | DB_VERSION_PATCH)
34 
35 
36 #if (DB_VERSION < 0x40000)
37 #undef USE_BerkeleyDB
38 #endif /* DB_VERSION */
39 #endif /* USE_BerkeleyDB */
40 
41 #if !defined (HAVE_U_INT32_T) && !defined (HAVE_DB_H)
43 #endif /* HAVE_U_INT32_T */
44 
45 typedef struct ZEDB_T ZEDB_T;
46 
47 struct ZEDB_T
48 {
49  unsigned long signature;
50  char *database;
51  pthread_mutex_t dbmutex;
52 #if USE_BerkeleyDB
53  DB *dbh;
54  DBC *dbc;
55  DB_ENV *dbenv;
56  DB_TXN *dbtxn;
57  bool chkmtime;
58  time_t mtime;
59  int dbfd;
60 
61  bool dbtype;
62  bool rdonly;
63  int mode;
64 #endif /* USE_BerkeleyDB */
65  bool OK;
66  int err;
67 };
68 
69 
70 #if USE_BerkeleyDB
71 
72 typedef DB_ENV ZEDB_ENV_T;
73 
74 typedef struct
75 {
76  DB_ENV *dbenv;
77  char *home;
78  uint32_t flags;
79  int dt_txn_chk;
80  LISTR_T *dbl;
81  pthread_mutex_t mutex;
82 } JXX_ENV_T;
83 
84 #else
85 typedef void ZEDB_ENV_T;
86 #endif
87 
88 #if USE_BerkeleyDB
89 
90 typedef struct
91 {
92  union
93  {
94  DB_BTREE_STAT btree_st;
95  DB_HASH_STAT hash_st;
96  } st;
97 } ZEDB_STAT_T;
98 
99 #else
100 typedef void ZEDB_STAT_T;
101 #endif
102 
103 #define ZEDBSIGNATURE 0xdb195702
104 
105 #if USE_BerkeleyDB
106 # define ZEDB_INITIALIZER {ZEDBSIGNATURE, NULL, PTHREAD_MUTEX_INITIALIZER, \
107  NULL, NULL, NULL, NULL, \
108  FALSE, (time_t ) 0L, -1, FALSE, TRUE, 0, \
109  FALSE, 0}
110 #else /* USE_BerkeleyDB */
111 # define ZEDB_INITIALIZER {ZEDBSIGNATURE, NULL, PTHREAD_MUTEX_INITIALIZER, \
112  FALSE, 0}
113 #endif /* USE_BerkeleyDB */
114 
115 #if USE_BerkeleyDB
116 #define zeDb_installed() TRUE
117 #else
118 #define zeDb_installed() FALSE
119 #endif
120 
121 #define DB_DB_CACHE_SIZE 1
122 
123 #define DB_ENV_CACHE_SIZE 11
124 #define DB_LK_MAX_LOCKS 12
125 #define DB_LK_MAX_LOCKERS 13
126 #define DB_LK_MAX_OBJECTS 14
127 
128 size_t zeDb_SetDefaults(int which, size_t value);
129 size_t zeDb_SetDefaultCacheSize(size_t size);
130 
131 bool zeDb_CheckVersion();
132 
133 ZEDB_ENV_T *zeDb_EnvOpen(char *home, bool rdonly, int dt_chkpoint);
134 bool zeDb_EnvClose(ZEDB_ENV_T * dbenv);
135 
136 bool zeDb_Open(ZEDB_T *h, ZEDB_ENV_T *, char *, int, bool, bool,
137  size_t);
138 bool zeDb_OK(ZEDB_T *h);
139 bool zeDb_Close(ZEDB_T *h);
140 bool zeDb_Reopen(ZEDB_T *h);
141 
142 bool zeDb_Empty(ZEDB_T *h);
143 bool zeDb_Flush(ZEDB_T *h);
144 
145 bool zeDb_AddRec(ZEDB_T *h, char *, void *, size_t);
146 bool zeDb_GetRec(ZEDB_T *h, char *, void *, size_t);
147 bool zeDb_DelRec(ZEDB_T *h, char *);
148 
149 bool zeDb_CursorOpen(ZEDB_T *h, bool);
150 bool zeDb_CursorGetFirst(ZEDB_T *h, char *, size_t, void *,
151  size_t);
152 bool zeDb_CursorGetNext(ZEDB_T *h, char *, size_t, void *,
153  size_t);
154 bool zeDb_CursorDel(ZEDB_T *h);
155 bool zeDb_CursorClose(ZEDB_T *h);
156 
162 bool zeDb_Lock(ZEDB_T *h);
168 bool zeDb_Unlock(ZEDB_T *h);
169 
170 int zeDb_errno(ZEDB_T *h);
171 
172 bool zeDb_Stat(ZEDB_T *h, ZEDB_STAT_T **);
173 
174 #if 1
175 
176 #define DB_BTREE_SEQ_START() \
177  do { \
178  int nb_seq_err = 0; \
179  char prev_seq_key[256]; \
180  memset(prev_seq_key, 0, sizeof(prev_seq_key));
181 
182 #define DB_BTREE_SEQ_CHECK(key,dbname) \
183  { \
184  if (strcasecmp(prev_seq_key, key) > 0) \
185  { \
186  ZE_MessageInfo(10,"Cursor error : %s\n", STRNULL(dbname,"-")); \
187  ZE_MessageInfo(10, " Possible loop found !\n"); \
188  ZE_MessageInfo(10, " * Previous key : %s\n", prev_seq_key); \
189  ZE_MessageInfo(10, " * Current key : %s\n", key); \
190  if (nb_seq_err++ > 2) \
191  break; \
192  } \
193  strlcpy(prev_seq_key, key, sizeof(prev_seq_key)); \
194  }
195 
196 #define DB_BTREE_SEQ_END() \
197  } while (0)
198 
199 #else
200 
201 #define DB_BTREE_SEQ_START()
202 #define DB_BTREE_SEQ_CHECK(key,dbname)
203 #define DB_BTREE_SEQ_END()
204 
205 #endif
206 
209 #define __ZE_DB_H
210 #endif
bool zeDb_Unlock(ZEDB_T *h)
Database unlock.
Definition: zeDb.c:907
int err
Definition: zeDb.h:66
void ZEDB_STAT_T
Definition: zeDb.h:100
bool zeDb_Stat(ZEDB_T *h, ZEDB_STAT_T **)
Definition: zeDb.c:1263
bool zeDb_AddRec(ZEDB_T *h, char *, void *, size_t)
Definition: zeDb.c:750
unsigned long signature
Definition: zeDb.h:49
bool zeDb_OK(ZEDB_T *h)
Definition: zeDb.c:649
bool zeDb_Empty(ZEDB_T *h)
Definition: zeDb.c:696
Definition: zeDb.h:47
pthread_mutex_t mutex
Definition: ze-connopen.c:63
bool zeDb_CursorGetFirst(ZEDB_T *h, char *, size_t, void *, size_t)
Definition: zeDb.c:1041
bool zeDb_DelRec(ZEDB_T *h, char *)
Definition: zeDb.c:863
bool zeDb_Reopen(ZEDB_T *h)
bool zeDb_Open(ZEDB_T *h, ZEDB_ENV_T *, char *, int, bool, bool, size_t)
Definition: zeDb.c:462
bool zeDb_Close(ZEDB_T *h)
Definition: zeDb.c:667
size_t zeDb_SetDefaultCacheSize(size_t size)
Definition: zeDb.c:54
uint32_t u_int32_t
Definition: zeDb.h:42
ZEDB_ENV_T * zeDb_EnvOpen(char *home, bool rdonly, int dt_chkpoint)
Definition: zeDb.c:243
bool zeDb_EnvClose(ZEDB_ENV_T *dbenv)
Definition: zeDb.c:416
char * database
Definition: zeDb.h:50
bool zeDb_GetRec(ZEDB_T *h, char *, void *, size_t)
Definition: zeDb.c:791
pthread_mutex_t dbmutex
Definition: zeDb.h:51
size_t zeDb_SetDefaults(int which, size_t value)
Definition: zeDb.c:64
bool zeDb_CursorOpen(ZEDB_T *h, bool)
Definition: zeDb.c:936
int zeDb_errno(ZEDB_T *h)
Definition: zeDb.c:922
void ZEDB_ENV_T
Definition: zeDb.h:85
bool zeDb_CursorDel(ZEDB_T *h)
Definition: zeDb.c:1189
bool zeDb_CursorClose(ZEDB_T *h)
Definition: zeDb.c:991
bool OK
Definition: zeDb.h:65
long uint32_t
Definition: ze-sys.h:489
bool zeDb_CursorGetNext(ZEDB_T *h, char *, size_t, void *, size_t)
Definition: zeDb.c:1116
bool zeDb_CheckVersion()
Definition: zeDb.c:148
bool zeDb_Flush(ZEDB_T *h)
Definition: zeDb.c:725
bool zeDb_Lock(ZEDB_T *h)
Database lock.
Definition: zeDb.c:896