]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/indice_b.c
Ultimas correcciones.
[z.facultad/75.06/emufs.git] / emufs / indice_b.c
index dc483fe25a07c400c95bdbb0499dc79f26b97dd6..db5e269df48ac9c931db8f46ca380ae5fcc48691 100644 (file)
@@ -75,6 +75,7 @@ void emufs_indice_b_crear(INDICE *idx)
        memcpy(bloque, &header, sizeof(B_NodoHeader));
 
        fwrite(bloque, idx->tam_bloque, 1, fp);
        memcpy(bloque, &header, sizeof(B_NodoHeader));
 
        fwrite(bloque, idx->tam_bloque, 1, fp);
+       free(bloque);
        fclose(fp);
 }
 
        fclose(fp);
 }
 
@@ -104,8 +105,9 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato)
                                PERR(idx->nombre);
                                return 0;
                        }
                                PERR(idx->nombre);
                                return 0;
                        }
-                       
-                       b_insertar_dup_en_pos(idx, claves[i].dato, dato);
+       
+                       if ((idx->funcion == IND_SELECCION) && (!emufs_indice_es_clave_nula(idx, clave)))
+                               b_insertar_dup_en_pos(idx, claves[i].dato, dato);
                
                        if (idx->tipo_dato == IDX_STRING) {
                                /* Tengo que sacar el texto repetido del archivo de textos */
                
                        if (idx->tipo_dato == IDX_STRING) {
                                /* Tengo que sacar el texto repetido del archivo de textos */
@@ -131,6 +133,11 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato)
                /* Agrego el DATO real al archivo de claves repetiras
                 * y me guardo el ID para poner en el indice
                 */
                /* Agrego el DATO real al archivo de claves repetiras
                 * y me guardo el ID para poner en el indice
                 */
+               if ((idx->funcion == IND_SELECCION) && (emufs_indice_es_clave_nula(idx, clave)))
+                       /* UPS!, la clave que se va a insertar por primera vez es nula
+                        * y soy un indice selectivo!, no lo puedo permitir, ciao!!
+                        */
+                       return 1;
                dummy.id = -1;
                dato.id = b_insertar_dup_en_pos(idx, dummy, dato);
        }
                dummy.id = -1;
                dato.id = b_insertar_dup_en_pos(idx, dummy, dato);
        }
@@ -216,7 +223,6 @@ int emufs_indice_b_borrar(INDICE *idx, CLAVE k, INDICE_DATO dato)
 
        if (encontrado) {
                PERR("Clave encontrada, borrando ...");
 
        if (encontrado) {
                PERR("Clave encontrada, borrando ...");
-               fprintf(stderr, "%s: La clave a borrar esta en el nodo %d\n", idx->nombre, nodo_id);
                if (idx->funcion != IND_PRIMARIO) {
                        /* Debo borrar primero la clave desde el archivo de
                         * claves repetidas, y si recien ahi me quedo sin claves,
                if (idx->funcion != IND_PRIMARIO) {
                        /* Debo borrar primero la clave desde el archivo de
                         * claves repetidas, y si recien ahi me quedo sin claves,
@@ -224,7 +230,6 @@ int emufs_indice_b_borrar(INDICE *idx, CLAVE k, INDICE_DATO dato)
                         */
                        PERR("Vamos a borrar duplicados");
                        encontrado = b_borrar_dup_clave(idx, claves[i].dato, dato);
                         */
                        PERR("Vamos a borrar duplicados");
                        encontrado = b_borrar_dup_clave(idx, claves[i].dato, dato);
-                       fprintf(stderr, "Listo, encontrado = %d\n", encontrado);
                }
                if (encontrado) {
                        b_borrar_clave(idx, nodo, nodo_id, k);
                }
                if (encontrado) {
                        b_borrar_clave(idx, nodo, nodo_id, k);
@@ -272,8 +277,8 @@ char *b_leer_nodo(INDICE *idx, int id)
 {
        FILE *fp;
        char *out;
 {
        FILE *fp;
        char *out;
-       /*B_NodoHeader header;
-       B_NodoEntry *claves;*/
+       B_NodoHeader header;
+       B_NodoEntry *claves;
 
        if (id < 0) return NULL;
 
 
        if (id < 0) return NULL;
 
@@ -296,11 +301,11 @@ char *b_leer_nodo(INDICE *idx, int id)
        }
 
        /* Si estoy manejando string tengo que sacar las abreviaturas */
        }
 
        /* Si estoy manejando string tengo que sacar las abreviaturas */
-/*     if (idx->tipo_dato == IDX_STRING) {
+       if (idx->tipo_dato == IDX_STRING) {
                b_leer_header(out, &header);
                claves = b_leer_claves(out, &header);
                desabreviar_claves(idx, claves, &header);
                b_leer_header(out, &header);
                claves = b_leer_claves(out, &header);
                desabreviar_claves(idx, claves, &header);
-       }*/
+       }
        fclose(fp);
        return out;
 }
        fclose(fp);
        return out;
 }
