]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
* Mas de claves duplicadas. En teoria "esta completa", hay que ver si con el
authorRicardo Markiewicz <gazer.arg@gmail.com>
Fri, 21 May 2004 04:20:18 +0000 (04:20 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Fri, 21 May 2004 04:20:18 +0000 (04:20 +0000)
 sueƱo que tengo no pense para el traste donde meto cada cosa. Pero la idea
 esta :-)

emufs/indice_b.c

index a3027d390ff31a8624a7703cd842a94a720f829c..4c033b60803cab8eb42bde64b1869db0a6736735 100644 (file)
@@ -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;
 }