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;
}
*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(®, 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(®, sizeof(EMUFS_IDX), 1, f_idx) == 1) {
+ found = 1;
+ max = reg.id_reg;
}
fclose(f_idx);
-
+
if (found) {
return ++max;
} else {
return EMUFS_NOT_FOUND;
}
- while (!feof(f_idx)) {
- if (fread(®, 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(®, sizeof(EMUFS_IDX), 1, f_idx) == 1) {
fclose(f_idx);
return reg.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(®,sizeof(EMUFS_IDX),1,f_idx);
fclose(f_idx);
+
return 0;
}
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(®, 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(®, 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(®, 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;
}
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(®, 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(®, sizeof(EMUFS_IDX), 1, f_idx);
+ if (reg.location != EMUFS_NOT_FOUND) {
+ fclose(f_idx);
return 0;
}
}
- fclose(fp);
+
+ fclose(f_idx);
return -1;
}
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*);
{
FILE *f;
EMUFS_Estadisticas stats;
+ EMUFS_REG_ID *tmp;
char name_f[255];
strcpy(name_f,emu->nombre);
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);
{
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;
} 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;
/* 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)
{
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);
{
/* 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 : ");
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);
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);
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 */
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);
}
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)
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;
+}