]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
- Se agrega reporte de errores a emufs_did_get_last() y a emufs_did_get_last().
authorLeandro Lucarella <llucax@gmail.com>
Sun, 11 Apr 2004 04:29:52 +0000 (04:29 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Sun, 11 Apr 2004 04:29:52 +0000 (04:29 +0000)
- Se crea una nueva funcion emufs_idx_get_new_id() para reemplazar la serie
  emufs_tipoX_get_id().
- Se agrega una macro PERR() que cuando se compila con -DDEBUG imprime un
  mensaje de debug por la salida de error (si se compila sin DEBUG no hace
  nada).
- Se cambia nombre de emufs_idx_buscar_mayor_id() a
  emufs_idx_buscar_mayor_id_libre() que es mas representativo (igual con
  emufs_idx_get_new_id() ya practicamente no se usa directamente).

13 files changed:
emufs/did.c
emufs/did.h
emufs/emufs.h
emufs/idx.c
emufs/idx.h
emufs/tipo1.c
emufs/tipo1.h
emufs/tipo1_test.c
emufs/tipo2.c
emufs/tipo2.h
emufs/tipo3.c
emufs/tipo3.h
emufs/tipo3_main.c

index 2a071a6f443ce7d2ea0b84041377fa1b32197360..0c7c10a823baab79f54fc5aa3b88ac9496c57e47 100644 (file)
@@ -45,35 +45,74 @@ int emufs_did_crear(EMUFS* efs)
        return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_DID_EXT);
 }
 
