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