X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/d0fc22a6828f9799a0869e2fc1a5360772ad5ce0..224194e18dce492ec2df32c6dd1f3b8d7290b4be:/emufs/indice_b.c?ds=sidebyside diff --git a/emufs/indice_b.c b/emufs/indice_b.c index a3027d3..4c033b6 100644 --- a/emufs/indice_b.c +++ b/emufs/indice_b.c @@ -54,7 +54,7 @@ static void b_pasar_clave_a_izquierda(INDICE*, char*, int, char*, int, int, B_No /** 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); +static EMUFS_REG_ID b_insertar_dup_en_pos(INDICE *idx, INDICE_DATO pos, INDICE_DATO nuevo); void emufs_indice_b_crear(INDICE *idx) { @@ -91,6 +91,7 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato) B_NodoHeader header; B_NodoEntry *claves; char *nodo, *padre; + INDICE_DATO dummy; /* Leo la raiz */ nodo = b_leer_nodo(idx, 0); @@ -128,6 +129,14 @@ int emufs_indice_b_insertar(INDICE *idx, CLAVE clave, INDICE_DATO dato) if (nodo) free(nodo); nodo = padre; nodo_id = padre_id; + + if (idx->tipo != IND_PRIMARIO) { + /* Agrego el DATO real al archivo de claves repetiras + * y me guardo el ID para poner en el indice + */ + dummy.id = -1; + dato.id = b_insertar_dup_en_pos(idx, dummy, dato); + } b_insertar_en_nodo(idx, clave, dato, nodo_id, nodo, -1, -1); return 1; /* Agregar OK! */ } @@ -761,7 +770,7 @@ 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) +static EMUFS_REG_ID b_insertar_dup_en_pos(INDICE *idx, INDICE_DATO pos, INDICE_DATO nuevo) { int cant; EMUFS_REG_SIZE tam; @@ -775,10 +784,14 @@ static void b_insertar_dup_en_pos(INDICE *idx, INDICE_DATO pos, INDICE_DATO nuev leido = (char *)idx->emu_mult->leer_registro(idx->emu_mult, k, &tam, &error); /* Incremento en 1 la cantidad */ - cant = *((int *)leido); + if (leido != NULL) + cant = *((int *)leido); + else + cant = 0; cant++; /* Obtengo un nuevo lugar para el dato nuevo */ + /* Aca todo bien, si leido es NULL se compota como malloc */ leido = realloc(leido, cant*sizeof(INDICE_DATO)+sizeof(int)); array = (INDICE_DATO *)(leido+sizeof(int)); @@ -789,14 +802,24 @@ static void b_insertar_dup_en_pos(INDICE *idx, INDICE_DATO pos, INDICE_DATO nuev (*((int *)leido)) = cant; /* Salvo */ - idx->emu_mult->modificar_registro(idx->emu_mult, - pos.id, + if (k.i_clave == -1) { + /* Creo uno nuevo */ + k.i_clave = idx->emu_mult->grabar_registro(idx->emu_mult, leido, cant*sizeof(INDICE_DATO)+sizeof(int), &error ); - + } else { + /* Modifico el que ya existia! */ + idx->emu_mult->modificar_registro(idx->emu_mult, + k.i_clave, + leido, + cant*sizeof(INDICE_DATO)+sizeof(int), + &error + ); + } /* Clean up! */ free(leido); + return k.i_clave; }