X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/db30ec34669e71266f038fcf7cb2386fa210d531..7ccae609792550a7d81d2496742def35f003bf26:/emufs/indice_b.h diff --git a/emufs/indice_b.h b/emufs/indice_b.h index c0a1bf3..08eb3d2 100644 --- a/emufs/indice_b.h +++ b/emufs/indice_b.h @@ -5,40 +5,62 @@ #include #include - +#include +#include "common.h" #include "indices.h" typedef struct _b_nodo_header_ { - int nivel; /* Numero de nivel. Si es hoja debe ser 0 */ - int cant; /* Cantidad de items en el nivel */ + int nivel; /**< Numero de nivel. Si es hoja debe ser 0 */ + int cant; /**< Cantidad de items en el nivel */ int padre; - /* Nodo al que debo ir si la clave a insertar/buscar/borrar + /** Nodo al que debo ir si la clave a insertar/buscar/borrar * es menor que la primera del nodo */ int hijo_izquierdo; } B_NodoHeader; typedef struct _b_nodo_entry_ { - /* FIXME usar tipo CLAVE */ - int clave; - /* Si el nivel del nodo == 0, quiere decir que es el - * bloque del archivo de datos donde esta el registro. - * Si el nivel != 0, es el siguiente bloque dentro - * del archivo de indice donde buscar - */ - long ubicacion; + CLAVE clave; + /** Dato guardado */ + INDICE_DATO dato; + /** El ID de la hoja de depliega a la derecha */ + int hijo_derecho; } B_NodoEntry; -/* Crea un arbol */ -void b_crear(); +/** Crea un árbol */ +void emufs_indice_b_crear(INDICE *idx); + +/** Inserta un par clave-ubicacion */ +int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato); + +/** Borra una entrada */ +int emufs_indice_b_borrar(INDICE *idx, CLAVE k, INDICE_DATO dato); + +/** Busca una clave, retorna ubicacion o -1 si no existe */ +INDICE_DATO emufs_indice_b_buscar(INDICE *idx, CLAVE clave); + +INDICE_DATO *emufs_indice_b_buscar_muchos(INDICE *idx, CLAVE clave, int *cant); + +CLAVE emufs_indice_b_obtener_menor_clave(INDICE *idx); + +CLAVE emufs_indice_b_obtener_mayor_clave(INDICE *idx); + +/* Private! */ +/** Lee un nodo desde el archivo */ +char *b_leer_nodo(INDICE *idx, int id); + +/** Lee el header de un nodo y lo guarda en header */ +void b_leer_header(char *src, B_NodoHeader *header); -/* Inserta un par clave-ubicacion */ -int b_insertar(int clave, int ubicacion); +/** Retorna el array de claves del nodo (esta data modifica directamente el bloque + * por eso no es necesario usar un actualizar_claves + */ +B_NodoEntry *b_leer_claves(char *src, B_NodoHeader *header); -/* Busca una clave, retorna ubicacion o -1 si no existe */ -int b_buscar(int clave); +CLAVE emufs_indice_b_obtener_sig_clave(INDICE *idx, CLAVE k); +int emufs_indice_b_asc_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato); #endif