\layout Title
+Organización de Datos (75.06)
+\newline
+Trabajo Práctico
+\newline
E
\begin_inset Formula $\mu$
\end_inset
FS
\layout Author
-Nicolás Dimov
+Nicolás Dimov (77624)
\newline
-Alan Kennedy
+Alan Kennedy (78907)
\newline
-Leandro Lucarella
+Leandro Lucarella (77891)
\newline
-Ricardo Markiewicz
+Ricardo Markiewicz (78226)
+\layout Date
+
+Primera Entrega, 19 de Abril de 2004
+\layout Standard
+
+
+\begin_inset LatexCommand \tableofcontents{}
+
+\end_inset
+
+
\layout Chapter
Introducción
+\layout Standard
+
+Esta es la documentación correspondiente a las API`s para el manejo de tres
+ organizaciones de archivo diferentes.
+ A continuación se describe cada una de ellas y su modo de funcionamiento
+ y sus características principales.
+ De la correcta elección de la organización, dependerá la eficiencia de
+ la aplicación que la utilice.
+
+\layout Standard
+
+EMUFS se presenta como un
+\emph on
+emulador
+\emph default
+ de un
+\emph on
+filesystem
+\emph default
+, capaz de administrar datos almacenados en cualquiera de las tres organizacione
+s de archivo previamente mencionadas, las cuales a saberse son:
+\layout Enumerate
+
+Registros de Longitud Variable, Bloques de tamaño parametrizable
+\layout Enumerate
+
+Registros de Longitud Variable, Sin Bloques
+\layout Enumerate
+
+Registros de Longitud Fija, Bloques de tamaño parametrizables
+\layout Standard
+
+A través de este trabajo, se podrán observar las diferencias entre distintos
+ tipos de organización de archivos, ventajas y desventajas de cada una de
+ ellas, y las situaciones particulares que deberá sortear un filesystem,
+ como la partición de registros en distintos bloques, manejo de espacio
+ libre, compactación de un archivo, etc.
+\layout Standard
+
+A continuación, veremos que el manejo de los archivos en EMUFS se realiza
+ a través de una estructura de control común para cualquier tipo de archivo,
+ dándole flexibilidad y escalabilidad a nuestro sistema.
+\layout Standard
+
+Hacia el final de esta presentación, se observaran las pruebas realizadas
+ con las distintas organizaciones de archivos, y las conclusiones obtenidos
+ al respecto.
\layout Chapter
Estructura común
\family default
que actúa como interfaz común para el manejo de cualquier tipo de archivo
(no importa que tipo de organización física posea un archivo, esta estructura
- prooverá una interfaz (funciones) para su manejo).
+ proveerá una interfaz (funciones) para su manejo).
+\layout Subsection
+
+Tipos Comunes
+\layout Standard
+
+En la implementación de cada tipo de organización física, así como también
+ en las API de los archivos auxiliares comunes a ellas, se da la utilización
+ de tipo definidos para una clara interfaz entre las mismas, los cuales
+ son brevemente descriptos a continuación y pueden ser hallados en el archivo
+
+\series bold
+emufs.h
+\series default
+:
+\layout Itemize
+
+
+\family typewriter
+EMUFS_REG_ID
+\family default
+: usado para representar un
+\emph on
+Id
+\emph default
+ de un registro.
+\layout Itemize
+
+
+\family typewriter
+EMUFS_REG_SIZE
+\family default
+: usado para representar el tamaño en bytes de un registro.
+\layout Itemize
+
+
+\family typewriter
+EMUFS_BLOCK_ID
+\family default
+: usado para representar un número de bloque.
+\layout Itemize
+
+
+\family typewriter
+EMUFS_BLOCK_SIZE
+\family default
+: usado para representar el tamaño en bytes de un bloque.
+\layout Itemize
+
+
+\family typewriter
+EMUFS_FREE
+\family default
+: usado para representar espacio libre en bytes.
+\layout Itemize
+
+
+\family typewriter
+EMUFS_OFFSET
+\family default
+: usado para representar un offset.
+\layout Standard
+
+Todos son del tipo
+\family typewriter
+unsigned long
+\family default
+.
\layout Subsection
EMUFS
\emph on
\emph default
-es la estuctura principal que encapsula todas las funciones para el manejo
+es la estructura principal que encapsula todas las funciones para el manejo
de un archivo de datos.
- Posee punteros a funciones que dependiendo de la organización fisica por
+ Posee punteros a funciones que dependiendo de la organización física por
la cual se opte dentro del sistema, serán asignados de acorde.
\layout Standard
\begin_inset Quotes erd
\end_inset
- organizado de la forma 3, se invoca a la función
+ organizado de la forma 3, se invoca a la función:
+\layout Standard
+
+
\family typewriter
-EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo,EMUFS_BLOCK_SIZE
- tam_bloque, EMUFS_REG_SIZE tam_reg),
+emufs_crear(filename,tipo,tam_bloque,tam_reg),
\family default
donde
\family typewriter
A saberse los valores y significado correspondiente que puede tomar este
tipo de dato son:
-\layout Enumerate
+\layout Itemize
-Archivos con registros de longitud variable y bloques parametrizables.
-\layout Enumerate
-Archivos con registros de longitud variable sin bloques.
-\layout Enumerate
+\series bold
+T1
+\series default
+ : Archivos con registros de longitud variable y bloques parametrizables.
+\layout Itemize
+
-Archivos con registros de longitud fija y bloques parametrizables.
+\series bold
+T2
+\series default
+ : Archivos con registros de longitud variable sin bloques.
+\layout Itemize
+
+
+\series bold
+T3
+\series default
+ : Archivos con registros de longitud fija y bloques parametrizables.
\layout Subsection
EMUFS_Estadisticas
\family typewriter
unsigned long
\family default
- tam_archivo: indica el tamaño del archivo de datos (.dat) en bytes.
+
+\family typewriter
+tam_archivo
+\family default
+: indica el tamaño del archivo de datos (.dat) en bytes.
\layout Itemize
\family typewriter
unsigned long
\family default
- tam_archivos_aux: indica el tamaño de los archivos auxiliares sumados en
- bytes.
+
+\family typewriter
+tam_archivos_aux
+\family default
+: indica el tamaño de los archivos auxiliares sumados en bytes.
\layout Itemize
\family typewriter
unsigned long
\family default
- tam_info_control_dat: indica la cantidad de bytes en información de control
- utilizados para el archivo.
+
+\family typewriter
+tam_info_control_dat
+\family default
+: indica la cantidad de bytes en información de control utilizados para
+ el archivo.
\layout Itemize
\family typewriter
unsigned long
\family default
- media_fs: promedio de espacio libre en el archivo de datos (por bloque
- o gap promedio segun la org)
+
+\family typewriter
+media_fs
+\family default
+: promedio de espacio libre en el archivo de datos (por bloque o gap promedio
+ según la org)
\layout Itemize
\family typewriter
unsigned long
\family default
- total_fs: total de espacio libre en el archivo de datos.
+
+\family typewriter
+total_fs
+\family default
+: total de espacio libre en el archivo de datos.
\layout Itemize
\family typewriter
unsigned long
\family default
- max_fs: máximo espacio libre en el archivo de datos (en un bloque o máximo
- gap segun la org).
+
+\family typewriter
+max_fs
+\family default
+: máximo espacio libre en el archivo de datos (en un bloque o máximo gap
+ segun la org).
\layout Itemize
\family typewriter
unsigned long
\family default
- min_fs: idem pero mínimo.
+
+\family typewriter
+min_fs
+\family default
+: ídem pero mínimo.
\layout Itemize
\family typewriter
unsigned long
\family default
- cant_bloques: cantidad de bloques en el archivo de datos (.
+
+\family typewriter
+cant_bloques
+\family default
+: cantidad de bloques en el archivo de datos (.
\series bold
dat
\series default
\family typewriter
unsigned long
\family default
- cant_registros: cantidad de registros en el archivo de datos (
+
+\family typewriter
+cant_registros
+\family default
+: cantidad de registros en el archivo de datos (
\series bold
.dat
\series default
\layout Standard
En base a la estructura descripta anteriormente y mediante la utilización
- de la función
+ de la función de lectura de estadísticas
\family typewriter
emufs_leer_estadisticas()
\family default
EMUFS
\family default
handler de cualquier tipo de archivo, podremos obtener una serie de estadística
-s que pasamos a detallar (más alla de los datos básicos como cant registros,
+s que pasamos a detallar (más allá de los datos básicos como cant registros,
cant bloques, tam archivo, etc):
\layout Itemize
Desviaciones extremas de espacio libre (máximo/mínimo espacio libre en bloque
o mayor/menor gap)
-\layout Subsection
-
-Tipos Comunes
-\layout Standard
-
-En la implementación de cada tipo de organización física, así como tambien
- en las API de los archivos auxiliares comunes a ellas, se da la utilización
- de tipo definidos para una clara interfaz entre las mismas, los cuales
- son brevemente descriptos a continuación y pueden ser hayados en el archivo
-
-\series bold
-emufs.h
-\series default
-:
-\layout Itemize
-
-typedef
-\family typewriter
-unsigned long EMUFS_REG_ID
-\family default
-: usado para representar un
-\emph on
-Id
-\emph default
- de un registro.
-\layout Itemize
-
-typdef
-\family typewriter
-unsigned long EMUFS_REG_SIZE
-\family default
-: usado para representar el tamaño en bytes de un registro.
-\layout Itemize
-
-typedef
-\family typewriter
-unsigned long EMUFS_BLOCK_ID
-\family default
-: usado para representar un número de bloque.
-\layout Itemize
-
-typdef
-\family typewriter
-unsigned long EMUFS_BLOCK_SIZE
-\family default
-: usado para representar el tamaño en bytes de un bloque.
-\layout Itemize
-
-typedef
-\family typewriter
-unsigned long EMUFS_FREE
-\family default
-: usado para representar espacio libre en bytes.
-\layout Itemize
-
-typedef
-\family typewriter
-unsigned long EMUFS_OFFSET
-\family default
-: usado para representar un offset.
\layout Section
\layout LyX-Code
/- 4 bytes -/
-\layout Chapter
+\layout Section
-Archivos Auxiliares
+Uso de la estructura EMUFS
\layout Standard
-Acompañando al archivo de datos (
+Como fue mencionado anteriormente en la descripción de la estructura EMUFS,
+ la misma proporciona al usuario una interfaz a través de la cual puede
+ realizar el manejo de archivos en forma genérica, abstrayéndose del tipo
+ de organización física en particular que dicho archivo posea.
+ Se la declara en
\series bold
-.dat
+emufs.h
\series default
-) el cual es responsable de la contención de los registros, tendremos tres
- archivos auxiliares (
+ y las funciones que inicializan la estructura se encuentran en
\series bold
-.idx
+emufs.c
+\layout Standard
+
+Es decir que a través de esta estructura, podemos manejar cualquier tipo
+ de archivo, mediante una misma interfaz en común.
+ La estructura
+\family typewriter
+EMUFS
+\family default
+posee además de ciertos datos que describen la organización física de un
+ archivo dado como por ejemplo
+\series bold
+\emph on
+tamaño de registro
\series default
+\emph default
,
\series bold
-.fsc
+\emph on
+tamaño de bloque
\series default
+\emph default
y
\series bold
-.did
+\emph on
+nombre del archivo
\series default
-) cuya funcionalidad y propósito pasamos a describir a continuación, sin
- antes remarcar que los tres archivos poseen una sola implementación para
- las distintas formas de organización física que hemos implementado (tres
- para ser mas exactos).
+\emph default
+, una serie de punteros a funciones para el manejo del archivo del cual
+ es handler:
\layout Standard
-Entre las ventajas de poseer la misma implementación se encuentra el tener
- un API común entre los tres tipos para el manejo de la localización de
- sus registros, administración de espacio libre e Id's liberados, sin necesidad
- de realizar n-implementaciones para un mismo objetivo final.
+Entre dichos funciones se encuentran:
+\family typewriter
+leer_registro()
+\family default
+,
+\family typewriter
+leer_bloque(), borrar_registro()
+\family default
+,
+\family typewriter
+agregar_registro()
+\family default
+,
+\family typewriter
+modificar_registro, leer_estadisticas()
+\family default
+,
+\family typewriter
+compactar().
\layout Standard
-Además, la obtención de ciertos datos estadísticos como espacio libre, o
- cantidad de registros, se realiza a través de la misma interfaz, y también
- se ha facilitado en cierto grado la re-organización física de un archivo
- (pasar de un tipo a otro), dado el uso de estos tres archivos auxiliares
- en común para funciones tan predominantes como índexación, administración
- de espacio libre y recuperación de Id's.
-\layout Section
+Para entender mejor el uso de esta estructura para el manejo de los archivos,
+ mostraremos un ejemplo concreto.
+ Supongamos que tenemos el siguiente código:
+\layout LyX-Code
+EMUFS *efs = emufs_crear(¨articulos.dat¨,T3,200,50);
+\layout Standard
-\begin_inset LatexCommand \label{sec:idx}
+Esto hará que se cree el archivo de datos
+\series bold
+articulos.dat
+\series default
+, con la organización física tipo 3 con registros de longitud fija de 50
+ bytes y bloques de 200 bytes.
+ Al mismo tiempo, los se asignaran valores a los punteros a funciones que
+ posee dicha estructura, la cual de ahora en más estará en condiciones de
+ manejar un archivo del tipo 3.
+ Gráficamente lo que sucede es:
+\layout Standard
-\end_inset
-Archivo índice
-\layout Standard
+\begin_inset Float figure
+placement H
+wide false
+collapsed false
-El archivo índice (.idx), permite la localización de los registros en el
- .DAT de forma directa, mediante la obtención de su offset respecto del inicio
- del .dat, o nro bloque (segun el tipo de organización física) en donde se
- encuentra un registro dado, indicado por su
-\emph on
-id_reg.
+\layout Caption
+
+Inicialización de estructura EMUFS para un caso Archivo Tipo 3
+\layout Standard
+\align center
+
+\begin_inset Graphics
+ filename graphics/Emufsinit.png
+ scale 75
+ keepAspectRatio
+
+\end_inset
+
+
+\end_inset
+
+
+\layout Standard
+
+Así pues, cuando se utilice la estructura para por ejemplo leer un registro,
+ sucederá lo siguiente:
+\layout LyX-Code
+
+efs->leer_registro(params) -- calls --> emufs_tipo3_leer_registro(params)
+\layout Standard
+
+Como se puede observar, la estructura
+\family typewriter
+EMUFS
+\family default
+ permitirá el manejo de cualquier tipo de archivo, a través del mismo código,
+ dándole gran flexibilidad a nuestro sistema, que podrá expandirse a más
+ tipos de archivos de ser necesario.
+\layout Chapter
+
+Archivos Auxiliares
+\layout Standard
+
+Acompañando al archivo de datos (
+\series bold
+.dat
+\series default
+) el cual es responsable de la contención de los registros, tendremos tres
+ archivos auxiliares (
+\series bold
+.idx
+\series default
+,
+\series bold
+.fsc
+\series default
+ y
+\series bold
+.did
+\series default
+) cuya funcionalidad y propósito pasamos a describir a continuación, sin
+ antes remarcar que los tres archivos poseen una sola implementación para
+ las distintas formas de organización física que hemos implementado (tres
+ para ser mas exactos).
+\layout Standard
+
+Entre las ventajas de poseer la misma implementación se encuentra el tener
+ un API común entre los tres tipos para el manejo de la localización de
+ sus registros, administración de espacio libre e Id's liberados, sin necesidad
+ de realizar n-implementaciones para un mismo objetivo final.
+\layout Standard
+
+Además, la obtención de ciertos datos estadísticos como espacio libre, o
+ cantidad de registros, se realiza a través de la misma interfaz, y también
+ se ha facilitado en cierto grado la re-organización física de un archivo
+ (pasar de un tipo a otro), dado el uso de estos tres archivos auxiliares
+ en común para funciones tan predominantes como índexación, administración
+ de espacio libre y recuperación de Id's.
+\layout Section
+
+
+\begin_inset LatexCommand \label{sec:idx}
+
+\end_inset
+
+Archivo índice
+\layout Standard
+
+El archivo índice (.idx), permite la localización de los registros en el
+ .DAT de forma directa, mediante la obtención de su offset respecto del inicio
+ del .dat, o nro bloque (segun el tipo de organización física) en donde se
+ encuentra un registro dado, indicado por su
+\emph on
+id_reg.
\layout Standard
Los registros de este archivo se encuentran representados una estructura
que indica un número de registro y el bloque u offset en donde se encuentra
- el mísmo.
+ el mismo.
\layout Standard
Es necesario que este archivo esté ordenado por
Organización física
\layout Standard
-Los registros de este archivo se encuentran representados a nivel codigo
+Los registros de este archivo se encuentran representados a nivel código
por el siguiente tipo de dato interno (
\family typewriter
EMUFS_IDX
):
\layout LyX-Code
-typedef unsigned long EMUFS_REG_ID;
-\layout LyX-Code
-
-typedef unsigned long EMUFS_OFFSET;
-\layout LyX-Code
-
typedef struct emufs_idx_t {
\layout LyX-Code
\begin_inset Float table
placement H
wide false
-collapsed true
+collapsed false
\layout Caption
-Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
+Ejemplo de registro en archivo índice (.idx), para un archivo de organización
Tipo 1 y 3
\layout Standard
\begin_inset Float table
placement H
wide false
-collapsed true
+collapsed false
\layout Caption
-Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
+Ejemplo de registro en archivo índice (.idx), para un archivo de organización
Tipo 2
\layout Standard
Búsqueda:
\series default
\emph default
- Los registros del archivo indice (
+ Los registros del archivo índice (
\series bold
.idx
\series default
.dat
\series default
).
-\newline
-
\series bold
+
+\newline
NOTA:
\series default
- Cabe aclarar que por si bien el indice se encuentra ordenado por
+ Cabe aclarar que por si bien el índice se encuentra ordenado por
\family typewriter
id_reg
\family default
-, los registros en el archivo de datos, por lo general no lo estarán.
- (ordenados por id).
+, los registros en el archivo de datos, por lo general no lo estarán (ordenados
+ por id).
\newline
Ver:
\family typewriter
-emufs_idx_buscar_registro()
+emufs_idx_buscar_registro(), emufs_idx_get()
\layout List
\labelwidthstring 00.00.0000
Alta:
\series default
Ante la alta de un registro en el archivo de datos, se insetará un nuevo
- registro en el archivo índice, con el id_reg del registro en cuestion,
+ registro en el archivo índice, con el id_reg del registro en cuestión,
y el offset u bloque donde se lo haya grabado en disco.
\newline
Ver:
Baja:
\series default
Ante el borrado de un registro del archivo de datos, se accederá el registro
- correspondiente en el índice, y se actualizara su LOCATION, estableciendolo
- en el valor -1 UL, el cual indica que ese registro ha sido eliminado y
- por ende no se lo podrá localizar en el futuro.
+ correspondiente en el índice, y se actualizara su LOCATION, estableciéndolo
+ en el valor especial
+\family typewriter
+EMUFS_NOT_FOUND
+\family default
+, el cual indica que ese registro ha sido eliminado y por ende no se lo
+ podrá localizar en el futuro.
Como se verá mas adelante, según el tipo de organización física, el registro
puede ser borrado concretamente del .
\series bold
dat
\series default
- o nó.
+ o no.
\newline
Ver:
Modificación:
\series default
Ante la modificación en la posición física de un registro dentro del archivo
- de datos (por ejemplo luego del proceso de recompactación, se realizará
+ de datos (por ejemplo luego del proceso de re-compactación, se realizará
la modificación respectiva del campo
\family typewriter
location
Los registros de este archivo se encuentran representados una estructura
que indica un número de bloque u offset y el espacio libre disponible en
- el mismo (o apartir del mismo en el caso del offset).
+ el mismo (o a partir del mismo en el caso del offset).
\layout Standard
Organización Física
\layout Standard
-Los registros de este archivo se encuentran representados a nivel codigo
+Los registros de este archivo se encuentran representados a nivel código
por el siguiente tipo de dato interno (
\family typewriter
EMUFS_FSC
typedef struct emufs_fsc_t {
\layout LyX-Code
- unsigned long int marker;
+ EMUFS_BLOCK_ID marker;
\layout LyX-Code
- unsigned long int freespace;
+ EMUFS_FREE freespace;
\layout LyX-Code
} EMUFS_FSC;
\begin_inset Float table
placement H
wide false
-collapsed true
+collapsed false
\layout Caption
\begin_inset Float table
placement H
wide false
-collapsed true
+collapsed false
\layout Caption
\family typewriter
nro_bloque
\family default
- se posee espacio suficiente para albergar el nuevo registro.
- En el caso de organizacion sin bloque, se buscará un gap o espacio libre
+ se posee espacio suficiente para albergar el nuevo registro (o a partir
+ de qué
+\family typewriter
+nro_bloque
+\family default
+ se encuentran
+\family typewriter
+N
+\family default
+ bloques consecutivos libres).
+ En el caso de organización sin bloque, se buscará un gap o espacio libre
en el archivo, obteniéndose en consecuencia, el
\family typewriter
offset
\family default
hasta el mismo.
+
\newline
Ver:
\family typewriter
-emufs_fsc_buscar_lugar()
+emufs_fsc_buscar_lugar(), emufs_fsc_buscar_n_lugares()
\layout List
\labelwidthstring 00.00.0000
\series bold
.fsc
\series default
-) o bien modificandoló.
+) o bien modificándolo.
\newline
\newline
-En el caso de organizaciónes con bloques, se actualizará el valor del espacio
+En el caso de organizaciones con bloques, se actualizará el valor del espacio
libre
\family typewriter
freespace
\family default
- en el bloque (ya sea incrementandoló o decrementandoló) o bien se insertará
+ en el bloque (ya sea incrementándolo o decrementándolo) o bien se insertará
un nuevo registro en caso de que se esté creando un nuevo bloque en el
archivo de datos (en este caso no será debido a un alta o baja de registro
como se mencionó al principio).
), y en caso de estar este lindante con otro gap, se realizará el merge
pertinente.
(esto esta explicado más en profundidad en los casos particulares de organizaci
-ón fisica, registros variables sin bloques).
+ón física, registros variables sin bloques).
Para el caso de una alta en el archivo de datos (
\series bold
.dat
\series bold
Baja
\series default
-: Unicamente para el caso de una organización que presente gaps en el archivo,
+: Únicamente para el caso de una organización que presente gaps en el archivo,
se podrá dar a lugar la eliminación de un registro del archivo de espacios
libres (
\series bold
id
\emph default
que se guardó en el archivo (o se eliminó del archivo de datos), y truncará
- el archivo eliminandolo.
+ el archivo eliminándolo.
\family typewriter
\newline
(cuenta tanto con bloques como con registros variables), hereda los inconvenien
tes (y ventajas) de ambos, más los propios.
- Al implementar este tipo de archivo se puso enfásis en la eficiencia mientras
+ Al implementar este tipo de archivo se puso énfasis en la eficiencia mientras
esta no comprometa la mantenibilidad del código, es por esto que en algunas
circunstancias no se hace un uso óptimo del espacio.
\layout Standard
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
+ De esta manera, 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
en la cabecera antes mencionada.
+-----------+-----------+------------------------//-+
\layout LyX-Code
-| tipo | tam bloque| Cero o más bloques ...
+| tipo | tam_bloque| Cero o más bloques ...
\backslash
Podemos ver gráficamente como se se compone un registro:
\layout LyX-Code
-registro id
+registro [id]
\layout LyX-Code
+-----------+-----------+------------------+
Puede darse el caso excepcional en que un registro sea de mayor longitud
que un bloque.
Al ser una situación excepcional, no siempre se resuelve de la forma más
- eficiente ni se mínimiza el espacio ocupado por datos de control (como
+ eficiente ni se minimiza el espacio ocupado por datos de control (como
se dijo anteriormente, se prefirió conservar la simpleza del código, adoptando
algoritmos generales aunque no sea de la forma más eficiente o maximizando
el uso del espacio para no perjudicar la mantenibilidad).
\layout Standard
-Para menejar un registro
+Para manejar un registro
\emph on
multibloque
\emph default
al penúltimo.
\layout Itemize
-Cada framento posee las cabeceras mencionadas en la sección
+Cada fragmento posee las cabeceras mencionadas en la sección
\begin_inset LatexCommand \ref{sub:tipo1_reg}
\end_inset
\begin_inset Quotes erd
\end_inset
-) almacenado en un archivo con bloques de 4 bytes:
+) almacenado en un archivo con bloques de 12 bytes (4 para datos):
\layout LyX-Code
| bloque 0 | bloque 1 | bloque 2
\backslash
-+
+\layout LyX-Code
+
+ ^^
+\layout LyX-Code
+
+ 2 bytes libres al final del bloque 2
+\layout Standard
+
+Este es un ejemplo figurativo, ya que se puso como límite mínimo de tamaño
+ de bloque 16 bytes (para que haya al menos la misma cantidad de espacio
+ para datos que para información de control).
+ Este límite mínimo ya roza lo absurdo (es muy ineficiente por la gran cantidad
+ de accesos a disco que necesita).
+ El límite físico es de 9 bytes (8 para información de control, 1 para datos).
\layout Section
Funciones principales
), se buscan N bloques consecutivos (todos los que necesite el registro)
absolutamente libres
\begin_inset Foot
-collapsed true
+collapsed false
\layout Standard
Bajas de registros
\layout Standard
+Al eliminar un registro lo primero que se hace es actualizar los archivos
+ de índice y de identificadores recuperables, poniendo como número de bloque
+ el valor especial
+\family typewriter
+EMUFS_NOT_FOUND
+\family default
+ y agregando el identificador del registro a borrar respectivamente.
+ También se actualiza el archivo de control de espacio libre por cada bloque
+ (en caso de ser más de uno, en registros
+\emph on
+multibloque
+\emph default
+, se actualizan todos los bloques) y se carga el bloque en memoria para
+
+\emph on
+alinear los datos a izquierda
+\emph default
+ (en caso de ser un registro
+\emph on
+multibloque
+\emph default
+, esto se realiza sólo para el último bloque).
+ Para alinear los datos, se recorre secuencialmente en bloque (leyendo la
+ cabecera de cada registro y salteando los datos) hasta encontrar el registro
+ a borrar.
+ Encontrado el registro, se copian todos los bytes que se encuentran entre
+ el fin del registro a borrar y el fin del bloque, en el comienzo del bloque
+ borrado.
+\layout Standard
+
Ver:
\family typewriter
emufs_tipo1_borrar_registro()
Modificación de registros
\layout Standard
+Se optó por un algoritmo simple y general, que usa las funciones de alto
+ nivel mencionadas hasta ahora.
+ Simplemente borra el registro y vuelve a crearlo.
+ Al recuperar el último identificador de registro borrado, nos aseguramos
+ de que se mantenga el identificador del registro.
+\layout Standard
+
Ver:
\family typewriter
emufs_tipo1_modificar_registro()
Obtención de estadísticas
\layout Standard
+Es una función bastante simple, con una única complicación que mencionaremos
+ más adelante.
+\layout Standard
+
+Para obtener las máximas desviaciones, cantidad total de espacio libre,
+ cantidad de registros y tamaño de los archivos auxiliares se utilizan las
+ funciones apropiadas de los archivos auxiliares (ver secciones
+\begin_inset LatexCommand \ref{sec:idx}
+
+\end_inset
+
+,
+\begin_inset LatexCommand \ref{sec:fsc}
+
+\end_inset
+
+ y
+\begin_inset LatexCommand \ref{sec:did}
+
+\end_inset
+
+).
+\layout Standard
+
+Para obtener la cantidad de bloques se hace el siguiente calculo:
+\layout LyX-Code
+
+cant_bloques = (tamaño_archivo_datos - tamaño_cabecera_archivo_datos)
+\layout LyX-Code
+
+ / tamaño_bloque;
+\layout Standard
+
+Hasta aquí no hay mayores inconvenientes.
+ El problema se presenta para calcular el tamaño de la información de control
+ utilizada por el archivo de datos; se utiliza el siguiente cálculo:
+\layout LyX-Code
+
+tam_info_control_datos = tamaño_cabecera_archivo_datos
+\layout LyX-Code
+
+ + cant_registros * tamaño_cabecera_registro;
+\layout Standard
+
+Aunque a simple vista esto parece acertado, no contempla el caso de los
+ registros
+\emph on
+multibloque
+\emph default
+ (pág
+\begin_inset LatexCommand \pageref{sub:tipo1_reg_multi}
+
+\end_inset
+
+), estos registros almacenan
+\family typewriter
+tamaño_cabecera_registro * N
+\family default
+, donde
+\family typewriter
+N
+\family default
+ es la cantidad de bloques que ocupan.
+ Salvar este caso sería muy costoso, porque habría que recorrer el archivo
+ registro a registro,
+\emph on
+fragmento
+\emph default
+ a
+\emph on
+fragmento
+\emph default
+ e ir contando todas las cabeceras de registro que aparecen (similar a lo
+ que se hace en la compactación, ver sección
+\begin_inset LatexCommand \ref{sub:tipo1_compact}
+
+\end_inset
+
+).
+ Al tratarse este de un caso excepcional, se optó por mantener la función
+ simple ya que funciona bien en la mayoría de los casos.
+\layout Standard
+
Ver:
\family typewriter
emufs_tipo1_leer_estadisticas()
\layout Subsection
+
+\begin_inset LatexCommand \label{sub:tipo1_compact}
+
+\end_inset
+
Compactación del archivo de datos
\layout Standard
+Esta función es una de las más simples, porque se limita a un algoritmo
+ muy simple que utiliza las funciones de
+\emph on
+alto nivel
+\emph default
+ antes nombradas para realizar su tarea.
+ Básicamente recorre el archivo de índices de registros, de comienzo a fin,
+ leyendo el registro, borrándolo y volviéndolo a insertar.
+ Si había espacio libre en un bloque anterior al que estaba, será insertado
+ en él, si no volverá a grabarse en el lugar en que estaba.
+ De esta forma se aprovechan todos los espacios libres intermedios, concluyendo
+ con un archivo igual o más pequeño que el original.
+\layout Standard
+
+Esta implementación no es la más eficiente, pero siendo que esta es una
+ operación costosa y excepcional por naturaleza, se optó por mantener el
+ algoritmo simple a costo de un poco de eficiencia.
+\layout Standard
+
Ver:
\family typewriter
emufs_tipo1_compactar()
Este tipo de archivo nos traerá a la mesa la particularidad de grabar registros
de longitud variable sin realizar su agrupación en bloques, y como veremos
- en la siguiente sección, tambien permitirá la administración de gaps que
+ en la siguiente sección, también permitirá la administración de gaps que
queden en el archivo luego de operaciones de baja de registros.
\layout Section
de archivo en cuestión.
\layout Standard
-Para poder entender mejor la organización fisica de este tipo de archivo,
+Para poder entender mejor la organización física de este tipo de archivo,
tomemos el caso hipotético en el que se encuentran grabados
\series bold
dos registros
\begin_inset Float figure
placement H
wide false
-collapsed true
+collapsed false
\layout Caption
), y posteriormente el registro (bloque de datos) en sí.
Luego se encuentra el espacio libre de 18 bytes dejado por el registro
de 10 bytes eliminado (10 bytes de datos + header de 8 bytes) y finalmente
- el segundo registro mencionado.dsds
+ el segundo registro mencionado.
\layout Subsection
Comportamiento Particular de los Archivos Auxiliares
Archivo índice o de posiciones relativas (.idx)
\layout Standard
-El archivo indice (
+El archivo índice (
\series bold
.idx
\series default
\begin_inset Float table
placement H
wide false
-collapsed true
+collapsed false
\layout Caption
te luego del header tendremos el registro en sí (los datos).
\layout Subsubsection
-Achivo de Gaps / Espacios Libres (.fsc)
+Archivo de Gaps / Espacios Libres (.fsc)
\layout Standard
El archivo de espacios libres o gaps (.fsc), tiene como función la administración
de registros en el archivo de datos.
El mismo, nos indicará donde hay lugar para insertar un nuevo registro
(se podrán insertar en algún gap acorde, o bien al final del archivo).
- Este archivo será utilizado tambien para el proceso de compactación de
+ Este archivo será utilizado también para el proceso de compactación de
un archivo, explicado luego.
\layout Standard
\begin_inset Float table
placement H
wide false
-collapsed true
+collapsed false
\layout Caption
\layout Standard
Nuestro sistema actuará en consecuencia, realizando un merge de los espacios
- libres, y unificándolos en una UNICA entrada en el archivo .fsc, que contendrá
+ libres, y unificándolos en una ÚNICA entrada en el archivo .fsc, que contendrá
como dato de freespace, la suma correspondiente de los espacios libres
antes mencionados.
\layout Subsubsection
Lectura de registros
\layout Standard
-Como se vió al comienzo, los registros en este tipo de archivo no se encuentran
- agrupados en bloques de ninguna índole y estan dispersos a lo largo del
+Como se vio al comienzo, los registros en este tipo de archivo no se encuentran
+ agrupados en bloques de ninguna índole y están dispersos a lo largo del
archivo, con la particularidad de que pueden existir gaps o espacio libre,
entre dos registros dados.
\layout Standard
\layout Standard
Dado que en la implementación de este tipo de organización física contamos
- con los gaps o espacios libres entre registros, no se eliminará fisicamente
+ con los gaps o espacios libres entre registros, no se eliminará físicamente
el registro del archivo de datos (
\series bold
.dat
\series default
).
En cambio, se agrega el gap dejado por la eliminación a dicho archivo,
- y se marca fisicamente en el archivo de datos la eliminación mediante un
+ y se marca físicamente en el archivo de datos la eliminación mediante un
fill de los bytes correspondientes con un caracter nulo.
(hexa 00 y con el propósito de probar fehacientemente que el sistema funciona).
\layout Standard
\layout Enumerate
Se realiza la lectura del registro, mediante el respectivo procedimiento
- ya desarollado anteriormente.
+ ya desarrollado anteriormente.
\layout Enumerate
Una vez que se cuenta con los nuevos datos modificados, se procede a dar
Compactación del archivo de datos
\layout Standard
-Asi como los otros dos tipos de datos, el que nos compete también cuenta
+Así como los otros dos tipos de datos, el que nos compete también cuenta
con la posibilidad de realizar la compactación de datos cuando el usuario
lo desee, justificando todos los registros a izquierda, eliminando así
- los gaps existentes y decrementando el tamaño del archivo en disco (truncandolo
+ los gaps existentes y decrementando el tamaño del archivo en disco (truncándolo
).
\layout Standard
-Para poder comprender como hemos implementado el proceso de recompactación
+Para poder comprender como hemos implementado el proceso de re-compactación
en nuestro tipo de archivo 2, nos ayudaremos de esquemas a través de los
cuales iremos describiendo el proceso.
Notemos antes, que el proceso de compactación esta directamente ligado
).
\layout Standard
-Comenzemos con el siguiente cuadro situacional:
+Comencemos con el siguiente cuadro situacional:
\begin_inset Float figure
placement H
wide false
-collapsed true
+collapsed false
\layout Caption
{
\layout Enumerate
-Se levanta el proximo gap al levantado en una instancia previa.
+Se levanta el próximo gap al levantado en una instancia previa.
En este ejemplo, durante el primer loop del while, se levantará
\series bold
Gap1
de Mustmove_bytes.
\layout Enumerate
-Se establece como gap de referencia, al ultimo gap leido (En este caso se
+Se establece como gap de referencia, al ultimo gap leído (En este caso se
realiza:
\series bold
StartGap0
\begin_inset Float figure
placement H
wide false
-collapsed true
+collapsed false
\layout Caption
Se han tomado ciertas consideraciones para algunos casos particulares que
se pueden presentar durante el uso/ejecución de la aplicación, así como
- tambien politicas respecto del diseño e implementación del sistema:
+ también políticas respecto del diseño e implementación del sistema:
\layout Itemize
En la organización física tipo 2 para los registros que se graban en disco
\newline
\newline
-B) Luego de un proceso de recompactación, los espacios libres que pudieron
+B) Luego de un proceso de re-compactación, los espacios libres que pudieron
haber existido en el archivo de datos (
\series bold
.dat
)
\layout Itemize
-Si se desea insertar un registro y no se puede hayar un gap o espacio libre
+Si se desea insertar un registro y no se puede hallar un gap o espacio libre
donde quepa, se los inserta al final del archivo.
\layout Itemize
del archivo.
\layout Standard
-El archivo estara compuesto por una cabecera que da información sobre el
- tipo de organización, el tamaño de los bloques y el tamaño de los registros.
+El archivo estará compuesto por una cabecera que da información sobre el
+ tipo (2, o el valor T3 del tipo
+\family typewriter
+EMUFS_Tipo
+\family default
+ en este caso) de organización, el tamaño de los bloques y el tamaño de
+ los registros.
+\layout LyX-Code
+
+archivo
+\layout LyX-Code
+
++-----------+-----------+-----------+------------------------//-+
+\layout LyX-Code
+
+| tipo | tam_bloque| tam_reg | Cero o más bloques ...
+
+\backslash
+
+\backslash
+ |
+\layout LyX-Code
+
++-----------+-----------+-----------+------------------------//-+
+\layout LyX-Code
+
+/- 4 bytes -/- 4 bytes -/- 4 bytes -/
\layout Subsection
Organización Física de un Bloque
Cada bloque será capaz de contener la cantidad de registros enteros que
quepan en él.
De esta manera un registro que no entre completamente en el bloque deberá
- almacenarce en un bloque diferente.
+ almacenarse en un bloque diferente.
\layout Standard
Los bloques no contienen ninguna información adicional, solo se conoce su
\begin_inset Quotes erd
\end_inset
- zonas en el archivo.
+ zonas en el archivo y obtener de esta manera acceso semi-aleatorio a los
+ registros.
+\layout LyX-Code
+
+bloque N-1 | bloque N | bloque N+1
+\layout LyX-Code
+
+/----------+------------+------------+---------------+-----------/
+\layout LyX-Code
+
+
+\backslash
+ | registro 1 | registro 2 | espacio libre |
+\backslash
+
+\layout LyX-Code
+
+/----------+------------+------------+---------------+-----------/
+\layout LyX-Code
+
+ /------------- tamaño del bloque ---------/
\layout Subsection
-Organizacion Física de Registros
+Organización Física de Registros
\layout Standard
Cada registro se almacena en un bloque, y contiene una cabecera que indica
\emph on
ID,
\emph default
-por este motivo al realizar la busqueda de espacio en un bloque se lo hará
+por este motivo al realizar la búsqueda de espacio en un bloque se lo hará
preguntando por el tamaño del registro más
\family typewriter
sizeof(EMUFS_REG_ID).
-
+\layout LyX-Code
+
+registro [id]
+\layout LyX-Code
+
++-----------+-------------------+
+\layout LyX-Code
+
+| id | datos ...
+ |
+\layout LyX-Code
+
++-----------+-------------------+
+\layout LyX-Code
+
+/- 4 bytes -/- [tam_reg] bytes -/
\layout Subsection
-Organización Física de Registros Multibloque
+Organización Física de Registros
+\emph on
+Multibloque
\layout Standard
Al ser los registros de longitud constante, se ha adoptado que un registro
- multibloque nunca podra estar almacenado en algún lugar que no sea el comienzo
- de un bloque.
+
+\emph on
+multibloque
+\emph default
+ nunca podrá estar almacenado en algún lugar que no sea el comienzo de un
+ bloque.
De esta manera se puede calcular cuantos bloques ocupará un registro y
se podrá solicitar lugar para almacenarlo con la ayuda de la función
\family typewriter
que es muy importante para evitar el solapamiento de registros.
Esta consideración acarrea como consecuencia directa un alto costo en términos
del espacio desperdiciado.
+\layout Standard
+
+A continuación se presenta un ejemplo gráfico de un registro multibloque
+ de 26 bytes (de contenido
+\begin_inset Quotes eld
+\end_inset
+
+12345678901234567890123456
+\begin_inset Quotes erd
+\end_inset
+
+) almacenado en un archivo con bloques de bytes 14 bytes (10 para datos)
+ y registros de 38 bytes:
+\layout LyX-Code
+
+| bloque 0 | bloque 1 | bloque 2
+\layout LyX-Code
+
++-------------------+-------------------+-------------------+-//-+
+\layout LyX-Code
+
+| registro 0 - 1/3 | registro 0 - 2/3 | registro 0 - 3/3..|
+\backslash
+
+\backslash
+ |
+\layout LyX-Code
+
+|+----+------------+|+----+------------+|+----+--------+....| // |
+\layout LyX-Code
+
+|| id | datos ||| id | datos ||| id | datos |....|
+\backslash
+
+\backslash
+ |
+\layout LyX-Code
+
+||----+------------+||----+------------+||----+--------+....| // |
+\layout LyX-Code
+
+|| 0 | 1234567890 ||| 0 | 1234567890 ||| 0 | 123456 |....|
+\backslash
+
+\backslash
+ |
+\layout LyX-Code
+
+|+----+------------+|+----+------------+|+----+--------+....| // |
+\layout LyX-Code
+
++-------------------+-------------------+-------------------+-
+\backslash
+
+\backslash
+-+
+\layout LyX-Code
+
+ ^^^^
+\layout LyX-Code
+
+ 4 bytes libres (e inutilizables) al final del bloque 2
\layout Section
Funciones Principales
\layout Standard
Dento de
-\emph on
+\family typewriter
tipo3.h
-\emph default
+\family default
y
-\emph on
+\family typewriter
tipo3.c
-\emph default
+\family default
se encuentran las cabeceras y la implementación de las funciones principales
respectivamente, las cuales dan funcionalidad a esta organización.
\layout Standard
A continuación se comentará la descripción de algunas acciones importantes.
\layout Subsection
-Leer Registro
+Lectura de registros
\layout Standard
La lectura de un registro se realiza con la ayuda del archivo .
\emph default
el cual contiene la información de la posición del registro dentro del
archivo de datos.
- Una vez leida esta información, se recupera el bloque (en su totalidad)
+ Una vez leída esta información, se recupera el bloque (en su totalidad)
del archivo y se busca secuencialmente el registro con el
\emph on
ID
emufs_tipo3_leer_registro()
\layout Subsection
-Grabar Registro
+Alta de registros
\layout Standard
Graba un registro en un bloque donde haya espacio suficiente, y si no crea
para mantener la coherencia.
\layout Standard
+Cuando nos encontramos con registros multibloque, se calcula cuantos bloques
+ ocupará el registro de la siguiente manera:
+\family typewriter
+Cantidad de Bloques = 1 + Tamaño del Registro/(Tamaño del Bloque-Sizeof(EMUFS_RE
+G_ID)
+\layout Standard
+
+Esta ecuación solo falla en el caso que el tamaño del registro y el tamaño
+ del bloque sean iguales, en tal caso, se coloca el valor 1 en
+\family typewriter
+Cantidad de Bloques
+\family default
+ post verificación.
+\layout Standard
+
+Y con esta información se realiza un ciclo
+\family typewriter
+for
+\family default
+ que grabará tantas veces como sea necesario levantando y grabando los bloques
+ que correspondan.
+\layout Standard
+
Ver:
\family typewriter
emufs_tipo3_grabar_registro()
\layout Subsection
-Borrar Registro
+Baja de registros
\layout Standard
Borra un registro del archivo de datos, para esto levanta el bloque al que
- pertenece el archivo y ajusta los demás registros justificandolos hacia
+ pertenece el archivo y ajusta los demás registros justificándolos hacia
la izquierda.
\layout Standard
ser así, si no se realizara el mismo.
\layout Standard
+En el caso de los registros multibloque, se eliminará la porción del registro
+ contenida en el primer bloque y se actualizarán de manera conveniente los
+ archivos índice, para restaurarlos a un valor verdadero.
+\layout Standard
+
Ver:
\family typewriter
emufs_tipo3_borrar_registro()
\layout Subsection
-Leer Estadísticas
+Obtención de estadísticas
\layout Standard
Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
emufs_tipo3_leer_estadisticas()
\layout Subsection
-Compactar el Archivo
+Compactación del archivo de datos
\layout Standard
Esta función intenta reorganizar el archivo de manera que el espacio libre
id al grabarse.
\layout Standard
-Al finalizar este proceso se verifica si existen bloques vacios para truncar
+Al finalizar este proceso se verifica si existen bloques vacíos para truncar
el archivo.
Lo mismo se debe hacer con el archivo de espacios libres .
\emph on
se actualizan todos los bloques con el espacio libre que realmente tienen.
\layout Chapter
+EMUFS View (interfaz gráfica)
+\layout Section
+
+Introducción
+\layout Standard
+
+La interfaz de visualización de EMUFS permite interactuar con los distintos
+ tipos de archivos para cada conjunto de datos almacenado (ya sean facturas,
+ articulos, o notas de facturas).
+\layout Section
+
+Instalación
+\layout Standard
+
+Para poder correr la interfaz gráfica necesitará previamente compilarla
+ (así como compilar los programas auxiliares), para ello necesitará cumplir
+ con los siguiente requisitos:
+\layout Enumerate
+
+Compilador gcc versión 3.3.x preferentemente.
+ No podemos garantizar la compatibilidad con otras versiones debido a cambios
+ drásticos que sufrieron las versiones anteriores.
+\layout Enumerate
+
+Parser XML libxml2 versión 2.6.x .
+ Versiones 2.5 y anteriores son incompatibles en la API y no funcionarán.
+\layout Enumerate
+
+libncurses version 5 o superior (probado con 5.4).
+\layout Enumerate
+
+GNU Make.
+\layout Subsection
+
+Compilar GUI
+\layout Standard
+
+Para compilar la GUI solo debe ejecutar el comando make dentro del directorio
+ raíz del proyecto.
+ Esto compilará primero una biblioteca estática con los manejadores de los
+ 3 tipos de archivo y luego compilará la GUI.
+\layout LyX-Code
+
+#~/emufs/> make
+\layout Subsection
+
+Preparar el banco de pruebas
+\layout Standard
+
+Antes de comenzar a utilizar la GUI deberá generar los archivo XML desde
+ donde serán leídos los datos para generar los archivos que luego se utilizará.
+ Para ello el proceso de compilación creará 2 ejecutable : generar_fact
+ y generar_art, que se ubicarán en la carpeta generar dentro de emufs_gui.
+\layout Standard
+
+Estos programas generan facturas y artículos respectivamente en forma aleatorio,
+ utilizando diccionarios de datos para llenar los campos.
+ Primero deberá ejecutar generar_art, ya que éste último crea un diccionario
+ de artículos que luego utilizará generar_fact para los items de las facturas.
+\layout Standard
+
+Ambos programas reciben 2 parámetros : el nombre de archivo de salida y
+ la cantidad de entradas a generar.
+\layout Section
+
+Línea de comandos
+\layout Standard
+
+El programa acepta varios parámetros, algunos de ellos opcionales, otros
+ obligatorios dependiendo de las elecciones realizadas.
+\layout Standard
+
+Para obtener una completa descripción de los parámetros el programa acepta
+
+\begin_inset Quotes eld
+\end_inset
+
+-h
+\begin_inset Quotes erd
+\end_inset
+
+ o
+\begin_inset Quotes eld
+\end_inset
+
+--help
+\begin_inset Quotes erd
+\end_inset
+
+ para mostrar una ayuda en línea.
+\layout Standard
+
+Si el programa es ejecutado sin parámetros tratará de recuperar los artículos
+ y las facturas desde archivo previamente creados.
+\layout Standard
+
+Para crear un archivo de artículos a partir de un archivo XML bien formado,
+ se debe ejecutar el programa con la opción
+\begin_inset Quotes eld
+\end_inset
+
+-a
+\begin_inset Quotes erd
+\end_inset
+
+.
+ Dicha opción espera que el siguiente parámetro sea el nombre del archivo
+ a leer, y que éste útimo tenga extensión xml (notar que es solo minúsculas).
+ A continuación espera encontrar el tipo de archivo que se quiere crear,
+ pudiendo ser éste último 1, 2 ó 3.
+ De ser el tipo de archivo con bloques, se le exigirá que ingrese como último
+ parámetro el tamaño del mismo.
+\layout Standard
+
+Para crear el archivo de facturas es el mismo procedimiento, solo que utilizando
+ el parámetro
+\begin_inset Quotes eld
+\end_inset
+
+-f
+\begin_inset Quotes erd
+\end_inset
+
+.
+ El archivo de notas es creado por el sistema de tipo 2 por defecto y no
+ puede ser cambiado desde la línea de comandos.
+ Para ello puede utilizar la opción correspondiente del menú mantenimiento.
+\layout Standard
+
+Debe saber que estos parámetros no son mutuamente excluyentes, por lo que
+ podrá utilizarlos al mismo tiempo.
+\layout Section
+
+Características
+\layout Standard
+
+A continuación se da una lista detallada de las operaciones que son posibles
+ hacerse desde esta interfaz :
+\layout Itemize
+
+Alta, baja y modificación de Artículos.
+ Para ello se abrirá una ventana donde se podrá editar comodamente los datos.
+\layout Itemize
+
+Alta, baja y modificación
+\begin_inset Foot
+collapsed true
+
+\layout Standard
+
+En la modificación de una factura no se podrán cambiar ni la cantidad de
+ items y los datos de los mismo!.
+ La nota si podrá ser modificada.
+\end_inset
+
+ de Facturas.
+\layout Itemize
+
+Ver registros.
+ Ver fisicamente los registros de cualquiera de los archivos sin importar
+ el tipo al que pertenezcan.
+ Desde aquí podrá tambien eliminar, agregar o modificar el registro actual.
+\layout Itemize
+
+Ver Bloques.
+ Para aquellos archivos que hallan sido creados con un tipo con bloques,
+ podrá verlos fisicamente, viendo el bloque actual y los anteriores/posteriores.
+\layout Itemize
+
+Ver las estadísticas de cada archivo según su tipo, para realizar comparativas
+\layout Itemize
+
+Cambiar el formato de cualquier tipo o parametros de archivo.
+\layout Itemize
+
+Compactar los archivos.
+\layout Section
+
+Decisiones de Diseño
+\layout Standard
+
+Durante el desarrollo se han tomado ciertas decisiones en el diseño o restriccio
+nes.
+ En este punto nos centraremos en las especificas tomadas por la interfaz
+ de visualización, y no tomaremos en cuenta las que ponen los tipos de archivo
+ por si solos.
+\layout Enumerate
+
+La cantidad de items por factura es igual a 10 para archivos de registro
+ de longitud fija y bloque parametrizado (TIPO 3).
+ Esta decición fue tomada por poner un valor típico de items que puede haber
+ en una factura, evaluando un caso de un comercio chico.
+ Como el tipo de archivo permite cortar un registro y guardarlo en varios
+ bloques consecutivos, la restricción de cantidad solo es un hecho de elección,
+ y así pusieramos 100, 1000, 10000 no habría diferencia, ya que el tipo
+ de archivo lo guardaría sin problemas.
+\layout Enumerate
+
+Si el archivo es de TIPO 3 y se agregan más de 10 items estos son truncados
+ y descartados sin aviso al usuario.
+ Esta fue una desición basada en el tiempo del proyecto.
+ De tener que validar y consultar al usuario se hubiera perdido tiempo de
+ mucho valor para completar objetivos más importantes del TP.
+\layout Enumerate
+
+Los campos son delimitados por el caracter nulo (en caso de los strings)
+ y por la longitud del tipo de dato en caso de los campos numéricos.
+ De esta forma se aprovechan las características de manejo de string en
+ C.
+\layout Section
+
+Vista de Registros
+\layout Standard
+
+Un ejemplo de vista de registros es la que se observa a continuación :
+\layout Standard
+
+
+\begin_inset Graphics
+ filename gui_ver_registros.eps
+ width 14cm
+ keepAspectRatio
+
+\end_inset
+
+
+\layout Standard
+
+Como puede verse el registro actual se ve resaltado respecto de los demás.
+ También se puede observar que en este caso (el bloque es de 2000 bytes)
+ no entra toda la información en pantalla, pero es posible desplazar utilizando
+ las teclas A y Z.
+\layout Standard
+
+Los datos binarios son convertidos a texto para ser mostrados, siendo la
+ representación elegida :
+\layout Itemize
+
+(XXX) : Representa un ID.
+ En el caso de las facturas también aparece en los datos el número de índice
+ de la nota asociada con esta representación.
+\layout Itemize
+
+{XXX} : Representa el tamaño de los datos.
+ Esto siempre y cuando el registro sea de longitud variable (TIPO1 y TIPO2).
+\layout Standard
+
+También es posible ejecutar acciones de edición sobre el registro seleccioado,
+ así como buscar por ID de registro.
+\layout Standard
+
+Cuando se procesa la información en crudo (es decir, el area de datos) algunos
+ bytes son modificados para evitar errores visuales.
+ Un caso es cuando el bytes es compuesto por 8 bits de valor 0 (caracter
+
+\backslash
+0).
+ Lo que se hace es cambiarlo por un caracter que tenga representacion visual
+ (en este caso un *).
+ Lo mismo suscede para los caracteres de control (
+\backslash
+b
+\backslash
+n
+\backslash
+r por ejemplo) y los espacion.
+ Esta política fue tomada ya que estos caracteres modifican la salida en
+ pantalla, y de no evitar su envío a la pantalla, producirían resultados
+ inesperados en la visualización.
+\layout Section
+
+Bugs conocidos
+\layout Standard
+
+A continuación se enumera los errores que sabemos que existen, que no hemos
+ tenido tiempo de corregir, pero que no hacen al TP en sí :
+\layout Enumerate
+
+Si la consola o terminal cambia de tamaño la GUI no sigue el nuevo tamaño,
+ pudiendose producir defectos visuales.
+ Esto es debido a que se debe capturar una señal que envia el SO, pero no
+ pudimos hacer que funciones con todas las terminales bajo X, por lo que
+ se decidio dejarlo para cuando tengamos tiempo.
+\layout Enumerate
+
+Si la GUI fue compilada con -DDEBUG y no se utiliza un PIPE para redirigir
+ la salida de error estandar, es posible que algun componente del programa
+ emita un mensaje de debug o warning y esta cause defectos de visualización
+ o el programa deje directamente de funcionar.
+ Esto es un defecto de la biblioteca NCurses.
+\layout Chapter
+
Conclusiones
\layout Standard