]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
-Comienzan los test del insertar ordenado, tengo buenas espectativas.De hecho ya...
authorNicolás Dimov <ndimov@gmail.com>
Fri, 28 May 2004 19:14:59 +0000 (19:14 +0000)
committerNicolás Dimov <ndimov@gmail.com>
Fri, 28 May 2004 19:14:59 +0000 (19:14 +0000)
gracias muchacho!!

emufs/Makefile
emufs/did.c
emufs/emufs.c
emufs/idx.c
emufs/indices.c
emufs/tipo1.c
emufs/tipo1_main.c

index 740b798ae224656577e1f3e40ad95972cd592992..134226f02c2a6053d3e971baccd3a008f978baef 100644 (file)
@@ -3,9 +3,9 @@ LDFLAGS= -lm -lmenu -lncurses -lxml2
 #CFLAGS=-Wall -g -pedantic -DDEBUG 
 #LDFLAGS=-lm
 
-EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o indices.o indice_b.o indice_bplus.o
+EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o indices.o indice_b.o indice_bplus.o 
 
-TARGETS=libemufs.a tipo1_main tipo2_main tipo3_main b_plus_test
+TARGETS=libemufs.a tipo1_main tipo2_main tipo3_main b_plus_test tipo1_bplus_main
 
 all: $(TARGETS)
 
@@ -17,6 +17,8 @@ tipo3_main: tipo3_main.o $(EMUFS_COMMON)
 
 b_plus_test: b_plus_test.o $(EMUFS_COMMON)
 
+tipo1_bplus_main: tipo1_bplus_main.o $(EMUFS_COMMON)
+
 #b_plus_test: b_plus_test.o b_plus.o indices.o emufs.o
 
 #b_test: b_test.o indice_b.o
index 6e13fd5cae3d5907cd8b35f7e370d7c7185480d4..d2b14af1aa96f0633cb370b976d7639dc68ce4ae 100644 (file)
@@ -141,4 +141,3 @@ long emufs_did_get_file_size(EMUFS* efs, int* err)
        strcat(name, EMUFS_DID_EXT);
        return emufs_common_get_file_size(name, err);
 }
-
index cc33ee38472b0bba99cb1c7df259ee3eef0a1278..42c81f1a1f727d2cf5975f51e7b4d54c49719588 100644 (file)
@@ -491,18 +491,19 @@ EMUFS_BLOCK_ID emufs_create_new_block(EMUFS *emu)
                PERR("NO SE PUDO ABRIR EL ARCHIVO");
                return -1;
        }
-       
+
        dummy = (char*)malloc(emu->tam_bloque);
        memset(dummy, 0, emu->tam_bloque);
        fwrite(dummy, emu->tam_bloque, 1, fp);
+       printf("new_block ftell = %d\n", ftell(fp));
        switch(emu->tipo){
-               case T1: num = (ftell(fp)-sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE))/emu->tam_bloque;
+               case T1: num = (ftell(fp)-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE))/emu->tam_bloque;
                        break;
-               case T3: num = (ftell(fp)-sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE))/emu->tam_bloque;
+               case T3: num = (ftell(fp)-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE)-sizeof(EMUFS_REG_SIZE))/emu->tam_bloque;
        }
        fclose(fp);
        free(dummy);
-       return num;
+       return num-1;
 }
 
 /*devuelve un numero de bloque siguiente al ultimo*/
@@ -510,23 +511,29 @@ EMUFS_BLOCK_ID emufs_get_new_block_number(EMUFS *emu)
 {
        FILE *fp;
        char name[255];
-       EMUFS_BLOCK_ID num;
+       EMUFS_BLOCK_ID num=0;
        
        /* obtengo nombre del archivo */
        strcpy(name, emu->nombre);
        strcat(name,".dat");
-
-       if ( (fp=fopen(name,"a+")) == NULL ){
+       if ( (fp=fopen(name,"r")) == NULL ){
                PERR("NO SE PUDO ABRIR EL ARCHIVO");
                return -1;
        }
+       if ( fseek(fp, 0, SEEK_END)!=0 ){
+               PERR("NO PUDE HACER EL SEEK");
+               return -1;
+       }
        switch(emu->tipo){
-               case T1: num = (ftell(fp)-sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE))/emu->tam_bloque;
+               case T1: num = (ftell(fp)-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE))/emu->tam_bloque;
+                       if (ftell(fp) ==  sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE)) num = 0;
+                               PERR("PASE");
                        break;
-               case T3: num = (ftell(fp)-sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE))/emu->tam_bloque;
+               case T3: num = (ftell(fp)-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE)-sizeof(EMUFS_REG_SIZE))/emu->tam_bloque;
+                       if (ftell(fp) ==  sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE)) num = 0;
        }
        fclose(fp);
-       return num+1;
+       return num;
 }
 
 INDICE *emufs_buscar_indice_por_nombre(EMUFS *emu, const char *nombre)
@@ -540,4 +547,3 @@ INDICE *emufs_buscar_indice_por_nombre(EMUFS *emu, const char *nombre)
        }
        return tmp;
 }
