]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/indice_b.c
* BUGFIX : Se estaba haciendo mal es split y cuando habia muchos split (como
[z.facultad/75.06/emufs.git] / emufs / indice_b.c
index df096183359c6a03096021cf6c8d48fca81e319c..9a5118dabc05a223b8d952cf6b38b8e4ddd83b2b 100644 (file)
@@ -71,8 +71,6 @@ void emufs_indice_b_crear(INDICE *idx)
        header.hijo_izquierdo = -1;
 
        fp = fopen(idx->filename, "w");
-       PERR("Creando indice");
-       fprintf(stderr, "Archivo = (%s)\n", idx->filename);
        if (fp == NULL) {
                PERR("Error al crear el archivo");
                return;
@@ -120,7 +118,6 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato)
                
                        if (idx->tipo_dato == IDX_STRING) {
                                /* Tengo que sacar el texto repetido del archivo de textos */
-                               PERR("Eliminando string duplicado");
                                idx->emu_string->borrar_registro(idx->emu_string, clave);
                        }
                        return 1;
@@ -145,10 +142,6 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato)
                 */
                dummy.id = -1;
                dato.id = b_insertar_dup_en_pos(idx, dummy, dato);
-               if (dato.id != -1)
-                       PERR("NODO INSERTADO EN POS GENERADA NUEVA");
-       PERR("Ahora inserto");
-       fprintf(stderr, "Nombre del coso = %s\n", idx->nombre);
        }
 
        b_insertar_en_nodo(idx, clave, dato, nodo_id, nodo, -1, -1);
@@ -162,9 +155,11 @@ INDICE_DATO emufs_indice_b_buscar(INDICE *idx, CLAVE clave)
        B_NodoHeader header;
        B_NodoEntry *claves;
        char *nodo, *tmp;
+       int nodo_id;
        
        /* Leo la raiz */
        nodo = b_leer_nodo(idx, 0);
