]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
* Se cambia la implementacion de IDX acorde al enunciado
authorRicardo Markiewicz <gazer.arg@gmail.com>
Thu, 15 Apr 2004 05:32:28 +0000 (05:32 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Thu, 15 Apr 2004 05:32:28 +0000 (05:32 +0000)
 * Se actualizan las funciones que utilizaban API deprecada

emufs/emufs.c
emufs/idx.c
emufs/idx.h
emufs/tipo3.c
emufs_gui/articulos.c
emufs_gui/registros.c

index 33c114a5fe39a84216aa4517a7a43e7957055652..297cf9d017e76d6230c1f02fb392b675a0581688 100644 (file)
@@ -278,17 +278,15 @@ int ver_archivo_FS(EMUFS *emu)
        fprintf(stderr, "BLOQUES Y REGISTROS\n");
        strcpy(name_f_block_free,emu->nombre);
        strcat(name_f_block_free,".idx");
+       f_block_free = fopen(name_f_block_free, "r");
        {
                EMUFS_IDX r;
-               f_block_free = fopen(name_f_block_free, "r");
-               fread(&r, sizeof(EMUFS_IDX), 1, f_block_free);
                while (!feof(f_block_free)) {
+                       if (fread(&r, sizeof(EMUFS_IDX), 1, f_block_free) != 1) continue;
                        fprintf(stderr, "ID %li en bloque %li\n", r.id_reg, r.location);
-                       fread(&r, sizeof(EMUFS_IDX), 1, f_block_free);
                }
-               fclose(f_block_free);
        }
-       
+       fclose(f_block_free);
        
        return 0;
 }
index 7e485451a84b06c8308017673c1589fdadd788ab..cb2ff78b15e2592f44c42eb33260576a4e02750e 100644 (file)
@@ -83,21 +83,19 @@ EMUFS_REG_ID emufs_idx_buscar_mayor_id_libre(EMUFS* emu, int* err)
                *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) {
-                       if (feof(f_idx)) break; /* No leyĆ³ por EOF */
-                       PERR("Error al leer registros de idx");
-                       *err = 3; /* EMUFS_ERROR_FILE_READ */
-                       return EMUFS_NOT_FOUND;
-               }
-               if (reg.id_reg >= max) {
-                       max = reg.id_reg;
-                       found = 1;
-               }
+
+       /* Voy a la ultima entrada */
+       if (fseek(f_idx, -sizeof(EMUFS_IDX), SEEK_END) != 0) {
+               fclose(f_idx);
+               return 0;
+       }
+       
+       if (fread(&reg, sizeof(EMUFS_IDX), 1, f_idx) == 1) {
+               found = 1;
+               max = reg.id_reg;
        }
        fclose(f_idx);
-
+       
        if (found) {
                return ++max;
        } else {
@@ -121,14 +119,9 @@ EMUFS_BLOCK_ID emufs_idx_buscar_registro(EMUFS *emu, EMUFS_REG_ID reg_id)
                return EMUFS_NOT_FOUND;
        }
 