@@ -308,15 +313,15 @@ char *b_leer_nodo(INDICE *idx, int id)
 static void b_grabar_nodo(INDICE *idx, int id, char *data)
 {
        FILE *fp;
 static void b_grabar_nodo(INDICE *idx, int id, char *data)
 {
        FILE *fp;
-       /*B_NodoHeader header;
-       B_NodoEntry *claves;*/
+       B_NodoHeader header;
+       B_NodoEntry *claves;
 
        /* Si las claves son de tipo string debo abreviar antes de guardar */
 
        /* Si las claves son de tipo string debo abreviar antes de guardar */
-/*     if (idx->tipo_dato == IDX_STRING) {
+       if (idx->tipo_dato == IDX_STRING) {
                b_leer_header(data, &header);
                claves = b_leer_claves(data, &header);
                abreviar_claves(idx, claves, &header);
                b_leer_header(data, &header);
                claves = b_leer_claves(data, &header);
                abreviar_claves(idx, claves, &header);
-       }*/
+       }
        fp = fopen(idx->filename, "r+");
        fseek(fp, id*idx->tam_bloque, SEEK_SET);
        fwrite(data, 1, idx->tam_bloque, fp);
        fp = fopen(idx->filename, "r+");
        fseek(fp, id*idx->tam_bloque, SEEK_SET);
        fwrite(data, 1, idx->tam_bloque, fp);
@@ -466,7 +471,6 @@ static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, INDICE_DATO dato, int n
                                hijo1 = nodo_id;
                                hijo2 = nuevo_id;
 
                                hijo1 = nodo_id;
                                hijo2 = nuevo_id;
 
-                               fprintf(stderr, "Nodos espliteados = %d %d\n", hijo1, hijo2);
                                nodo = padre;
                                nodo_id = nodo_header.padre;
                        } else {
                                nodo = padre;
                                nodo_id = nodo_header.padre;
                        } else {
@@ -491,7 +495,6 @@ static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, INDICE_DATO dato, int n
                                hijo1 = nuevo_id+1;
                                hijo2 = nuevo_id;
 
                                hijo1 = nuevo_id+1;
                                hijo2 = nuevo_id;
 
-                               fprintf(stderr, "Nodos espliteados = %d %d\n", hijo1, hijo2);
                                /* Limpio al padre */
                                nuevo = b_leer_nodo(idx, 0);
 
                                /* Limpio al padre */
                                nuevo = b_leer_nodo(idx, 0);
 
@@ -500,7 +503,6 @@ static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, INDICE_DATO dato, int n
                                nuevo_header.padre = -1;
                                nuevo_header.nivel = nodo_header.nivel+1;
                                nuevo_header.hijo_izquierdo = -1;
                                nuevo_header.padre = -1;
                                nuevo_header.nivel = nodo_header.nivel+1;
                                nuevo_header.hijo_izquierdo = -1;
-                               fprintf(stderr, "root.nivel=%d\n", nuevo_header.nivel);
                                memset(nuevo, -1, idx->tam_bloque);
                                b_actualizar_header(nuevo, &nuevo_header);
                                b_grabar_nodo(idx, 0, nuevo);
                                memset(nuevo, -1, idx->tam_bloque);
                                b_actualizar_header(nuevo, &nuevo_header);
                                b_grabar_nodo(idx, 0, nuevo);
@@ -549,7 +551,6 @@ void b_insertar_en_nodo_con_lugar(INDICE *idx, CLAVE clave, INDICE_DATO dato, in
                char* nuevo = b_leer_nodo(idx, hijo_izq);
                if (nuevo != NULL) {
                        B_NodoHeader nuevo_header;
                char* nuevo = b_leer_nodo(idx, hijo_izq);
                if (nuevo != NULL) {
                        B_NodoHeader nuevo_header;
-                       fprintf(stderr, "Actualizo padre de %d a %d\n", hijo_izq, nodo_id);
                        b_leer_header(nuevo, &nuevo_header);
                        nuevo_header.padre = nodo_id;
                        b_actualizar_header(nuevo, &nuevo_header);
                        b_leer_header(nuevo, &nuevo_header);
                        nuevo_header.padre = nodo_id;
                        b_actualizar_header(nuevo, &nuevo_header);
@@ -561,7 +562,6 @@ void b_insertar_en_nodo_con_lugar(INDICE *idx, CLAVE clave, INDICE_DATO dato, in
                char* nuevo = b_leer_nodo(idx, hijo_der);
                if (nuevo != NULL) {
                        B_NodoHeader nuevo_header;
                char* nuevo = b_leer_nodo(idx, hijo_der);
                if (nuevo != NULL) {
                        B_NodoHeader nuevo_header;
-                       fprintf(stderr, "Actualizo padre de %d a %d\n", hijo_der, nodo_id);
                        b_leer_header(nuevo, &nuevo_header);
                        nuevo_header.padre = nodo_id;
                        b_actualizar_header(nuevo, &nuevo_header);
                        b_leer_header(nuevo, &nuevo_header);
                        nuevo_header.padre = nodo_id;
                        b_actualizar_header(nuevo, &nuevo_header);
@@ -662,7 +662,6 @@ static void b_borrar_clave(INDICE *idx, char *nodo, int nodo_id, CLAVE k)
        while (emufs_indice_es_menor(idx, claves[pos].clave, k)) pos++;
 
        /* Es el nodo una hoja? */
        while (emufs_indice_es_menor(idx, claves[pos].clave, k)) pos++;
 
        /* Es el nodo una hoja? */
-       fprintf(stderr, "La clave esta en la pos = %d\n", pos);
        if (header.hijo_izquierdo != -1) {
                PERR("Nodo no es hoja, intercambio");
                actual = b_leer_nodo(idx, claves[pos].hijo_derecho);
        if (header.hijo_izquierdo != -1) {
                PERR("Nodo no es hoja, intercambio");
                actual = b_leer_nodo(idx, claves[pos].hijo_derecho);
@@ -704,7 +703,6 @@ static void b_borrar_clave(INDICE *idx, char *nodo, int nodo_id, CLAVE k)
 
        /* Se cumple la condicion de hijos? */
        PERR("Dejo todo consistente");
 
        /* Se cumple la condicion de hijos? */
        PERR("Dejo todo consistente");
-       fprintf(stderr, "Condicion : %d >= %d\n", header_actual.cant, MIN_HIJOS(idx));
        if ((header_actual.cant >= MIN_HIJOS(idx)) || (actual_id == 0)) {
                PERR("Borrar completo sin fundir");
                return;
        if ((header_actual.cant >= MIN_HIJOS(idx)) || (actual_id == 0)) {
                PERR("Borrar completo sin fundir");
                return;
@@ -718,7 +716,6 @@ static void b_borrar_clave(INDICE *idx, char *nodo, int nodo_id, CLAVE k)
                padre = b_leer_nodo(idx, padre_id);
                b_leer_header(padre, &header_padre);
                claves_padre = b_leer_claves(padre, &header_padre);
                padre = b_leer_nodo(idx, padre_id);
                b_leer_header(padre, &header_padre);
                claves_padre = b_leer_claves(padre, &header_padre);
-               fprintf(stderr, "ID del padre = %d de nivel %d\n", padre_id, header_padre.nivel);
                /* TODO Tengo el hijo_izquierdo para revisar!! XXX */
                if (header_padre.hijo_izquierdo == actual_id) {
                        PERR("Soy el hijo izquierdo de padre");
                /* TODO Tengo el hijo_izquierdo para revisar!! XXX */
                if (header_padre.hijo_izquierdo == actual_id) {
                        PERR("Soy el hijo izquierdo de padre");
@@ -760,14 +757,11 @@ static void b_borrar_clave(INDICE *idx, char *nodo, int nodo_id, CLAVE k)
                PERR("Ta calcule lo que tengo que hacer");
                if ((derecha_id != -1) && (header_der.cant > MIN_HIJOS(idx))) {
                        PERR("Le pido clave a derecha");
                PERR("Ta calcule lo que tengo que hacer");
                if ((derecha_id != -1) && (header_der.cant > MIN_HIJOS(idx))) {
                        PERR("Le pido clave a derecha");
-                       fprintf(stderr, "ANTES DE PEDIR DERECHA TENGO %d claves\n", header_actual.cant);
-                       fprintf(stderr, "PEDIR DERECHA DATOS : yo=%d, padre=%d, der=%d, pos_clave=%d\n", actual_id, padre_id, derecha_id, pos_padre);
                        b_pedir_clave_derecha(der, derecha_id, padre, padre_id, actual, actual_id, pos_padre);
                        PERR("listo");
                        b_leer_header(der, &header_der);
                        b_leer_header(padre, &header_padre);
                        b_leer_header(actual, &header_actual);
                        b_pedir_clave_derecha(der, derecha_id, padre, padre_id, actual, actual_id, pos_padre);
                        PERR("listo");
                        b_leer_header(der, &header_der);
                        b_leer_header(padre, &header_padre);
                        b_leer_header(actual, &header_actual);
-                       fprintf(stderr, "DESPUES DE PEDIR DERECHA TENGO %d claves\n", header_actual.cant);
                } else if ((izquierda_id != -1) && (header_izq.cant > MIN_HIJOS(idx))) {
                        PERR("Le pido clave a izquierda");
                        b_pedir_clave_izquierda(izq, izquierda_id, padre, padre_id, actual, actual_id, pos_padre);
                } else if ((izquierda_id != -1) && (header_izq.cant > MIN_HIJOS(idx))) {
                        PERR("Le pido clave a izquierda");
                        b_pedir_clave_izquierda(izq, izquierda_id, padre, padre_id, actual, actual_id, pos_padre);
@@ -845,6 +839,7 @@ void b_pasar_clave_a_derecha(INDICE *idx, char *der, int der_id, char *padre, in
        b_leer_header(der, &der_h);
        padre_entries = b_leer_claves(padre, &padre_h);
        /* Inserto en el hijo derecho la clave del padre */
        b_leer_header(der, &der_h);
        padre_entries = b_leer_claves(padre, &padre_h);
        /* Inserto en el hijo derecho la clave del padre */
+       PERR("PASAR CLAVE DERECHA");
        b_insertar_en_nodo_con_lugar(idx, padre_entries[padre_pos].clave, padre_entries[padre_pos].dato,
                        der_id, der, der_h.hijo_izquierdo, entry.hijo_derecho);
        /* Reemplazo clave del padre por clave nueva */
        b_insertar_en_nodo_con_lugar(idx, padre_entries[padre_pos].clave, padre_entries[padre_pos].dato,
                        der_id, der, der_h.hijo_izquierdo, entry.hijo_derecho);
        /* Reemplazo clave del padre por clave nueva */
@@ -1125,12 +1120,12 @@ static void b_partir_dos_nodos_en_tres(INDICE* idx, int nodo_izq, int nodo_der,
        /* lleno el lado derecho e izquierdo */
        for(i=0, j=0; i<cant_claves/3; i++, j++)
                c_izq[j] = buffer[i];
        /* lleno el lado derecho e izquierdo */
        for(i=0, j=0; i<cant_claves/3; i++, j++)
                c_izq[j] = buffer[i];
-       prom1 = buffer[i];
+       prom1 = buffer[i++];
        h_izq.cant = j;
        for(j=0; i<2*cant_claves/3; i++, j++)
                c_der[j] = buffer[i];
        h_der.cant = j;
        h_izq.cant = j;
        for(j=0; i<2*cant_claves/3; i++, j++)
                c_der[j] = buffer[i];
        h_der.cant = j;
-       prom2 = buffer[i];
+       prom2 = buffer[i++];
        for(j=0; i<cant_claves; i++,j++)
                c_nuevo[j] = buffer[i];
        h_nuevo.cant = j;
        for(j=0; i<cant_claves; i++,j++)
                c_nuevo[j] = buffer[i];
        h_nuevo.cant = j;
@@ -1245,7 +1240,6 @@ CLAVE emufs_indice_b_obtener_sig_clave(INDICE *idx, CLAVE k)
                while ((i<header.cant) && (emufs_indice_es_menor(idx, claves[i].clave, k))) i++;
                if ((i<header.cant) && (emufs_indice_es_igual(idx, claves[i].clave, k))) {                              
                                /* LA ENCONTRE! , ahora busco la siguiente clave!! */           
                while ((i<header.cant) && (emufs_indice_es_menor(idx, claves[i].clave, k))) i++;
                if ((i<header.cant) && (emufs_indice_es_igual(idx, claves[i].clave, k))) {                              
                                /* LA ENCONTRE! , ahora busco la siguiente clave!! */           
-                               fprintf(stderr, "Me encontre en pos %d en el padre\n", i);
                                if ((i+1)<header.cant) {
                                        PERR("Joya, hay lugar a la derecha");
                                        if (claves[i].hijo_derecho == -1) {
                                if ((i+1)<header.cant) {
                                        PERR("Joya, hay lugar a la derecha");
                                        if (claves[i].hijo_derecho == -1) {
@@ -1281,20 +1275,32 @@ CLAVE emufs_indice_b_obtener_sig_clave(INDICE *idx, CLAVE k)
                                /* Busco al mi padre, perdido en un maremoto hace mucho,muchos
                                 * años
                                 */
                                /* Busco al mi padre, perdido en un maremoto hace mucho,muchos
                                 * años
                                 */
-                               free(nodo);
+                               tmp = nodo;
                                if (header.padre == -1) {
                                if (header.padre == -1) {
-                                       salida.i_clave = -1;
+                                       if (nodo_id == 0) {
+                                               /* Bien, son el nodo raiz y aca tendria que ir hacia mi hijo
+                                                * derecho
+                                                */
+                                               nodo = b_leer_nodo(idx, claves[header.cant-1].hijo_derecho);
+                                               free(tmp);
+                                               if (nodo != NULL) {
+                                                       b_leer_header(nodo, &header);
+                                                       claves = b_leer_claves(nodo, &header);
+
+                                                       salida = claves[0].clave;
+                                               } else
+                                                       salida.i_clave = -1;
+                                       }
                                        return salida;
                                }
                                        return salida;
                                }
+                               free(nodo);
                                nodo = b_leer_nodo(idx, header.padre);
                                b_leer_header(nodo, &header);
                                claves = b_leer_claves(nodo, &header);
                                i = 0;
                                PERR("Busco mi siguiente en mi padre");
                                nodo = b_leer_nodo(idx, header.padre);
                                b_leer_header(nodo, &header);
                                claves = b_leer_claves(nodo, &header);
                                i = 0;
                                PERR("Busco mi siguiente en mi padre");
-                               fprintf(stderr, "Padre tiene %d claves\n", header.cant);
                                while ((i<header.cant) && (emufs_indice_es_menor(idx, claves[i].clave, k))) {
                                        i++;
                                while ((i<header.cant) && (emufs_indice_es_menor(idx, claves[i].clave, k))) {
                                        i++;
-                                       fprintf(stderr, "Proximo i : %d\n", i);
                                }
                                if (i<header.cant) {
                                        PERR("Siguiente clave encontrada");
                                }
                                if (i<header.cant) {
                                        PERR("Siguiente clave encontrada");
@@ -1388,5 +1394,15 @@ int b_borrar_dup_clave(INDICE *idx, INDICE_DATO k_dato, INDICE_DATO dato)
        return cant;
 }
 
        return cant;
 }
 
-#include "indice_b_asc.c"
+#ifdef NO_TERMINAOD
+EMUFS_Estadisticas emufs_indice_b_obtener_estadisticas(INDICE *idx)
+{
+       EMUFS_Estadisticas stats, st_string, st_multiples;
+
+       stats.tam_archivo = emufs_common_get_file_size(idx->filename);
+       stats.cant_bloques = stats.tam_archivo/idx->tam_bloque;
 
 
+}
+#endif
+
+#include "indice_b_asc.c"