]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/indice_b.c
Listo busqueda de sucesor, predecesor de 1 clave, tambien conocido como el afamado...
[z.facultad/75.06/emufs.git] / emufs / indice_b.c
index 89a5b7715e8792c7670db4e0e1914269e6faa983..f032d51805e834070f7647d46bd74ec9f64bf45a 100644 (file)
@@ -285,11 +285,11 @@ char *b_leer_nodo(INDICE *idx, int id)
        }
 
        /* Si estoy manejando string tengo que sacar las abreviaturas */
-       if (idx->tipo_dato == IDX_STRING) {
+/*     XXX if (idx->tipo_dato == IDX_STRING) {
                b_leer_header(out, &header);
                claves = b_leer_claves(out, &header);
                desabreviar_claves(idx, claves, &header);
-       }
+       }*/
        fclose(fp);
        return out;
 }
@@ -301,11 +301,11 @@ static void b_grabar_nodo(INDICE *idx, int id, char *data)
        B_NodoEntry *claves;
 
        /* Si las claves son de tipo string debo abreviar antes de guardar */
-       if (idx->tipo_dato == IDX_STRING) {
+/*XXX  if (idx->tipo_dato == IDX_STRING) {
                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);
@@ -1151,14 +1151,18 @@ 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!! */           
+                               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) {
+                                               PERR("Y soy hoja!!");
                                                /* Joya!, fue facil, la siguiente va en camino! */
-                                               salida = claves[i].clave;
+                                               salida = claves[i+1].clave;
                                                free(nodo);
                                                return salida;
                                        }
 
+                                       PERR("No soy hoja, busco la hoja de menor");
                                        /* Mmmmm ... la siguiente esta en uno de mis hijo */
                                        /* Necesito la mas chica de las siguientes, para eso
                                         * me voy a mi hijo derecho y de ahi bajo siempre
@@ -1178,21 +1182,34 @@ CLAVE emufs_indice_b_obtener_sig_clave(INDICE *idx, CLAVE k)
                                        return salida;
                                }
 
+                               PERR("Fuck, tengo que ir otro nodo a buscar");
                                /* Fuck, la siguiente clave la tengo que sacar de padre */
                                /* Busco al mi padre, perdido en un maremoto hace mucho,muchos
                                 * aƱos
                                 */
                                free(nodo);
+                               if (header.padre == -1) {
+                                       salida.i_clave = -1;
+                                       return salida;
+                               }
                                nodo = b_leer_nodo(idx, header.padre);
                                b_leer_header(nodo, &header);
                                claves = b_leer_claves(nodo, &header);
                                i = 0;
-                               while ((i<header.cant) && (emufs_indice_es_menor(idx, claves[i].clave, k))) i++;
-                               if (i<header.cant)
+                               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++;
+                                       fprintf(stderr, "Proximo i : %d\n", i);
+                               }
+                               if (i<header.cant) {
+                                       PERR("Siguiente clave encontrada");
                                        salida = claves[i].clave;
-                               else
+                               } else {
                                        /* No hay mas claves! */
+                                       PERR("Busque y busque pero no aparecio");
                                        salida.i_clave = -1;
+                               }
                                return salida;
                } else {
                        tmp = nodo;
@@ -1209,6 +1226,7 @@ CLAVE emufs_indice_b_obtener_sig_clave(INDICE *idx, CLAVE k)
        }
 
        /* No encontre la clave pasada, no existe */
+       PERR("No encontre la clave pasada!!");
        salida.i_clave = -1;
        return salida;
 }