-       while (!feof(f_idx)) {
-               if (fread(&reg, sizeof(EMUFS_IDX), 1, f_idx) != 1) {
-                       if (feof(f_idx)) break; /* No leyĆ³ por EOF */
-                       PERR("Error al leer registros de idx");
-                       /*   *err = 3; * EMUFS_ERROR_FILE_READ */
-                       return EMUFS_NOT_FOUND;
-               }
-               if (reg.id_reg == reg_id) {
+       /* Me muevo a la posicion pedida */
+       if (fseek(f_idx, sizeof(EMUFS_IDX)*reg_id, SEEK_SET) == 0) {
+               if (fread(&reg, sizeof(EMUFS_IDX), 1, f_idx) == 1) {
                        fclose(f_idx);
                        return reg.location;
                }
@@ -148,13 +141,14 @@ int emufs_idx_agregar(EMUFS *emu, EMUFS_REG_ID id_reg, EMUFS_BLOCK_ID location)
        strcpy(name_f_idx,emu->nombre);
        strcat(name_f_idx, EMUFS_IDX_EXT);
 
-       if ( (f_idx = fopen(name_f_idx,"a+"))==NULL ) return -1;
-               
-    /* Note: Location = Bloque para Tipo 1 y 3, Offset para Tipo 2 */
+       if ( (f_idx = fopen(name_f_idx,"a+b"))==NULL ) return -1;
+
+       fseek(f_idx, sizeof(EMUFS_IDX)*id_reg, SEEK_SET); 
        reg.id_reg = id_reg;
        reg.location = location;
        fwrite(&reg,sizeof(EMUFS_IDX),1,f_idx); 
        fclose(f_idx);
+
        return 0;
 }
 
@@ -164,43 +158,18 @@ int emufs_idx_borrar(EMUFS *emu, EMUFS_REG_ID idreg)
        FILE *f_idx;
        EMUFS_IDX reg;
        char name_f_idx[255];
-       long actual, final, cant, i, tam;
        
        strcpy(name_f_idx,emu->nombre);
        strcat(name_f_idx, EMUFS_IDX_EXT);
 
-       if ( (f_idx = fopen(name_f_idx,"r+"))==NULL ) return -1;
-
-       while ( !feof(f_idx) ){
-               /*busco cual tengo que borrar*/
-               if ( fread(&reg, sizeof(EMUFS_IDX), 1, f_idx) != 1 ) continue;
-               if ( reg.id_reg == idreg ) {
-                       break;
-               }
-       }
+       if ( (f_idx = fopen(name_f_idx,"r+"))==NULL ) return 1;
 
-       /* me paro en el que tengo que borrar */
-       fseek(f_idx, -sizeof(EMUFS_IDX), SEEK_CUR);     
-       actual = ftell(f_idx); /* Guardo la posicion actual */
-       fseek(f_idx, 0, SEEK_END); /* me voy al final */
-       final = ftell(f_idx); /* veo cuando ocupa el archivo */
-       fseek(f_idx, actual, SEEK_SET);/* vuelvo al lugar desde donde quiero justificar */
-       /*calculo cuantos registros tengo que mover */
-       cant = (final-actual)/sizeof(EMUFS_IDX);
-       /*apunto al siguiente del que quiero borrar*/
-       /*leo todos los que quedan*/
-       for(i=0; i<cant; i++) {
-               final = actual + sizeof(EMUFS_IDX);
-               fseek(f_idx, final, SEEK_SET);
-               fread(&reg, sizeof(EMUFS_IDX), 1, f_idx);
-               fseek(f_idx, actual, SEEK_SET);
+       if (fseek(f_idx, sizeof(EMUFS_IDX)*idreg, SEEK_SET) == 0) {
+               reg.id_reg = idreg;
+               reg.location = EMUFS_NOT_FOUND;
                fwrite(&reg, sizeof(EMUFS_IDX), 1, f_idx);
-               actual += sizeof(EMUFS_IDX);
        }
-       /* Aca deberia estar al final del archivo , no hago seek */     
-       tam = ftell(f_idx);
        fclose(f_idx);
-       truncate(name_f_idx, tam-sizeof(EMUFS_IDX));
        
        return 0;
 }
@@ -221,72 +190,64 @@ EMUFS_REG_ID emufs_idx_get_new_id(EMUFS* efs, int* err)
                        return EMUFS_NOT_FOUND;
                }
        }
+
        return id;      
 }
 
