X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/ad2c7ad2d8e8e460bc0f9d790da9b7f315bc0125..8ed872279800f018aa1dfa690d646428d68820c1:/emufs/indice_b.c diff --git a/emufs/indice_b.c b/emufs/indice_b.c index f18312a..ef05112 100644 --- a/emufs/indice_b.c +++ b/emufs/indice_b.c @@ -75,6 +75,7 @@ void emufs_indice_b_crear(INDICE *idx) memcpy(bloque, &header, sizeof(B_NodoHeader)); fwrite(bloque, idx->tam_bloque, 1, fp); + free(bloque); fclose(fp); } @@ -104,8 +105,9 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato) 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 */ @@ -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 */ + 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); } @@ -845,6 +852,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 */ + 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 */ @@ -1281,11 +1289,22 @@ CLAVE emufs_indice_b_obtener_sig_clave(INDICE *idx, CLAVE k) /* Busco al mi padre, perdido en un maremoto hace mucho,muchos * aƱos */ - free(nodo); + tmp = nodo; 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); + b_leer_header(nodo, &header); + claves = b_leer_claves(nodo, &header); + + salida = claves[0].clave; + } return salida; } + free(nodo); nodo = b_leer_nodo(idx, header.padre); b_leer_header(nodo, &header); claves = b_leer_claves(nodo, &header); @@ -1389,4 +1408,3 @@ int b_borrar_dup_clave(INDICE *idx, INDICE_DATO k_dato, INDICE_DATO dato) } #include "indice_b_asc.c" -