]> git.sur5r.net Git - openldap/commitdiff
Replaced add/delete_value() by change_value() and index_add/delete_value()
authorJuan Gomez <gomez@openldap.org>
Tue, 15 Jun 1999 23:56:28 +0000 (23:56 +0000)
committerJuan Gomez <gomez@openldap.org>
Tue, 15 Jun 1999 23:56:28 +0000 (23:56 +0000)
by index_change_values(). The functions were exactly the same but for
one call.

servers/slapd/back-ldbm/index.c
servers/slapd/back-ldbm/modify.c
servers/slapd/back-ldbm/proto-back-ldbm.h
servers/slapd/tools/ldif2index.c

index b27327dccb27b4bc50abba09406354c131cc43e8..5f8b7cec646450c7ff35bb7a1cea0a03d651ee14 100644 (file)
 #include "slap.h"
 #include "back-ldbm.h"
 
-static int     add_value(Backend *be,
+static int     change_value(Backend *be,
                          struct dbcache *db,
                          char *type,
                          int indextype,
                          char *val,
-                         ID id);
-static int     delete_value(Backend *be,
-                            struct dbcache *db,
-                            char *type,
-                            int indextype,
-                            char *val,
-                            ID id);
+                         ID id,
+                         int
+                         (*idl_func)(Backend *, struct dbcache *, Datum, ID));
 static int     index2prefix(int indextype);
 
 int
