X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/4da22b509af90f905ad13be0b846e41a8d89e3c2..d0fc22a6828f9799a0869e2fc1a5360772ad5ce0:/emufs/indice_b.c?ds=sidebyside diff --git a/emufs/indice_b.c b/emufs/indice_b.c index 183c6fe..a3027d3 100644 --- a/emufs/indice_b.c +++ b/emufs/indice_b.c @@ -1,6 +1,7 @@ #include "indice_b.h" #include "common.h" +#include "emufs.h" /* Cantidad de claves por nodo */ #define CANT_HIJOS(x) ((x->tam_bloque-sizeof(B_NodoHeader))/sizeof(B_NodoEntry)) @@ -52,6 +53,8 @@ static void b_pasar_clave_a_derecha(INDICE*, char*, int, char*, int, int, B_Nodo static void b_pasar_clave_a_izquierda(INDICE*, char*, int, char*, int, int, B_NodoEntry); /** Junta 2 nodos y hace uno solo */ static void b_fundir_nodo(char *, int, char *, int, char *, int, int); + +static void b_insertar_dup_en_pos(INDICE *idx, INDICE_DATO pos, INDICE_DATO nuevo); void emufs_indice_b_crear(INDICE *idx) { @@ -108,6 +111,7 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato) } /* TODO : Implementar carga de valor en clave duplicada! */ + b_insertar_dup_en_pos(idx, claves[i].dato, dato); return 1; } else { @@ -757,3 +761,42 @@ static void b_fundir_nodo(char *izq, int izq_id, char *padre, int padre_id, char { } +static void b_insertar_dup_en_pos(INDICE *idx, INDICE_DATO pos, INDICE_DATO nuevo) +{ + int cant; + EMUFS_REG_SIZE tam; + int error; + INDICE_DATO *array; + char *leido; + CLAVE k; + + /* Leo el contenido actual */ + k.i_clave = pos.id; + leido = (char *)idx->emu_mult->leer_registro(idx->emu_mult, k, &tam, &error); + + /* Incremento en 1 la cantidad */ + cant = *((int *)leido); + cant++; + + /* Obtengo un nuevo lugar para el dato nuevo */ + leido = realloc(leido, cant*sizeof(INDICE_DATO)+sizeof(int)); + array = (INDICE_DATO *)(leido+sizeof(int)); + + /* Pongo el dato nuevo */ + array[cant-1] = nuevo; + + /* Actualizo la cantidad */ + (*((int *)leido)) = cant; + + /* Salvo */ + idx->emu_mult->modificar_registro(idx->emu_mult, + pos.id, + leido, + cant*sizeof(INDICE_DATO)+sizeof(int), + &error + ); + + /* Clean up! */ + free(leido); +} +