From: Ricardo Markiewicz Date: Sun, 30 May 2004 21:30:13 +0000 (+0000) Subject: * hago el nuevo art_reformatear X-Git-Tag: svn_import_r684~57 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/9fe20770f27710e6d9133fd19c88250815738b35 * hago el nuevo art_reformatear --- diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 6bc3b7a..74281fd 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -14,6 +14,8 @@ static t_Articulo *art_form_buscar(WINDOW *win, EMUFS_REG_ID *id); static void *procesar_guardar_articulo(t_Articulo *src, EMUFS_REG_SIZE *size, t_LstArticulos *lst); static int procesar_leer_articulo(t_Articulo *dst, void *src, EMUFS_REG_SIZE size, t_LstArticulos *lst); +static void dump_articulos(char *tmpfile); + #ifdef TP_PRIMER_ENTREGA /* Manejo de la lista doble */ static t_Reg_Articulo *crear_nodo_articulo(EMUFS_REG_ID reg, unsigned int num); @@ -528,80 +530,49 @@ void *procesar_guardar_articulo(t_Articulo *src, EMUFS_REG_SIZE *size, t_LstArti return tmp; } -void art_reformatear(int tipo, int tam_bloque, int tam_reg) +void art_reformatear(t_Parametros *param) { -#ifdef NO_SE_PUEDE_USAR - EMUFS *nuevo, *old; - EMUFS_REG_ID *indices, id; - EMUFS_REG_SIZE indices_total, i, size; - t_Articulo art; - t_LstArticulos *lst_nueva; - int error; + char *tmpfile = "tmp_file.xxx"; + FILE *fp; char *save; + int error; + EMUFS_REG_SIZE size; + EMUFS *emu; + t_Articulo articulo, *un_articulo; - PERR("==== EMPIEZO ====\n"); - old = lst_articulos->fp; - - /* Creo el nuevo file */ - PERR("Creo el archivo\n"); - nuevo = emufs_crear("emufs_tmp", tipo, tam_bloque, sizeof(t_Articulo)); - if (nuevo == NULL) { - PERR("ARCHIVO NUEVO NO CREADO"); - return; - } + /* Creo el archivo temporal con los datos actuales */ + PERR("Creo dumpfile"); + dump_articulos(tmpfile); + PERR("Listo"); - /* Creo la nueva lista */ - lst_nueva = (t_LstArticulos *)malloc(sizeof(t_LstArticulos)); - lst_nueva->primero = NULL; - lst_nueva->fp = nuevo; - - /* Leo los indices del archivo viejo */ - PERR("Obtengo Indices\n"); - indices = emufs_idx_get(old, &indices_total); - if (indices == NULL) { - art_liberar(lst_nueva); - return; - } + /* Destruyo el EMUFS y todos sus indices */ + art_liberar(NULL); - PERR("Proceso datos\n"); - for(i=0; ileer_registro(old, indices[i], &size, &error); - if (procesar_leer_articulo(&art, save, size, lst_articulos) == 1) { + /* vuelvo a crear el EMUFS y sus indices (esto deberia pisar lo actual) */ + PERR("Creando todo de nuevo") + + lst_articulos = (t_LstArticulos *)malloc(sizeof(t_LstArticulos)); + + emu = lst_articulos->fp = emufs_crear("articulos", param->tipo_arch_art, param->tam_bloque_art, sizeof(t_Articulo)); + emufs_agregar_indice(emu, "presentacion", IND_EXAHUSTIVO, param->ind_art[2].tipo_arbol, IDX_STRING, STRUCT_OFFSET(un_articulo, desc), param->ind_art[2].tam_bloque, 1); + emufs_agregar_indice(emu, "desc", IND_EXAHUSTIVO, param->ind_art[1].tipo_arbol, IDX_STRING, STRUCT_OFFSET(un_articulo, desc), param->ind_art[1].tam_bloque, 0); + emufs_agregar_indice(emu, "codigo", IND_PRIMARIO, param->ind_art[0].tipo_arbol, IDX_INT, 0, param->ind_art[0].tam_bloque, 0); + PERR("Listo"); + /* Ahora solo resta volver a meter todos los datos en el archivo */ + fp = fopen(tmpfile, "rb"); + PERR("Agregando datos de nuevo") + while (!feof(fp)) { + if (fread(&articulo, sizeof(t_Articulo), 1, fp) != 1) continue; + save = procesar_guardar_articulo(&articulo, &size, lst_articulos); + if (save) { + error = 0; + emu->grabar_registro(emu, save, size, &error); free(save); - /* Lei un registro Ok. Lo salvo en el archivo nuevo */ - save = procesar_guardar_articulo(&art, &size, lst_nueva); - if (save) { - error = 0; - id = nuevo->grabar_registro(nuevo, save, size, &error); - agregar_nodo_articulo(lst_nueva, crear_nodo_articulo(id, art.numero)); - free(save); - } } } - - free(indices); - - PERR("Libero lo viejo\n"); - art_liberar(lst_articulos); - - PERR("Ahora tengo lo nuevo\n"); - lst_articulos = lst_nueva; - - /* El nuevo tiene como nombre emufs_tmp, lo cambio a mano! */ - free(lst_articulos->fp->nombre); - lst_articulos->fp->nombre = (char *)malloc(sizeof(char)*(strlen("articulos")+1)); - strcpy(lst_articulos->fp->nombre, "articulos"); - - /* Muevo los archivos! */ - /* TODO : Poner en otro lugar mas generico! */ - PERR("Renombre!!\n"); - rename("emufs_tmp.dat", "articulos.dat"); - rename("emufs_tmp.idx", "articulos.idx"); - rename("emufs_tmp.fsc", "articulos.fsc"); - rename("emufs_tmp.did", "articulos.did"); - PERR("==== TERMINE ====\n"); -#endif + fclose(fp); + PERR("Todo listo"); + unlink(tmpfile); } int art_exportar_xml(const char *filename) @@ -1316,3 +1287,30 @@ void art_actualizar_stock(int numero, int cv) } } +static void dump_articulos(char *tmpfile) +{ + t_Articulo *art; + EMUFS_REG_ID id; + FILE *fp; + CLAVE k; + INDICE *idx; + + idx = lst_articulos->fp->indices; + + k = idx->obtener_menor_clave(idx); + + if (!(fp = fopen(tmpfile, "wb"))) return; + + while (k.i_clave != -1) { + art = art_obtener(lst_articulos, k.i_clave, &id); + if (art != NULL) { + fwrite(art, 1, sizeof(t_Articulo), fp); + free(art); + } + k = idx->obtener_sig_clave(idx, k); + } + + fclose(fp); + return; +} + diff --git a/emufs_gui/articulos.h b/emufs_gui/articulos.h index 41f1699..2b05305 100644 --- a/emufs_gui/articulos.h +++ b/emufs_gui/articulos.h @@ -44,7 +44,7 @@ void art_eliminar(char *); void art_modificar(char *); void art_consultas(char *); t_LstArticulos *art_get_lst(); -void art_reformatear(int tipo, int tam_bloque, int tam_reg); +void art_reformatear(t_Parametros *param); int art_exportar_xml(const char *filename); diff --git a/emufs_gui/emufs_view.c b/emufs_gui/emufs_view.c index d72c987..cccd036 100644 --- a/emufs_gui/emufs_view.c +++ b/emufs_gui/emufs_view.c @@ -264,10 +264,11 @@ void param_xml(char *s, t_Parametros *param) } } +static t_Parametros parametros; + int main(int argc, char *argv[]) { WINDOW *dialog; - t_Parametros parametros; if (argc != 2) { print_help(argv[0]); @@ -673,7 +674,9 @@ void menu_mantenimiento() nuevo_tam_registro = -1; /* No permito cambiar el tamaƱo de registro */ preguntar_nuevo_tipo("Parametros para Articulos", &nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro); dlg = msg_box(stdscr, COLS, LINES, "Cambiando el formato de archivo .... Aguarde"); - art_reformatear(nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro); + parametros.tipo_arch_art = nuevo_tipo; + parametros.tam_bloque_art = nuevo_tam_bloque; + art_reformatear(¶metros); msg_box_free(stdscr, dlg); break; case 4: