From 5565477433b377796908c649d62b17f83adbcb3a Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Fri, 21 May 2004 04:20:18 +0000 Subject: [PATCH 1/1] =?utf8?q?=20*=20Mas=20de=20claves=20duplicadas.=20En?= =?utf8?q?=20teoria=20"esta=20completa",=20hay=20que=20ver=20si=20con=20el?= =?utf8?q?=20=20sue=C3=B1o=20que=20tengo=20no=20pense=20para=20el=20traste?= =?utf8?q?=20donde=20meto=20cada=20cosa.=20Pero=20la=20idea=20=20esta=20:-?= =?utf8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- emufs/indice_b.c | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) 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; } -- 2.43.0