]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/indice_b.c
* Agrego insercion de claves duplicadas (NOT DONE!)
[z.facultad/75.06/emufs.git] / emufs / indice_b.c
index 183c6fe1c4d87d46b614345f3c2221394e41237c..a3027d390ff31a8624a7703cd842a94a720f829c 100644 (file)
@@ -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);
+}
+