13 #define CACHE_SIZE 1000000
15 #define DB_FLAGS (LDBM_WRCREAT|LDBM_NEWDB)
18 extern char *first_word(char *);
19 extern char *next_word(char *);
20 extern char *word_dup(char *);
21 extern char *phonetic(char *);
23 extern int ldap_debug;
24 extern int lber_debug;
27 int ldap_syslog_level;
29 static void add(LDBM ldbm, char *s, int *count, int *size, int freeit);
32 main( int argc, char **argv )
36 int i, j, k, count, len, nentries;
37 int vcount, wcount, pcount, scount;
38 int vsize, wsize, psize, ssize;
39 struct berval **bvals;
43 LDBM wldbm, pldbm, sldbm;
44 static char *attrs[] = { "cn", "nentries", NULL };
50 if ( (ld = ldap_open( "vertigo:5555", 0 )) == NULL ) {
51 perror( "ldap_open" );
55 if ( ldap_search( ld, "cn=index", LDAP_SCOPE_ONELEVEL, "(objectclass=*)",
57 ldap_perror( ld, "ldap_search" );
61 printf( "attr\tdn\tnentries\tvcount\tvsize\twcount\twsize\tpcount\tpsize\tscount\tssize\n" );
64 while ( ldap_result( ld, LDAP_RES_ANY, 0, NULL, &res )
65 == LDAP_RES_SEARCH_ENTRY ) {
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 );
73 fprintf( stderr, "no nentries attribute for (%s)\n", dn );
77 for ( i = 0; attrs[i] != NULL; i++ ) {
78 if ( strcasecmp( attrs[i], "nentries" ) == 0 ) {
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" );
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++ ) {
97 ldbm_datum_init( key );
98 ldbm_datum_init( data );
100 /* update value count */
102 vsize += bvals[j]->bv_len;
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 );
109 add( pldbm, phonetic( w ), &pcount, &psize, 1 );
112 /* update substring count */
113 len = bvals[j]->bv_len;
114 val = bvals[j]->bv_val;
115 if ( len > SUBLEN - 2 ) {
117 for ( k = 0; k < SUBLEN - 1; k++ ) {
121 add( sldbm, buf, &scount, &ssize, 0 );
123 p = val + len - SUBLEN + 1;
124 for ( k = 0; k < SUBLEN; k++ ) {
127 buf[SUBLEN - 1] = '$';
129 add( sldbm, buf, &scount, &ssize, 0 );
131 for ( p = val; p < (val + len - SUBLEN + 1); p++ ) {
132 for ( k = 0; k < SUBLEN; k++ ) {
136 add( sldbm, buf, &scount, &ssize, 0 );
139 ldap_value_free_len( bvals );
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 );
156 printf( "%d entries\n", count );
159 if ( ldap_result2error( ld, res, 1 ) != LDAP_SUCCESS ) {
160 ldap_perror( ld, "ldap_result" );
164 (void) unlink( "wcount.ldbm" );
165 (void) unlink( "pcount.ldbm" );
166 (void) unlink( "scount.ldbm" );
182 ldbm_datum_init( key );
183 ldbm_datum_init( data );
186 key.dsize = strlen( key.dptr ) + 1;
189 if ( ldbm_store( ldbm, key, data, LDBM_INSERT ) == 0 ) {
191 (*size) += strlen( key.dptr );
193 if ( freeit && ( key.dptr != NULL ) )
194 ldbm_datum_free( ldbm, key );