@@ -39,7 +35,7 @@ index_add_entry(
 
        /*
         * dn index entry - make it look like an attribute so it works
-        * with index_add_values() call
+        * with index_change_values() call
         */
 
        bv.bv_val = ch_strdup( e->e_ndn );
@@ -50,7 +46,7 @@ index_add_entry(
        /* add the dn to the indexes */
        {
                char *dn = ch_strdup("dn");
-               index_add_values( be, dn, bvals, e->e_id );
+               index_change_values( be, dn, bvals, e->e_id, __INDEX_ADD_OP );
                free( dn );
        }
 
@@ -59,7 +55,8 @@ index_add_entry(
        /* add each attribute to the indexes */
        for ( ap = e->e_attrs; ap != NULL; ap = ap->a_next ) {
 
-               index_add_values( be, ap->a_type, ap->a_vals, e->e_id );
+               index_change_values( be, ap->a_type, ap->a_vals, e->e_id,
+                                    __INDEX_ADD_OP );
        }
 
        Debug( LDAP_DEBUG_TRACE, "<= index_add( %ld, \"%s\" ) 0\n", e->e_id,
@@ -85,12 +82,18 @@ index_add_mods(
                         * gets called we lost values already!
                         */
                case LDAP_MOD_ADD:
-                       rc = index_add_values( be, mod->mod_type,
-                           mod->mod_bvalues, id );
+                       rc = index_change_values( be,
+                                              mod->mod_type,
+                                              mod->mod_bvalues,
+                                              id,
+                                              __INDEX_ADD_OP);
                        break;
                case LDAP_MOD_DELETE:
-                       rc =  index_delete_values( be, mod->mod_type,
-                           mod->mod_bvalues, id );
+                       rc =  index_change_values( be,
+                                                  mod->mod_type,
+                                                  mod->mod_bvalues,
+                                                  id,
+                                                  __INDEX_DELETE_OP );
                        break;
                case LDAP_MOD_SOFTADD:  /* SOFTADD means index was there */
                        rc = 0;
@@ -169,34 +172,32 @@ index_read(
        key.dsize = strlen( realval ) + 1;
 
        idl = idl_fetch( be, db, key );
-      if ( tmpval != NULL ) {
+       if ( tmpval != NULL ) {
               free( tmpval );
-      }
+       }
 
        ldbm_cache_close( be, db );
 
        Debug( LDAP_DEBUG_TRACE, "<= index_read %ld candidates\n",
-           idl ? ID_BLOCK_NIDS(idl) : 0, 0, 0 );
+              idl ? ID_BLOCK_NIDS(idl) : 0, 0, 0 );
        return( idl );
 }
 
-/* Remove values from index files */
+/* Add or remove stuff from index files */
 
 static int
-delete_value(
+change_value(
     Backend            *be,
     struct dbcache     *db,
     char               *type,
     int                        indextype,
     char               *val,
-    ID                 id
+    ID                 id,
+    int                        (*idl_func)(Backend *, struct dbcache *, Datum, ID)
 )
 {
-
        int     rc;
        Datum   key;
-       /* XXX do we need idl ??? */
-       ID_BLOCK        *idl = NULL;
        char    *tmpval = NULL;
        char    *realval = val;
        char    buf[BUFSIZ];
@@ -206,8 +207,8 @@ delete_value(
        ldbm_datum_init( key );
 
        Debug( LDAP_DEBUG_TRACE,
-              "=> delete_value( \"%c%s\" )\n",
-              prefix, val, 0 );
+              "=> change_value( \"%c%s\", op=%s )\n",
+              prefix, val, (idl_func == idl_insert_key ? "ADD":"DELETE") );
 
        if ( prefix != UNKNOWN_PREFIX ) {
               unsigned int     len = strlen( val );
@@ -226,147 +227,105 @@ delete_value(
        key.dptr = realval;
        key.dsize = strlen( realval ) + 1;
 
-       rc = idl_delete_key( be, db, key, id );
+       rc = idl_func( be, db, key, id );
 
        if ( tmpval != NULL ) {
                free( tmpval );
        }
 
-       if( idl != NULL ) {
-               idl_free( idl );
-       }
-
        ldap_pvt_thread_yield();
 
-       Debug( LDAP_DEBUG_TRACE, "<= delete_value %d\n", rc, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "<= change_value %d\n", rc, 0, 0 );
 
        return( rc );
 
-}/* static int delete_value() */
-
-static int
-add_value(
-    Backend            *be,
-    struct dbcache     *db,
-    char               *type,
-    int                        indextype,
-    char               *val,
-    ID                 id
-)
-{
-       int     rc;
-       Datum   key;
-       /* XXX do we need idl ??? */
-       ID_BLOCK        *idl = NULL;
-       char    *tmpval = NULL;
-       char    *realval = val;
-       char    buf[BUFSIZ];
-
-       char    prefix = index2prefix( indextype );
-
-       ldbm_datum_init( key );
-
-       Debug( LDAP_DEBUG_TRACE, "=> add_value( \"%c%s\" )\n", prefix, val, 0 );
-
-       if ( prefix != UNKNOWN_PREFIX ) {
-              unsigned int     len = strlen( val );
-
-              if ( (len + 2) < sizeof(buf) ) {
-                       realval = buf;
-               } else {
-                       /* value + prefix + null */
-                       tmpval = (char *) ch_malloc( len + 2 );
-                       realval = tmpval;
-               }
-              realval[0] = prefix;
-              strcpy( &realval[1], val );
-       }
-
-       key.dptr = realval;
-       key.dsize = strlen( realval ) + 1;
-
-       rc = idl_insert_key( be, db, key, id );
+}/* static int change_value() */
 
-       if ( tmpval != NULL ) {
-               free( tmpval );
-       }
-
-       if( idl != NULL ) {
-               idl_free( idl );
-       }
-
-       ldap_pvt_thread_yield();
-
-       /* Debug( LDAP_DEBUG_TRACE, "<= add_value %d\n", rc, 0, 0 ); */
-       return( rc );
-}
-
-/* Remove entries from index files */
 
 int
-index_delete_values(
+index_change_values(
     Backend            *be,
     char               *type,
     struct berval      **vals,
-    ID                 id
+    ID                 id,
+    unsigned int       op
 )
 {
-       int             indexmask, syntax;
-       char            *at_cn; /* Attribute canonical name */
-       struct dbcache  *db;
        char            *val, *p, *code, *w;
        unsigned        i, j, len;
+       int             indexmask, syntax;
        char            buf[SUBLEN + 1];
        char            vbuf[BUFSIZ];
        char            *bigbuf;
+       struct dbcache  *db;
 
+       int             (*idl_funct)(Backend *,
+                                   struct dbcache *,
+                                   Datum, ID);
+       char            *at_cn; /* Attribute canonical name */
+       int             mode;
 
        Debug( LDAP_DEBUG_TRACE,
-              "=> index_delete_values( \"%s\", %ld )\n", 
-              (type ? type : "(NULL)"),
-              id,
-              0 );
-              
+              "=> index_change_values( \"%s\", %ld, op=%s )\n", 
+              type, id, ((op == __INDEX_ADD_OP) ? "ADD" : "DELETE" ) );
+
+       
+       if (op == __INDEX_ADD_OP) {
+
+           /* Add values */
+
+           idl_funct =  idl_insert_key;
+           mode = LDBM_WRCREAT;
+
+       } else {
+
+           /* Delete values */
+
+           idl_funct = idl_delete_key;
+           mode = LDBM_WRITER;
+
+       }
+
        attr_normalize(type);
        attr_masks( be->be_private, type, &indexmask, &syntax );
-       
+
        if ( indexmask == 0 ) {
                return( 0 );
        }
 
        at_cn = at_canonical_name( type );
 
-       if ( (db = ldbm_cache_open( be, at_cn, LDBM_SUFFIX, LDBM_WRITER ))
+       if ( (db = ldbm_cache_open( be, at_cn, LDBM_SUFFIX, mode ))
             == NULL ) {
-
                Debug( LDAP_DEBUG_ANY,
-                      "<= index_delete_values -1 (could not open(wr) %s%s)\n",
+                      "<= index_change_values (couldn't open(%s%s),md=%s)\n",
                       at_cn,
                       LDBM_SUFFIX,
-                      0 );
+                      ((mode==LDBM_WRCREAT)?"LDBM_WRCREAT":"LDBM_WRITER") );
                return( -1 );
-
        }
 
-       /* Remove each value from index file */
-       
-       for ( i = 0; vals[i] != NULL; i++ ) {
 
+       for ( i = 0; vals[i] != NULL; i++ ) {
                /*
-                * Presence index entry
+                * presence index entry
                 */
-
                if ( indexmask & INDEX_PRESENCE ) {
-                       delete_value( be, db, at_cn, INDEX_PRESENCE, "*", id );
+
+                       change_value( be, db, at_cn, INDEX_PRESENCE,
+                                     "*", id, idl_funct );
+
                }
 
                Debug( LDAP_DEBUG_TRACE,
-                      "*** index_add_values syntax 0x%x syntax bin 0x%x\n",
+                      "index_change_values syntax 0x%x syntax bin 0x%x\n",
                       syntax, SYNTAX_BIN, 0 );
 
                if ( syntax & SYNTAX_BIN ) {
+
                        ldbm_cache_close( be, db );
                        return( 0 );
+
                }
 
                bigbuf = NULL;
@@ -374,32 +333,26 @@ index_delete_values(
 
                /* value + null */
                if ( len + 2 > sizeof(vbuf) ) {
-
                        bigbuf = (char *) ch_malloc( len + 1 );
                        val = bigbuf;
-
                } else {
-
                        val = vbuf;
-
                }
-
                (void) memcpy( val, vals[i]->bv_val, len );
                val[len] = '\0';
 
                value_normalize( val, syntax );
 
                /* value_normalize could change the length of val */
-
                len = strlen( val );
 
                /*
                 * equality index entry
                 */
-
                if ( indexmask & INDEX_EQUALITY ) {
                    
-                       delete_value( be, db, at_cn, INDEX_EQUALITY, val, id );
+                       change_value( be, db, at_cn, INDEX_EQUALITY,
+                                     val, id, idl_funct);
 
                }
 
@@ -407,46 +360,35 @@ index_delete_values(
                 * approximate index entry
                 */
                if ( indexmask & INDEX_APPROX ) {
-                   
-                       for ( w = first_word( val );
-                             w != NULL;
-                             w = next_word( w ) ) {
-                           
+                       for ( w = first_word( val ); w != NULL;
+                           w = next_word( w ) ) {
                                if ( (code = phonetic( w )) != NULL ) {
-
-                                       delete_value( be,
+                                       change_value( be,
                                                      db,
                                                      at_cn,
                                                      INDEX_APPROX,
                                                      code,
-                                                     id );
+                                                     id,
+                                                     idl_funct );
                                        free( code );
                                }
                        }
-
                }
 
                /*
                 * substrings index entry
                 */
-
                if ( indexmask & INDEX_SUB ) {
-
                        /* leading and trailing */
                        if ( len > SUBLEN - 2 ) {
-
                                buf[0] = '^';
                                for ( j = 0; j < SUBLEN - 1; j++ ) {
                                        buf[j + 1] = val[j];
                                }
                                buf[SUBLEN] = '\0';
 
-                               delete_value( be,
-                                             db,
-                                             at_cn,
-                                             INDEX_SUB,
-                                             buf,
-                                             id );
+                               change_value( be, db, at_cn, INDEX_SUB,
+                                             buf, id, idl_funct );
 
                                p = val + len - SUBLEN + 1;
                                for ( j = 0; j < SUBLEN - 1; j++ ) {
@@ -455,159 +397,8 @@ index_delete_values(
                                buf[SUBLEN - 1] = '$';
                                buf[SUBLEN] = '\0';
 
-                               delete_value( be,
-                                             db,
-                                             at_cn,
-                                             INDEX_SUB,
-                                             buf,
-                                             id );
-
-                       }
-
-                       /* any */
-
-                       for (p = val; p < (val + len - SUBLEN + 1); p++) {
-
-                               for ( j = 0; j < SUBLEN; j++ ) {
-                                       buf[j] = p[j];
-                               }
-                               buf[SUBLEN] = '\0';
-
-                               delete_value( be,
-                                             db,
-                                             at_cn,
-                                             INDEX_SUB,
-                                             buf,
-                                             id );
-                       }/* for (p = val; p < (val + len - SUBLEN + 1); p++) */
-
-               }/* if ( indexmask & INDEX_SUB ) */
-
-               if ( bigbuf != NULL ) {
-
-                       free( bigbuf );
-
-               }
-
-       }/* for ( i = 0; vals[i] != NULL; i++ ) */
-
-       ldbm_cache_close( be, db );
-
-       return 0;
-
-}
-
-int
-index_add_values(
-    Backend            *be,
-    char               *type,
-    struct berval      **vals,
-    ID                 id
-)
-{
-       char            *val, *p, *code, *w;
-       unsigned        i, j, len;
-       int             indexmask, syntax;
-       char            buf[SUBLEN + 1];
-       char            vbuf[BUFSIZ];
-       char            *bigbuf;
-       struct dbcache  *db;
-
-       char            *at_cn; /* Attribute canonical name */
-
-       Debug( LDAP_DEBUG_TRACE, "=> index_add_values( \"%s\", %ld )\n", type,
-           id, 0 );
-       attr_normalize(type);
-       attr_masks( be->be_private, type, &indexmask, &syntax );
-       if ( indexmask == 0 ) {
-               return( 0 );
-       }
-       at_cn = at_canonical_name( type );
-       if ( (db = ldbm_cache_open( be, at_cn, LDBM_SUFFIX, LDBM_WRCREAT ))
-           == NULL ) {
-               Debug( LDAP_DEBUG_ANY,
-                   "<= index_add_values -1 (could not open/create %s%s)\n",
-                   at_cn, LDBM_SUFFIX, 0 );
-               return( -1 );
-       }
-
-
-       for ( i = 0; vals[i] != NULL; i++ ) {
-               /*
-                * presence index entry
-                */
-               if ( indexmask & INDEX_PRESENCE ) {
-                       add_value( be, db, at_cn, INDEX_PRESENCE, "*", id );
-               }
-
-               Debug( LDAP_DEBUG_TRACE, "*** index_add_values syntax 0x%x syntax bin 0x%x\n",
-                   syntax, SYNTAX_BIN, 0 );
-               if ( syntax & SYNTAX_BIN ) {
-                       ldbm_cache_close( be, db );
-                       return( 0 );
-               }
-
-               bigbuf = NULL;
-               len = vals[i]->bv_len;
-
-               /* value + null */
-               if ( len + 2 > sizeof(vbuf) ) {
-                       bigbuf = (char *) ch_malloc( len + 1 );
-                       val = bigbuf;
-               } else {
-                       val = vbuf;
-               }
-               (void) memcpy( val, vals[i]->bv_val, len );
-               val[len] = '\0';
-
-               value_normalize( val, syntax );
-
-               /* value_normalize could change the length of val */
-               len = strlen( val );
-
-               /*
-                * equality index entry
-                */
-               if ( indexmask & INDEX_EQUALITY ) {
-                       add_value( be, db, at_cn, INDEX_EQUALITY, val, id );
-               }
-
-               /*
-                * approximate index entry
-                */
-               if ( indexmask & INDEX_APPROX ) {
-                       for ( w = first_word( val ); w != NULL;
-                           w = next_word( w ) ) {
-                               if ( (code = phonetic( w )) != NULL ) {
-                                       add_value( be, db, at_cn, INDEX_APPROX,
-                                           code, id );
-                                       free( code );
-                               }
-                       }
-               }
-
-               /*
-                * substrings index entry
-                */
-               if ( indexmask & INDEX_SUB ) {
-                       /* leading and trailing */
-                       if ( len > SUBLEN - 2 ) {
-                               buf[0] = '^';
-                               for ( j = 0; j < SUBLEN - 1; j++ ) {
-                                       buf[j + 1] = val[j];
-                               }
-                               buf[SUBLEN] = '\0';
-
-                               add_value( be, db, at_cn, INDEX_SUB, buf, id );
-
-                               p = val + len - SUBLEN + 1;
-                               for ( j = 0; j < SUBLEN - 1; j++ ) {
-                                       buf[j] = p[j];
-                               }
-                               buf[SUBLEN - 1] = '$';
-                               buf[SUBLEN] = '\0';
-
-                               add_value( be, db, at_cn, INDEX_SUB, buf, id );
+                               change_value( be, db, at_cn, INDEX_SUB,
+                                             buf, id, idl_funct );
                        }
 
                        /* any */
@@ -617,7 +408,8 @@ index_add_values(
                                }
                                buf[SUBLEN] = '\0';
 
-                               add_value( be, db, at_cn, INDEX_SUB, buf, id );
+                               change_value( be, db, at_cn, INDEX_SUB,
+                                             buf, id, idl_funct );
                        }
                }
 
@@ -628,7 +420,8 @@ index_add_values(
        ldbm_cache_close( be, db );
 
        return( 0 );
-}
+
+}/* int index_change_values() */
 
 static int
 index2prefix( int indextype )
index 99048ce61c6d7b4857be2dc969eed9a9a297a31e..ff79544fb05b0266de4c58cc32701ccad03c9763 100644 (file)
@@ -150,8 +150,11 @@ int ldbm_modify_internal(
                            && ((a = attr_find( e->e_attrs, mod->mod_type ))
                           != NULL) ) {
 
-                           (void) index_delete_values( be, mod->mod_type,
-                                                       a->a_vals, e->e_id );
+                           (void) index_change_values( be,
+                                                       mod->mod_type,
+                                                       a->a_vals,
+                                                       e->e_id,
+                                                       __INDEX_DELETE_OP);
                        }
 
                        err = replace_values( e, mod, op->o_ndn );
index 8c01f5827520c06f051c5cd813e27420e98af545..a5066eff8b14b8c00a0d1b193e9e2fe4404f92b3 100644 (file)
@@ -129,8 +129,15 @@ ID idl_nextid LDAP_P(( ID_BLOCK *idl, ID id ));
 int index_add_entry LDAP_P(( Backend *be, Entry *e ));
 int index_add_mods LDAP_P(( Backend *be, LDAPModList *ml, ID id ));
 ID_BLOCK * index_read LDAP_P(( Backend *be, char *type, int indextype, char *val ));
-int index_add_values LDAP_P(( Backend *be, char *type, struct berval **vals, ID  id ));
-int index_delete_values LDAP_P(( Backend *be, char *type, struct berval **vals, ID  id ));
+/* Possible operations supported (op) by index_change_values() */
+#define __INDEX_ADD_OP         0x0001
+#define __INDEX_DELETE_OP      0x0002
+int index_change_values LDAP_P(( Backend *be,
+                                char *type,
+                                struct berval **vals,
+                                ID  id,
+                                unsigned int op ));
+
 
 /*
  * kerberos.c
index 4c620e212000144bb94fd75c3c53ecdf17e91337..4343d4bb2163565b6de24bf637e68f0aa2e95445 100644 (file)
@@ -161,8 +161,11 @@ main( int argc, char **argv )
                                        if ( strcasecmp( type, attr ) == 0 ) {
                                                bv.bv_val = val;
                                                bv.bv_len = vlen;
-                                               index_add_values( be, attr,
-                                                   vals, id );
+                                               index_change_values( be,
+                                                                    attr,
+                                                                    vals,
+                                                                    id,
+                                                              __INDEX_ADD_OP);
                                        }
                                }
                        }