-EMUFS_REG_ID emufs_idx_get_count(EMUFS *emu)
+EMUFS_REG_ID *emufs_idx_get(EMUFS *emu, EMUFS_REG_ID *cant)
 {
-       FILE *fp;
+       FILE *f_idx;
+       int count;
        char name_f_idx[255];
-       EMUFS_REG_ID tam;
+       EMUFS_REG_ID *tmp;
+       EMUFS_IDX reg;
        
        strcpy(name_f_idx,emu->nombre);
        strcat(name_f_idx, EMUFS_IDX_EXT);
 
-       if ( (fp = fopen(name_f_idx, "rb"))==NULL){
+       if ( (f_idx = fopen(name_f_idx, "rb"))==NULL){
                PERR("No se pudo abrir el archvo");
-               return -1;
+               (*cant) = EMUFS_NOT_FOUND;
+               return NULL;
        }
 
-       fseek(fp, 0l, SEEK_END);
-       tam = ftell(fp);
-       fclose(fp);
-
-       return tam/sizeof(EMUFS_IDX);
-}
-
-EMUFS_REG_ID emufs_idx_get_id_at(EMUFS *emu, long pos)
-{
-       FILE *fp;
-       char name_f_idx[255];
-       EMUFS_IDX id;
-       
-       strcpy(name_f_idx,emu->nombre);
-       strcat(name_f_idx, EMUFS_IDX_EXT);
-
-       if ( (fp = fopen(name_f_idx, "rb")) == NULL){
-               PERR("No se pudo abrir el archivo");
-               return -1;
+       tmp = NULL;
+       count = 0;
+       while (!feof(f_idx)) {
+               if (fread(&reg, sizeof(EMUFS_IDX), 1, f_idx) != 1) continue;
+               count++;
+               /* TODO : Verificar errores :-D */
+               tmp = realloc(tmp, count);
+               tmp[count-1] = reg.id_reg;
        }
+       fclose(f_idx);
 
-       fseek(fp, pos*sizeof(EMUFS_IDX), SEEK_SET);
-       fread(&id, sizeof(EMUFS_IDX), 1, fp);
-       fclose(fp);
-
-       return id.id_reg;
+       (*cant) = count;
+       return tmp;
 }
 
 int emufs_idx_existe_id(EMUFS *emu, int ID)
 {
-       FILE *fp;
+       FILE *f_idx;
        char name_f_idx[255];
-       EMUFS_IDX id;
+       EMUFS_IDX reg;
        
        strcpy(name_f_idx,emu->nombre);
        strcat(name_f_idx, EMUFS_IDX_EXT);
 
-       if ( (fp = fopen(name_f_idx, "rb")) == NULL){
+       if ( (f_idx = fopen(name_f_idx, "rb")) == NULL){
                PERR("No se pudo abrir el archivo");
                return -1;
        }
-       
-       while ( !feof(fp) ){
-               fread(&id, sizeof(EMUFS_IDX), 1, fp);
-               if ( id.id_reg == ID ){
-                       fclose(fp);
+
+       if (fseek(f_idx, sizeof(EMUFS_IDX)*ID, SEEK_SET) == 0) {
+               fread(&reg, sizeof(EMUFS_IDX), 1, f_idx);
+               if (reg.location != EMUFS_NOT_FOUND) {
+                       fclose(f_idx);
                        return 0;
                }
        }
-       fclose(fp);
+
+       fclose(f_idx);
        return -1;
 }
index 1b94da4c8ce88f1def55663b404c9931efdc5799..c6a927515505d9cc92992546f7c2912d63d0cb69 100644 (file)
@@ -61,9 +61,13 @@ 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_count(EMUFS *);
-
-EMUFS_REG_ID emufs_idx_get_id_at(EMUFS *, long pos);
+/** Retorna un array con los Ids validos del archivo IDX
+ *
+ *  EL ARRAY DEBE SER LIBERADO!
+ *  \param emu EMUFS
+ *  \param cant Puntero donde guardar la cantidad de items
+ */
+EMUFS_REG_ID *emufs_idx_get(EMUFS *emu, EMUFS_REG_ID *cant);
 
 EMUFS_REG_ID emufs_idx_get_new_id(EMUFS*, int*);
 
index 3d4a2739a4d6a42a4eed6df44d5096d4811ebc06..f5291ec043086467ecf36e8b7af0f06366f16996 100644 (file)
@@ -313,6 +313,7 @@ EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *emu)
 {
        FILE *f;
        EMUFS_Estadisticas stats;
+       EMUFS_REG_ID *tmp;
        char name_f[255];
 
        strcpy(name_f,emu->nombre);
@@ -326,7 +327,8 @@ EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *emu)
        fseek(f,0,SEEK_END);
        stats.tam_archivo_bytes = ftell(f);
        stats.cant_bloques = ( ftell(f) - sizeof(EMUFS_Tipo) - sizeof(EMUFS_BLOCK_SIZE) - sizeof(EMUFS_REG_SIZE) )/ emu->tam_bloque;
-       stats.tam_archivo = emufs_idx_get_count(emu);
+       tmp = emufs_idx_get(emu, &stats.tam_archivo);
+       if (tmp) free(tmp);
        stats.total_fs = emufs_fsc_get_total_fs(emu);
        /*verificar el segentado*/
        stats.info_control = stats.tam_archivo*sizeof(EMUFS_REG_ID) + sizeof(EMUFS_Tipo) + sizeof(EMUFS_BLOCK_SIZE) + sizeof(EMUFS_REG_SIZE);
index dd4e29a20b1852916436d5b4da530e71295f2e6b..150910ed35ab49d22a3e45fe9eeb07b86decef1a 100644 (file)
@@ -64,11 +64,11 @@ t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque)
 {
        xmlDocPtr document;
        xmlNode *node, *inicio;
-       int cant, error = 0, i;
+       int error = 0, i;
        EMUFS_REG_SIZE size;
        t_LstArticulos *tmp;
        lst_articulos = NULL;
-       EMUFS_REG_ID id;
+       EMUFS_REG_ID id, *indices, indices_cant;
 
        tmp = (t_LstArticulos *)malloc(sizeof(t_LstArticulos));
        if (tmp == NULL) return NULL;
@@ -123,18 +123,18 @@ t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque)
        } else {
                tmp->fp = emufs_abrir("articulos");
                /* Ahora trato de recuperar la info */
-               cant = emufs_idx_get_count(tmp->fp);
-               for(i=0; i<cant; i++) {
+               indices = emufs_idx_get(tmp->fp, &indices_cant);
+               for(i=0; i<indices_cant; i++) {
                        t_Articulo art;
                        void *save;
-                       id = emufs_idx_get_id_at(tmp->fp, i);
                        /* Leo el registro */
-                       save = tmp->fp->leer_registro(tmp->fp, id, &size, &error);
+                       save = tmp->fp->leer_registro(tmp->fp, indices[i], &size, &error);
                        if (procesar_leer_articulo(&art, save, size, tmp) == 1) {
-                               agregar_nodo_articulo(tmp, crear_nodo_articulo(id, art.numero));
+                               agregar_nodo_articulo(tmp, crear_nodo_articulo(indices[i], art.numero));
                                free(save);
                        }
                }
+               free(indices);
        }
 
        return tmp;
index 69d73b66e4a2d71978271ff96dfd8cec9e1b9fd7..7c043e7b901dadb401946533ad55e65f5c8e8efd 100644 (file)
@@ -6,6 +6,7 @@
 /* Se encarga de reemplazar los \0 un caracter visual, y segurar un \0 al final */
 static char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho);
 static char *procesar_registro_articulo_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho);
+static int preguntar_id(WINDOW *win, EMUFS *fp);
 
 void mostrar_info(WINDOW *padre, int h, int offset_alto)
 {
@@ -32,6 +33,7 @@ void mostrar_info(WINDOW *padre, int h, int offset_alto)
        waddstr(padre, "E");
        wattroff(padre, A_BOLD);
        waddstr(padre, "liminar ");
+       mvwaddstr(padre, h-offset_alto+6, 8, "Buscar ID : B");
        
        /* Info de leyenda */
        wattron(padre, A_BOLD);
@@ -50,15 +52,17 @@ void ver_registros(WINDOW *padre, int w, int h)
 {
        /* Ventanas donde mostrar las cosas */
        char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*);
-       WINDOW *actual[2];
+       WINDOW *actual[2], *dlg;
        EMUFS_REG_SIZE size;
        int scroll, actual_ancho;
        int max_scroll, c, offset_alto;
-       EMUFS_REG_ID ant_indice, total_indice; /* Indice de registro que tengo en ANT */
+       /* Indices que hay validos en IDX */
+       EMUFS_REG_ID *indices, indices_total, indices_actual;
        char *data; /* Registros a mostrar en pantalla */
        char codigo[50]; /* Variable para guardar el codigo actual para mandar a modificar */
        EMUFS *fp;
        int pos_actual, ancho_registro, offset, pos;
+       
        fp = emufs_abrir("articulos");
        wattron(padre, COLOR_PAIR(COLOR_BLUE));
        mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
@@ -76,10 +80,10 @@ void ver_registros(WINDOW *padre, int w, int h)
                        waddstr(padre, "Registro fijo con bloque parametrizado.");
        }
 
-       total_indice = emufs_idx_get_count(fp);
+       indices = emufs_idx_get(fp, &indices_total);
 
-       ant_indice = 0;
-       data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual);
+       indices_actual = 0;
+       data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
        data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
 
 
