efs->leer_registro = emufs_tipo2_leer_registro;
efs->modificar_registro = emufs_tipo2_modificar_registro;
efs->leer_estadisticas = emufs_tipo2_leer_estadisticas;
+ efs->compactar = emufs_tipo2_compactar;
return 0;
}
return(stats);
}
-/* Recompila y devuelve ciertas estadisticas del archivo indicado */
-int emufs_tipo2_recompactar(EMUFS *efs)
+/* Compacta el archivo eliminando espacios libres, alineando a izquierda */
+void emufs_tipo2_compactar(EMUFS *efs)
{
char name_fdat[255],name_ffsc[255];
FILE *datfile;
/* Obtengo el tamanio del .dat */
if ( (datfile = fopen(name_fdat,"rb+")) == NULL){
PERR("No se pudo abrir el archivo");
- return -1;
+ return;
}
fseek(datfile,0,SEEK_END);
datsize = ftell(datfile);
/* Obtengo la cantidad de gaps */
if ( (fscfile = fopen(name_ffsc,"rb")) == NULL){
PERR("No se pudo abrir el archivo");
- return -1;
+ return;
}
fseek(fscfile,0,SEEK_END);
cant_gaps = ftell(fscfile)/sizeof(EMUFS_FSC);
- if (cant_gaps == 0) return 0;
+ if (cant_gaps == 0) {
+ fclose(datfile);
+ fclose(fscfile);
+ return;
+ }
if (cant_gaps == 1) {
/* Un solo gap, muevo toda la data luego del gap y trunco */
fseek(fscfile,0,SEEK_SET);
totalfsc = emufs_fsc_get_total_fs(efs);
truncate(name_fdat,datsize - totalfsc);
truncate(name_ffsc,0);
- return 0;
+
+ /* Recreo el Indice con los nuevos offsets */
+ emufs_tipo2_updateidx(efs);
}
+/* Mueve data desde un source a un destination, de a chunks */
void emufs_tipo2_movedata(FILE *datfile,EMUFS_OFFSET *source, EMUFS_OFFSET *destination, EMUFS_BLOCK_SIZE mustmove_bytes)
{
- int chunksize = 9;
+ int chunksize = 25;
char *chunk = malloc(chunksize*sizeof(char));
unsigned long cant_chunks = 0,left_chunk = 0;
free(chunk);
}
+
+/* Sincroniza el Index con las posiciones de los datos, luego de un recompactar */
+int emufs_tipo2_updateidx(EMUFS *efs)
+{
+ char name_fdat[255];
+ FILE *datfile;
+ EMUFS_REG_ID reg_id = -1;
+ EMUFS_OFFSET reg_offset = -1;
+ EMUFS_REG_SIZE reg_size = -1;
+
+ strcpy(name_fdat,efs->nombre);
+ strcat(name_fdat,".dat");
+
+ /* Obtengo el tamanio del .dat */
+ if ( (datfile = fopen(name_fdat,"rb+")) == NULL){
+ PERR("No se pudo abrir el archivo");
+ return -1;
+ }
+
+ /* Recorremos el archivo y actualizamos el .idx */
+ fseek(datfile,sizeof(EMUFS_Tipo),SEEK_SET);
+ while (!feof(datfile))
+ {
+ /* Leo un ID y actualizo el offset en el .idx */
+ reg_offset = ftell(datfile);
+ if (fread(®_id,sizeof(EMUFS_REG_ID),1,datfile) != 1) continue;
+ emufs_idx_actualizar(efs,reg_id,reg_offset);
+ /* Salteo la data del registro, para leer el proximo header */
+ fread(®_size,sizeof(EMUFS_REG_SIZE),1,datfile);
+ fseek(datfile,reg_size,SEEK_CUR);
+ }
+
+ return 0;
+}
*/
EMUFS_Estadisticas emufs_tipo2_leer_estadisticas(EMUFS *efs);
-/** Método para recompactar un archivo tipo 2
+/** Método para compactar un archivo tipo 2
*
* \param efs Estructura que realiza el handling de archivos de cualquier tipo.
- * \return \b int Indicador de exito de la opracion.
*/
-int emufs_tipo2_recompactar(EMUFS *efs);
+void emufs_tipo2_compactar(EMUFS *efs);
+
+/** Método para mover datos de un source a un dest, de a chunks
+ *
+ * \param datfile Stream en el cual se esta haciendo el movimiento.
+ * \param source Source desde donde mover los datos.
+ * \param destination Destino hacia donde mover los datos.
+ * \param mustmove_bytes Cantidad de bytes a mover.
+ */
void emufs_tipo2_movedata(FILE * datfile,EMUFS_OFFSET *source, EMUFS_OFFSET *destination, EMUFS_BLOCK_SIZE mustmove_bytes);
+/** Método para sincronizar / actualiza un indice luego de una recompactacion
+ *
+ * \param efs Estructura que realiza el handling de archivos de cualquier tipo.
+ * \return \b int Indicador de exito de la opracion.
+ */
+int emufs_tipo2_updateidx(EMUFS *efs);
+
#endif /* _EMUFS_TIPO2_H_ */