]> git.sur5r.net Git - openldap/blob - servers/slapd/tools/sizecount.c
include portable.h
[openldap] / servers / slapd / tools / sizecount.c
1 #include "portable.h"
2
3 #include <stdio.h>
4 #include <ldbm.h>
5 #include <lber.h>
6 #include <ldap.h>
7 #include "portable.h"
8
9 #define CACHE_SIZE      1000000
10 #define MODE            0600
11 #define DB_FLAGS        (LDBM_WRCREAT|LDBM_NEWDB)
12 #define SUBLEN          3
13
14 extern char     *first_word();
15 extern char     *next_word();
16 extern char     *word_dup();
17 extern char     *phonetic();
18
19 extern int ldap_debug;
20 extern int lber_debug;
21
22 int     ldap_syslog;
23 int     ldap_syslog_level;
24
25 static void     add();
26
27 main( argc, argv )
28     int         argc;
29     char        **argv;
30 {
31         LDAP                    *ld;
32         LDAPMessage             *res, *e;
33         int                             i, j, k, count, len, nentries;
34         int                             vcount, wcount, pcount, scount;
35         int                             vsize, wsize, psize, ssize;
36         struct berval   **bvals;
37         char                    **vals;
38         char                    *dn, *p, *val;
39         char                    buf[SUBLEN+1];
40         LDBM                    wldbm, pldbm, sldbm;
41         static char             *attrs[] = { "cn", "nentries", NULL };
42
43 /*
44         ldap_debug = 255;
45         lber_debug = 255;
46 */
47         if ( (ld = ldap_open( "vertigo:5555", LDAP_PORT )) == NULL ) {
48                 perror( "ldap_open" );
49                 exit( 1 );
50         }
51
52         if ( ldap_search( ld, "cn=index", LDAP_SCOPE_ONELEVEL, "(objectclass=*)",
53           attrs, 0 ) == -1 ) {
54                 ldap_perror( ld, "ldap_search" );
55                 exit( 1 );
56         }
57
58         printf( "attr\tdn\tnentries\tvcount\tvsize\twcount\twsize\tpcount\tpsize\tscount\tssize\n" );
59         fflush( stdout );
60         count = 0;
61         while ( ldap_result( ld, LDAP_RES_ANY, 0, NULL, &res )
62           == LDAP_RES_SEARCH_ENTRY ) {
63                 count++;
64                 e = ldap_first_entry( ld, res );
65                 dn = ldap_get_dn( ld, e );
66                 if ( (vals = ldap_get_values( ld, e, "nentries" )) != NULL ) {
67                         nentries = atoi( vals[0] );
68                         ldap_value_free( vals );
69                 } else {
70                         fprintf( stderr, "no nentries attribute for (%s)\n", dn );
71                         nentries = -1;
72                 }
73
74                 for ( i = 0; attrs[i] != NULL; i++ ) {
75                         if ( strcasecmp( attrs[i], "nentries" ) == 0 ) {
76                                 continue;
77                         }
78                         if ( (wldbm = ldbm_open( "wcount.ldbm", DB_FLAGS, MODE,
79                           CACHE_SIZE )) == NULL || (pldbm = ldbm_open( "pcount.ldbm",
80                           DB_FLAGS, MODE, CACHE_SIZE )) == NULL || (sldbm = ldbm_open(
81                           "scount.ldbm", DB_FLAGS, MODE, CACHE_SIZE )) == NULL ) {
82                                 perror( "ldbm_open" );
83                                 exit( 1 );
84                         }
85                         vcount = 0; vsize = 0;
86                         wcount = 0; wsize = 0;
87                         pcount = 0; psize = 0;
88                         scount = 0; ssize = 0;
89                         if ( (bvals = ldap_get_values_len( ld, e, attrs[i] )) != NULL ) {
90                                 for ( j = 0; bvals[j] != NULL; j++ ) {
91                                         Datum   key, data;
92                                         char    *w;
93
94                                         /* update value count */
95                                         vcount++;
96                                         vsize += bvals[j]->bv_len;
97
98                                         /* update word and phoneme counts */
99                                         for ( w = first_word( bvals[j]->bv_val ); w != NULL;
100                                           w = next_word( w ) ) {
101                                                 add( wldbm, word_dup( w ), &wcount, &wsize, 1 );
102
103                                                 add( pldbm, phonetic( w ), &pcount, &psize, 1 );
104                                         }
105
106                                         /* update substring count */
107                                         len = bvals[j]->bv_len;
108                                         val = bvals[j]->bv_val;
109                                         if ( len > SUBLEN - 2 ) {
110                                                 buf[0] = '^';
111                                                 for ( k = 0; k < SUBLEN - 1; k++ ) {
112                                                         buf[k + 1] = val[k];
113                                                 }
114                                                 buf[SUBLEN] = '\0';
115                                                 add( sldbm, buf, &scount, &ssize, 0 );
116
117                                                 p = val + len - SUBLEN + 1;
118                                                 for ( k = 0; k < SUBLEN; k++ ) {
119                                                         buf[k] = p[k];
120                                                 }
121                                                 buf[SUBLEN - 1] = '$';
122                                                 buf[SUBLEN] = '\0';
123                                                 add( sldbm, buf, &scount, &ssize, 0 );
124                                         }
125                                         for ( p = val; p < (val + len - SUBLEN + 1); p++ ) {
126                                                 for ( k = 0; k < SUBLEN; k++ ) {
127                                                         buf[k] = p[k];
128                                                 }
129                                                 buf[SUBLEN] = '\0';
130                                                 add( sldbm, buf, &scount, &ssize, 0 );
131                                         }
132                                 }
133                                 ldap_value_free_len( bvals );
134                         }
135                         printf( "%s\t%s\t%d", attrs[i], dn, nentries );
136                         printf( "\t%d\t%d", vcount, vsize );
137                         printf( "\t%d\t%d", wcount, wsize );
138                         printf( "\t%d\t%d", pcount, psize );
139                         printf( "\t%d\t%d\n", scount, ssize );
140                         fflush( stdout );
141
142                         ldbm_close( wldbm );
143                         ldbm_close( pldbm );
144                         ldbm_close( sldbm );
145                 }
146
147                 free( dn );
148                 ldap_msgfree( res );
149         }
150         printf( "%d entries\n", count );
151         fflush( stdout );
152
153         if ( ldap_result2error( ld, res, 1 ) != LDAP_SUCCESS ) {
154                 ldap_perror( ld, "ldap_result" );
155         }
156         ldap_unbind( ld );
157
158         (void) unlink( "wcount.ldbm" );
159         (void) unlink( "pcount.ldbm" );
160         (void) unlink( "scount.ldbm" );
161
162         exit( 0 );
163 }
164
165 static void
166 add(
167     LDBM        ldbm,
168     char        *s,
169     int         *count,
170     int         *size,
171     int         freeit
172 )
173 {
174         Datum   key, data;
175
176         key.dptr = s;
177         key.dsize = strlen( key.dptr ) + 1;
178         data.dptr = "";
179         data.dsize = 0;
180         if ( ldbm_store( ldbm, key, data, LDBM_INSERT ) == 0 ) {
181                 (*count)++;
182                 (*size) += strlen( key.dptr );
183         }
184         if ( freeit )
185                 ldbm_datum_free( ldbm, key );
186 }