\layout Standard
+\family typewriter
+EMUFS
+\family default
\emph on
-EMUFS
+
\emph default
es la estuctura principal que encapsula todas las funciones para el manejo
de un archivo de datos.
Esta estructura consta de:
\layout Enumerate
-EMUFS_Tipo que es un tipo enumerado que indica cual es la organización.
+
+\family typewriter
+EMUFS_Tipo
+\family default
+ que es un tipo enumerado que indica cual es la organización.
\layout Enumerate
-EMUFS_BLOCK_SIZE indica el tamaño del bloque para los tipos 1 y 3.
+
+\family typewriter
+EMUFS_BLOCK_SIZE
+\family default
+ indica el tamaño del bloque para los tipos 1 y 3.
\layout Enumerate
-EMUFS_REG_SIZE indica el tamaño del registro, para el tipo 3 que posee tamaño
- constante.
+
+\family typewriter
+EMUFS_REG_SIZE
+\family default
+ indica el tamaño del registro, para el tipo 3 que posee tamaño constante.
\layout Enumerate
-void *leer_bloque()
-\layout Comment
-no me convence esta descripcion.
-
+\family typewriter
+void **leer_bloque()
+\family default
+puntero a la función para leer un bloque.
+\layout Enumerate
+
+
+\family typewriter
+void *leer_bloque_raw()
+\family default
+ puntero a la función para leer un bloque, el anterior y el siguiente.
+\layout Enumerate
+
+
+\family typewriter
+void **leer_registro()
+\family default
+ puntero a la función para leer un registro.
+\layout Enumerate
+
+
+\family typewriter
+void **leer_registro_raw()
+\family default
+ puntero a la función para leer un registro con su encabezado.
+\layout Enumerate
+
+
+\family typewriter
+EMUFS_REG_ID *grabar_registro()
+\family default
+ puntero a la función para grabar un registro.
+\layout Enumerate
+
+
+\family typewriter
+EMUFS_REG_ID *modificar_registro()
+\family default
+puntero a la función para modificar un registro.
+\layout Enumerate
+
+
+\family typewriter
+int *borrar_registro()
+\family default
+ puntero a la función para borrar un registro.
+\layout Enumerate
+
+
+\family typewriter
+EMUFS_Estadisticas *leer_estadisticas()
+\family default
+ puntero a la función para cargar una estructura con las estadísticas.
+\layout Enumerate
+
+
+\family typewriter
+void *compactar()
+\family default
+ puntero a la función para compactar un archivo.
+\layout Enumerate
+
+
+\family typewriter
+char *nombre
+\family default
+ almacena el nombre del archivo sin extensión.
+\layout Standard
+
+Esta estructura define los valores de sus punteros según el tipo de organización
+ que se desee manejar.
+\layout Standard
+
+Por ejemplo si se desea crear un archivo de nombre
+\begin_inset Quotes eld
+\end_inset
+
+facturas
+\begin_inset Quotes erd
+\end_inset
+
+ organizado de la forma 3, se invoca a la función
+\family typewriter
+EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo,EMUFS_BLOCK_SIZE
+ tam_bloque, EMUFS_REG_SIZE tam_reg),
+\family default
+donde
+\family typewriter
+ filename
+\family default
+es el nombre que tendrán los archivos de datos e índice,
+\family typewriter
+tipo
+\family default
+ es el tipo de organización - bloques parametrizados y registros constantes
+ en este caso-,
+\family typewriter
+tam_bloque
+\family default
+ es el tamaño del bloque, y
+\family typewriter
+tam_reg
+\family default
+ es el tamaño del registro.
+\layout Standard
+
+Para las diferentes organizaciones puede ser que alguno de estos 2 últimos
+ valores no tengan sentido almacenarlas y tomaran un valor por defecto igual
+ a cero.
+\layout Standard
+
+Según el tipo de organización, se inicializan los punteros a las funciones.
+ Para el ejemplo
+\family typewriter
+leer_bloque
+\family default
+ se igualará a
+\family typewriter
+emufs_tipo3_leer_bloque()
+\family default
+, y lo mismo sucede con los demás.
\layout Subsection
EMUFS_Tipo
\layout Standard
Si un registro es borrado del archivo de datos, debe actualizarse el índice,
- esto se logra colocando un flag que indique que el id no pertenece a ningún
- bloque, hemos adoptado poner -1 en el campo location de la estructura
+ esto se logra colocando un flag que indique que el
\emph on
-EMUFS_IDX
+id
\emph default
+ no pertenece a ningún bloque, hemos adoptado poner -1 en el campo location
+ de la estructura
+\family typewriter
+EMUFS_IDX
+\family default
.
\layout Standard
Organización física
\layout Standard
-El tipo EMUFS_IDX define la estuctura de los registros de este archivo.
+El tipo
+\family typewriter
+EMUFS_IDX
+\family default
+ define la estuctura de los registros de este archivo.
\layout Standard
Esta estructura está compuesta por:
\layout Itemize
-EMUFS_REG_ID reg_id indica el
+
+\family typewriter
+EMUFS_REG_ID
+\family default
+ reg_id indica el
\emph on
id
\emph default
del registro
\layout Itemize
-EMUFS_BLOCK_ID location número de bloque donde se encuentra el registro.
+
+\family typewriter
+EMUFS_BLOCK_ID
+\family default
+ location número de bloque donde se encuentra el registro.
\layout Standard
-EMUFS_REG_ID y EMUFS_BLOCK_ID son
+
+\family typewriter
+EMUFS_REG_ID
+\family default
+ y
+\family typewriter
+EMUFS_BLOCK_ID
+\family default
+ son
\emph on
unsigned long.
\layout Comment
De esta manera al querer guardar un registro este archivo informará donde
cabe el mismo, previa invocación al la función
-\emph on
+\family typewriter
EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *, EMUFS_FREE, EMUFS_FREE*)
-\emph default
- perteneciente a fsc.h, la cual devuelve el número de bloque donde entra
- el registro o -1 si no hay un bloque con lugar suficiente, y toma como
- parámetros una estructura
+\family default
+ perteneciente a
\emph on
-EMUFS
+fsc.h,
\emph default
+ la cual devuelve el número de bloque donde entra el registro o -1 si no
+ hay un bloque con lugar suficiente, y toma como parámetros una estructura
+
+\family typewriter
+EMUFS
+\family default
, y dos
-\emph on
+\family typewriter
EMUFS_FREE
-\emph default
+\family default
donde el segndo parámetro es el tamaño buscado, y el tercero devuelve el
tamaño disponible.
\layout Standard
La estuctura que define este archivo es la siguiente:
\layout Standard
-EMUFS_FSC que contiene:
+
+\family typewriter
+EMUFS_FSC
+\family default
+ que contiene:
\layout Itemize
-EMUFS_BLOCK_ID indica el número de bloque
+
+\family typewriter
+EMUFS_BLOCK_ID
+\family default
+ indica el número de bloque
\layout Itemize
-EMUFS_FREE freespace indica la cantidad de espacio libre que queda en el
- bloque.
+
+\family typewriter
+EMUFS_FREE
+\family default
+ freespace indica la cantidad de espacio libre que queda en el bloque.
\layout Standard
-EMUFS_FSC y EMUFS_FREE son
+
+\family typewriter
+EMUFS_FSC
+\family default
+ y
+\family typewriter
+EMUFS_FREE
+\family default
+ son
\emph on
unsiged long int
\layout Subsection
Archivo de índices recuperables
\layout Standard
-Este archivo funciona como una pila de id`s borrados, es decir, cuando se
- borra un registro el
+Este archivo funciona como una pila de i
+\emph on
+d`s
+\emph default
+ borrados, es decir, cuando se borra un registro el
\emph on
id
\emph default
Estructura Física
\layout Standard
-Este archivo tiene registros de un solo campo, EMUFS_REG_ID el cual simboliza
- al id almacenado.
+Este archivo tiene registros de un solo campo,
+\family typewriter
+EMUFS_REG_ID
+\family default
+ el cual simboliza al id almacenado.
\layout Subsection
Comportamiento
\emph default
al archivo, el cual será el primero recuperado.
-\emph on
-ver: emufs_did_agregar()
+\family typewriter
+Ver: emufs_did_agregar()
\layout Itemize
que se guardó en el archivo (o se eliminó del archivo de datos), y trunca
el archivo.
-\emph on
-ver: emufs_did_get_last()
+\family typewriter
+Ver: emufs_did_get_last()
\layout Chapter
EMUFS_Tipo
\family default
).
- Luego le sigue una cabecera propia del archivo (un EMUFS_BLOCK_SIZE, 4
- bytes) que almacena el tamaño del bloque que usa el archivo.
+ Luego le sigue una cabecera propia del archivo (un
+\family typewriter
+EMUFS_BLOCK_SIZE
+\family default
+, 4 bytes) que almacena el tamaño del bloque que usa el archivo.
De esta menera, al abrir un archivo de este tipo no se necesita tener ninguna
información sobre él.
A esta cabecera le siguen cero o más bloques del tamaño fijo especificado
Como se puede observar, a nivel físico cada registro grabado esta compuesto
por un Header cuyo tamaño total es de 8 bytes (
+\family typewriter
\series bold
EMUFS_REG_ID
\series default
+
\series bold
EMUFS_REG_SIZE
+\family default
\series default
), y posteriormente el registro (bloque de datos) en sí.
Luego se encuentra el espacio libre de 18 bytes dejado por el registro
\layout Enumerate
Calculamos el espacio que necesitaremos para el registro: sizeof(
+\family typewriter
\series bold
EMUFS_REG_ID
+\family default
\series default
) + sizeof(
+\family typewriter
\series bold
EMUFS_REG_SIZE
+\family default
\series default
) + sizeof(registro).
\layout Enumerate
por otros.
\layout Standard
+Al estar utilizando recuperación de
+\emph on
+id`s
+\emph default
+ borrados, esto me asegura que el registro borrado-guardado conservará el
+ id al grabarse.
+\layout Standard
+
Al finalizar este proceso se verifica si existen bloques vacios para truncar
el archivo.
Lo mismo se debe hacer con el archivo de espacios libres .