From ee3853f9b2bed3fa3a1f3a90c8dca81686d39fc8 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Sun, 30 May 2004 15:25:45 +0000 Subject: [PATCH] Empiezo a recomponer features desactivadas. En esta caso, abrir_emufs con recuperacion de indices. --- emufs/emufs.c | 53 ++++++++++++++++++++++-- emufs/indices.c | 92 ++++++++++++++++++++++++++++++++++++++++++ emufs/indices.h | 1 + emufs_gui/articulos.c | 20 +-------- emufs_gui/emufs_view.c | 15 +++---- emufs_gui/facturas.c | 17 -------- 6 files changed, 152 insertions(+), 46 deletions(-) diff --git a/emufs/emufs.c b/emufs/emufs.c index c80da2e..067c445 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -54,9 +54,11 @@ typedef struct _data_indices_ { INDICE_TIPO_DATO tipo_dato; unsigned int offset; unsigned int tam_bloque; + int str_offset; } t_Indice; -int guardar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque); +int guardar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque, int str_offset); +int cargar_indices(EMUFS *emu); char *str_dup(const char *s); @@ -326,6 +328,8 @@ EMUFS *emufs_abrir(const char *filename) emufs_tipo5_inicializar(efs); } + /* finalmente cargo la data de los indices */ + cargar_indices(efs); fclose(fp); return efs; } @@ -453,7 +457,7 @@ int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDIC tmp = emufs_indice_crear(emu, nombre, funcion, tipo, tipo_dato, offset, tam_bloque, str_offset); /* Guardo la info del indice para poder abrir despues el archivo */ - guardar_indice(emu, nombre, funcion, tipo, tipo_dato, offset, tam_bloque); + guardar_indice(emu, nombre, funcion, tipo, tipo_dato, offset, tam_bloque, str_offset); if (tmp == NULL) { PERR("NO SE PUDO CREAR INDICE!!!"); @@ -493,7 +497,7 @@ INDICE_DATO *emufs_buscar_registros(EMUFS *emu, char *indice, char *data, int *c return tmp->buscar_entradas(tmp, k, cant); } -int guardar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque) +int guardar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque, int str_offset) { char filename[100]; FILE *fp; @@ -519,6 +523,7 @@ int guardar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO indices[cant].tipo_dato = tipo_dato; indices[cant].offset = offset; indices[cant].tam_bloque = tam_bloque; + indices[cant].str_offset = str_offset; fseek(fp, SEEK_SET, 0); cant++; @@ -529,6 +534,48 @@ int guardar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO return 1; } +int cargar_indices(EMUFS *emu) +{ + char filename[100]; + FILE *fp; + int cant, i; /* cantidad de indices hasta el momento */ + t_Indice *indices; + + sprintf(filename, "%s.info", emu->nombre); + fp = fopen(filename, "r"); + PERR("Abri info"); + PERR(filename); + if (fp == NULL) { + PERR("No se pudo"); + return 0; + } + + fread(&cant, 1, sizeof(int), fp); + indices = malloc(cant*sizeof(t_Indice)); + fread(indices, cant, sizeof(t_Indice), fp); + fclose(fp); + + /* Leo */ + emu->indices = NULL; + for(i=cant-1; i>=0; i++) { + INDICE *tmp; + tmp = emufs_indice_abrir(emu, + indices[i].nombre, + indices[i].funcion, + indices[i].tipo, + indices[i].tipo_dato, + indices[i].offset, + indices[i].tam_bloque, + indices[i].str_offset + ); + tmp->sig = emu->indices; + emu->indices = tmp; + } + + free(indices); + return 1; +} + /*crea un bloque y devuelve en numero del mismo*/ EMUFS_BLOCK_ID emufs_create_new_block(EMUFS *emu) { diff --git a/emufs/indices.c b/emufs/indices.c index aab487a..7bb8928 100644 --- a/emufs/indices.c +++ b/emufs/indices.c @@ -96,6 +96,98 @@ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, IND return tmp; } +INDICE *emufs_indice_abrir(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque, int str_offset) +{ + int len; + INDICE *tmp; + char string_file[255]; + tmp = (INDICE *)malloc(sizeof(INDICE)); + if (tmp == NULL) return NULL; + + len = strlen(emu->nombre); + len += strlen(nombre); + + tmp->filename = (char *)malloc(sizeof(char)*(len+6)); + strcpy(tmp->filename, emu->nombre); + strcat(tmp->filename, "_"); + strcat(tmp->filename, nombre); + strcat(tmp->filename, ".idx"); + + tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1)); + strcpy(tmp->nombre, nombre); + + tmp->tipo = tipo; + tmp->tipo_dato = tipo_dato; + switch (tipo_dato) { + case IDX_STRING: + sprintf(string_file, "%s_%s_%s", emu->nombre, nombre, "string"); + tmp->emu_string = emufs_crear(string_file, T2, 0, 0); + break; + case IDX_FLOAT: + case IDX_INT: + tmp->emu_string = NULL; + } + + tmp->tam_bloque = tam_bloque; + tmp->funcion = funcion; + switch (funcion) { + case IND_PRIMARIO: + tmp->emu_mult = NULL; + break; + case IND_SELECCION: + case IND_EXAHUSTIVO: + sprintf(string_file, "%s_%s_%s", emu->nombre, nombre, "multiples"); + tmp->emu_mult = emufs_crear(string_file, T2, 0, 0); + } + + tmp->offset = offset; + tmp->str_offset = str_offset; + tmp->sig = NULL; + tmp->size_claves = 0; + tmp->size_hijos = 0; + tmp->keybucket = NULL; + + fprintf(stderr, "TIPO ARBOL= %d\n", tmp->tipo); + switch (tmp->tipo) { + case IND_B: + PERR("Creando indice con Arbol B"); + /* Ya esta creado XXX emufs_indice_b_crear(tmp); */ + tmp->agregar_entrada = emufs_indice_b_insertar; + tmp->borrar_entrada = emufs_indice_b_borrar; + tmp->existe_entrada = emufs_indice_b_buscar; + tmp->buscar_entradas = emufs_indice_b_buscar_muchos; + tmp->obtener_menor_clave = emufs_indice_b_obtener_menor_clave; + tmp->obtener_mayor_clave = emufs_indice_b_obtener_mayor_clave; + tmp->obtener_sig_clave = emufs_indice_b_obtener_sig_clave; + break; + case IND_B_ASC: + /* llenar metodos */ + PERR("Creando indice con Arbol B*"); + /* Ya esta creado XXX emufs_indice_b_crear(tmp); */ + tmp->agregar_entrada = emufs_indice_b_asc_insertar; + tmp->borrar_entrada = emufs_indice_b_borrar; + tmp->existe_entrada = emufs_indice_b_buscar; + tmp->buscar_entradas = emufs_indice_b_buscar_muchos; + tmp->obtener_menor_clave = emufs_indice_b_obtener_menor_clave; + tmp->obtener_mayor_clave = emufs_indice_b_obtener_mayor_clave; + tmp->obtener_sig_clave = emufs_indice_b_obtener_sig_clave; + 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); + /* Ya esta creado XXX emufs_b_plus_crear(tmp); */ + tmp->obtener_menor_clave = emufs_b_plus_obtener_menor_clave; + tmp->obtener_mayor_clave = emufs_b_plus_obtener_mayor_clave; + PERR("AÚN NO IMPLEMENTADO DEL TODO!!!!!!!!"); + break; + } + + return tmp; +} + void emufs_indice_destruir(EMUFS *emu, INDICE *i) { /* TODO Sacar el indice de la lista en EMUFS */ diff --git a/emufs/indices.h b/emufs/indices.h index d85f56e..2be19c2 100644 --- a/emufs/indices.h +++ b/emufs/indices.h @@ -120,6 +120,7 @@ typedef struct _indices_h_ { * \param tam_bloque Tamaño del bloque (nodo) del arbol */ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned tam_bloque, int str_offset); +INDICE *emufs_indice_abrir(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque, int str_offset); /** Destruye un indice * diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index c042bfb..e5a6850 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -157,10 +157,7 @@ t_LstArticulos *art_cargar(t_Parametros *param) xmlFreeDoc(document); xmlCleanupParser(); } else { -/* XXX Ahora no necesito leer nada del archivo cuando lo cargo - * pues tengo todo en los indices - * - * PERR("Voy a recuperar desde un archivo"); + PERR("Voy a recuperar desde un archivo"); tmp->fp = emufs_abrir("articulos"); if (tmp->fp == NULL) { PERR("No se pudo cargar archivo de articulos."); @@ -168,21 +165,6 @@ t_LstArticulos *art_cargar(t_Parametros *param) lst_articulos = NULL; return NULL; } - Ahora trato de recuperar la info - indices = emufs_idx_get(tmp->fp, &indices_cant); - for(i=0; ifp->leer_registro(tmp->fp, indices[i], &size, &error); - if (procesar_leer_articulo(&art, save, size, tmp) == 1) { - agregar_nodo_articulo(tmp, crear_nodo_articulo(indices[i], art.numero)); - free(save); - } - } - free(indices); -*/ } return tmp; diff --git a/emufs_gui/emufs_view.c b/emufs_gui/emufs_view.c index edce8e4..fdd8c23 100644 --- a/emufs_gui/emufs_view.c +++ b/emufs_gui/emufs_view.c @@ -271,8 +271,9 @@ int main(int argc, char *argv[]) if (argc != 2) { print_help(argv[0]); } - - param_xml(argv[1], ¶metros); + + if (argc == 2) + param_xml(argv[1], ¶metros); #ifdef DEBUG printf("CUIDADO! - Uds esta a punto de ejecutar EMUFS Gui compilado con mensajes de debug (-DDEBUG). "); @@ -326,16 +327,16 @@ int main(int argc, char *argv[]) dialog = msg_box(stdscr, COLS, LINES, "Generando archivos ..."); -/* if (parametros.xml_art != -1) {*/ + if (argc == 2) { art_cargar(¶metros); -/* } else { + } else { art_cargar(NULL); } - if (parametros.xml_fact != -1) {*/ + if (argc == 2) { fact_cargar(¶metros); -/* } else { + } else { fact_cargar(NULL); - }*/ + } msg_box_free(stdscr, dialog); diff --git a/emufs_gui/facturas.c b/emufs_gui/facturas.c index de17769..23e9deb 100644 --- a/emufs_gui/facturas.c +++ b/emufs_gui/facturas.c @@ -308,8 +308,6 @@ t_LstFacturas *fact_cargar(t_Parametros *param) xmlFreeDoc(document); xmlCleanupParser(); } else { -#ifdef NO_SE_USA_MAS - /* TODO RECUPERAR INDICES DESDE EL ARCHIVO */ PERR("Voy a recuperar desde un archivo"); tmp->fp = emufs_abrir("facturas"); if (tmp->fp == NULL) { @@ -326,21 +324,6 @@ t_LstFacturas *fact_cargar(t_Parametros *param) lst_facturas = NULL; return NULL; } - - /* Ahora trato de recuperar la info */ - indices = emufs_idx_get(tmp->fp, &indices_cant); - for(i=0; ifp->leer_registro(tmp->fp, indices[i], &size, &error); - if (procesar_leer_factura(&art, save, size, tmp) == 1) { - agregar_nodo_factura(tmp, crear_nodo_factura(indices[i], art.reg_nota, art.numero)); - free(save); - } - } - free(indices); -#endif } PERR("Facturas todo Ok"); -- 2.43.0