pfix-srsd: add a -I option
[apps/pfixtools.git] / postlicyd / tst-greylist.c
1 /******************************************************************************/
2 /*          pfixtools: a collection of postfix related tools                  */
3 /*          ~~~~~~~~~                                                         */
4 /*  ________________________________________________________________________  */
5 /*                                                                            */
6 /*  Redistribution and use in source and binary forms, with or without        */
7 /*  modification, are permitted provided that the following conditions        */
8 /*  are met:                                                                  */
9 /*                                                                            */
10 /*  1. Redistributions of source code must retain the above copyright         */
11 /*     notice, this list of conditions and the following disclaimer.          */
12 /*  2. Redistributions in binary form must reproduce the above copyright      */
13 /*     notice, this list of conditions and the following disclaimer in the    */
14 /*     documentation and/or other materials provided with the distribution.   */
15 /*  3. The names of its contributors may not be used to endorse or promote    */
16 /*     products derived from this software without specific prior written     */
17 /*     permission.                                                            */
18 /*                                                                            */
19 /*  THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS   */
20 /*  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED         */
21 /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE    */
22 /*  DISCLAIMED.  IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY         */
23 /*  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL        */
24 /*  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS   */
25 /*  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)     */
26 /*  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,       */
27 /*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN  */
28 /*  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE           */
29 /*  POSSIBILITY OF SUCH DAMAGE.                                               */
30 /*                                                                            */
31 /*   Copyright (c) 2006-2008 the Authors                                      */
32 /*   see AUTHORS and source files for details                                 */
33 /******************************************************************************/
34
35 /*
36  * Copyright © 2008 Florent Bruneau
37  */
38
39 #include <tcbdb.h>
40
41 #include "common.h"
42 #include "str.h"
43
44
45 struct awl_entry {
46     int32_t count;
47     time_t  last;
48 };
49
50 union obj {
51   struct {
52     unsigned a:8;
53     unsigned b:8;
54     unsigned c:8;
55     unsigned d:8;
56     unsigned e:8;
57     unsigned f:8;
58     unsigned g:8;
59     unsigned h:8;
60   } b;
61
62   struct {
63     unsigned a:32;
64     unsigned b:32;
65   } w;
66
67   uint64_t l;
68 };
69
70 __attribute__((used))
71 static void fill_tree(TCBDB *db)
72 {
73     char key[BUFSIZ];
74     union obj val;
75     ssize_t key_len;
76
77     struct awl_entry entry = { 0, 0 };
78
79     for (uint32_t i = 0 ; i < 1000000 ; ++i) {
80         val.w.a = random();
81         val.w.b = random();
82         key_len = snprintf(key, BUFSIZ, "%u.%u.%u.%u.%u.%u.%u.%u",
83                            val.b.a, val.b.b, val.b.c, val.b.d,
84                            val.b.e, val.b.f, val.b.g, val.b.h);
85         tcbdbput(db, key, key_len, &entry, sizeof(entry));
86         if (i && i % 10000 == 0) {
87             info("%u inserted... sill %u to go", i, 1000000 - i);
88         }
89     }
90     tcbdbsync(db);
91 }
92
93 static void enumerate_tree(TCBDB *src, TCBDB *dest)
94 {
95     BDBCUR *cur = tcbdbcurnew(src);
96     TCXSTR *key, *value;
97     uint32_t new_count = 0;
98
99     key = tcxstrnew();
100     value = tcxstrnew();
101     if (tcbdbcurfirst(cur)) {
102         do {
103             tcxstrclear(key);
104             tcxstrclear(value);
105             (void)tcbdbcurrec(cur, key, value);
106
107             tcbdbput(dest, tcxstrptr(key), tcxstrsize(key),
108                       tcxstrptr(value), sizeof(struct awl_entry));
109             ++new_count;
110             if (new_count % 10000 == 0) {
111                 info("%u enumerated... strill %u to go", new_count, 1000000 - new_count);
112             }
113         } while (tcbdbcurnext(cur));
114     }
115     tcxstrdel(key);
116     tcxstrdel(value);
117     tcbdbcurdel(cur);
118     tcbdbsync(dest);
119 }
120
121 int main(void)
122 {
123     TCBDB *db;
124     TCBDB *tmp;
125     common_startup();
126
127     info("Fill the database with 1.000.000 of random entries");
128     db = tcbdbnew();
129     if (!tcbdbopen(db, "/tmp/test_greylist_perf", BDBOWRITER | BDBOCREAT | BDBOTRUNC)) {
130         err("can not open database: %s", tcbdberrmsg(tcbdbecode(db)));
131         tcbdbdel(db);
132         return -1;
133     }
134
135     fill_tree(db);
136     info("Done");
137     tcbdbclose(db);
138     tcbdbdel(db);
139
140     info("Enumerate the database in a new one");
141     tmp = tcbdbnew();
142     if (!tcbdbopen(tmp, "/tmp/test_greylist_perf.tmp",
143                    BDBOWRITER | BDBOCREAT | BDBOTRUNC)) {
144         err("can not open database: %s", tcbdberrmsg(tcbdbecode(tmp)));
145         tcbdbdel(tmp);
146         return -1;
147     }
148     db = tcbdbnew();
149     if (!tcbdbopen(db, "/tmp/test_greylist_perf", BDBOREADER)) {
150         err("can not open database: %s", tcbdberrmsg(tcbdbecode(db)));
151         tcbdbdel(db);
152         tcbdbdel(tmp);
153         return -1;
154     }
155
156     enumerate_tree(db, tmp);
157     info("done");
158     tcbdbclose(db);
159     tcbdbdel(db);
160     tcbdbclose(tmp);
161     tcbdbdel(tmp);
162
163     return 0;
164 }