Move some code.
[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 REGENTS AND CONTRIBUTORS ``AS IS'' AND   */
20 /*  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE     */
21 /*  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR        */
22 /*  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS    */
23 /*  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR    */
24 /*  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF      */
25 /*  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  */
26 /*  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN   */
27 /*  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)   */
28 /*  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF    */
29 /*  THE POSSIBILITY OF SUCH DAMAGE.                                           */
30 /******************************************************************************/
31
32 /*
33  * Copyright © 2008 Florent Bruneau
34  */
35
36 #include <tcbdb.h>
37
38 #include "common.h"
39 #include "str.h"
40
41
42 struct awl_entry {
43     int32_t count;
44     time_t  last;
45 };
46
47 union obj {
48   struct {
49     unsigned a:8;
50     unsigned b:8;
51     unsigned c:8;
52     unsigned d:8;
53     unsigned e:8;
54     unsigned f:8;
55     unsigned g:8;
56     unsigned h:8;
57   } b;
58
59   struct {
60     unsigned a:32;
61     unsigned b:32;
62   } w;
63
64   uint64_t l;
65 };
66
67 __attribute__((used))
68 static void fill_tree(TCBDB *db)
69 {
70     char key[BUFSIZ];
71     union obj val;
72     ssize_t key_len;
73
74     struct awl_entry entry = { 0, 0 };
75
76     for (uint32_t i = 0 ; i < 1000000 ; ++i) {
77         val.w.a = random();
78         val.w.b = random();
79         key_len = snprintf(key, BUFSIZ, "%u.%u.%u.%u.%u.%u.%u.%u",
80                            val.b.a, val.b.b, val.b.c, val.b.d,
81                            val.b.e, val.b.f, val.b.g, val.b.h);
82         tcbdbput(db, key, key_len, &entry, sizeof(entry));
83         if (i && i % 10000 == 0) {
84             info("%u inserted... sill %u to go", i, 1000000 - i);
85         }
86     }
87     tcbdbsync(db);
88 }
89
90 static void enumerate_tree(TCBDB *src, TCBDB *dest)
91 {
92     BDBCUR *cur = tcbdbcurnew(src);
93     TCXSTR *key, *value;
94     uint32_t new_count = 0;
95
96     key = tcxstrnew();
97     value = tcxstrnew();
98     if (tcbdbcurfirst(cur)) {
99         do {
100             tcxstrclear(key);
101             tcxstrclear(value);
102             (void)tcbdbcurrec(cur, key, value);
103
104             tcbdbput(dest, tcxstrptr(key), tcxstrsize(key),
105                       tcxstrptr(value), sizeof(struct awl_entry));
106             ++new_count;
107             if (new_count % 10000 == 0) {
108                 info("%u enumerated... strill %u to go", new_count, 1000000 - new_count);
109             }
110         } while (tcbdbcurnext(cur));
111     }
112     tcxstrdel(key);
113     tcxstrdel(value);
114     tcbdbcurdel(cur);
115     tcbdbsync(dest);
116 }
117
118 int main(void)
119 {
120     TCBDB *db;
121     TCBDB *tmp;
122     common_startup();
123
124     info("Fill the database with 1.000.000 of random entries");
125     db = tcbdbnew();
126     if (!tcbdbopen(db, "/tmp/test_greylist_perf", BDBOWRITER | BDBOCREAT | BDBOTRUNC)) {
127         err("can not open database: %s", tcbdberrmsg(tcbdbecode(db)));
128         tcbdbdel(db);
129         return -1;
130     }
131
132     fill_tree(db);
133     info("Done");
134     tcbdbclose(db);
135     tcbdbdel(db);
136
137     info("Enumerate the database in a new one");
138     tmp = tcbdbnew();
139     if (!tcbdbopen(tmp, "/tmp/test_greylist_perf.tmp",
140                    BDBOWRITER | BDBOCREAT | BDBOTRUNC)) {
141         err("can not open database: %s", tcbdberrmsg(tcbdbecode(tmp)));
142         tcbdbdel(tmp);
143         return -1;
144     }
145     db = tcbdbnew();
146     if (!tcbdbopen(db, "/tmp/test_greylist_perf", BDBOREADER)) {
147         err("can not open database: %s", tcbdberrmsg(tcbdbecode(db)));
148         tcbdbdel(db);
149         tcbdbdel(tmp);
150         return -1;
151     }
152
153     enumerate_tree(db, tmp);
154     info("done");
155     tcbdbclose(db);
156     tcbdbdel(db);
157     tcbdbclose(tmp);
158     tcbdbdel(tmp);
159
160     return 0;
161 }