-EMUFS_REG_ID emufs_did_get_last(EMUFS *efs)
+EMUFS_REG_ID emufs_did_get_last(EMUFS *efs, int* err)
 {
        FILE *f_did;
        EMUFS_REG_ID n_regid;
        EMUFS_OFFSET n_offset;
        char name_f_did[255];
+       long pos;
        
        strcpy(name_f_did, efs->nombre);
        strcat(name_f_did, EMUFS_DID_EXT);
        
-       if ( (f_did = fopen(name_f_did,"r")) == NULL) return -1; /*ERROR*/
-       fseek(f_did, 0, SEEK_END);
+       if ((f_did = fopen(name_f_did, "rb")) == NULL) {
+               PERR("No se puede abrir archivo");
+               *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
+               return EMUFS_NOT_FOUND;
+       }
+       if (fseek(f_did, 0l, SEEK_END)) {
+               PERR("No se pudo hacer fseek()");
+               fclose(f_did);
+               *err = 8; /* EMUFS_ERROR_SEEK_FILE */
+               return EMUFS_NOT_FOUND;
+       }
        
-       if (ftell(f_did) > 0){
+       if ((pos = ftell(f_did)) > 0){
                /* si el archivo no esta vacio es porque hay un nro disponible*/
-               fseek(f_did, -sizeof(EMUFS_REG_ID),SEEK_END);
+               if (fseek(f_did, -sizeof(EMUFS_REG_ID), SEEK_END)) {
+                       PERR("No se pudo hacer fseek()");
+                       fclose(f_did);
+                       *err = 8; /* EMUFS_ERROR_SEEK_FILE */
+                       return EMUFS_NOT_FOUND;
+               }
                /* leo el ultimo numero */
-               fread(&n_regid,sizeof(EMUFS_REG_ID),1,f_did);
+               if (fread(&n_regid, sizeof(EMUFS_REG_ID), 1, f_did) != 1) {
+                       fclose(f_did);
+                       PERR("Error al leer did");
+                       *err = 3; /* EMUFS_ERROR_FILE_READ */
+                       return NULL;
+               }
                /* voy al final */
-               fseek(f_did, 0, SEEK_END);
-               /* mido el tamaño del archivo*/
-               n_offset = ftell(f_did);
+               if (fseek(f_did, 0l, SEEK_END)) {
+                       PERR("No se pudo hacer fseek()");
+                       fclose(f_did);
+                       *err = 8; /* EMUFS_ERROR_SEEK_FILE */
+                       return EMUFS_NOT_FOUND;
+               }
+               /* mido el tamaño del archivo */
+               if ((n_offset = ftell(f_did)) == -1) {
+                       PERR("No se pudo hacer ftell()");
+                       fclose(f_did);
+                       *err = 9; /* EMUFS_ERROR_TELL_FILE */
+                       return EMUFS_NOT_FOUND;
+               }
                fclose(f_did);
-               /*lo trunco */
-               truncate(name_f_did, n_offset - sizeof(EMUFS_REG_ID));
-       } else {
+               /* lo trunco */
+               if (truncate(name_f_did, n_offset - sizeof(EMUFS_REG_ID))) {
+                       PERR("No se pudo truncar el archivo did");
+                       *err = 10; /* EMUFS_ERROR_TRUNCATE_FILE */
+                       return EMUFS_NOT_FOUND;
+               }
+       } else if (!pos) {
                fclose(f_did);
                /* si el archivo esta vacio */
                n_regid = EMUFS_NOT_FOUND;
+       } else {
+               PERR("No se pudo hacer ftell()");
+               fclose(f_did);
+               *err = 9; /* EMUFS_ERROR_TELL_FILE */
+               return EMUFS_NOT_FOUND;
        }
        return n_regid;
 }
index 12b85924ee0edc7995097b37060b59ca0e9d1487..75042417d4c2681d8a43852e85e06f254766a0ba 100644 (file)
@@ -47,6 +47,6 @@ int emufs_did_crear(EMUFS*);
 /* Agrega un registro al archivo de ID's Libres (pila) */
 int emufs_did_agregar(EMUFS *, EMUFS_REG_ID);
 /* Devuelve el ID Libre, liberado mas recientemente (pila) */
-EMUFS_REG_ID emufs_did_get_last(EMUFS *); 
+EMUFS_REG_ID emufs_did_get_last(EMUFS*, int*); 
 
 #endif /* _EMUFS_DID_H */
index efcc2ad2af93812581de7bd6ebd015fd11821cfe..885c720504aee5b2225990d852accb8841db68c3 100644 (file)
 #include <stdlib.h>
 #include <stdio.h>
 
+#ifdef DEBUG
+       /** Imprime un mensaje de debug por pantalla. */
+       #define PERR(msg) fprintf(stderr, "%s:%d> %s.\n",__FILE__, __LINE__, msg);
+#else
+       #define PERR(msg) ;
+#endif /* DEBUG */
+
 /** Tipo de archivo. */
 typedef enum {
        T1, /**< Archivo de bloque parametrizado y registro variable. */
index 9ae481a3f01414ccfb8e540d1be52111326bb199..565cd3fe97f148a12df6a002ae775b7ab349e3bb 100644 (file)
@@ -36,6 +36,7 @@
  */
 
 #include "idx.h"
+#include "did.h"
 #include <stdlib.h>
 #include <strings.h>
 #include <unistd.h>
@@ -66,32 +67,41 @@ int emufs_idx_crear(EMUFS *efs)
 }
 
 /* Devuelve el mayor id de registro utilizado so far en el archivo de datos, revisando el indice. */
-EMUFS_REG_ID emufs_idx_buscar_mayor_id(EMUFS *emu)
+EMUFS_REG_ID emufs_idx_buscar_mayor_id_libre(EMUFS* emu, int* err)
 {
        EMUFS_REG_ID max = 0;
-       FILE *f_idx;    
+       FILEf_idx;    
        EMUFS_IDX reg;
        char name_f_idx[255]; /* TODO usar malloc para no limitar el tamaño de nombre de archivo */
-       char found = 0;
+       int found = 0;
 
-       strcpy(name_f_idx,emu->nombre);
+       strcpy(name_f_idx, emu->nombre);
        strcat(name_f_idx, EMUFS_IDX_EXT);
 
-       if ( (f_idx = fopen(name_f_idx,"r")) == NULL) return -1; /*ERROR*/
-       while ( !feof(f_idx) ){
+       if ((f_idx = fopen(name_f_idx, "rb")) == NULL) {
+               PERR("No se puede abrir archivo");
+               *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
+               return EMUFS_NOT_FOUND;
+       }
+       while (!feof(f_idx)) {
                /* Me aseguro de leer la cantidad de bytes correcta */
-               if (fread(&reg,sizeof(EMUFS_IDX),1,f_idx) != 1) continue;
+               if (fread(&reg, sizeof(EMUFS_IDX), 1, f_idx) != 1) {
+                       PERR("Error al leer registros de idx");
+                       *err = 3; /* EMUFS_ERROR_FILE_READ */
+                       return EMUFS_NOT_FOUND;
+               }
                if (reg.n_idreg >= max) {
                        max = reg.n_idreg;
                        found = 1;
                }
        }
        fclose(f_idx);
-       
-       if (!found)
-               return (0);
-       else
-               return(max+1);
+
+       if (b_found) {
+               return ++max;
+       } else {
+               return 0;
+       }
 }
 
 /* busca el registro ID en el archivo ".idx" y devuelve el nro de bloque en el que se encuentra */
@@ -197,3 +207,23 @@ int emufs_idx_borrar(EMUFS *emu, EMUFS_REG_ID n_IdReg)
        free(buffer);
        return 0;
 }
+
+EMUFS_REG_ID emufs_idx_get_new_id(EMUFS* efs, int* err)
+{
+       EMUFS_REG_ID id;
+
+       id = emufs_did_get_last(efs, err);
+       if (id == EMUFS_NOT_FOUND) {
+               if (*err) {
+                       PERR("error al obtener ultimo id");
+                       return id;
+               }
+               id = emufs_idx_buscar_mayor_id_libre(efs, err);
+               if (*err) {
+                       PERR("error al obtener id mayor");
+                       return id;
+               }
+       }
+       return id;      
+}
+
index 510e78c8db3f80f480604da8421b66731e9a2d1e..40bf53972a93c418dba454e7d8bdd9e516b33151 100644 (file)
@@ -50,10 +50,17 @@ typedef struct emufs_idx_t {
 } EMUFS_IDX;
 
 FILE* emufs_idx_abrir(EMUFS*, const char*);
+
 int emufs_idx_crear(EMUFS*);
-EMUFS_REG_ID emufs_idx_buscar_mayor_id(EMUFS *);
-EMUFS_BLOCK_ID emufs_idx_buscar_registro(EMUFS *, EMUFS_REG_ID);
-int emufs_idx_agregar(EMUFS *, EMUFS_BLOCK_ID, EMUFS_REG_ID);
-int emufs_idx_borrar(EMUFS *emu, EMUFS_REG_ID);
+
+EMUFS_REG_ID emufs_idx_buscar_mayor_id_libre(EMUFS*, int*);
+
+EMUFS_BLOCK_ID emufs_idx_buscar_registro(EMUFS*, EMUFS_REG_ID);
+
+int emufs_idx_agregar(EMUFS*, EMUFS_BLOCK_ID, EMUFS_REG_ID);
+
+int emufs_idx_borrar(EMUFS*, EMUFS_REG_ID);
+
+EMUFS_REG_ID emufs_idx_get_new_id(EMUFS*, int*);
 
 #endif /* _EMUFS_IDX_H */
index a75967e86941780b76651115fe5dca37ebb24d51..8cd7e2ccb6fe7c9805aee8a0a76bd1e785210ddb 100644 (file)
@@ -44,8 +44,6 @@
 #include <string.h>
 #include <unistd.h>
 
-#define PERR(msg) printf("%s:%d> %s.\n",__FILE__, __LINE__, msg);
-
 /*------------------ Funciones privadas ----------------------*/
 
 int emufs_tipo1_header_jump(FILE*);
@@ -183,7 +181,7 @@ EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* efs, void* reg,
                        return EMUFS_NOT_FOUND;
                }
                /* graba el registro al principio del bloque */
