recuperacion de 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);
emufs_tipo5_inicializar(efs);
}
+ /* finalmente cargo la data de los indices */
+ cargar_indices(efs);
fclose(fp);
return efs;
}
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!!!");
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;
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++;
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)
{
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 */
* \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
*
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.");
lst_articulos = NULL;
return NULL;
}
- Ahora trato de recuperar la info
- indices = emufs_idx_get(tmp->fp, &indices_cant);
- for(i=0; i<indices_cant; i++) {
- t_Articulo art;
- void *save;
- Leo el registro
- error = 0;
- 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(indices[i], art.numero));
- free(save);
- }
- }
- free(indices);
-*/
}
return tmp;
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). ");
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);
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) {
lst_facturas = NULL;
return NULL;
}
-
- /* Ahora trato de recuperar la info */
- indices = emufs_idx_get(tmp->fp, &indices_cant);
- for(i=0; i<indices_cant; i++) {
- t_Factura art;
- void *save;
- /* Leo el registro */
- save = tmp->fp->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");