-
index 6e33fda41ed442fd5e803a91b8de93cb07a374af..ec869663f027d6725a3a1f6718a7e7dd72c5991a 100644 (file)
@@ -286,4 +286,3 @@ long emufs_idx_get_file_size(EMUFS* efs, int* err)
        strcat(name, EMUFS_IDX_EXT);
        return emufs_common_get_file_size(name, err);
 }
-
index 207e999c582641564d73c782c4733d3a46bc4edd..34d347effaf00420a3172c509a47e02b596b75f7 100644 (file)
@@ -72,6 +72,7 @@ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, IND
                        break;
                case IND_B_PLUS:
                        /* llenar metodos */
+                       /* hacer que la cantidad de claves quede par o impar, no me acuerdo (SAGAR)!!!*/
                        PERR("Creando indice con Arbol B+");
                        tmp->size_claves = (tmp->tam_bloque - SIZE_B_PLUS_HEADER - sizeof(CLAVE))/2;
                        tmp->size_hijos = tmp->size_claves + sizeof(CLAVE);
@@ -243,4 +244,3 @@ void emufs_indice_obtener_valor_desde_clave(INDICE *idx, CLAVE k, void *dst)
                        free(leido);
        }
 }
-
index 08d91901effb862090abbe5cea9ac96d62ecd850..0e8f7dc69aced4f60f306216141a8a16eb50dddb 100644 (file)
@@ -750,7 +750,7 @@ void emufs_tipo1_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, c
 int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, int *err)
 {
        CLAVE clave;
-       EMUFS_BLOCK_ID num_bloque = emufs_get_new_block_number(emu)
+       EMUFS_BLOCK_ID num_bloque; 
        EMUFS_TIPO1_REG_HEADER header;
        EMUFS_REG_SIZE tam_reg, move_size;
        INDEX_DAT query;
@@ -759,7 +759,10 @@ int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, in
        int cant_reg, i, result, dif;
        
        /*le asigno un posible numero de bloque para el caso en que no encuentre donde meterlo*/
-       query.num_bloque = num_bloque;  
+       PERR("LEO EL NUMERO DE BLOQUE SIGUIENTE");
+       num_bloque = emufs_get_new_block_number(emu);   
+       query.num_bloque = num_bloque;
+       printf("BLOQUE NUMBER : %d\n", 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*/
@@ -773,6 +776,7 @@ int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, in
        1 = Error de lectura en algun nodo, abortar operacion en funcion invocante.
        */
        result = emufs_b_plus_get_bloque(emu->indices, &query, 0);
+       printf("tengo que guardar en bloque: %d\n", query.num_bloque);
        if (result == 1){
                PERR("SE PRODUJO UN ERROR EN EL ARBOL.. ABORTANDO");
                return -1;
@@ -785,6 +789,11 @@ int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, in
                        return -1;
                }
                header.id = emufs_idx_get_new_id(emu, err);
+               if (*err) {
+                       PERR("NO SE PUDO OBTENER UN ID");
+                       free(bloque);
+                       return -1;
+               }
                header.size = size;
                cant_reg = 1;
                /*pongo la cabecera en el registro*/
@@ -821,7 +830,8 @@ int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, in
                        fs -= (tam_reg+sizeof(EMUFS_TIPO1_REG_HEADER));
                } /*aca deberia estar apuntando al final de los registros. espacio libre*/
                fs -= sizeof(int); /*footer*/
-               if ( fs >= size+sizeof(EMUFS_TIPO1_REG_HEADER) ){ /* puedo meter el registro en este bloque*/   
+               if ( fs >= size+sizeof(EMUFS_TIPO1_REG_HEADER) ){ /* puedo meter el registro en este bloque*/
+                       PERR("GRABO ORDENADO");                 
                        grabar_ordenado_en_bloque(emu, ptr, size, bloque, query.num_bloque, fs, err);
                        /*en teoria el nuevo registro no debe cambiar el ancla, por lo cual no actualizo el arbol*/
                        return 0;
@@ -915,6 +925,7 @@ CLAVE grabar_ordenado_en_bloque(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, void
        }
        /*grabo el bloque en el archivo*/
        new_bloque = aux; /*apunto al principio del bloque*/
+       memcpy(new_bloque+emu->tam_bloque-sizeof(int), &cant_reg, sizeof(int));
        emufs_tipo1_grabar_bloque_fsc(emu, new_bloque, num_bloque, EMUFS_NOT_FOUND, err);
        clave = emufs_indice_generar_clave(emu->indices, new_bloque+sizeof(EMUFS_TIPO1_REG_HEADER));
        free(new_bloque);
index ebeb376c84d3c98ba0021eb31e3b7aacaf7892c7..c96331e9f75adff8b81b47b020586d207ab1042d 100644 (file)
@@ -28,7 +28,7 @@
 
 /** \file
  *
- * Prueba de archivo \ref tipo3.h "tipo3".
+ * Prueba de archivo \ref tipo1.h "tipo1".
  * 
  */