-               reg_id = emufs_tipo1_get_id(efs);
+               reg_id = emufs_idx_get_new_id(efs, err);
                /* graba registro en bloque */
                emufs_tipo1_escribir_reg_en_memoria(block, reg_id, reg_size, reg);
                /* graba el bloque en el archivo */
@@ -212,7 +210,7 @@ EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* efs, void* reg,
                }
                /* inserta el registro en el bloque */
                /* tengo que buscar un ID válido para el nuevo registro */
-               reg_id = emufs_tipo1_get_id(efs);
+               reg_id = emufs_idx_get_new_id(efs, err);
                /* graba registro en bloque */
                emufs_tipo1_escribir_reg_en_memoria(block + efs->tam_bloque - fs,
                                reg_id, reg_size, reg);
@@ -298,12 +296,6 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque(EMUFS *efs, void *block,
        return block_id;
 }
 
-/*Busco en el archivo de Id`s un Id valido para un nuevo registro*/
-EMUFS_REG_ID emufs_tipo1_get_id(EMUFS *emu)
-{
-       return -1; /* FIXME Error */
-}
-
 /*borra un registro de un bloque y acomoda los registros que quedan*/
 int emufs_tipo1_buscar_registro(EMUFS *emu, EMUFS_REG_ID id_reg)
 {
index cc540a81ea032bfdf5c87d0f9aba3228e6cd4210..00e63d5a82457891a4f0ca182b1f7426107a72ec 100644 (file)
@@ -54,8 +54,6 @@ EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS*, void*, EMUFS_REG_SIZE, int*);
 /** Graba el bloque apuntado por \param ptr en el archivo */
 EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque(EMUFS*, void*, EMUFS_BLOCK_ID, int*);
 
