]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/tipo3.c
b_plus_insertar_clave, deprecated and removed from source
[z.facultad/75.06/emufs.git] / emufs / tipo3.c
index ca850a08d48683dbf1873734ac9a42b786191035..24d2e72e5ea0e095615af0016df8d318a176b522 100644 (file)
@@ -59,12 +59,18 @@ void* emufs_tipo3_leer_registro(EMUFS *emu, CLAVE clave,
                cant_bloques = 1;
        
        /*si existe, lo busco en el archivo de bloques*/
                cant_bloques = 1;
        
        /*si existe, lo busco en el archivo de bloques*/
-       if (emu->indices != NULL) {
+       if ((emu->indices != NULL) && (*err != 1)) {
                /* TODO : Verificar donde esta el indice primario */
                dato = emu->indices->existe_entrada(emu->indices, clave);
                block = dato.bloque;
                ID = dato.id;
                /* TODO : Verificar donde esta el indice primario */
                dato = emu->indices->existe_entrada(emu->indices, clave);
                block = dato.bloque;
                ID = dato.id;
+               PERR("Use indice");
        } else {
        } else {
+               /* Si no tengo claves, uso el campo entero para pasar un ID
+                * directamente.
+                */
+               PERR("Use directo");
+               ID = clave.i_clave;
                block = emufs_idx_buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/
        }
        if ( block == EMUFS_NOT_FOUND ){
                block = emufs_idx_buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/
        }
        if ( block == EMUFS_NOT_FOUND ){
@@ -331,13 +337,14 @@ int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num)
 }
 
 /*borra un registro de un bloque y acomoda los registros que quedan*/
 }
 
 /*borra un registro de un bloque y acomoda los registros que quedan*/
-int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID)
+int emufs_tipo3_borrar_registro(EMUFS *emu, CLAVE k)
 {
        EMUFS_BLOCK_SIZE num_bloque;
        EMUFS_BLOCK_SIZE ptr_elim;
        EMUFS_BLOCK_SIZE ptr_mov;
 {
        EMUFS_BLOCK_SIZE num_bloque;
        EMUFS_BLOCK_SIZE ptr_elim;
        EMUFS_BLOCK_SIZE ptr_mov;
-       EMUFS_REG_ID ID_aux;
+       EMUFS_REG_ID ID_aux, ID;
        EMUFS_FREE fs;
        EMUFS_FREE fs;
+       INDICE_DATO dato;
        char *bloque;
        int err = 0, i, cant_bloques;
 
        char *bloque;
        int err = 0, i, cant_bloques;
 
@@ -345,14 +352,26 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID)
        cant_bloques = emu->tam_reg/(emu->tam_bloque-sizeof(EMUFS_REG_ID))+1;
        if ( emu->tam_reg+sizeof(EMUFS_REG_ID) == emu->tam_bloque ) 
                cant_bloques = 1;
        cant_bloques = emu->tam_reg/(emu->tam_bloque-sizeof(EMUFS_REG_ID))+1;
        if ( emu->tam_reg+sizeof(EMUFS_REG_ID) == emu->tam_bloque ) 
                cant_bloques = 1;
-       
-       num_bloque = emufs_idx_buscar_registro(emu, ID);
+
+       PERR("Buscando datos del registro en el indice");
+       if (emu->indices != NULL) {
+               dato = emu->indices->existe_entrada(emu->indices, k);
+               num_bloque = dato.bloque;
+               ID = dato.id;
+       } else {
+               ID = k.i_clave;
+               num_bloque = emufs_idx_buscar_registro(emu, ID);
+       }
+
        if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque, &err))) {
                /* TODO Manejo de errores */
                PERR("no se pudo leer el bloque");
                return -1;
        }
 
        if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque, &err))) {
                /* TODO Manejo de errores */
                PERR("no se pudo leer el bloque");
                return -1;
        }
 
+       PERR("Borrando clave");
+       /* TODO Borrar en todos los indices!! */
+       emu->indices->borrar_entrada(emu->indices, k);
        /*apunto al registro que voy a eliminar*/
        ptr_elim = 0;
        while ( ptr_elim < emu->tam_bloque ){
        /*apunto al registro que voy a eliminar*/
        ptr_elim = 0;
        while ( ptr_elim < emu->tam_bloque ){
@@ -463,9 +482,9 @@ EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *emu)
        return stats;   
 }
 
        return stats;   
 }
 
-EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *data, EMUFS_REG_SIZE size, int *error)
+EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, CLAVE k, void *data, EMUFS_REG_SIZE size, int *error)
 {
 {
-       emufs_tipo3_borrar_registro(emu, id);
+       emufs_tipo3_borrar_registro(emu, k);
        return emufs_tipo3_grabar_registro(emu, data, size, error);
 }
 
        return emufs_tipo3_grabar_registro(emu, data, size, error);
 }
 
@@ -566,16 +585,37 @@ void emufs_tipo3_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, c
        (*size1) = (*size2) = (*size3) = efs->tam_bloque;
 }
 
        (*size1) = (*size2) = (*size3) = efs->tam_bloque;
 }
 
-int emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, CLAVE clave, int *err)
+int emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, int *err)
 {
 {
-       FILE *f;
-       char f_name[255];
-       char *bloque;
+       #ifdef ESTO_NO_ANDA_TODAVIA
+       CLAVE clave, clave_aux;
+       EMUFS_BLOCK_ID num_bloque = get_new_block_number(emu); /*implementar esto*/
+       INDEX_DAT query;
+       char *bloque, *new_bloque, *registro;
+       
+       /*le asigno un posible numero de bloque para el caso en que no encuentre donde meterlo*/
+       query.num_bloque = num_bloque;  
+       /*saco la clave del stream*/
+       query.clave = emufs_indice_generar_clave(emu->indices, ptr);
+       /*mando a buscar en el arbol el bloque correspondiente a esa clave*/
+       emu->indices->emufs_b_plus_get_bloque(ind, &query);
+       /*en query->num_bloque tengo el bloque donde debo meter el registro*/
+       
+       /*cargo el bloque*/
+       bloque = emufs_tipo3_leer_bloque(emu, query.num_bloque, err);
+       if (err != 0){
+               PERR("NO SE PUDO LEER EL BLOQUE");
+               return -1;
+       }
+       
+       /*debo insertar el reg en el bloque en forma ordenada*/
+       /*si es el menor de todos tengo que cambiar el ancla en el arbol*/
+       /*si no entra, tengo que insertar una nueva clave en el arbol y separar los registros en 2 bloques*/
+       
        
        
-       strcpy(f_name, emu->nombre);
-       strcat(f_name, ".dat");
        
        
        
        
        
        
+       #endif /*ESTO_NO_ANDA_TODAVIA*/
        return 0;
 }
        return 0;
 }