]> 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 9f3e4114e3c15160d88c663d09e99eda626f18cb..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;
@@ -158,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);
@@ -168,15 +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);
-                               PERR("CLAVE ENCONTRADA");
                                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);
                }
@@ -198,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);
@@ -369,15 +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;
-                       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++;
@@ -387,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++)
@@ -397,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);
@@ -478,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);
@@ -554,7 +571,6 @@ INDICE_DATO *emufs_indice_b_buscar_muchos(INDICE *idx, CLAVE clave, int *cant)
        }
 
        /* Busco la clave en el arbol */
-       PERR("Buscando clave");
        dato = emufs_indice_b_buscar(idx, clave);
 
        if (dato.id == -1) {
@@ -575,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;
 }
 
@@ -839,22 +854,21 @@ 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),
-                                                                       &error
-                                                               );
+                       leido,
+                       cant*sizeof(INDICE_DATO)+sizeof(int),
+                       &error
+               );
+               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,
-                                                                       leido,
-                                                                       cant*sizeof(INDICE_DATO)+sizeof(int),
-                                                                       &error
-                                                               );
+                       k.i_clave,
+                       leido,
+                       cant*sizeof(INDICE_DATO)+sizeof(int),
+                       &error
+               );
        }
        /* Clean up! */
        free(leido);
@@ -889,12 +903,16 @@ 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
                 */
                if (iguales > 1) {
-                       sprintf(salvar, "%d%s", iguales, resto);
+                       sprintf(salvar, "%d|%s", iguales, resto);
                        free(actual);
                        error = 0;
                        idx->emu_string->modificar_registro(idx->emu_string, array[i].clave.i_clave, salvar, strlen(salvar)+1, &error);
@@ -918,11 +936,15 @@ 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) {
+               if ((iguales > 0) && (*resto == '|')) {
                        strncpy(salvar, primera, iguales);
                        salvar[iguales] = '\0';
-                       strcat(salvar, resto);
+                       strcat(salvar, resto+1); /* +1 para saltar el separador */
                        idx->emu_string->modificar_registro(idx->emu_string, array[i].clave.i_clave, salvar, strlen(salvar)+1, &error);
                        free(actual);
                } else {