-EMUFS_REG_ID emufs_tipo1_get_id(EMUFS*);
-
 int emufs_tipo1_buscar_registro(EMUFS*, EMUFS_REG_ID);
 
 int emufs_tipo1_borrar_registro(EMUFS*, EMUFS_REG_ID, EMUFS_REG_SIZE);
index 6cb869dafbbce9d11355009c332ea5f2982b8c17..618032a26012f4858bb1172c3b70c3d434eb6ac7 100644 (file)
@@ -2,6 +2,7 @@
 
 int main(int argc, char* argv[]) {
        EMUFS* efs;
+
        if (argc < 2) {
                printf("Faltan argumentos! %s [nombre]\n", argv[0]);
                return 1;
@@ -22,7 +23,6 @@ int main(int argc, char* argv[]) {
                return 1;
        }
        return 0;
-       */
 
        efs = emufs_abrir(argv[1]);
        if (!efs) {
@@ -30,6 +30,13 @@ int main(int argc, char* argv[]) {
                return 1;
        }
 
+       if (!efs->leer_registro(efs, 0, registro1) == -1) {
+               printf("No se pudo leer el registro 1.\n");
+               return 1;
+       }
+       registro1[4] = '\0';
+       printf("Registro 1: %s\n", registro1);
+
        /*
        if (efs->leer_registro(efs, 1, registro2, 5) == -1) {
                printf("No se pudo leer el registro 2.\n");
@@ -39,6 +46,6 @@ int main(int argc, char* argv[]) {
        printf("Registro 2: %s\n", registro2);
        */
 
-       emufs_destruir(efs);
+       /*emufs_destruir(efs);*/
        return 0;
 }
index 194eee8b95d9486fa4d3e00909b27a6f0b86735e..4cd2fc97a12fbd8e29f325d048d9093d7580b11a 100644 (file)
@@ -69,7 +69,7 @@ EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *efs, void *ptr, EMUFS_REG_SIZE n
        if (n_WrtOffset == -1) {                       
                
                /* Obtengo un ID libre para el registro y luego grabo a disco */
-        n_IdReg = emufs_tipo2_get_id(efs);
+        n_IdReg = emufs_idx_get_new_id(efs, err);
                fseek(f_data, 0, SEEK_END);
                n_RegOffset = ftell(f_data);
 
@@ -207,18 +207,3 @@ int emufs_tipo2_dummyfill(EMUFS *efs, EMUFS_OFFSET n_RegPos, EMUFS_REG_SIZE n_Am
        return (0);
 }
 
-/**********************************************************************/
-/* EMUFS_REG_ID emufs_tipo2_get_id(EMUFS *efs)                        */
-/* Objetivo: Devuelve un Id apropiado y disponible para un nuevo reg  */
-/* Parametros: EMUFS *emu // Struct con handlers + info del openfile. */
-/**********************************************************************/
-EMUFS_REG_ID emufs_tipo2_get_id(EMUFS *efs)
-{
-       EMUFS_REG_ID n_RegId;
-
-       /* Si no se hallo un id libre, entonces debo usar el maximo + 1 */
-       if ( (n_RegId = emufs_did_get_last(efs)) == -1 )
-               n_RegId = emufs_idx_buscar_mayor_id(efs);
-       
-       return n_RegId; 
-}
index 4f95840835b8cb3393079fd9f35b41de48d003a1..e6b4051623bee6453610035bc36d6c8bc216ef61 100644 (file)
@@ -39,7 +39,6 @@
 
 EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *, void *, EMUFS_REG_SIZE, int*);
 int emufs_tipo2_borrar_registro(EMUFS*, EMUFS_REG_ID);
-EMUFS_REG_ID emufs_tipo2_get_id(EMUFS *);
 int emufs_tipo2_get_regsize(EMUFS *efs, EMUFS_OFFSET n_RegPos,EMUFS_REG_SIZE *n_RegSize);
 int emufs_tipo2_dummyfill(EMUFS *efs, EMUFS_OFFSET n_RegPos,EMUFS_REG_SIZE n_Amount);
 
index c31068a2b38b692bb367466dc411b28afb8fee9c..3656499da6a16af51342509e1b4f7b5474e73863 100644 (file)
@@ -139,7 +139,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t
                bloque = (char*)malloc(emu->tam_bloque);
                /* grabar el registro al principio del bloque */
                /*tengo que buscar un ID valido para el nuevo registro*/
-               ID_aux = emufs_tipo3_get_id(emu);
+               ID_aux = emufs_idx_get_new_id(emu, err);
                /*grabo el id en el bloque*/
                memcpy(bloque,&ID_aux,sizeof(EMUFS_REG_ID));
                /*grabo el registro en el bloque*/
@@ -171,7 +171,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t
                /*El error puede haberse producido porque la funcion leer_bloque devolvio -1, el cual es un bloque invalido*/
                /*insertar el registro en el bloque*/
                /*tengo que buscar un ID valido para el nuevo registro*/
-               ID_aux = emufs_tipo3_get_id(emu);
+               ID_aux = emufs_idx_get_new_id(emu, err);
                /*grabo el id en el bloque*/
                memcpy(bloque+emu->tam_bloque-fs,&ID_aux,sizeof(EMUFS_REG_ID));
                /*grabo el registro en el bloque*/
@@ -197,16 +197,6 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t
        return ID_aux;
 }
 
-/*Busco en el archivo de Id`s un Id valido para un nuevo registro*/
-EMUFS_REG_ID emufs_tipo3_get_id(EMUFS *emu)
-{
-       EMUFS_REG_ID id;
-
-       if ( (id = emufs_did_get_last(emu)) == EMUFS_NOT_FOUND )
-               id = emufs_idx_buscar_mayor_id(emu);
-       return id;      
-}
-
 /*Graba un bloque en el archivo*/
 int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num)
 {
index 71bcb683448167971145f0c5e34e8cfd837ef813..57f60a42cfacbb4c53b124cfe8d6dfa4baa94397 100644 (file)
@@ -61,8 +61,6 @@ int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num_bloque);
 
 int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg);
 
-EMUFS_REG_ID emufs_tipo3_get_id(EMUFS *emu);
-
 int emufs_tipo3_buscar_registro(EMUFS *emu, EMUFS_REG_ID id_reg);
 
 #endif /* _EMUFS_TIPO3_H_ */
index 9be9a2dcd3a4c97676b4b7eed73f83c88ad2f3a2..940931aa89533f116fecb6fad9a2dc62cebb605e 100644 (file)
@@ -41,7 +41,7 @@ int main(int argc, char *argv[])
 {
        EMUFS *fp;
        EMUFS_REG_ID n1, n2, n3, n4, n5, n6, n7, n8;
-       EMUFS_REG_SIZE size;
+       EMUFS_REG_SIZE reg_size;
        char a[100];
        char b[100];
        char c[100];
@@ -90,7 +90,7 @@ int main(int argc, char *argv[])
 
        fp->borrar_registro(fp, n3);
        printf("borre el registro de id = %lu\n",n3);
-       b_ptr = fp->leer_registro(fp, n2, &size, &err);
+       b_ptr = fp->leer_registro(fp, n2, &reg_size, &err);
 
        printf("Recuperado : %s\n", b_ptr);