\layout Section
Archivo de control de espacio libre (.fsc)
+\layout Subsection
+
+Estructura Física
\layout Standard
-idem anterior
+La estuctura que define este archivo es la siguiente:
+\layout Standard
+
+EMUFS_FSC que contiene
+\layout Itemize
+
+EMUFS_BLOCK_ID indica el número de bloque
+\layout Itemize
+
+EMUFS_FREE freespace indica la cantidad de espacio libre que queda en el
+ bloque.
\layout Section
Archivo de índices recuperables (.did)
#define EMUFS_FSC_EXT ".fsc"
typedef struct emufs_fsc_t {
- unsigned long int marker;
- unsigned long int freespace;
+ EMUFS_BLOCK_ID marker;
+ EMUFS_FREE freespace;
} EMUFS_FSC;
/** Crea un archivo de Gaps o Espacio Libre en Bloque */
ID_aux = emufs_tipo3_grabar_registro(emu, reg, emu->tam_reg, &err);
free(reg);
}
- /*tengo que truncar el archivo*/
- /*bloques_vacios = emufs_fsc_get_cant_bloques_vacios(emu)-1;
- */
+ /*trunco el archivo sacando los bloques vacios*/
block_id = emufs_fsc_buscar_lugar(emu, emu->tam_bloque, &fs);
size = sizeof(EMUFS_Tipo)+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_BLOCK_SIZE)+block_id*emu->tam_bloque;
if (truncate(name, size)!=0)
#include "idx.h"
#include "fsc.h"
-/** Lee el registro \param id_reg y lo almacena en \param ptr */
-void* emufs_tipo3_leer_registro(EMUFS*, EMUFS_REG_ID, EMUFS_REG_SIZE*, int*);
+/** Devuelve un puntero con la memoria reservada que contiene al registro solicitado
+ * por el segundo parámetro \param ID, y almacena en \param reg_size el tamaño del
+ * registro leido, que en este caso no es necesario pues es constante y es conocicdo de antemano.
+ * Para realizar esta acción, busca en el archivo .idx el bloque al cual pertenece el registro.
+ */
+void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE* reg_size, int* err);
-/** Lee el bloque \param num_bloque y lo almacena en \param ptr */
+/** Devuelve un puntero con la memoria reservada que contiene el bloque solicitado por
+ * el segundo parámetro \param num_bloque. Como la numeración de los bloques es virtual,
+ * el acceso al archivo para levantar un bloque es directo, es decir, se posiciona directamente
+ * en en número de bloque multiplicado por el tamaño del mismo, salteando antes el encabezado del archivo.
+ */
void* emufs_tipo3_leer_bloque(EMUFS*, EMUFS_BLOCK_ID, int*);
-/** Graba el registro apuntado por \param ptr en el archivo */
+/** Graba un registro en un bloque donde haya espacio suficiente, y si no
+ * crea un nuevo bloque y lo agrega al final del archivo.
+ * El registro a grabar es apuntado por el segundo parámetro \param ptr
+ * y el tamaño viene indicado en \param tam.
+ * Luego de realizar la grabación, actualiza los archivos índice con los
+ * valores correspondientes.
+ */
EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE, int*);
/** Graba el bloque apuntado por \param ptr en el archivo */
int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num_bloque);
-/** Borra el registro \param id_reg del archivo de datos */
+/** Borra el registro \param id_reg del archivo de datos, y actualiza los archivos
+ * de índice para mantener la coherencia en las próximas modificaciones.
+ */
int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg);
/** Método para modificar un registro */
EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, EMUFS_REG_ID, void*, EMUFS_REG_SIZE, int*);
-/** Carga una estructura del tipo EMUFS_Estadisticas con las estadisticas del archivo */
+/** Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas del
+ * archivo de datos, espacio libre total, cantidad de registros, cantidad de bloques,
+ * tamaño del archivo en bytes, relaciones entre tamaños y espacios libres, etc.
+ */
EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *);
/** Lee un registro con su informacion de control */
fp->compactar(fp);
ver_archivo_FS(fp);
-
- /*
- printf("COMPACTANDO........\n");
- fp->compactar(fp);
-
-ver_archivo_FS(fp);
-
- for (j=1; j<40; j+=2){
- b_ptr = fp->leer_registro(fp, v[j], ®_size, &err);
- printf("Recuperado %d: %s\n",v[j], b_ptr);
- free(b_ptr);
- }
-
-/*
- for (j=1; j<8; j+=2){
- b_ptr = fp->leer_registro(fp, v[j], ®_size, &err);
- printf("Recuperado : %s\n", b_ptr);
- free(b_ptr);
- }
-
- printf("GRABANDO REGISTROS....\n");
- v[0] = fp->grabar_registro(fp, a, 100, &err);
- v[1] = fp->grabar_registro(fp, c, 100, &err);
- v[2] = fp->grabar_registro(fp, d, 100, &err);
- v[3] = fp->grabar_registro(fp, e, 100, &err);
- v[4] = fp->grabar_registro(fp, f, 100, &err);
- v[5] = fp->grabar_registro(fp, g, 100, &err);
- v[6] = fp->grabar_registro(fp, h, 100, &err);
- v[7] = fp->grabar_registro(fp, i, 100, &err);
- v[4] = fp->grabar_registro(fp, f, 100, &err);
- v[5] = fp->grabar_registro(fp, g, 100, &err);
- v[6] = fp->grabar_registro(fp, h, 100, &err);
- v[7] = fp->grabar_registro(fp, i, 100, &err);
-
-
printf("BORRANDO REGISTROS....\n");
- for (j=0; j<8; j+=3){
- fp->borrar_registro(fp, v[j]);
- printf("borrado : %lu\n", v[j]);
+ for (j=0; j<20; j++){
+ fp->borrar_registro(fp, j);
+ printf("borrado : %lu\n", j);
}
-
-
printf("COMPACTANDO........\n");
fp->compactar(fp);
-
-
- stats = fp->leer_estadisticas(fp);
- printf("Size del Archivo de datos: %lu\n",stats.tam_archivo_bytes);
- printf("Cantidad de Registros en el Archivo de datos: %lu\n",stats.tam_archivo);
- printf("Total de espacio libre en el .dat: %lu\n",stats.total_fs);
- printf("Minimo espacio libre en bloque o gap: %lu\n",stats.min_fs);
- printf("Maximo espacio libre en bloque o gap: %lu\n",stats.max_fs);
- printf("Media de espacio libre en bloque o gap: %lu\n",stats.media_fs);
- printf("Cantidad en bytes de informacion de control: %lu\n",stats.info_control);
+ver_archivo_FS(fp);
- ver_archivo_FS(fp);
-*/
emufs_destruir(fp);
return 0;
}