@@ -108,27 +112,40 @@ void ver_registros(WINDOW *padre, int w, int h)
        scroll = 0;
        while ((c=getch()) != 13) {
                switch (c) {
+                       case 'b':
+                       case 'B':
+                               dlg = newwin(4, 50, h/2-2, w/2-25);
+                               box(dlg, 0, 0);
+                               preguntar_id(dlg, fp);
+                               werase(dlg);
+                               wrefresh(dlg);
+                               delwin(dlg);
+                               wrefresh(padre);
+                               curs_set(0);
+                       break;
                        case 'e':
                        case 'E':
-                               if (ant_indice != EMUFS_NOT_FOUND)
-                                       fp->borrar_registro(fp, emufs_idx_get_id_at(fp, ant_indice));
+                               if (indices_actual != EMUFS_NOT_FOUND)
+                                       fp->borrar_registro(fp, indices[indices_actual]);
        
-                               total_indice = emufs_idx_get_count(fp);
-                               if (ant_indice >= total_indice) {
-                                       ant_indice = total_indice - 1;
+                               free(indices);
+                               indices = emufs_idx_get(fp, &indices_total);
+                               if (indices_actual >= indices_total) {
+                                       indices_actual = indices_total - 1;
                                }
                                
-                               data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual);
+                               data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
                                data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
                        break;
                        case 'g':
                        case 'G':
                                art_agregar(NULL);
                                free(data);
-                               data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual);
+                               data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
                                data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
        
-                               total_indice = emufs_idx_get_count(fp);
+                               free(indices);
+                               indices = emufs_idx_get(fp, &indices_total);
 
                                /* Tengo que re-pintar algunas cosas */
                                mostrar_info(padre, h, offset_alto);
@@ -137,12 +154,12 @@ void ver_registros(WINDOW *padre, int w, int h)
                        break;                  
                        case 'M':
                        case 'm': /* Quiero editar !!! */
-                               sprintf(codigo, "%lu", emufs_idx_get_id_at(fp, ant_indice));
+                               sprintf(codigo, "%lu", indices[indices_actual]);
                                art_modificar(codigo);  
                                /* Vuelvo a cargar el articulo actual */
                                
                                free(data);
-                               data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual);
+                               data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
                                data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
 
                                /* Tengo que re-pintar algunas cosas */
