X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/63f9cc2172df9d346457685096b4de200c084e9e..40435bfb0df998d2d97ec9010535ca9a6cdffcd3:/emufs/indice_b.c diff --git a/emufs/indice_b.c b/emufs/indice_b.c index abbdfbc..96ada55 100644 --- a/emufs/indice_b.c +++ b/emufs/indice_b.c @@ -1,5 +1,6 @@ #include "indice_b.h" +#include "common.h" /* Cantidad de claves por nodo */ #define CANT_HIJOS(x) ((x->tam_bloque-sizeof(B_NodoHeader))/sizeof(B_NodoEntry)) @@ -15,7 +16,8 @@ static void b_leer_header(char *src, B_NodoHeader *header); static void b_actualizar_header(char *src, B_NodoHeader *header); static B_NodoEntry *b_leer_claves(char *src, B_NodoHeader *header); static void b_insertar_en_nodo(INDICE *idx, CLAVE clave, INDICE_DATO dato, int nodo_id, char *nodo, int hijo1, int hijo2); -const int b_elegir_izquierdo(INDICE *idx, int a, int b); +static int b_elegir_izquierdo(INDICE *idx, int a, int b); +static void b_borrar_clave(INDICE *idx, char *nodo, int nodo_id, CLAVE k); void emufs_indice_b_crear(INDICE *idx) { @@ -29,6 +31,12 @@ 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; + } /* Creo el archivo con el Nodo raiz */ bloque = (char *)malloc(idx->tam_bloque); @@ -64,21 +72,11 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato) return 0; } else { if (i == 0) { - if (header.nivel != 0) { - nodo = b_leer_nodo(idx, header.hijo_izquierdo); - nodo_id = header.hijo_izquierdo; - } else { - nodo = NULL; - nodo_id = -1; - } + nodo = b_leer_nodo(idx, header.hijo_izquierdo); + nodo_id = header.hijo_izquierdo; } else { - if (header.nivel != 0) { - nodo = b_leer_nodo(idx, claves[i-1].dato.bloque); - nodo_id = claves[i-1].dato.bloque; - } else { - nodo = NULL; - nodo_id = -1; - } + nodo = b_leer_nodo(idx, claves[i-1].hijo_derecho); + nodo_id = claves[i-1].hijo_derecho; } } } @@ -114,7 +112,7 @@ INDICE_DATO emufs_indice_b_buscar(INDICE *idx, CLAVE clave) if (i == 0) { nodo = b_leer_nodo(idx, header.hijo_izquierdo); } else { - nodo = b_leer_nodo(idx, claves[i-1].dato.bloque); + nodo = b_leer_nodo(idx, claves[i-1].hijo_derecho); } free(tmp); } @@ -125,6 +123,50 @@ INDICE_DATO emufs_indice_b_buscar(INDICE *idx, CLAVE clave) return ret; } +int emufs_indice_b_borrar(INDICE *idx, CLAVE k) +{ + /* Busco el nodo que contiene la clave,si es que esta existe */ + char *nodo; + int nodo_id, i; + char encontrado=0; + B_NodoHeader header; + B_NodoEntry *claves; + + 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); + claves = b_leer_claves(nodo, &header); + + i=0; + while ((i= MIN_HIJOS(idx)) { + PERR("Borrar completo sin fundir"); + return; + } + + /* Tengo que pasar datos o fundir nodos :-( */ + PERR("TODO : FUNDIR NODOS!!!!\n"); +} +