+       nodo_id = 0;
        while (nodo) {
                b_leer_header(nodo, &header);
                claves = b_leer_claves(nodo, &header);
@@ -172,14 +167,18 @@ INDICE_DATO emufs_indice_b_buscar(INDICE *idx, CLAVE clave)
                while ((i<header.cant) && (emufs_indice_es_menor(idx, claves[i].clave, clave))) i++;
                if ((i<header.cant) && (emufs_indice_es_igual(idx, claves[i].clave, clave))) {
                                ret = claves[i].dato;
+                               b_grabar_nodo(idx, nodo_id, nodo);
                                free(nodo);
                                return ret;
                } else {
                        tmp = nodo;
+                       b_grabar_nodo(idx, nodo_id, nodo);
                        if (i == 0) {
                                nodo = b_leer_nodo(idx, header.hijo_izquierdo);
+                               nodo_id = header.hijo_izquierdo;
                        } else {
                                nodo = b_leer_nodo(idx, claves[i-1].hijo_derecho);
+                               nodo_id = claves[i-1].hijo_derecho;
                        }
                        free(tmp);
                }
@@ -201,7 +200,6 @@ int emufs_indice_b_borrar(INDICE *idx, CLAVE k)
 
        nodo_id = 0; /* Tomo la raiz */
        nodo = b_leer_nodo(idx, nodo_id);
-       PERR("Buscando clave a borrar");
        while (nodo && !encontrado) {
                /* Obtengo los datos del nodo */
                b_leer_header(nodo, &header);
@@ -372,16 +370,25 @@ static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, INDICE_DATO dato, int n
                        i=0;
                        /* Creo una lista ordenada de los nodos a partir */
                        tmp_claves = (B_NodoEntry *)malloc(sizeof(B_NodoEntry)*(nodo_header.cant+1));
-                       total = nodo_header.cant;
+                       total = nodo_header.cant+1;
                        while ((i<nodo_header.cant) && (emufs_indice_es_menor(idx, claves[i].clave, clave))) {
                                tmp_claves[i] = claves[i];
                                i++;
                        }
                        tmp_claves[i].clave = clave;
                        tmp_claves[i].dato = dato;
-                       tmp_claves[i].hijo_derecho = hijo1;
-                       if (i<nodo_header.cant)
-                               tmp_claves[i+1].hijo_derecho = hijo2;
+                       /*tmp_claves[i].hijo_derecho = hijo1;*/
+                       if (i==0) {
+                               nodo_header.hijo_izquierdo = hijo1;
+                               tmp_claves[i].hijo_derecho = hijo2;
+                       } else {
+                               tmp_claves[i-1].hijo_derecho = hijo1;
+                               tmp_claves[i].hijo_derecho = hijo2;
+                       }
+/*                     if (i == 0)
+                               nodo_header.hijo_izquierdo = hijo2;
+                       else
+                               tmp_claves[i+1].hijo_derecho = hijo2;*/
                        while (i < nodo_header.cant) {
                                tmp_claves[i+1] = claves[i];
                                i++;
@@ -391,8 +398,8 @@ static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, INDICE_DATO dato, int n
                        b_leer_header(nuevo, &nuevo_header);
 
                        nuevo_header.nivel = nodo_header.nivel;
-                       nodo_header.cant = total/2;
-                       nuevo_header.cant = total - nodo_header.cant;
+                       nodo_header.cant = total/2-1;
+                       nuevo_header.cant = (total-1) - nodo_header.cant;
 
                        memset(claves, '*', idx->tam_bloque-sizeof(B_NodoHeader));
                        for(j=0; j<nodo_header.cant; j++)
@@ -401,7 +408,7 @@ static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, INDICE_DATO dato, int n
                        claves_nuevo = b_leer_claves(nuevo, &nuevo_header);
                        memset(claves_nuevo, '*', idx->tam_bloque-sizeof(B_NodoHeader));
                        for(j=0; j<nuevo_header.cant; j++)
-                               claves_nuevo[j] = tmp_claves[j+total/2+1];
+                               claves_nuevo[j] = tmp_claves[j+total/2];
 
                        b_actualizar_header(nodo, &nodo_header);
                        b_actualizar_header(nuevo, &nuevo_header);
@@ -482,8 +489,14 @@ void b_insertar_en_nodo_con_lugar(INDICE *idx, CLAVE clave, INDICE_DATO dato, in
        nodo_header.cant++;
        claves[i].clave = clave;
        claves[i].dato = dato;
-       claves[i].hijo_derecho = hijo2;
-       nodo_header.hijo_izquierdo = b_elegir_izquierdo(idx, nodo_header.hijo_izquierdo, hijo1);
+       if (i==0) {
+               nodo_header.hijo_izquierdo = hijo1;
+               claves[i].hijo_derecho = hijo2;
+       } else {
+               claves[i-1].hijo_derecho = hijo1;
+               claves[i].hijo_derecho = hijo2;
+       }
+       /*b_elegir_izquierdo(idx, nodo_header.hijo_izquierdo, hijo1);*/
 
        b_actualizar_header(nodo, &nodo_header);
        b_grabar_nodo(idx, nodo_id, nodo);
@@ -578,7 +591,6 @@ INDICE_DATO *emufs_indice_b_buscar_muchos(INDICE *idx, CLAVE clave, int *cant)
        ret = malloc(sizeof(INDICE_DATO)*(*cant));
        memcpy(ret, leido+sizeof(int), (*cant)*sizeof(INDICE_DATO));
        free(leido);
-       fprintf(stderr, "TENGO QUE ESTA CLAVE TIENE %d ITEMS\n", *cant);
        return ret;
 }
 
@@ -842,7 +854,6 @@ static EMUFS_REG_ID b_insertar_dup_en_pos(INDICE *idx, INDICE_DATO pos, INDICE_D
        if (k.i_clave == -1) {
                /* Creo uno nuevo */
                error = 0;
-               PERR("GRABADO REGISTRO NUEVO");
                k.i_clave = idx->emu_mult->grabar_registro(idx->emu_mult,
                        leido,
                        cant*sizeof(INDICE_DATO)+sizeof(int),
@@ -851,7 +862,6 @@ static EMUFS_REG_ID b_insertar_dup_en_pos(INDICE *idx, INDICE_DATO pos, INDICE_D
                if (k.i_clave == -1) PERR("ALGO NO GRABO BIEN!!");
        } else {
                /* Modifico el que ya existia! */
-               PERR("MODIFICANDO REGISTRO EXISTENTE");
                error = 0;
                idx->emu_mult->modificar_registro(idx->emu_mult,
                        k.i_clave,
@@ -893,6 +903,10 @@ static void abreviar_claves(INDICE *idx, B_NodoEntry *array, B_NodoHeader *heade
        primera = (char *)idx->emu_string->leer_registro(idx->emu_string, array[0].clave, &size, &error);
        for(i=1; i<header->cant; i++) {
                actual = (char *)idx->emu_string->leer_registro(idx->emu_string, array[i].clave, &size, &error);
+               if (*actual == '*') {
+                       free(actual);
+                       continue;
+               }
                resto = abreviar(primera, actual, &iguales);
                /* Para que tenga sentido abreviar tengo que tener
                 * mas de 2 letras iguales, si no no gano nada y complica las cosas
@@ -922,9 +936,12 @@ static void desabreviar_claves(INDICE *idx, B_NodoEntry *array, B_NodoHeader *he
        primera = (char *)idx->emu_string->leer_registro(idx->emu_string, array[0].clave, &size, &error);
        for(i=1; i<header->cant; i++) {
                actual = (char *)idx->emu_string->leer_registro(idx->emu_string, array[i].clave, &size, &error);
+               if (*actual == '*') {
+                       free(actual);
+                       continue;
+               }
                iguales = strtol(actual, &resto, 10);
                if ((iguales > 0) && (*resto == '|')) {
-                       fprintf(stderr, "%s %s %d\n", primera, actual, iguales); 
                        strncpy(salvar, primera, iguales);
                        salvar[iguales] = '\0';
                        strcat(salvar, resto+1); /* +1 para saltar el separador */