@@ -159,20 +176,20 @@ void ver_registros(WINDOW *padre, int w, int h)
                                if (scroll > max_scroll) scroll = max_scroll;
                        break;
                        case 'l':
-                               if (ant_indice < total_indice) {
-                                       ant_indice++;
-                                       if (ant_indice >= total_indice) ant_indice = total_indice-1;
+                               if (indices_actual < indices_total) {
+                                       indices_actual++;
+                                       if (indices_actual >= indices_total) indices_actual = indices_total-1;
                                        if (data) free(data);
-                                       data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual);
+                                       data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
                                        data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
                                }
                        break;
                        case 'k':
-                               if (ant_indice != EMUFS_NOT_FOUND) {
-                                       ant_indice--;
-                                       if (ant_indice == EMUFS_NOT_FOUND) ant_indice = 0;
+                               if (indices_actual != EMUFS_NOT_FOUND) {
+                                       indices_actual--;
+                                       if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
                                        if (data) free(data);
-                                       data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual);
+                                       data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
                                        data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
                                }
 
@@ -200,6 +217,7 @@ void ver_registros(WINDOW *padre, int w, int h)
        delwin(actual[0]);
        wrefresh(padre);
        curs_set(1);
+       free(indices);
 }
 
 char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
@@ -347,4 +365,32 @@ char *procesar_registro_articulo_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *si
        return salida;
 }
 
+int preguntar_id(WINDOW *win, EMUFS *fp)
+{
+       int n=-1, j=0;
+       t_Form *form = form_crear(win);
+       form_agregar_widget(form, INPUT, "ID a buscar", 8, "");
+
+       do {
+               if (j != 0) {
+                       curs_set(0);
+                       wattron(win, COLOR_PAIR(COLOR_YELLOW));
+                       wattron(win, A_BOLD);
+                       mvwaddstr(win, 2, 1, "Registro no encontrado!!");
+                       wattroff(win, A_BOLD);
+                       wattroff(win, COLOR_PAIR(COLOR_YELLOW));
+                       wrefresh(win);
+                       getch();
+                       werase(win);
+                       box(win, 0, 0);
+               }
+               form_ejecutar(form, 1,1);
+
+               n = form_obtener_valor_int(form, "ID a buscar");
+               j = 1;
+       } while (emufs_idx_existe_id(fp, n) != 0);
+
+       form_destruir(form);
+       return n;
+}