]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - doc/informe.lyx
e9b5fd81263714a65e682fbe25a094c8fd06e083
[z.facultad/75.06/emufs.git] / doc / informe.lyx
1 #LyX 1.3 created this file. For more info see http://www.lyx.org/
2 \lyxformat 221
3 \textclass book
4 \language spanish
5 \inputencoding auto
6 \fontscheme palatino
7 \graphics default
8 \paperfontsize default
9 \spacing single 
10 \papersize a4paper
11 \paperpackage widemarginsa4
12 \use_geometry 0
13 \use_amsmath 0
14 \use_natbib 0
15 \use_numerical_citations 0
16 \paperorientation portrait
17 \secnumdepth 3
18 \tocdepth 3
19 \paragraph_separation indent
20 \defskip medskip
21 \quotes_language english
22 \quotes_times 2
23 \papercolumns 1
24 \papersides 1
25 \paperpagestyle default
26
27 \layout Title
28
29 Organización de Datos (75.06)
30 \newline 
31 Trabajo Práctico
32 \newline 
33 E
34 \begin_inset Formula $\mu$
35 \end_inset 
36
37 FS
38 \layout Author
39
40 Nicolás Dimov (77624)
41 \newline 
42 Alan Kennedy (78907)
43 \newline 
44 Leandro Lucarella (77891)
45 \newline 
46 Ricardo Markiewicz (78226)
47 \layout Date
48
49 Primera Entrega, 19 de Abril de 2004
50 \layout Standard
51
52
53 \begin_inset LatexCommand \tableofcontents{}
54
55 \end_inset 
56
57
58 \layout Chapter
59
60 Introducción
61 \layout Standard
62
63 Esta es la documentación correspondiente a las API`s para el manejo de tres
64  organizaciones de archivo diferentes.
65  A continuación se describe cada una de ellas y su modo de funcionamiento
66  y sus características principales.
67  De la correcta elección de la organización, dependerá la eficiencia de
68  la aplicación que la utilice.
69  
70 \layout Standard
71
72 EMUFS se presenta como un 
73 \emph on 
74 emulador
75 \emph default 
76  de un 
77 \emph on 
78 filesystem
79 \emph default 
80 , capaz de administrar datos almacenados en cualquiera de las tres organizacione
81 s de archivo previamente mencionadas, las cuales a saberse son:
82 \layout Enumerate
83
84 Registros de Longitud Variable, Bloques de tamaño parametrizable
85 \layout Enumerate
86
87 Registros de Longitud Variable, Sin Bloques
88 \layout Enumerate
89
90 Registros de Longitud Fija, Bloques de tamaño parametrizables
91 \layout Standard
92
93 A través de este trabajo, se podrán observar las diferencias entre distintos
94  tipos de organización de archivos, ventajas y desventajas de cada una de
95  ellas, y las situaciones particulares que deberá sortear un filesystem,
96  como la partición de registros en distintos bloques, manejo de espacio
97  libre, compactación de un archivo, etc.
98 \layout Standard
99
100 A continuación, veremos que el manejo de los archivos en EMUFS se realiza
101  a través de una estructura de control común para cualquier tipo de archivo,
102  dándole flexibilidad y escalabilidad a nuestro sistema.
103 \layout Standard
104
105 Hacia el final de esta presentación, se observaran las pruebas realizadas
106  con las distintas organizaciones de archivos, y las conclusiones obtenidos
107  al respecto.
108 \layout Chapter
109
110 Estructura común
111 \layout Section
112
113 Tipos
114 \layout Standard
115
116 Se detallan a continuación los tipos de datos definidos y utilizados en
117  las distintas implementaciones que conforman nuestro sistema, siendo el
118  más importante de ellos, la estructura 
119 \family typewriter 
120 EMUFS
121 \family default 
122  que actúa como interfaz común para el manejo de cualquier tipo de archivo
123  (no importa que tipo de organización física posea un archivo, esta estructura
124  proveerá una interfaz (funciones) para su manejo).
125 \layout Subsection
126
127 Tipos Comunes
128 \layout Standard
129
130 En la implementación de cada tipo de organización física, así como también
131  en las API de los archivos auxiliares comunes a ellas, se da la utilización
132  de tipo definidos para una clara interfaz entre las mismas, los cuales
133  son brevemente descriptos a continuación y pueden ser hallados en el archivo
134  
135 \series bold 
136 emufs.h
137 \series default 
138 :
139 \layout Itemize
140
141
142 \family typewriter 
143 EMUFS_REG_ID
144 \family default 
145 : usado para representar un 
146 \emph on 
147 Id
148 \emph default 
149  de un registro.
150 \layout Itemize
151
152
153 \family typewriter 
154 EMUFS_REG_SIZE
155 \family default 
156 : usado para representar el tamaño en bytes de un registro.
157 \layout Itemize
158
159
160 \family typewriter 
161 EMUFS_BLOCK_ID
162 \family default 
163 : usado para representar un número de bloque.
164 \layout Itemize
165
166
167 \family typewriter 
168 EMUFS_BLOCK_SIZE
169 \family default 
170 : usado para representar el tamaño en bytes de un bloque.
171 \layout Itemize
172
173
174 \family typewriter 
175 EMUFS_FREE
176 \family default 
177 : usado para representar espacio libre en bytes.
178 \layout Itemize
179
180
181 \family typewriter 
182 EMUFS_OFFSET
183 \family default 
184 : usado para representar un offset.
185 \layout Standard
186
187 Todos son del tipo 
188 \family typewriter 
189 unsigned long
190 \family default 
191 .
192 \layout Subsection
193
194 EMUFS
195 \layout Standard
196
197
198 \family typewriter 
199 EMUFS
200 \family default 
201 \emph on 
202  
203 \emph default 
204 es la estructura principal que encapsula todas las funciones para el manejo
205  de un archivo de datos.
206  Posee punteros a funciones que dependiendo de la organización física por
207  la cual se opte dentro del sistema, serán asignados de acorde.
208  
209 \layout Standard
210
211 Su declaración puede ser observada en el archivo 
212 \series bold 
213 emufs.h 
214 \series default 
215 y la misma cuenta con los siguiente campos:
216 \layout Itemize
217
218
219 \family typewriter 
220 EMUFS_Tipo
221 \family default 
222  que es un tipo enumerado que indica cual es la organización.
223 \layout Itemize
224
225
226 \family typewriter 
227 EMUFS_BLOCK_SIZE
228 \family default 
229  indica el tamaño del bloque para los tipos 1 y 3.
230 \layout Itemize
231
232
233 \family typewriter 
234 EMUFS_REG_SIZE
235 \family default 
236  indica el tamaño del registro, para el tipo 3 que posee tamaño constante.
237 \layout Itemize
238
239
240 \family typewriter 
241 void **leer_bloque() 
242 \family default 
243 puntero a la función para leer un bloque.
244 \layout Itemize
245
246
247 \family typewriter 
248 void *leer_bloque_raw()
249 \family default 
250  puntero a la función para leer un bloque, el anterior y el siguiente.
251 \layout Itemize
252
253
254 \family typewriter 
255 void **leer_registro()
256 \family default 
257  puntero a la función para leer un registro.
258 \layout Itemize
259
260
261 \family typewriter 
262 void **leer_registro_raw()
263 \family default 
264  puntero a la función para leer un registro con su encabezado.
265 \layout Itemize
266
267
268 \family typewriter 
269 EMUFS_REG_ID *grabar_registro()
270 \family default 
271  puntero a la función para grabar un registro.
272 \layout Itemize
273
274
275 \family typewriter 
276 EMUFS_REG_ID *modificar_registro() 
277 \family default 
278 puntero a la función para modificar un registro.
279 \layout Itemize
280
281
282 \family typewriter 
283 int *borrar_registro()
284 \family default 
285  puntero a la función para borrar un registro.
286 \layout Itemize
287
288
289 \family typewriter 
290 EMUFS_Estadisticas *leer_estadisticas()
291 \family default 
292  puntero a la función para cargar una estructura con las estadísticas.
293 \layout Itemize
294
295
296 \family typewriter 
297 void *compactar()
298 \family default 
299  puntero a la función para compactar un archivo.
300 \layout Itemize
301
302
303 \family typewriter 
304 char *nombre
305 \family default 
306  almacena el nombre del archivo sin extensión.
307 \layout Standard
308
309 Esta estructura define los valores de sus punteros según el tipo de organización
310  que se desee manejar y esto se realiza a través del API emufs, implementado
311  en 
312 \series bold 
313 emufs.c
314 \series default 
315 , que se describirá posteriormente.
316 \layout Standard
317
318 Por ejemplo si se desea crear un archivo de nombre 
319 \begin_inset Quotes eld
320 \end_inset 
321
322 facturas
323 \begin_inset Quotes erd
324 \end_inset 
325
326  organizado de la forma 3, se invoca a la función:
327 \layout Standard
328
329
330 \family typewriter 
331 emufs_crear(filename,tipo,tam_bloque,tam_reg), 
332 \family default 
333 donde
334 \family typewriter 
335  filename 
336 \family default 
337 es el nombre que tendrán los archivos de datos e índice, 
338 \family typewriter 
339 tipo
340 \family default 
341  es el tipo de organización - bloques parametrizados y registros constantes
342  en este caso-, 
343 \family typewriter 
344 tam_bloque
345 \family default 
346  es el tamaño del bloque, y 
347 \family typewriter 
348 tam_reg
349 \family default 
350  es el tamaño del registro.
351 \layout Standard
352
353 Para las diferentes organizaciones puede ser que alguno de estos 2 últimos
354  valores no tengan sentido almacenarlas y tomaran un valor por defecto igual
355  a cero.
356 \layout Standard
357
358 Según el tipo de organización, se inicializan los punteros a las funciones.
359  Para el ejemplo 
360 \family typewriter 
361 leer_bloque
362 \family default 
363  se igualará a 
364 \family typewriter 
365 emufs_tipo3_leer_bloque()
366 \family default 
367 , y lo mismo sucede con los demás.
368 \layout Subsection
369
370 EMUFS_Tipo
371 \layout Standard
372
373
374 \family typewriter 
375 EMUFS_Tipo
376 \family default 
377  es un tipo de dato enum, el cual será utilizado en la cabecera de todo
378  archivo de datos (
379 \series bold 
380 .dat
381 \series default 
382 ), para indicar los distintos tipos de organización física.
383  Su declaración puede verse en el archivo 
384 \series bold 
385 emufs.h.
386 \layout Standard
387
388 A saberse los valores y significado correspondiente que puede tomar este
389  tipo de dato son:
390 \layout Itemize
391
392
393 \series bold 
394 T1
395 \series default 
396  : Archivos con registros de longitud variable y bloques parametrizables.
397 \layout Itemize
398
399
400 \series bold 
401 T2
402 \series default 
403  : Archivos con registros de longitud variable sin bloques.
404 \layout Itemize
405
406
407 \series bold 
408 T3
409 \series default 
410  : Archivos con registros de longitud fija y bloques parametrizables.
411 \layout Subsection
412
413 EMUFS_Estadisticas
414 \layout Standard
415
416
417 \family typewriter 
418 EMUFS_Estadisticas
419 \family default 
420  es una estructura que almacenará los datos pertinentes a las estadísticas
421  de un archivo dado, y será utilizada para visualizar dichas observaciones
422  a través de la GUI.
423 \layout Standard
424
425 Su declaración puede ser observada en el archivo 
426 \series bold 
427 emufs.h 
428 \series default 
429 y la misma cuenta con los siguiente campos:
430 \layout Itemize
431
432
433 \family typewriter 
434 unsigned long
435 \family default 
436  
437 \family typewriter 
438 tam_archivo
439 \family default 
440 : indica el tamaño del archivo de datos (.dat) en bytes.
441 \layout Itemize
442
443
444 \family typewriter 
445 unsigned long
446 \family default 
447  
448 \family typewriter 
449 tam_archivos_aux
450 \family default 
451 : indica el tamaño de los archivos auxiliares sumados en bytes.
452 \layout Itemize
453
454
455 \family typewriter 
456 unsigned long
457 \family default 
458  
459 \family typewriter 
460 tam_info_control_dat
461 \family default 
462 : indica la cantidad de bytes en información de control utilizados para
463  el archivo.
464 \layout Itemize
465
466
467 \family typewriter 
468 unsigned long
469 \family default 
470  
471 \family typewriter 
472 media_fs
473 \family default 
474 : promedio de espacio libre en el archivo de datos (por bloque o gap promedio
475  según la org)
476 \layout Itemize
477
478
479 \family typewriter 
480 unsigned long
481 \family default 
482  
483 \family typewriter 
484 total_fs
485 \family default 
486 : total de espacio libre en el archivo de datos.
487 \layout Itemize
488
489
490 \family typewriter 
491 unsigned long
492 \family default 
493  
494 \family typewriter 
495 max_fs
496 \family default 
497 : máximo espacio libre en el archivo de datos (en un bloque o máximo gap
498  segun la org).
499 \layout Itemize
500
501
502 \family typewriter 
503 unsigned long
504 \family default 
505  
506 \family typewriter 
507 min_fs
508 \family default 
509 : ídem pero mínimo.
510 \layout Itemize
511
512
513 \family typewriter 
514 unsigned long
515 \family default 
516  
517 \family typewriter 
518 cant_bloques
519 \family default 
520 : cantidad de bloques en el archivo de datos (.
521 \series bold 
522 dat
523 \series default 
524 )
525 \layout Itemize
526
527
528 \family typewriter 
529 unsigned long
530 \family default 
531  
532 \family typewriter 
533 cant_registros
534 \family default 
535 : cantidad de registros en el archivo de datos (
536 \series bold 
537 .dat
538 \series default 
539 )
540 \layout Standard
541
542 En base a la estructura descripta anteriormente y mediante la utilización
543  de la función de lectura de estadísticas 
544 \family typewriter 
545 emufs_leer_estadisticas()
546 \family default 
547  disponible en la estructura común 
548 \family typewriter 
549 EMUFS
550 \family default 
551  handler de cualquier tipo de archivo, podremos obtener una serie de estadística
552 s que pasamos a detallar (más allá de los datos básicos como cant registros,
553  cant bloques, tam archivo, etc):
554 \layout Itemize
555
556 Relación entre espacio libre y el tamaño del archivo de datos (
557 \series bold 
558 .dat
559 \series default 
560 )
561 \layout Itemize
562
563 Relación entre el espacio ocupado por información de control y el tamaño
564  del archivo de datos (
565 \series bold 
566 .dat
567 \series default 
568 )
569 \layout Itemize
570
571 Cantidad promedio de espacio libre (en bloque o gap promedio)
572 \layout Itemize
573
574 Desviaciones extremas de espacio libre (máximo/mínimo espacio libre en bloque
575  o mayor/menor gap)
576 \layout Section
577
578
579 \begin_inset LatexCommand \label{sec:cabecera_gral}
580
581 \end_inset 
582
583 Organización física general de un archivo E
584 \begin_inset Formula $\mu$
585 \end_inset 
586
587 FS
588 \layout Standard
589
590 Todo archivo E
591 \begin_inset Formula $\mu$
592 \end_inset 
593
594 FS está compuesto por 4 archivos a nivel de sistema operativo: archivo de
595  datos (con 3 formatos posibles, ver páginas 
596 \begin_inset LatexCommand \pageref{cha:tipo1}
597
598 \end_inset 
599
600
601 \begin_inset LatexCommand \pageref{cha:tipo2}
602
603 \end_inset 
604
605  y 
606 \begin_inset LatexCommand \pageref{cha:tipo3}
607
608 \end_inset 
609
610 ), archivo de índice (ver página 
611 \begin_inset LatexCommand \pageref{sec:idx}
612
613 \end_inset 
614
615 ), archivo de control de espacio libre (ver página 
616 \begin_inset LatexCommand \pageref{sec:fsc}
617
618 \end_inset 
619
620 ) y archivo de índices recuperables (ver página 
621 \begin_inset LatexCommand \pageref{sec:did}
622
623 \end_inset 
624
625 ).
626 \layout Standard
627
628 El archivo de datos está compuesto por:
629 \layout Itemize
630
631 Una 
632 \emph on 
633 cabecera general
634 \emph default 
635  compuesta por un 
636 \family typewriter 
637 int
638 \family default 
639  (4 bytes en plataformas Linux de 32 bits) que representa el tipo de archivo.
640 \layout Itemize
641
642 Datos dependientes del tipo de archivo.
643 \layout Standard
644
645 La 
646 \emph on 
647 cabecera general
648 \emph default 
649  es utilizada para poder detectar el formato de un archivo al abrirlo.
650  Los datos dependientes del tipo de archivo serán explicados en sus secciones
651  correspondientes.
652 \layout LyX-Code
653
654 archivo
655 \layout LyX-Code
656
657 +-----------+--------------------------------------------//-+
658 \layout LyX-Code
659
660 |    tipo   | Datos dependientes del tipo de archivo ...
661  
662 \backslash 
663
664 \backslash 
665  |
666 \layout LyX-Code
667
668 +-----------+--------------------------------------------//-+
669 \layout LyX-Code
670
671 /- 4 bytes -/
672 \layout Section
673
674 Uso de la estructura EMUFS
675 \layout Standard
676
677 Como fue mencionado anteriormente en la descripción de la estructura EMUFS,
678  la misma proporciona al usuario una interfaz a través de la cual puede
679  realizar el manejo de archivos en forma genérica, abstrayéndose del tipo
680  de organización física en particular que dicho archivo posea.
681  Se la declara en 
682 \series bold 
683 emufs.h
684 \series default 
685  y las funciones que inicializan la estructura se encuentran en 
686 \series bold 
687 emufs.c
688 \layout Standard
689
690 Es decir que a través de esta estructura, podemos manejar cualquier tipo
691  de archivo, mediante una misma interfaz en común.
692  La estructura 
693 \family typewriter 
694 EMUFS 
695 \family default 
696 posee además de ciertos datos que describen la organización física de un
697  archivo dado como por ejemplo 
698 \series bold 
699 \emph on 
700 tamaño de registro
701 \series default 
702 \emph default 
703
704 \series bold 
705 \emph on 
706 tamaño de bloque
707 \series default 
708 \emph default 
709  y 
710 \series bold 
711 \emph on 
712 nombre del archivo
713 \series default 
714 \emph default 
715 , una serie de punteros a funciones para el manejo del archivo del cual
716  es handler:
717 \layout Standard
718
719 Entre dichos funciones se encuentran: 
720 \family typewriter 
721 leer_registro()
722 \family default 
723
724 \family typewriter 
725 leer_bloque(), borrar_registro()
726 \family default 
727
728 \family typewriter 
729 agregar_registro()
730 \family default 
731
732 \family typewriter 
733 modificar_registro, leer_estadisticas()
734 \family default 
735
736 \family typewriter 
737 compactar().
738 \layout Standard
739
740 Para entender mejor el uso de esta estructura para el manejo de los archivos,
741  mostraremos un ejemplo concreto.
742  Supongamos que tenemos el siguiente código:
743 \layout LyX-Code
744
745 EMUFS *efs = emufs_crear(¨articulos.dat¨,T3,200,50);
746 \layout Standard
747
748 Esto hará que se cree el archivo de datos 
749 \series bold 
750 articulos.dat
751 \series default 
752 , con la organización física tipo 3 con registros de longitud fija de 50
753  bytes y bloques de 200 bytes.
754  Al mismo tiempo, los se asignaran valores a los punteros a funciones que
755  posee dicha estructura, la cual de ahora en más estará en condiciones de
756  manejar un archivo del tipo 3.
757  Gráficamente lo que sucede es:
758 \layout Standard
759
760
761 \begin_inset Float figure
762 placement H
763 wide false
764 collapsed false
765
766 \layout Caption
767
768 Inicialización de estructura EMUFS para un caso Archivo Tipo 3
769 \layout Standard
770 \align center 
771
772 \begin_inset Graphics
773         filename graphics/Emufsinit.png
774         scale 75
775         keepAspectRatio
776
777 \end_inset 
778
779
780 \end_inset 
781
782
783 \layout Standard
784
785 Así pues, cuando se utilice la estructura para por ejemplo leer un registro,
786  sucederá lo siguiente:
787 \layout LyX-Code
788
789 efs->leer_registro(params) -- calls -->  emufs_tipo3_leer_registro(params)
790 \layout Standard
791
792 Como se puede observar, la estructura 
793 \family typewriter 
794 EMUFS
795 \family default 
796  permitirá el manejo de cualquier tipo de archivo, a través del mismo código,
797  dándole gran flexibilidad a nuestro sistema, que podrá expandirse a más
798  tipos de archivos de ser necesario.
799 \layout Chapter
800
801 Archivos Auxiliares
802 \layout Standard
803
804 Acompañando al archivo de datos (
805 \series bold 
806 .dat
807 \series default 
808 ) el cual es responsable de la contención de los registros, tendremos tres
809  archivos auxiliares (
810 \series bold 
811 .idx
812 \series default 
813
814 \series bold 
815 .fsc
816 \series default 
817  y 
818 \series bold 
819 .did
820 \series default 
821 ) cuya funcionalidad y propósito pasamos a describir a continuación, sin
822  antes remarcar que los tres archivos poseen una sola implementación para
823  las distintas formas de organización física que hemos implementado (tres
824  para ser mas exactos).
825 \layout Standard
826
827 Entre las ventajas de poseer la misma implementación se encuentra el tener
828  un API común entre los tres tipos para el manejo de la localización de
829  sus registros, administración de espacio libre e Id's liberados, sin necesidad
830  de realizar n-implementaciones para un mismo objetivo final.
831 \layout Standard
832
833 Además, la obtención de ciertos datos estadísticos como espacio libre, o
834  cantidad de registros, se realiza a través de la misma interfaz, y también
835  se ha facilitado en cierto grado la re-organización física de un archivo
836  (pasar de un tipo a otro), dado el uso de estos tres archivos auxiliares
837  en común para funciones tan predominantes como índexación, administración
838  de espacio libre y recuperación de Id's.
839 \layout Section
840
841
842 \begin_inset LatexCommand \label{sec:idx}
843
844 \end_inset 
845
846 Archivo índice
847 \layout Standard
848
849 El archivo índice (.idx), permite la localización de los registros en el
850  .DAT de forma directa, mediante la obtención de su offset respecto del inicio
851  del .dat, o nro bloque (segun el tipo de organización física) en donde se
852  encuentra un registro dado, indicado por su 
853 \emph on 
854 id_reg.
855 \layout Standard
856
857 Los registros de este archivo se encuentran representados una estructura
858  que indica un número de registro y el bloque u offset en donde se encuentra
859  el mismo.
860 \layout Standard
861
862 Es necesario que este archivo esté ordenado por 
863 \emph on 
864 id_reg
865 \emph default 
866 , ya que esto permitirá el acceso directo al mismo, para la rápida obtención
867  del nro de bloque u offset y posterior búsqueda de un registro en el archivo
868  de datos.
869 \layout Subsection
870
871 Organización física
872 \layout Standard
873
874 Los registros de este archivo se encuentran representados a nivel código
875  por el siguiente tipo de dato interno (
876 \family typewriter 
877 EMUFS_IDX
878 \family default 
879 ):
880 \layout LyX-Code
881
882 typedef struct emufs_idx_t { 
883 \layout LyX-Code
884
885   EMUFS_REG_ID id_reg;
886 \layout LyX-Code
887
888   EMUFS_OFFSET location;
889 \layout LyX-Code
890
891 } EMUFS_IDX;
892 \layout Standard
893
894
895 \begin_inset Float table
896 placement H
897 wide false
898 collapsed false
899
900 \layout Caption
901
902 Ejemplo de registro en archivo índice (.idx), para un archivo de organización
903  Tipo 1 y 3
904 \layout Standard
905
906
907 \begin_inset  Tabular
908 <lyxtabular version="3" rows="2" columns="3">
909 <features>
910 <column alignment="center" valignment="top" leftline="true" width="0">
911 <column alignment="center" valignment="top" leftline="true" width="0">
912 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
913 <row topline="true" bottomline="true">
914 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
915 \begin_inset Text
916
917 \layout Standard
918
919 id_reg
920 \end_inset 
921 </cell>
922 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
923 \begin_inset Text
924
925 \layout Standard
926
927 nro_bloque
928 \end_inset 
929 </cell>
930 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
931 \begin_inset Text
932
933 \layout Standard
934
935 \end_inset 
936 </cell>
937 </row>
938 <row topline="true" bottomline="true">
939 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
940 \begin_inset Text
941
942 \layout Standard
943
944 5
945 \end_inset 
946 </cell>
947 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
948 \begin_inset Text
949
950 \layout Standard
951
952 54
953 \end_inset 
954 </cell>
955 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
956 \begin_inset Text
957
958 \layout Standard
959
960 Indica que el registro de id_reg = 5, se encuentra en el bloque 54
961 \end_inset 
962 </cell>
963 </row>
964 </lyxtabular>
965
966 \end_inset 
967
968
969 \end_inset 
970
971  
972 \begin_inset Float table
973 placement H
974 wide false
975 collapsed false
976
977 \layout Caption
978
979 Ejemplo de registro en archivo índice (.idx), para un archivo de organización
980  Tipo 2
981 \layout Standard
982
983
984 \begin_inset  Tabular
985 <lyxtabular version="3" rows="2" columns="3">
986 <features>
987 <column alignment="center" valignment="top" leftline="true" width="0">
988 <column alignment="center" valignment="top" leftline="true" width="0">
989 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
990 <row topline="true" bottomline="true">
991 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
992 \begin_inset Text
993
994 \layout Standard
995
996 id_reg
997 \end_inset 
998 </cell>
999 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1000 \begin_inset Text
1001
1002 \layout Standard
1003
1004 nro_bloque
1005 \end_inset 
1006 </cell>
1007 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1008 \begin_inset Text
1009
1010 \layout Standard
1011
1012 \end_inset 
1013 </cell>
1014 </row>
1015 <row topline="true" bottomline="true">
1016 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1017 \begin_inset Text
1018
1019 \layout Standard
1020
1021 5
1022 \end_inset 
1023 </cell>
1024 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1025 \begin_inset Text
1026
1027 \layout Standard
1028
1029 54
1030 \end_inset 
1031 </cell>
1032 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1033 \begin_inset Text
1034
1035 \layout Standard
1036
1037 Indica que el registro de id_reg = 5, se encuentra en el bloque 54
1038 \end_inset 
1039 </cell>
1040 </row>
1041 </lyxtabular>
1042
1043 \end_inset 
1044
1045
1046 \end_inset 
1047
1048
1049 \layout Standard
1050
1051
1052 \series bold 
1053 \emph on 
1054 Nota: 
1055 \series default 
1056 \emph default 
1057 Como se puede observar, para distintas organizaciones el significado de
1058  los registros en este archivo es diferente y se utilizará de distinta manera
1059  en consecuencia.
1060 \layout Subsection
1061
1062 Comportamiento
1063 \layout Standard
1064
1065 Las declaraciones e implementación se pueden encontrar en 
1066 \series bold 
1067 \emph on 
1068 idx.h
1069 \series default 
1070 \emph default 
1071  y 
1072 \series bold 
1073 \emph on 
1074 idx.c
1075 \series default 
1076 \emph default 
1077  respectivamente:
1078 \layout List
1079 \labelwidthstring 00.00.0000
1080
1081
1082 \series bold 
1083 \emph on 
1084 Búsqueda:
1085 \series default 
1086 \emph default 
1087  Los registros del archivo índice (
1088 \series bold 
1089 .idx
1090 \series default 
1091 ), poseen una correspondencia 1 a 1, con los Id's de los registros en el
1092  archivo de datos (
1093 \series bold 
1094 .dat
1095 \series default 
1096 ).
1097  Con esto, queremos decir que el N-ésimo registro del archivo índice, será
1098  aquél que posea la información para localizar al registro cuyo 
1099 \family typewriter 
1100 id_reg
1101 \family default 
1102  es N, dentro del archivo de datos (
1103 \series bold 
1104 .dat
1105 \series default 
1106 ).
1107 \series bold 
1108
1109 \newline 
1110 NOTA:
1111 \series default 
1112  Cabe aclarar que por si bien el índice se encuentra ordenado por 
1113 \family typewriter 
1114 id_reg
1115 \family default 
1116 , los registros en el archivo de datos, por lo general no lo estarán (ordenados
1117  por id).
1118  
1119 \newline 
1120 Ver: 
1121 \family typewriter 
1122 emufs_idx_buscar_registro(), emufs_idx_get()
1123 \layout List
1124 \labelwidthstring 00.00.0000
1125
1126
1127 \series bold 
1128 Alta:
1129 \series default 
1130  Ante la alta de un registro en el archivo de datos, se insetará un nuevo
1131  registro en el archivo índice, con el id_reg del registro en cuestión,
1132  y el offset u bloque donde se lo haya grabado en disco.
1133 \newline 
1134 Ver: 
1135 \family typewriter 
1136 emufs_idx_agregar()
1137 \layout List
1138 \labelwidthstring 00.00.0000
1139
1140
1141 \series bold 
1142 Baja:
1143 \series default 
1144  Ante el borrado de un registro del archivo de datos, se accederá el registro
1145  correspondiente en el índice, y se actualizara su LOCATION, estableciéndolo
1146  en el valor especial 
1147 \family typewriter 
1148 EMUFS_NOT_FOUND
1149 \family default 
1150 , el cual indica que ese registro ha sido eliminado y por ende no se lo
1151  podrá localizar en el futuro.
1152  Como se verá mas adelante, según el tipo de organización física, el registro
1153  puede ser borrado concretamente del .
1154 \series bold 
1155 dat
1156 \series default 
1157  o no.
1158  
1159 \newline 
1160 Ver: 
1161 \family typewriter 
1162 emufs_idx_borrar()
1163 \layout List
1164 \labelwidthstring 00.00.0000
1165
1166
1167 \series bold 
1168 Modificación:
1169 \series default 
1170  Ante la modificación en la posición física de un registro dentro del archivo
1171  de datos (por ejemplo luego del proceso de re-compactación, se realizará
1172  la modificación respectiva del campo 
1173 \family typewriter 
1174 location
1175 \family default 
1176 .
1177 \newline 
1178 Ver: 
1179 \family typewriter 
1180 emufs_idx_actualizar()
1181 \layout Section
1182
1183
1184 \begin_inset LatexCommand \label{sec:fsc}
1185
1186 \end_inset 
1187
1188 Archivo de control de espacio libre
1189 \layout Standard
1190
1191 El archivo de espacio libre (
1192 \series bold 
1193 .fsc
1194 \series default 
1195 ) (espacio por bloque o gaps en archivo, según el tipo de organización física),
1196  tiene como función la administración del espacio libre, generado por previas
1197  eliminaciones de registros en el archivo de datos.
1198  El mismo, nos indicará donde hay lugar para insertar un nuevo registro.
1199 \layout Standard
1200
1201 Para el caso de una organización por bloque, nos dirá en que bloque o si
1202  se debe generar un nuevo bloque.
1203  En el caso de la organización sin bloques, nos indicará en que gap o si
1204  al final del archivo.
1205 \layout Standard
1206
1207 Los registros de este archivo se encuentran representados una estructura
1208  que indica un número de bloque u offset y el espacio libre disponible en
1209  el mismo (o a partir del mismo en el caso del offset).
1210 \layout Standard
1211
1212
1213 \series bold 
1214 Nota
1215 \series default 
1216 : Por requerimiento del algoritmo de compactación el tipo de organización
1217  física con reg long var, sin bloques, los gaps se graban en forma ordenada
1218  en el (.fsc).
1219  (El orden se corresponde con lo que hay en el .dat).
1220 \layout Subsection
1221
1222 Organización Física
1223 \layout Standard
1224
1225 Los registros de este archivo se encuentran representados a nivel código
1226  por el siguiente tipo de dato interno (
1227 \family typewriter 
1228 EMUFS_FSC
1229 \family default 
1230 ):
1231 \layout LyX-Code
1232
1233 typedef struct emufs_fsc_t { 
1234 \layout LyX-Code
1235
1236   EMUFS_BLOCK_ID marker;
1237 \layout LyX-Code
1238
1239   EMUFS_FREE freespace;
1240 \layout LyX-Code
1241
1242 } EMUFS_FSC;
1243 \layout Standard
1244
1245
1246 \series bold 
1247 \emph on 
1248
1249 \begin_inset Float table
1250 placement H
1251 wide false
1252 collapsed false
1253
1254 \layout Caption
1255
1256 Ejemplo de registro en archivo de control de espacio libre para un archivo
1257  con bloques
1258 \layout Standard
1259
1260
1261 \begin_inset  Tabular
1262 <lyxtabular version="3" rows="2" columns="3">
1263 <features>
1264 <column alignment="center" valignment="top" leftline="true" width="0">
1265 <column alignment="center" valignment="top" leftline="true" width="0">
1266 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1267 <row topline="true" bottomline="true">
1268 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1269 \begin_inset Text
1270
1271 \layout Standard
1272
1273 nro_bloque
1274 \end_inset 
1275 </cell>
1276 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1277 \begin_inset Text
1278
1279 \layout Standard
1280
1281 freespace
1282 \end_inset 
1283 </cell>
1284 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1285 \begin_inset Text
1286
1287 \layout Standard
1288
1289 \end_inset 
1290 </cell>
1291 </row>
1292 <row topline="true" bottomline="true">
1293 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1294 \begin_inset Text
1295
1296 \layout Standard
1297
1298 12
1299 \end_inset 
1300 </cell>
1301 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1302 \begin_inset Text
1303
1304 \layout Standard
1305
1306 120
1307 \end_inset 
1308 </cell>
1309 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1310 \begin_inset Text
1311
1312 \layout Standard
1313
1314 Indica que en el bloque 12, hay 120 bytes libres al final del mismo.
1315 \end_inset 
1316 </cell>
1317 </row>
1318 </lyxtabular>
1319
1320 \end_inset 
1321
1322
1323 \end_inset 
1324
1325  
1326 \begin_inset Float table
1327 placement H
1328 wide false
1329 collapsed false
1330
1331 \layout Caption
1332
1333 Ejemplo de registro en archivo de 
1334 \emph on 
1335 gaps
1336 \emph default 
1337  para un archivo sin bloques
1338 \layout Standard
1339
1340
1341 \begin_inset  Tabular
1342 <lyxtabular version="3" rows="2" columns="3">
1343 <features>
1344 <column alignment="center" valignment="top" leftline="true" width="0">
1345 <column alignment="center" valignment="top" leftline="true" width="0">
1346 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1347 <row topline="true" bottomline="true">
1348 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1349 \begin_inset Text
1350
1351 \layout Standard
1352
1353 offset
1354 \end_inset 
1355 </cell>
1356 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1357 \begin_inset Text
1358
1359 \layout Standard
1360
1361 freespace
1362 \end_inset 
1363 </cell>
1364 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1365 \begin_inset Text
1366
1367 \layout Standard
1368
1369 \end_inset 
1370 </cell>
1371 </row>
1372 <row topline="true" bottomline="true">
1373 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1374 \begin_inset Text
1375
1376 \layout Standard
1377
1378 12
1379 \end_inset 
1380 </cell>
1381 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1382 \begin_inset Text
1383
1384 \layout Standard
1385
1386 120
1387 \end_inset 
1388 </cell>
1389 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1390 \begin_inset Text
1391
1392 \layout Standard
1393
1394 Indica que a partir del byte 12 del archivo de datos, hay 120 bytes libres.
1395 \end_inset 
1396 </cell>
1397 </row>
1398 </lyxtabular>
1399
1400 \end_inset 
1401
1402
1403 \end_inset 
1404
1405
1406 \layout Standard
1407
1408
1409 \series bold 
1410 \emph on 
1411 Nota: 
1412 \series default 
1413 \emph default 
1414 Como se puede observar, para distintas organizaciones el significado de
1415  los registros en este archivo es diferente y se utilizará de distinta manera
1416  en consecuencia.
1417 \layout Subsection
1418
1419 Funciones principales
1420 \layout Standard
1421
1422 Las declaraciones e implementación se pueden encontrar en 
1423 \series bold 
1424 \emph on 
1425 fsc.h
1426 \series default 
1427 \emph default 
1428  y 
1429 \series bold 
1430 \emph on 
1431 fsc.c
1432 \series default 
1433 \emph default 
1434  respectivamente:
1435 \layout List
1436 \labelwidthstring 00.00.0000
1437
1438
1439 \series bold 
1440 Búsqueda:
1441 \series default 
1442  Ante la operación de alta de un registro en el archivo de datos, se realizará
1443  la búsqueda de espacio libre donde este podrá ser insertado.
1444  En el caso de organizaciones con bloques, se buscará en que 
1445 \family typewriter 
1446 nro_bloque
1447 \family default 
1448  se posee espacio suficiente para albergar el nuevo registro (o a partir
1449  de qué 
1450 \family typewriter 
1451 nro_bloque
1452 \family default 
1453  se encuentran 
1454 \family typewriter 
1455 N
1456 \family default 
1457  bloques consecutivos libres).
1458  En el caso de organización sin bloque, se buscará un gap o espacio libre
1459  en el archivo, obteniéndose en consecuencia, el 
1460 \family typewriter 
1461 offset
1462 \family default 
1463  hasta el mismo.
1464  
1465 \newline 
1466 Ver: 
1467 \family typewriter 
1468 emufs_fsc_buscar_lugar(), emufs_fsc_buscar_n_lugares()
1469 \layout List
1470 \labelwidthstring 00.00.0000
1471
1472
1473 \series bold 
1474 Alta/Mod:
1475 \series default 
1476  Luego de una operación de baja o alta de un registro en el archivo de datos
1477  (
1478 \series bold 
1479 .dat
1480 \series default 
1481 ), incrementará o decrementará respectivamente el espacio libre en el archivo
1482  de datos, y esto deberá ser registrado, agregando un nuevo registro en
1483  el archivo de espacios libres (
1484 \series bold 
1485 .fsc
1486 \series default 
1487 ) o bien modificándolo.
1488 \newline 
1489
1490 \newline 
1491 En el caso de organizaciones con bloques, se actualizará el valor del espacio
1492  libre 
1493 \family typewriter 
1494 freespace
1495 \family default 
1496  en el bloque (ya sea incrementándolo o decrementándolo) o bien se insertará
1497  un nuevo registro en caso de que se esté creando un nuevo bloque en el
1498  archivo de datos (en este caso no será debido a un alta o baja de registro
1499  como se mencionó al principio).
1500 \newline 
1501
1502 \newline 
1503 Para el caso de organización sin bloques, en el caso de baja de un registro
1504  de datos (
1505 \series bold 
1506 .dat
1507 \series default 
1508 ) se insertará un nuevo registro en el 
1509 \series bold 
1510 .fsc
1511 \series default 
1512  dando cuenta de la aparición de un nuevo gap en el archivo de datos (
1513 \series bold 
1514 .dat
1515 \series default 
1516 ), y en caso de estar este lindante con otro gap, se realizará el merge
1517  pertinente.
1518  (esto esta explicado más en profundidad en los casos particulares de organizaci
1519 ón física, registros variables sin bloques).
1520  Para el caso de una alta en el archivo de datos (
1521 \series bold 
1522 .dat
1523 \series default 
1524 ), el valor del gap donde se haya insertado se actualizará.
1525  
1526 \newline 
1527 Ver: 
1528 \family typewriter 
1529 emufs_fsc_agregar(), emufs_fsc_agregar_gap(), emufs_fsc_actualizar(), emufs_fsc_
1530 actualizar_gap().
1531 \layout List
1532 \labelwidthstring 00.00.0000
1533
1534
1535 \series bold 
1536 Baja
1537 \series default 
1538 : Únicamente para el caso de una organización que presente gaps en el archivo,
1539  se podrá dar a lugar la eliminación de un registro del archivo de espacios
1540  libres (
1541 \series bold 
1542 .fsc)
1543 \series default 
1544 .
1545  Esta situación tendrá efecto cuando se inserte un registro que entre perfecto
1546  en un gap disponible, y por ende el gap desaparecerá.
1547 \newline 
1548 Ver: 
1549 \family typewriter 
1550 emufs_fsc_borrar_gap()
1551 \layout Section
1552
1553
1554 \begin_inset LatexCommand \label{sec:did}
1555
1556 \end_inset 
1557
1558 Archivo de id's recuperables
1559 \layout Standard
1560
1561 El archivo de Id's liberado (
1562 \series bold 
1563 .did
1564 \series default 
1565 ) llevará cuenta de aquellos Id's de registros (
1566 \family typewriter 
1567 id_reg
1568 \family default 
1569 ) que ya no se encuentran siendo utilizados y fueron liberados por registros
1570  eliminados previamente.
1571  A través del mismo, se podrá realizar la reutilización de Id's ante la
1572  alta de nuevos registros.
1573 \layout Standard
1574
1575 A nivel físico, este archivo poseerá una secuencia de datos del tipo EMUFS_REG_I
1576 D, y el comportamiento del sistema de recuperación de Id's será el de una
1577  pila.
1578  Es decir, ante el requerimiento de un 
1579 \family typewriter 
1580 reg_id
1581 \family default 
1582  libre por una función del sistema como por ejemplo la alta de un nuevo
1583  registro, el API del archivo (
1584 \series bold 
1585 .did
1586 \series default 
1587 ), obtendrá el último dato del mismo (el 
1588 \emph on 
1589 Id
1590 \emph default 
1591  que fue liberado mas recientemente), y truncará el archivo eliminando el
1592  
1593 \emph on 
1594 Id
1595 \emph default 
1596  recuperado de la tabla.
1597  (LIFO, Last in First Out).
1598 \layout Subsection
1599
1600 Organización Física
1601 \layout Standard
1602
1603 Este archivo tiene registros de un solo campo, 
1604 \family typewriter 
1605 EMUFS_REG_ID
1606 \family default 
1607  el cual simboliza al id que fue liberado en un proceso de baja de registros.
1608 \layout Subsection
1609
1610 Funciones principales
1611 \layout Standard
1612
1613 Las declaraciones e implementación se pueden encontrar en 
1614 \series bold 
1615 \emph on 
1616 did.h
1617 \series default 
1618 \emph default 
1619  y 
1620 \series bold 
1621 \emph on 
1622 did.c
1623 \series default 
1624 \emph default 
1625  respectivamente
1626 \layout List
1627 \labelwidthstring 00.00.0000
1628
1629
1630 \series bold 
1631 Alta: 
1632 \series default 
1633 Ante la eliminación de un registro del archivo de datos (
1634 \series bold 
1635 .dat
1636 \series default 
1637 ) se procederá al agregado del correspondiente 
1638 \family typewriter 
1639 id_reg
1640 \family default 
1641  que fue liberado por dicha operación, al archivo 
1642 \series bold 
1643 .did
1644 \series default 
1645 .
1646 \family typewriter 
1647
1648 \newline 
1649
1650 \family default 
1651 Ver: 
1652 \family typewriter 
1653 emufs_did_agregar()
1654 \layout List
1655 \labelwidthstring 00.00.0000
1656
1657
1658 \series bold 
1659 Baja
1660 \series default 
1661  Cuando el sistema desee grabar un nuevo registro en el archivo de datos,
1662  este pedirá un 
1663 \family typewriter 
1664 id_reg
1665 \family default 
1666  disponible para el mismo.
1667  El sistema de administración de Id's libres, obtendrá el último 
1668 \emph on 
1669 id
1670 \emph default 
1671  que se guardó en el archivo (o se eliminó del archivo de datos), y truncará
1672  el archivo eliminándolo.
1673 \family typewriter 
1674
1675 \newline 
1676
1677 \family default 
1678 Ver: 
1679 \family typewriter 
1680 emufs_did_get_last()
1681 \layout Chapter
1682
1683
1684 \begin_inset LatexCommand \label{cha:tipo1}
1685
1686 \end_inset 
1687
1688 Archivo con bloques parametrizados y registros de longitud variable
1689 \layout Standard
1690
1691 Este tipo de archivo tiene varias complicaciones, al tratarse de un punto
1692  intermedio entre el 
1693 \begin_inset LatexCommand \ref{cha:tipo2}
1694
1695 \end_inset 
1696
1697  y el 
1698 \begin_inset LatexCommand \ref{cha:tipo3}
1699
1700 \end_inset 
1701
1702  (cuenta tanto con bloques como con registros variables), hereda los inconvenien
1703 tes (y ventajas) de ambos, más los propios.
1704  Al implementar este tipo de archivo se puso énfasis en la eficiencia mientras
1705  esta no comprometa la mantenibilidad del código, es por esto que en algunas
1706  circunstancias no se hace un uso óptimo del espacio.
1707 \layout Standard
1708
1709 La implementación de este tipo de archivo puede ser encontrada en 
1710 \family typewriter 
1711 emufs/tipo1.c
1712 \family default 
1713  mientras que su interfaz pública está disponible en 
1714 \family typewriter 
1715 emufs/tipo1.h
1716 \family default 
1717 .
1718 \layout Section
1719
1720 Organización física
1721 \layout Standard
1722
1723 El archivo está compuesto por la 
1724 \emph on 
1725 cabecera general
1726 \emph default 
1727  (ver página 
1728 \begin_inset LatexCommand \pageref{sec:cabecera_gral}
1729
1730 \end_inset 
1731
1732 ).
1733  El valor que toma en este tipo de archivo es 0 (o el valor simbólico 
1734 \family typewriter 
1735 T1
1736 \family default 
1737  del tipo 
1738 \family typewriter 
1739 EMUFS_Tipo
1740 \family default 
1741 ).
1742  Luego le sigue una cabecera propia del archivo (un 
1743 \family typewriter 
1744 EMUFS_BLOCK_SIZE
1745 \family default 
1746 , 4 bytes) que almacena el tamaño del bloque que usa el archivo.
1747  De esta manera, al abrir un archivo de este tipo no se necesita tener ninguna
1748  información sobre él.
1749  A esta cabecera le siguen cero o más bloques del tamaño fijo especificado
1750  en la cabecera antes mencionada.
1751 \layout LyX-Code
1752
1753 archivo
1754 \layout LyX-Code
1755
1756 +-----------+-----------+------------------------//-+
1757 \layout LyX-Code
1758
1759 |    tipo   | tam_bloque| Cero o más bloques ...
1760  
1761 \backslash 
1762
1763 \backslash 
1764  |
1765 \layout LyX-Code
1766
1767 +-----------+-----------+------------------------//-+
1768 \layout LyX-Code
1769
1770 /- 4 bytes -/- 4 bytes -/
1771 \layout Subsection
1772
1773 Organización física de un bloque
1774 \layout Standard
1775
1776 Cada bloque no guarda información en sí, sólo se comporta como un contenedor
1777  de registros.
1778  Esto no significa que un bloque no tenga utilidad, el bloque es utilizado
1779  para proveer un acceso semi-aleatorio a los registros.
1780  Para esto se utiliza el archivo de índice (ver página 
1781 \begin_inset LatexCommand \ref{sec:idx}
1782
1783 \end_inset 
1784
1785 ), que almacena pares [identificador de registro, número de bloque].
1786  Para que sea suficiente este único índice para hallar un registro (siendo
1787  que puede haber más de un registro por bloque), es necesario 
1788 \emph on 
1789 alinear los registros a izquierda
1790 \emph default 
1791 .
1792  Esto significa que hay que asegurar que siempre los registros en un bloque
1793  se presenten de forma consecutiva, jamás permitiendo que haya un espacio
1794  libre entre registros (en un mismo bloque).
1795 \layout Standard
1796
1797 Podemos ver un ejemplo de esto en forma gráfica:
1798 \layout LyX-Code
1799
1800 bloque N-1 | bloque N                                | bloque N+1
1801 \layout LyX-Code
1802
1803 /----------+------------+------------+---------------+-----------/
1804 \layout LyX-Code
1805
1806
1807 \backslash 
1808           | registro 1 | registro 2 | espacio libre |           
1809 \backslash 
1810
1811 \layout LyX-Code
1812
1813 /----------+------------+------------+---------------+-----------/
1814 \layout LyX-Code
1815
1816            /------------- tamaño del bloque ---------/
1817 \layout Standard
1818
1819 De esta forma, una vez obtenido el número de bloque, se pueda recorrer secuencia
1820 lmente hasta encontrar el registro deseado.
1821  A fin de llevar el conteo de espacio libre se utiliza el archivo de control
1822  de espacio libre (ver página 
1823 \begin_inset LatexCommand \ref{sec:fsc}
1824
1825 \end_inset 
1826
1827 ), de forma tal que no sea necesario recorrer secuencialmente en busca de
1828  espacio libre al hacer una inserción.
1829 \layout Standard
1830
1831 Puede darse un caso excepcional en el que un registro sea más grande que
1832  un bloque, en este caso el registro se almacenará en N bloques consecutivos
1833  (siendo N la cantidad de bloques que necesita el registro), ocupando completos
1834  los todos los bloques a excepción del último, en el que posteriormente
1835  se pueden agregar más registros.
1836 \layout Subsubsection
1837
1838
1839 \begin_inset LatexCommand \label{sub:tipo1_reg}
1840
1841 \end_inset 
1842
1843 Organización física de un registro.
1844 \layout Standard
1845
1846 El registro es el que representa al dato realmente que se quiere almacenar.
1847  Para representar ese dato se necesita una determinada información de control,
1848  tanto para poder identificar el registro en un bloque (en búsquedas secuenciale
1849 s dentro del bloque) como para saber su longitud (dado que este tipo de
1850  archivo utiliza registros de tamaño variable).
1851 \layout Standard
1852
1853 Siguiendo la metodología general de E
1854 \begin_inset Formula $\mu$
1855 \end_inset 
1856
1857 FS, se optó por incluir esta información de control como una cabecera al
1858  comienzo del registro, siguiendo a esta los datos en sí.
1859  La cabecera está compuesta por un identificador (
1860 \family typewriter 
1861 id
1862 \family default 
1863 ) de registro (EMUFS_REG_ID, 4 bytes) seguido por el tamaño (
1864 \family typewriter 
1865 tamaño
1866 \family default 
1867 ) del registros (EMUFS_REG_SIZE, 4 bytes).
1868  Podemos ver gráficamente como se se compone un registro:
1869 \layout LyX-Code
1870
1871 registro [id]
1872 \layout LyX-Code
1873
1874 +-----------+-----------+------------------+
1875 \layout LyX-Code
1876
1877 |     id    |   tamaño  |   datos ...
1878       |
1879 \layout LyX-Code
1880
1881 +-----------+-----------+------------------+
1882 \layout LyX-Code
1883
1884 /- 4 bytes -/- 4 bytes -/- [tamaño] bytes -/
1885 \layout Subsubsection
1886
1887
1888 \begin_inset LatexCommand \label{sub:tipo1_reg_multi}
1889
1890 \end_inset 
1891
1892 Organización física de un registro más grande que un bloque (registro 
1893 \emph on 
1894 multibloque
1895 \emph default 
1896 ).
1897 \layout Standard
1898
1899 Puede darse el caso excepcional en que un registro sea de mayor longitud
1900  que un bloque.
1901  Al ser una situación excepcional, no siempre se resuelve de la forma más
1902  eficiente ni se minimiza el espacio ocupado por datos de control (como
1903  se dijo anteriormente, se prefirió conservar la simpleza del código, adoptando
1904  algoritmos generales aunque no sea de la forma más eficiente o maximizando
1905  el uso del espacio para no perjudicar la mantenibilidad).
1906 \layout Standard
1907
1908 Para manejar un registro 
1909 \emph on 
1910 multibloque 
1911 \emph default 
1912 se optó por limitarlo a la siguiente estructura (suponiendo que el registro
1913  ocupa N bloques, con N > 1 y que un 
1914 \emph on 
1915 fragmento
1916 \emph default 
1917  es una porción del registro que entra en un bloque):
1918 \layout Itemize
1919
1920 Los primeros N-1 
1921 \emph on 
1922 fragmentos
1923 \emph default 
1924  se almacenan en bloques completos consecutivos.
1925 \layout Itemize
1926
1927 El último fragmento se almacena al comienzo del bloque inmediatamente posterior
1928  al penúltimo.
1929 \layout Itemize
1930
1931 Cada fragmento posee las cabeceras mencionadas en la sección 
1932 \begin_inset LatexCommand \ref{sub:tipo1_reg}
1933
1934 \end_inset 
1935
1936 , cuyo contenido es el siguiente:
1937 \begin_deeper 
1938 \layout Itemize
1939
1940 En 
1941 \family typewriter 
1942 id
1943 \family default 
1944  se almacena el identificador único obtenido al hacer el alta.
1945 \layout Itemize
1946
1947 En 
1948 \family typewriter 
1949 tamaño
1950 \family default 
1951  se almacena el tamaño del 
1952 \emph on 
1953 fragmento
1954 \emph default 
1955  actual más los tamaños de los 
1956 \emph on 
1957 fragmentos
1958 \emph default 
1959  posteriores, quedando en el primer 
1960 \emph on 
1961 fragmento
1962 \emph default 
1963  el tamaño completo del registro y en el último sólo el tamaño del 
1964 \emph on 
1965 fragmento
1966 \emph default 
1967  final.
1968 \end_deeper 
1969 \layout Standard
1970
1971 Como puede observarse, la información de control en los 
1972 \emph on 
1973 fragmentos
1974 \emph default 
1975  intermedios puede ser redundante, pero se conserva para poder realizar
1976  algoritmos genéricos (que se basan en que al principio de un bloque, si
1977  no está vacío, hay una cabecera de un registro) y para facilitar chequeos
1978  de integridad del archivo.
1979 \layout Standard
1980
1981 A continuación se presenta un ejemplo gráfico de un registro multibloque
1982  de 10 bytes (de contenido 
1983 \begin_inset Quotes eld
1984 \end_inset 
1985
1986 1234567890
1987 \begin_inset Quotes erd
1988 \end_inset 
1989
1990 ) almacenado en un archivo con bloques de 12 bytes (4 para datos):
1991 \layout LyX-Code
1992
1993 | bloque 0          | bloque 1          | bloque 2
1994 \layout LyX-Code
1995
1996 +-------------------+-------------------+-------------------+-//-+
1997 \layout LyX-Code
1998
1999 | registro 0 - 1/3  | registro 0 - 2/3  | registro 0 - 3/3..| 
2000 \backslash 
2001
2002 \backslash 
2003  |
2004 \layout LyX-Code
2005
2006 |+----+-----+------+|+----+-----+------+|+----+-----+----+..| // |
2007 \layout LyX-Code
2008
2009 || id | tam | datos||| id | tam | datos||| id | tam |dato|..| 
2010 \backslash 
2011
2012 \backslash 
2013  |
2014 \layout LyX-Code
2015
2016 ||----+-----+------+||----+-----+------+||----+-----+----+..| // |
2017 \layout LyX-Code
2018
2019 ||  0 |  10 | 1234 |||  0 |  6  | 5678 |||  0 |  2  | 90 |..| 
2020 \backslash 
2021
2022 \backslash 
2023  |
2024 \layout LyX-Code
2025
2026 |+----+-----+------+|+----+-----+------+|+----+-----+----+..| // |
2027 \layout LyX-Code
2028
2029 +-------------------+-------------------+-------------------+-
2030 \backslash 
2031
2032 \backslash 
2033 -+
2034 \layout LyX-Code
2035
2036                                                           ^^
2037 \layout LyX-Code
2038
2039                               2 bytes libres al final del bloque 2
2040 \layout Standard
2041
2042 Este es un ejemplo figurativo, ya que se puso como límite mínimo de tamaño
2043  de bloque 16 bytes (para que haya al menos la misma cantidad de espacio
2044  para datos que para información de control).
2045  Este límite mínimo ya roza lo absurdo (es muy ineficiente por la gran cantidad
2046  de accesos a disco que necesita).
2047  El límite físico es de 9 bytes (8 para información de control, 1 para datos).
2048 \layout Section
2049
2050 Funciones principales
2051 \layout Standard
2052
2053 Las funciones principales son las necesarias para completar la estructura
2054  EMUFS (ver página 
2055 \begin_inset LatexCommand \pageref{sub:EMUFS}
2056
2057 \end_inset 
2058
2059 ).
2060 \layout Subsection
2061
2062 Lectura de registros
2063 \layout Standard
2064
2065 Para leer un registro se hace uso del archivo de índice (ver página 
2066 \begin_inset LatexCommand \pageref{sec:idx}
2067
2068 \end_inset 
2069
2070 ), obteniéndose el número de bloque en donde está almacenado el registro
2071  a buscar.
2072  Una vez obtenido, se carga en memoria el bloque entero y se busca secuencialmen
2073 te en él (leyendo la cabecera de cada registro y salteando los datos) hasta
2074  encontrar el registro pedido.
2075  Una vez encontrado se lo copia y devuelve.
2076 \layout Standard
2077
2078 Si se tratara de un registro 
2079 \emph on 
2080 multibloque
2081 \emph default 
2082  (ver sección 
2083 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
2084
2085 \end_inset 
2086
2087 ), se procede forma similar, sólo que se cargan en memoria uno a uno los
2088  bloques que componen el registro y se van copiando (y uniendo) los 
2089 \emph on 
2090 fragmentos
2091 \emph default 
2092  hasta completarlo.
2093 \layout Standard
2094
2095 Ver: 
2096 \family typewriter 
2097 emufs_tipo1_leer_registro()
2098 \layout Subsection
2099
2100 Altas de registros
2101 \layout Standard
2102
2103 Para realizar el alta de un registro, lo primero que se obtiene es un identifica
2104 dor, buscando primero en el archivo de identificadores recuperables (pág.
2105  
2106 \begin_inset LatexCommand \ref{sec:did}
2107
2108 \end_inset 
2109
2110 ) y de no haber ninguno, buscando el mayor identificador presente en el
2111  archivo de índice (pág.
2112  
2113 \begin_inset LatexCommand \ref{sec:idx}
2114
2115 \end_inset 
2116
2117 ) y sumándole uno.
2118  El paso siguiente es buscar un bloque con espacio libre suficiente como
2119  para almacenar el registro (y su cabecera) en el archivo de control de
2120  espacio libre (pág.
2121  
2122 \begin_inset LatexCommand \ref{sec:fsc}
2123
2124 \end_inset 
2125
2126 ) y cargarlo completo en memoria.
2127  De no encontrarse, se crea un bloque nuevo al final de archivo.
2128  En el bloque cargado en memoria, se agrega el registro nuevo (con su cabecera)
2129  al comienzo del espacio libre (calculado a partir del tamaño del bloque
2130  y el espacio libre en bloque) y se lo graba en disco.
2131  Finalmente se agrega (o actualiza) el identificador al archivo índice y
2132  el espacio libre en el bloque.
2133 \layout Standard
2134
2135 Si el registro ocupara más de un bloque (ver sección 
2136 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
2137
2138 \end_inset 
2139
2140 ), se buscan N bloques consecutivos (todos los que necesite el registro)
2141  absolutamente libres
2142 \begin_inset Foot
2143 collapsed false
2144
2145 \layout Standard
2146
2147 Incluso el último bloque debe estar absolutamente libre para cumplir con
2148  las condiciones presentadas en la sección 
2149 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
2150
2151 \end_inset 
2152
2153 .
2154 \end_inset 
2155
2156  y graba bloque a bloque cada 
2157 \emph on 
2158 fragmento
2159 \emph default 
2160  del registro (con sus cabeceras intermedias), al último 
2161 \emph on 
2162 fragmento
2163 \emph default 
2164  se lo trata de forma análoga a un registro 
2165 \emph on 
2166 simple
2167 \emph default 
2168 .
2169  Por cada bloque utilizado se actualiza el archivo de control de espacio
2170  libre.
2171 \layout Standard
2172
2173 Ver: 
2174 \family typewriter 
2175 emufs_tipo1_agregar_registro()
2176 \layout Subsection
2177
2178 Bajas de registros
2179 \layout Standard
2180
2181 Al eliminar un registro lo primero que se hace es actualizar los archivos
2182  de índice y de identificadores recuperables, poniendo como número de bloque
2183  el valor especial 
2184 \family typewriter 
2185 EMUFS_NOT_FOUND
2186 \family default 
2187  y agregando el identificador del registro a borrar respectivamente.
2188  También se actualiza el archivo de control de espacio libre por cada bloque
2189  (en caso de ser más de uno, en registros 
2190 \emph on 
2191 multibloque
2192 \emph default 
2193 , se actualizan todos los bloques) y se carga el bloque en memoria para
2194  
2195 \emph on 
2196 alinear los datos a izquierda
2197 \emph default 
2198  (en caso de ser un registro 
2199 \emph on 
2200 multibloque
2201 \emph default 
2202 , esto se realiza sólo para el último bloque).
2203  Para alinear los datos, se recorre secuencialmente en bloque (leyendo la
2204  cabecera de cada registro y salteando los datos) hasta encontrar el registro
2205  a borrar.
2206  Encontrado el registro, se copian todos los bytes que se encuentran entre
2207  el fin del registro a borrar y el fin del bloque, en el comienzo del bloque
2208  borrado.
2209 \layout Standard
2210
2211 Ver: 
2212 \family typewriter 
2213 emufs_tipo1_borrar_registro()
2214 \layout Subsection
2215
2216 Modificación de registros
2217 \layout Standard
2218
2219 Se optó por un algoritmo simple y general, que usa las funciones de alto
2220  nivel mencionadas hasta ahora.
2221  Simplemente borra el registro y vuelve a crearlo.
2222  Al recuperar el último identificador de registro borrado, nos aseguramos
2223  de que se mantenga el identificador del registro.
2224 \layout Standard
2225
2226 Ver: 
2227 \family typewriter 
2228 emufs_tipo1_modificar_registro()
2229 \layout Subsection
2230
2231 Obtención de estadísticas
2232 \layout Standard
2233
2234 Es una función bastante simple, con una única complicación que mencionaremos
2235  más adelante.
2236 \layout Standard
2237
2238 Para obtener las máximas desviaciones, cantidad total de espacio libre,
2239  cantidad de registros y tamaño de los archivos auxiliares se utilizan las
2240  funciones apropiadas de los archivos auxiliares (ver secciones 
2241 \begin_inset LatexCommand \ref{sec:idx}
2242
2243 \end_inset 
2244
2245
2246 \begin_inset LatexCommand \ref{sec:fsc}
2247
2248 \end_inset 
2249
2250  y 
2251 \begin_inset LatexCommand \ref{sec:did}
2252
2253 \end_inset 
2254
2255 ).
2256 \layout Standard
2257
2258 Para obtener la cantidad de bloques se hace el siguiente calculo:
2259 \layout LyX-Code
2260
2261 cant_bloques = (tamaño_archivo_datos - tamaño_cabecera_archivo_datos)
2262 \layout LyX-Code
2263
2264                / tamaño_bloque;
2265 \layout Standard
2266
2267 Hasta aquí no hay mayores inconvenientes.
2268  El problema se presenta para calcular el tamaño de la información de control
2269  utilizada por el archivo de datos; se utiliza el siguiente cálculo:
2270 \layout LyX-Code
2271
2272 tam_info_control_datos = tamaño_cabecera_archivo_datos
2273 \layout LyX-Code
2274
2275                          + cant_registros * tamaño_cabecera_registro;
2276 \layout Standard
2277
2278 Aunque a simple vista esto parece acertado, no contempla el caso de los
2279  registros 
2280 \emph on 
2281 multibloque
2282 \emph default 
2283  (pág 
2284 \begin_inset LatexCommand \pageref{sub:tipo1_reg_multi}
2285
2286 \end_inset 
2287
2288 ), estos registros almacenan 
2289 \family typewriter 
2290 tamaño_cabecera_registro * N
2291 \family default 
2292 , donde 
2293 \family typewriter 
2294 N
2295 \family default 
2296  es la cantidad de bloques que ocupan.
2297  Salvar este caso sería muy costoso, porque habría que recorrer el archivo
2298  registro a registro, 
2299 \emph on 
2300 fragmento
2301 \emph default 
2302  a 
2303 \emph on 
2304 fragmento
2305 \emph default 
2306  e ir contando todas las cabeceras de registro que aparecen (similar a lo
2307  que se hace en la compactación, ver sección 
2308 \begin_inset LatexCommand \ref{sub:tipo1_compact}
2309
2310 \end_inset 
2311
2312 ).
2313  Al tratarse este de un caso excepcional, se optó por mantener la función
2314  simple ya que funciona bien en la mayoría de los casos.
2315 \layout Standard
2316
2317 Ver: 
2318 \family typewriter 
2319 emufs_tipo1_leer_estadisticas()
2320 \layout Subsection
2321
2322
2323 \begin_inset LatexCommand \label{sub:tipo1_compact}
2324
2325 \end_inset 
2326
2327 Compactación del archivo de datos
2328 \layout Standard
2329
2330 Esta función es una de las más simples, porque se limita a un algoritmo
2331  muy simple que utiliza las funciones de 
2332 \emph on 
2333 alto nivel
2334 \emph default 
2335  antes nombradas para realizar su tarea.
2336  Básicamente recorre el archivo de índices de registros, de comienzo a fin,
2337  leyendo el registro, borrándolo y volviéndolo a insertar.
2338  Si había espacio libre en un bloque anterior al que estaba, será insertado
2339  en él, si no volverá a grabarse en el lugar en que estaba.
2340  De esta forma se aprovechan todos los espacios libres intermedios, concluyendo
2341  con un archivo igual o más pequeño que el original.
2342 \layout Standard
2343
2344 Esta implementación no es la más eficiente, pero siendo que esta es una
2345  operación costosa y excepcional por naturaleza, se optó por mantener el
2346  algoritmo simple a costo de un poco de eficiencia.
2347 \layout Standard
2348
2349 Ver:
2350 \family typewriter 
2351  emufs_tipo1_compactar()
2352 \layout Section
2353
2354 Detalles de implementación (funciones internas, ver si lo ponemos o no)
2355 \layout Chapter
2356
2357
2358 \begin_inset LatexCommand \label{cha:tipo2}
2359
2360 \end_inset 
2361
2362 Archivo sin bloques y registros de longitud variable
2363 \layout Standard
2364
2365 Este tipo de archivo nos traerá a la mesa la particularidad de grabar registros
2366  de longitud variable sin realizar su agrupación en bloques, y como veremos
2367  en la siguiente sección, también permitirá la administración de gaps que
2368  queden en el archivo luego de operaciones de baja de registros.
2369 \layout Section
2370
2371 Organización física
2372 \layout Standard
2373
2374 Este tipo de archivo realizará el almacenamiento de registros de longitud
2375  variable en disco, su borrado y modificación sin la utilización de bloques
2376  de ningún tipo.
2377  Su implementación se encuentra en los archivos fuente (
2378 \series bold 
2379 tipo2.c
2380 \series default 
2381  y 
2382 \series bold 
2383 tipo2.h
2384 \series default 
2385 ).
2386 \layout Standard
2387
2388 Los archivos del tipo 2, presentarán al comienzo del mismo un header compuesto
2389  simplemente por un dato del tipo EMUFS_Tipo (int) el cual indicará el tipo
2390  de archivo en cuestión.
2391 \layout Standard
2392
2393 Para poder entender mejor la organización física de este tipo de archivo,
2394  tomemos el caso hipotético en el que se encuentran grabados 
2395 \series bold 
2396 dos registros
2397 \series default 
2398  (comenzando desde registro 0) de 
2399 \series bold 
2400 30 bytes
2401 \series default 
2402 , y 
2403 \series bold 
2404 25 bytes
2405 \series default 
2406 , respectivamente.
2407  Supongamos también que entre el registro 0 y 1 se encontraba un 
2408 \series bold 
2409 registro de 10 bytes
2410 \series default 
2411  que fue 
2412 \series bold 
2413 borrado
2414 \series default 
2415 , generando un 
2416 \series bold 
2417 gap
2418 \series default 
2419  
2420 \series bold 
2421 o freespace
2422 \series default 
2423 .
2424  Si miramos al archivo de datos (.dat) en el disco nos encontraremos con
2425  lo siguiente: 
2426 \begin_inset Float figure
2427 placement H
2428 wide false
2429 collapsed false
2430
2431 \layout Caption
2432
2433 Organización física de los registros en disco
2434 \layout Standard
2435
2436
2437 \begin_inset Graphics
2438         filename graphics/Example1.png
2439         width 100text%
2440
2441 \end_inset 
2442
2443
2444 \end_inset 
2445
2446
2447 \layout Standard
2448
2449 Como se puede observar, a nivel físico cada registro grabado esta compuesto
2450  por un Header cuyo tamaño total es de 8 bytes (
2451 \series bold 
2452 EMUFS_REG_ID
2453 \series default 
2454  + 
2455 \series bold 
2456 EMUFS_REG_SIZE
2457 \series default 
2458 ), y posteriormente el registro (bloque de datos) en sí.
2459  Luego se encuentra el espacio libre de 18 bytes dejado por el registro
2460  de 10 bytes eliminado (10 bytes de datos + header de 8 bytes) y finalmente
2461  el segundo registro mencionado.
2462 \layout Subsection
2463
2464 Comportamiento Particular de los Archivos Auxiliares
2465 \layout Standard
2466
2467 Como fue explicado al inicio de la documentación, la implementación de cualquier
2468 a de las tres organizaciones físicas de archivos presenta la necesidad de
2469  poseer tres archivos auxiliares que actuarán como índice de direcciones
2470  de registro (.
2471 \series bold 
2472 idx
2473 \series default 
2474 ), administrador de espacio libre (
2475 \series bold 
2476 .fsc
2477 \series default 
2478 ) y administrador de Id's liberados (
2479 \series bold 
2480 .did
2481 \series default 
2482 ) respectivamente.
2483 \layout Standard
2484
2485 No obstante, cada tipo de organización presentara sus particularidades respecto
2486  de estos tres archivos, las cuales describiremos a continuación en caso
2487  de haberla.
2488 \layout Subsubsection
2489
2490 Archivo índice o de posiciones relativas (.idx)
2491 \layout Standard
2492
2493 El archivo índice (
2494 \series bold 
2495 .idx
2496 \series default 
2497 ), permite la localización de los registros en el .DAT de forma directa,
2498  mediante la obtención de su offset o posición relativa respecto del inicio
2499  del 
2500 \series bold 
2501 .dat
2502 \series default 
2503  en donde se encuentra un registro dado, indicado por su ID.
2504 \layout Standard
2505
2506 Así pues, si tomamos el ejemplo descripto al inicio de este capítulo, tendremos
2507  las siguientes entradas en el archivo índice 
2508 \series bold 
2509 .idx
2510 \series default 
2511
2512 \begin_inset Float table
2513 placement H
2514 wide false
2515 collapsed false
2516
2517 \layout Caption
2518
2519 Organización física del archivo de índice o posiciones relativas.
2520 \layout Standard
2521
2522
2523 \begin_inset  Tabular
2524 <lyxtabular version="3" rows="3" columns="3">
2525 <features>
2526 <column alignment="center" valignment="top" leftline="true" width="0">
2527 <column alignment="center" valignment="top" leftline="true" width="0">
2528 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
2529 <row topline="true" bottomline="true">
2530 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2531 \begin_inset Text
2532
2533 \layout Standard
2534
2535
2536 \emph on 
2537 ID_REGISTRO
2538 \end_inset 
2539 </cell>
2540 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2541 \begin_inset Text
2542
2543 \layout Standard
2544
2545
2546 \emph on 
2547 OFFSET
2548 \end_inset 
2549 </cell>
2550 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2551 \begin_inset Text
2552
2553 \layout Standard
2554
2555 \end_inset 
2556 </cell>
2557 </row>
2558 <row topline="true">
2559 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2560 \begin_inset Text
2561
2562 \layout Standard
2563
2564
2565 \series bold 
2566 0
2567 \end_inset 
2568 </cell>
2569 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2570 \begin_inset Text
2571
2572 \layout Standard
2573
2574
2575 \series bold 
2576 4
2577 \end_inset 
2578 </cell>
2579 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2580 \begin_inset Text
2581
2582 \layout Standard
2583
2584 El primer registro (reg0) comienza en el byte 4
2585 \end_inset 
2586 </cell>
2587 </row>
2588 <row topline="true" bottomline="true">
2589 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2590 \begin_inset Text
2591
2592 \layout Standard
2593
2594 1
2595 \end_inset 
2596 </cell>
2597 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2598 \begin_inset Text
2599
2600 \layout Standard
2601
2602
2603 \series bold 
2604 60
2605 \end_inset 
2606 </cell>
2607 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2608 \begin_inset Text
2609
2610 \layout Standard
2611
2612 El segundo registro (reg1) comienza en el byte 60
2613 \end_inset 
2614 </cell>
2615 </row>
2616 </lyxtabular>
2617
2618 \end_inset 
2619
2620
2621 \end_inset 
2622
2623
2624 \layout Standard
2625
2626
2627 \series bold 
2628 \emph on 
2629 Observación:
2630 \series default 
2631 \emph default 
2632  LOCATION indica donde comienza el header del registro buscado, y por consiguien
2633 te luego del header tendremos el registro en sí (los datos).
2634 \layout Subsubsection
2635
2636 Archivo de Gaps / Espacios Libres (.fsc)
2637 \layout Standard
2638
2639 El archivo de espacios libres o gaps (.fsc), tiene como función la administración
2640  del espacio libre o gaps (agujeros), generados por previas eliminaciones
2641  de registros en el archivo de datos.
2642  El mismo, nos indicará donde hay lugar para insertar un nuevo registro
2643  (se podrán insertar en algún gap acorde, o bien al final del archivo).
2644  Este archivo será utilizado también para el proceso de compactación de
2645  un archivo, explicado luego.
2646 \layout Standard
2647
2648 Así pues, si tomamos el ejemplo descripto al inicio del documento, tendremos
2649  las siguientes entradas en el archivo índice 
2650 \series bold 
2651 .fsc
2652 \series default 
2653
2654 \begin_inset Float table
2655 placement H
2656 wide false
2657 collapsed false
2658
2659 \layout Caption
2660
2661 Organización física del archivo de 
2662 \emph on 
2663 gaps 
2664 \emph default 
2665 o control de espacio libre.
2666 \layout Standard
2667
2668
2669 \begin_inset  Tabular
2670 <lyxtabular version="3" rows="2" columns="3">
2671 <features>
2672 <column alignment="center" valignment="top" leftline="true" width="0">
2673 <column alignment="center" valignment="top" leftline="true" width="0">
2674 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
2675 <row topline="true" bottomline="true">
2676 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2677 \begin_inset Text
2678
2679 \layout Standard
2680
2681
2682 \emph on 
2683 OFFSET
2684 \end_inset 
2685 </cell>
2686 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2687 \begin_inset Text
2688
2689 \layout Standard
2690
2691
2692 \emph on 
2693 FREESPACE
2694 \end_inset 
2695 </cell>
2696 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2697 \begin_inset Text
2698
2699 \layout Standard
2700
2701 \end_inset 
2702 </cell>
2703 </row>
2704 <row topline="true" bottomline="true">
2705 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2706 \begin_inset Text
2707
2708 \layout Standard
2709
2710
2711 \series bold 
2712 42
2713 \end_inset 
2714 </cell>
2715 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2716 \begin_inset Text
2717
2718 \layout Standard
2719
2720
2721 \series bold 
2722 18
2723 \end_inset 
2724 </cell>
2725 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2726 \begin_inset Text
2727
2728 \layout Standard
2729
2730 18 bytes libres a partir del byte 42 del .dat
2731 \end_inset 
2732 </cell>
2733 </row>
2734 </lyxtabular>
2735
2736 \end_inset 
2737
2738
2739 \end_inset 
2740
2741
2742 \layout Standard
2743
2744
2745 \series bold 
2746 \emph on 
2747 Nota:
2748 \series default 
2749 \emph default 
2750  Por requerimiento del algoritmo de compactación, los gaps se graban en
2751  forma ordenada en el (.fsc).
2752  (El orden se corresponde con lo que hay en el 
2753 \series bold 
2754 .dat
2755 \series default 
2756 .
2757 \layout Subsubsection*
2758
2759 GAP Merging
2760 \layout Standard
2761
2762 Si bien la utilización concreta de los GAPS será explicada posteriormente
2763  en la ALTA y BAJA de registros, debemos remarcar la funcionalidad de MERGING
2764  que posee nuestro sistema FSC.
2765 \layout Standard
2766
2767 Ante la eliminación de un registro del archivo de datos, se generara por
2768  consiguiente un gap o espacio libre en alguna posición del archivo.
2769  Ese gap deberá ser registrado en el archivo de gaps (.fsc).
2770  Ahora bien, nuestro sistema de gaps, contemplará como es debido, la posibilidad
2771  de que se haya eliminado un registro que posee un GAP por delante, un GAP
2772  por detrás, o bien un GAP por delante y por detrás del mismo.
2773 \layout Standard
2774
2775 Nuestro sistema actuará en consecuencia, realizando un merge de los espacios
2776  libres, y unificándolos en una ÚNICA entrada en el archivo .fsc, que contendrá
2777  como dato de freespace, la suma correspondiente de los espacios libres
2778  antes mencionados.
2779 \layout Subsubsection
2780
2781 Archivo de ID's liberados (.did)
2782 \layout Standard
2783
2784 El archivo de ID's liberados no presenta ningún aspecto particular en este
2785  tipo de organización.
2786  Remitirse al capítulo correspondiente a los archivos auxiliares para consultar
2787  su estructura y funcionamiento.
2788 \layout Section
2789
2790 Funciones Principales
2791 \layout Standard
2792
2793 Dentro de 
2794 \series bold 
2795 \emph on 
2796 tipo2.h
2797 \series default 
2798 \emph default 
2799  y 
2800 \series bold 
2801 \emph on 
2802 tipo2.c
2803 \series default 
2804 \emph default 
2805  se encuentran las cabeceras y la implementación de las funciones principales
2806  respectivamente, las cuales dan funcionalidad a esta organización.
2807  
2808 \layout Standard
2809
2810 A continuación se comentará el funcionamiento algunas de las mas importantes.
2811 \layout Subsection
2812
2813 Lectura de registros
2814 \layout Standard
2815
2816 Como se vio al comienzo, los registros en este tipo de archivo no se encuentran
2817  agrupados en bloques de ninguna índole y están dispersos a lo largo del
2818  archivo, con la particularidad de que pueden existir gaps o espacio libre,
2819  entre dos registros dados.
2820 \layout Standard
2821
2822 Por ende la lectura de registros en este tipo de organización es muy simple
2823  y dada la inexistencia de bloques, el procedimiento será el siguiente:
2824 \layout Enumerate
2825
2826 Se determina el offset en bytes, donde comienza el registro deseado, a través
2827  de su ID, buscando la misma en el archivo índice (
2828 \series bold 
2829 .idx
2830 \series default 
2831 )
2832 \layout Enumerate
2833
2834 Ya determinada la posición física del registro dentro del archivo de datos
2835  (
2836 \series bold 
2837 .dat
2838 \series default 
2839 ), nos posicionamos en la misma, y leemos el header del registro (
2840 \series bold 
2841 IDReg
2842 \series default 
2843  + 
2844 \series bold 
2845 RegSize
2846 \series default 
2847 ).
2848  Contando así con el tamaño del registro, procedemos a leer el mismo (los
2849  datos), dando por finalizada la lectura.
2850 \layout Standard
2851
2852 Ver: 
2853 \family typewriter 
2854 emufs_tipo2_leer_registro()
2855 \layout Subsection
2856
2857 Altas de registros
2858 \layout Standard
2859
2860 En el proceso de alta de registros entrarán en juego dos archivos descriptos
2861  en la 
2862 \emph on 
2863 sección de archivos auxiliares
2864 \emph default 
2865 , siendo estos el archivo índice (
2866 \series bold 
2867 .idx
2868 \series default 
2869 ), y el archivo de gaps / espacios libres (
2870 \series bold 
2871 .fsc
2872 \series default 
2873 ).
2874 \layout Standard
2875
2876 Así pues, a la hora de realizar una inserción de un registro en el archivo
2877  de datos, el procedimiento será el siguiente:
2878 \layout Enumerate
2879
2880 Calculamos el espacio que necesitaremos para el registro: sizeof(
2881 \series bold 
2882 EMUFS_REG_ID
2883 \series default 
2884 ) + sizeof(
2885 \series bold 
2886 EMUFS_REG_SIZE
2887 \series default 
2888 ) + sizeof(registro).
2889 \layout Enumerate
2890
2891 Determinamos donde debemos insertar el registro, ya sea un gap donde entre,
2892  o bien al final del archivo.
2893 \layout Enumerate
2894
2895 Insertamos el registro e información de control (
2896 \series bold 
2897 header
2898 \series default 
2899 +
2900 \series bold 
2901 data
2902 \series default 
2903 ), en la posición indicada en el paso 2.
2904 \layout Enumerate
2905
2906 En caso de haber utilizado un GAP, actualizamos el espacio libre restante
2907  en el mismo y en caso de que se haya utilizado al totalidad del GAP, se
2908  lo elimina del archivo (
2909 \series bold 
2910 .fsc
2911 \series default 
2912 ).
2913 \layout Enumerate
2914
2915 Actualizamos la entrada correspondiente al registro ingresado (determinada
2916  por su RegID), en el archivo índice (
2917 \series bold 
2918 .idx
2919 \series default 
2920 ), indicando su offset donde podrá ser accedido luego.
2921 \layout Standard
2922
2923 Ver: 
2924 \family typewriter 
2925 emufs_tipo2_agregar_registro()
2926 \layout Subsection
2927
2928 Bajas de registros
2929 \layout Standard
2930
2931 En el proceso de baja de registros entrarán en juego los tres archivos descripto
2932 s en la 
2933 \emph on 
2934 sección de archivos auxiliares
2935 \emph default 
2936 , siendo estos el archivo índice (
2937 \series bold 
2938 .idx
2939 \series default 
2940 ), el archivo de gaps / espacios libres (
2941 \series bold 
2942 .fsc
2943 \series default 
2944 ) y el archivo de ID's liberados (
2945 \series bold 
2946 .did
2947 \series default 
2948 ).
2949 \layout Standard
2950
2951 Dado que en la implementación de este tipo de organización física contamos
2952  con los gaps o espacios libres entre registros, no se eliminará físicamente
2953  el registro del archivo de datos (
2954 \series bold 
2955 .dat
2956 \series default 
2957 ), pues entonces carecería de sentido el archivo anteriormente mencionado
2958  (
2959 \series bold 
2960 .fsc
2961 \series default 
2962 ).
2963  En cambio, se agrega el gap dejado por la eliminación a dicho archivo,
2964  y se marca físicamente en el archivo de datos la eliminación mediante un
2965  fill de los bytes correspondientes con un caracter nulo.
2966  (hexa 00 y con el propósito de probar fehacientemente que el sistema funciona).
2967 \layout Standard
2968
2969 El proceso de baja o eliminación de un registro constará luego de los siguientes
2970  pasos:
2971 \layout Enumerate
2972
2973 Se obtiene el offset o posición relativa en donde se encuentra grabado el
2974  registro dentro del archivo de datos.
2975 \layout Enumerate
2976
2977 Se obtiene el tamaño del registro y se realiza un dummyfill del sector del
2978  archivo correspondiente al registro que se está dando de baja.
2979  (Se rellena la zona correspondiente a su header+data).
2980 \layout Enumerate
2981
2982 Se agrega el GAP generado al archivo de gaps o espacios libres, y en caso
2983  de haberse generado un GAP lindante con otro GAP, se realizará un merge
2984  de los mismos y se los registrará bajo una única entrada en el archivo
2985  de espacios libres (.fsc).
2986 \layout Enumerate
2987
2988 Se agrega el ID que fue liberado, al archivo de ID's liberados (
2989 \series bold 
2990 .did
2991 \series default 
2992 ), al final del mismo (
2993 \emph on 
2994 pila
2995 \emph default 
2996 ).
2997 \layout Enumerate
2998
2999 Se marca en el archivo índice (
3000 \series bold 
3001 .idx
3002 \series default 
3003 ) la eliminación, mediante el valor ¨-1¨ en el registro correspondiente
3004  al registro recién eliminado (se le cambia el valor al n-esimo registro,
3005  donde N = IDReg del reg eliminado).
3006 \layout Standard
3007
3008 Ver: 
3009 \family typewriter 
3010 emufs_tipo2_borrar_registro()
3011 \layout Subsection
3012
3013 Modificación de registros
3014 \layout Standard
3015
3016 Dada la naturaleza del archivo de ID's liberados, y el manejo de espacio
3017  libre del que consta esta organización de archivo, el proceso de modificación
3018  de un registro se limita a los siguientes pasos:
3019 \layout Enumerate
3020
3021 Se realiza la lectura del registro, mediante el respectivo procedimiento
3022  ya desarrollado anteriormente.
3023 \layout Enumerate
3024
3025 Una vez que se cuenta con los nuevos datos modificados, se procede a dar
3026  de baja el registro que ha sido modificado, e inmediatamente después se
3027  realiza una inserción con los nuevos datos.
3028 \layout Standard
3029
3030
3031 \series bold 
3032 \emph on 
3033 NOTA:
3034 \series default 
3035 \emph default 
3036  Como fue indicado, dada la naturaleza de PILA del subsistema de administración
3037  de ID liberados, es asegurado que la nueva inserción del registro modificado
3038  se realizará con el mismo RegID.
3039 \layout Standard
3040
3041 Ver: 
3042 \family typewriter 
3043 emufs_tipo2_modificar_registro()
3044 \layout Subsection
3045
3046 Obtención de estadísticas
3047 \layout Standard
3048
3049 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
3050  cantidad de bloques, cantidad de registros, espacio libre total, espacio
3051  libre promedio, espacio libre máximo y mínimo, etc.
3052 \layout Standard
3053
3054 Esta información es el resultado de ciertos cálculos realizados tanto en
3055  el archivo de datos como en los archivos índice.
3056 \layout Standard
3057
3058 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
3059  del archivo de datos, espacio libre total, cantidad de registros, cantidad
3060  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
3061  libres, etc.
3062 \layout Standard
3063
3064 Ver: 
3065 \family typewriter 
3066 emufs_tipo2_leer_estadisticas()
3067 \layout Subsection
3068
3069 Compactación del archivo de datos
3070 \layout Standard
3071
3072 Así como los otros dos tipos de datos, el que nos compete también cuenta
3073  con la posibilidad de realizar la compactación de datos cuando el usuario
3074  lo desee, justificando todos los registros a izquierda, eliminando así
3075  los gaps existentes y decrementando el tamaño del archivo en disco (truncándolo
3076 ).
3077 \layout Standard
3078
3079 Para poder comprender como hemos implementado el proceso de re-compactación
3080  en nuestro tipo de archivo 2, nos ayudaremos de esquemas a través de los
3081  cuales iremos describiendo el proceso.
3082  Notemos antes, que el proceso de compactación esta directamente ligado
3083  con el archivo de gaps o espacios libres (
3084 \series bold 
3085 .fsc
3086 \series default 
3087 ).
3088 \layout Standard
3089
3090 Comencemos con el siguiente cuadro situacional: 
3091 \begin_inset Float figure
3092 placement H
3093 wide false
3094 collapsed false
3095
3096 \layout Caption
3097
3098 Archivo con gaps entre registros previo a compactación
3099 \layout Standard
3100
3101
3102 \begin_inset Graphics
3103         filename graphics/Compact1.png
3104         width 100text%
3105         keepAspectRatio
3106
3107 \end_inset 
3108
3109
3110 \end_inset 
3111
3112
3113 \layout Standard
3114
3115 Partiendo de esta base, el algoritmo de compactación tomará en su inicio
3116  al primer gap existente dentro del archivo de datos, en este caso llamado
3117  
3118 \series bold 
3119 Gap0
3120 \series default 
3121 .
3122  Luego, establecerá que el 
3123 \series bold 
3124 Source
3125 \series default 
3126  a partir de donde se quieren mover datos, sera:
3127 \layout LyX-Code
3128
3129 StartGap0 + SizeGap0 = EndGap0 = Source
3130 \layout Standard
3131
3132 Lo cual no es nada más y nada menos que lo obvio, la fuente a partir de
3133  donde se mueven los datos, sera el fin del primer gap, donde comienzan
3134  datos.
3135  Como destino (
3136 \series bold 
3137 Destination
3138 \series default 
3139 ) del movimiento, se establece inicialmente, el inicio del gap, o sea 
3140 \series bold 
3141 StartGap0 = Destination
3142 \series default 
3143 .
3144 \layout Standard
3145
3146 Luego, el algoritmo entrara en un bucle while (mientras haya bucles por
3147  levantar), el cual trabajara hasta el final de la compactación de la siguiente
3148  manera:
3149 \layout Standard
3150
3151
3152 \series bold 
3153 Mientras haya Gaps
3154 \series default 
3155  {
3156 \layout Enumerate
3157
3158 Se levanta el próximo gap al levantado en una instancia previa.
3159  En este ejemplo, durante el primer loop del while, se levantará 
3160 \series bold 
3161 Gap1
3162 \layout Enumerate
3163
3164 Luego, se calcula cuantos bytes hay que mover hacia el Destination de la
3165  siguiente manera:
3166 \layout Enumerate
3167
3168
3169 \series bold 
3170 Mustmove_bytes
3171 \series default 
3172  = 
3173 \series bold 
3174 StartGap1
3175 \series default 
3176  - 
3177 \series bold 
3178 Source
3179 \series default 
3180  = 
3181 \series bold 
3182 StartGap1
3183 \series default 
3184  - 
3185 \series bold 
3186 EndGap0 (
3187 \series default 
3188 Lo cual nuevamente es lógico pues querremos mover lo que se encuentra entre
3189  el final del primer gap levantado y el inicio del siguiente).
3190 \layout Enumerate
3191
3192 Se realiza el movimiento de los datos, utilizando las direcciones 
3193 \series bold 
3194 Source
3195 \series default 
3196  y 
3197 \series bold 
3198 Destination
3199 \series default 
3200 , así como la variable 
3201 \series bold 
3202 Mustmove_bytes
3203 \series default 
3204  que nos indica cuantos bytes transferir.
3205 \series bold 
3206
3207 \newline 
3208 IMPORTANTE: 
3209 \emph on 
3210 La transferencia se hace de a chunks de 25 bytes + un resto segun el valor
3211  de Mustmove_bytes.
3212 \layout Enumerate
3213
3214 Se establece como gap de referencia, al ultimo gap leído (En este caso se
3215  realiza: 
3216 \series bold 
3217 StartGap0
3218 \series default 
3219  = 
3220 \series bold 
3221 StartGap1
3222 \series default 
3223
3224 \series bold 
3225 Gap0Size = Gap1Size
3226 \series default 
3227 ) y termina el código de repetición del bucle, dando lugar a la carga del
3228  siguiente gap en el inicio del mismo.
3229 \layout Standard
3230
3231
3232 \series bold 
3233 }
3234 \layout Standard
3235
3236 Luego del primer bucle, el archivo se vera de la siguiente forma: 
3237 \begin_inset Float figure
3238 placement H
3239 wide false
3240 collapsed false
3241
3242 \layout Caption
3243
3244 Archivo con gaps en disco luego del primer bucle de compactación
3245 \layout Standard
3246
3247
3248 \begin_inset Graphics
3249         filename graphics/Compact2.png
3250         width 100text%
3251
3252 \end_inset 
3253
3254
3255 \end_inset 
3256
3257
3258 \layout Standard
3259
3260 Notemos que al final de la porción de datos de los bytes movidos (donde
3261  quedo apuntando 
3262 \series bold 
3263 Destination
3264 \series default 
3265 ), hay basura que será pisada por el próximo movimiento.
3266 \layout Standard
3267
3268 En el próximo loop, el bucle levantará un nuevo gap, y utilizando el gap
3269  anterior (En esta caso el Gap anterior será 
3270 \series bold 
3271 Gap1
3272 \series default 
3273 ) como referencia, realizará los mismos cálculos, desde donde transferir
3274  y cuantos bytes mover.
3275  (El destino es solo establecido inicialmente por código, y para el resto
3276  del algoritmo es el lugar donde quedo el puntero destination luego de la
3277  última escritura).
3278 \layout Standard
3279
3280 Una vez que se salga del bucle while, se realizará un último movimiento
3281  preprogramado, donde la fuente (
3282 \series bold 
3283 Source
3284 \series default 
3285 ) será el final del ultimo gap, y la cantidad de bytes a mover será lo que
3286  se encuentre luego del mismo hasta el fin de archivo.
3287 \layout LyX-Code
3288
3289 Source = StartLastGap + SizeLastGap = EndLastGap
3290 \layout LyX-Code
3291
3292 Mustmove_bytes = Datsize - Source
3293 \layout Standard
3294
3295 Damos por terminada así, la explicación del algoritmo de compresión el cual
3296  para el caso del tipo 2, es realmente bastante sencillo.
3297 \layout Standard
3298
3299 Ver:
3300 \family typewriter 
3301  emufs_tipo2_compactar()
3302 \layout Section
3303
3304 Consideraciones y Políticas de Diseño
3305 \layout Standard
3306
3307 Se han tomado ciertas consideraciones para algunos casos particulares que
3308  se pueden presentar durante el uso/ejecución de la aplicación, así como
3309  también políticas respecto del diseño e implementación del sistema:
3310 \layout Itemize
3311
3312 En la organización física tipo 2 para los registros que se graban en disco
3313  hemos decidido utilizar como encabezado de cada uno de ellos, los datos
3314  [ID_REG][REG_SIZE], los cuales fueron detallados previamente.
3315  Si bien se podría haber descartado el grabado del ID del registro en el
3316  archivo de datos y puede parecer redundante, dado que poseemos el archivo
3317  índice con el offset directo, el mismo se lo graba por distintos motivos:
3318 \newline 
3319
3320 \newline 
3321 A) En caso de la corrupción del archivo índice (.idx), podremos gracias a
3322  que poseemos en el archivo de datos, el ID de cada registro, recrear dicho
3323  índice, ayudándonos del archivo de espacios libres (
3324 \series bold 
3325 .fsc
3326 \series default 
3327 ), para poder saltear los espacios libres y e ir recorriendo secuencialmente
3328  los registros, reconstruyendo así el índice en cuestión.
3329  (esta función de reconstrucción no pudo ser implementada para esta entrega,
3330  pero es una posibilidad real).
3331 \newline 
3332
3333 \newline 
3334 B) Luego de un proceso de re-compactación, los espacios libres que pudieron
3335  haber existido en el archivo de datos (
3336 \series bold 
3337 .dat
3338 \series default 
3339 ), son eliminados y los registros han cambiado de posición.
3340  Por ello, recorriendo secuencialmente por única vez el archivo de datos,
3341  se procede a la actualización / reconstrucción del índice de direcciones
3342  u offsets (.
3343 \series bold 
3344 idx
3345 \series default 
3346 )
3347 \layout Itemize
3348
3349 Si se desea insertar un registro y no se puede hallar un gap o espacio libre
3350  donde quepa, se los inserta al final del archivo.
3351 \layout Itemize
3352
3353 Ante una operación de baja de un registro, el mismo no es físicamente borrado
3354  del archivo de datos (
3355 \series bold 
3356 .dat
3357 \series default 
3358 ), simplemente los bytes que ocupa son llenados con hexa (00).
3359  Paralelamente, se procede a actualiza el archivo índice, insertando como
3360  valor de OFFSET para el registro eliminado, el valor ¨-1¨, indicando así
3361  la inexistencia del registro para el futuro, y por otro lado se genera
3362  la entrada de espacio libre en el archivo de gaps (
3363 \series bold 
3364 .fsc
3365 \series default 
3366 ).
3367 \layout Itemize
3368
3369 La reutilización de ID's liberados por previas operaciones de baja de registros,
3370  se ve implementada por el archivo de ID liberados (.did), y su comportamiento
3371  es el de una pila por lo que el último ID liberado, sera el próximo a ser
3372  reutilizado (LIFO).
3373 \layout Itemize
3374
3375 Como fue explicado en la implementación del archivo índice, existe una correspon
3376 dencia 1 a 1 entre los registros allí presentes (en el .idx) y los ID's de
3377  los registros, por lo cual el registro N-ésimo del archivo índice, será
3378  el correspondiente al registro de datos cuyo ID es igual a N.
3379 \layout Itemize
3380
3381 El proceso de compactación de archivos, realiza los movimientos de información
3382  requeridos para dicho propósito de a chunks de 25 bytes por vez.
3383  Este valor es fijo, pero se lo podría hacer parametrizable mediante la
3384  GUI en próximas entregas.
3385 \layout Chapter
3386
3387
3388 \begin_inset LatexCommand \label{cha:tipo3}
3389
3390 \end_inset 
3391
3392 Archivo con bloques parametrizados y registros de longitud constante
3393 \layout Standard
3394
3395 Las distintas organizaciones de archivos buscan aprovechar al máximo el
3396  espacio del archivo.
3397 \layout Standard
3398
3399 En este caso veremos que sucede luego de agregar y borrar una gran cantidad
3400  de registros del archivo, lo que provoca como consecuencia directa la fragmenta
3401 ción del archivo, es decir, quedan huecos entre un registro y otro, lo que
3402  produce un desperdicio de espacio.
3403 \layout Standard
3404
3405 La implementación de este tipo de archivo puede ser encontrada en 
3406 \family typewriter 
3407 emufs/tipo3.c
3408 \family default 
3409  mientras que su interfaz pública está disponible en 
3410 \family typewriter 
3411 emufs/tipo3.h
3412 \family default 
3413 .
3414 \layout Section
3415
3416 Organización Física
3417 \layout Standard
3418
3419 Esta organización guarda los registros pertenecientes al archivo en bloques
3420  de tamaño parametrizado, de modo que intentará guardar la mayor cantidad
3421  de registros que quepan en un bloque.
3422  
3423 \layout Standard
3424
3425 Así como los graba, también tendrá la posibilidad de leer registros y borrarlos
3426  del archivo.
3427 \layout Standard
3428
3429 El archivo estará compuesto por una cabecera que da información sobre el
3430  tipo (2, o el valor T3 del tipo 
3431 \family typewriter 
3432 EMUFS_Tipo
3433 \family default 
3434  en este caso) de organización, el tamaño de los bloques y el tamaño de
3435  los registros.
3436 \layout LyX-Code
3437
3438 archivo
3439 \layout LyX-Code
3440
3441 +-----------+-----------+-----------+------------------------//-+
3442 \layout LyX-Code
3443
3444 |    tipo   | tam_bloque|  tam_reg  | Cero o más bloques ...
3445  
3446 \backslash 
3447
3448 \backslash 
3449  |
3450 \layout LyX-Code
3451
3452 +-----------+-----------+-----------+------------------------//-+
3453 \layout LyX-Code
3454
3455 /- 4 bytes -/- 4 bytes -/- 4 bytes -/
3456 \layout Subsection
3457
3458 Organización Física de un Bloque
3459 \layout Standard
3460
3461 Cada bloque será capaz de contener la cantidad de registros enteros que
3462  quepan en él.
3463  De esta manera un registro que no entre completamente en el bloque deberá
3464  almacenarse en un bloque diferente.
3465 \layout Standard
3466
3467 Los bloques no contienen ninguna información adicional, solo se conoce su
3468  tamaño y se usa para delimitar 
3469 \begin_inset Quotes eld
3470 \end_inset 
3471
3472 virtualmente
3473 \begin_inset Quotes erd
3474 \end_inset 
3475
3476  zonas en el archivo y obtener de esta manera acceso semi-aleatorio a los
3477  registros.
3478 \layout LyX-Code
3479
3480 bloque N-1 | bloque N                                | bloque N+1
3481 \layout LyX-Code
3482
3483 /----------+------------+------------+---------------+-----------/
3484 \layout LyX-Code
3485
3486
3487 \backslash 
3488           | registro 1 | registro 2 | espacio libre |           
3489 \backslash 
3490
3491 \layout LyX-Code
3492
3493 /----------+------------+------------+---------------+-----------/
3494 \layout LyX-Code
3495
3496            /------------- tamaño del bloque ---------/
3497 \layout Subsection
3498
3499 Organización Física de Registros
3500 \layout Standard
3501
3502 Cada registro se almacena en un bloque, y contiene una cabecera que indica
3503  su 
3504 \emph on 
3505 ID, 
3506 \emph default 
3507 por este motivo al realizar la búsqueda de espacio en un bloque se lo hará
3508  preguntando por el tamaño del registro más 
3509 \family typewriter 
3510 sizeof(EMUFS_REG_ID).
3511 \layout LyX-Code
3512
3513 registro [id]
3514 \layout LyX-Code
3515
3516 +-----------+-------------------+
3517 \layout LyX-Code
3518
3519 |     id    |     datos ...
3520      |
3521 \layout LyX-Code
3522
3523 +-----------+-------------------+
3524 \layout LyX-Code
3525
3526 /- 4 bytes -/- [tam_reg] bytes -/
3527 \layout Subsection
3528
3529 Organización Física de Registros 
3530 \emph on 
3531 Multibloque
3532 \layout Standard
3533
3534 Al ser los registros de longitud constante, se ha adoptado que un registro
3535  
3536 \emph on 
3537 multibloque
3538 \emph default 
3539  nunca podrá estar almacenado en algún lugar que no sea el comienzo de un
3540  bloque.
3541  De esta manera se puede calcular cuantos bloques ocupará un registro y
3542  se podrá solicitar lugar para almacenarlo con la ayuda de la función 
3543 \family typewriter 
3544 emufs_fsc_buscar_n_lugares(), 
3545 \family default 
3546 que es muy importante para evitar el solapamiento de registros.
3547  Esta consideración acarrea como consecuencia directa un alto costo en términos
3548  del espacio desperdiciado.
3549 \layout Standard
3550
3551 A continuación se presenta un ejemplo gráfico de un registro multibloque
3552  de 26 bytes (de contenido 
3553 \begin_inset Quotes eld
3554 \end_inset 
3555
3556 12345678901234567890123456
3557 \begin_inset Quotes erd
3558 \end_inset 
3559
3560 ) almacenado en un archivo con bloques de bytes 14 bytes (10 para datos)
3561  y registros de 38 bytes:
3562 \layout LyX-Code
3563
3564 | bloque 0          | bloque 1          | bloque 2
3565 \layout LyX-Code
3566
3567 +-------------------+-------------------+-------------------+-//-+
3568 \layout LyX-Code
3569
3570 | registro 0 - 1/3  | registro 0 - 2/3  | registro 0 - 3/3..| 
3571 \backslash 
3572
3573 \backslash 
3574  |
3575 \layout LyX-Code
3576
3577 |+----+------------+|+----+------------+|+----+--------+....| // |
3578 \layout LyX-Code
3579
3580 || id |    datos   ||| id |    datos   ||| id |  datos |....| 
3581 \backslash 
3582
3583 \backslash 
3584  |
3585 \layout LyX-Code
3586
3587 ||----+------------+||----+------------+||----+--------+....| // |
3588 \layout LyX-Code
3589
3590 ||  0 | 1234567890 |||  0 | 1234567890 |||  0 | 123456 |....| 
3591 \backslash 
3592
3593 \backslash 
3594  |
3595 \layout LyX-Code
3596
3597 |+----+------------+|+----+------------+|+----+--------+....| // |
3598 \layout LyX-Code
3599
3600 +-------------------+-------------------+-------------------+-
3601 \backslash 
3602
3603 \backslash 
3604 -+
3605 \layout LyX-Code
3606
3607                                                         ^^^^
3608 \layout LyX-Code
3609
3610             4 bytes libres (e inutilizables) al final del bloque 2
3611 \layout Section
3612
3613 Funciones Principales
3614 \layout Standard
3615
3616 Dento de 
3617 \family typewriter 
3618 tipo3.h
3619 \family default 
3620  y 
3621 \family typewriter 
3622 tipo3.c
3623 \family default 
3624  se encuentran las cabeceras y la implementación de las funciones principales
3625  respectivamente, las cuales dan funcionalidad a esta organización.
3626 \layout Standard
3627
3628 A continuación se comentará la descripción de algunas acciones importantes.
3629 \layout Subsection
3630
3631 Lectura de registros
3632 \layout Standard
3633
3634 La lectura de un registro se realiza con la ayuda del archivo .
3635 \emph on 
3636 idx
3637 \emph default 
3638  el cual contiene la información de la posición del registro dentro del
3639  archivo de datos.
3640  Una vez leída esta información, se recupera el bloque (en su totalidad)
3641  del archivo y se busca secuencialmente el registro con el 
3642 \emph on 
3643 ID
3644 \emph default 
3645  especificado.
3646 \layout Standard
3647
3648 Ver: 
3649 \family typewriter 
3650 emufs_tipo3_leer_registro()
3651 \layout Subsection
3652
3653 Alta de registros
3654 \layout Standard
3655
3656 Graba un registro en un bloque donde haya espacio suficiente, y si no crea
3657  un nuevo bloque y lo agrega al final del archivo.
3658 \layout Standard
3659
3660 Luego de grabar un registro, actualiza los archivos de índice .idx y .fsc
3661  para mantener la coherencia.
3662 \layout Standard
3663
3664 Cuando nos encontramos con registros multibloque, se calcula cuantos bloques
3665  ocupará el registro de la siguiente manera: 
3666 \family typewriter 
3667 Cantidad de Bloques = 1 + Tamaño del Registro/(Tamaño del Bloque-Sizeof(EMUFS_RE
3668 G_ID)
3669 \layout Standard
3670
3671 Esta ecuación solo falla en el caso que el tamaño del registro y el tamaño
3672  del bloque sean iguales, en tal caso, se coloca el valor 1 en 
3673 \family typewriter 
3674 Cantidad de Bloques
3675 \family default 
3676  post verificación.
3677 \layout Standard
3678
3679 Y con esta información se realiza un ciclo 
3680 \family typewriter 
3681 for
3682 \family default 
3683  que grabará tantas veces como sea necesario levantando y grabando los bloques
3684  que correspondan.
3685 \layout Standard
3686
3687 Ver: 
3688 \family typewriter 
3689 emufs_tipo3_grabar_registro()
3690 \layout Subsection
3691
3692 Baja de registros
3693 \layout Standard
3694
3695 Borra un registro del archivo de datos, para esto levanta el bloque al que
3696  pertenece el archivo y ajusta los demás registros justificándolos hacia
3697  la izquierda.
3698 \layout Standard
3699
3700 Cabe destacar que para dar de baja un registro no hace falta borrarlo del
3701  archivo de datos, solo es necesario borrar las entradas en los archivos
3702  de índice, pero cuando se realiza el ajuste el algoritmo toma porciones
3703  del bloque del tamaño de un registro mas su encabezado - comenzando desde
3704  el siguiente al que fue borrado - y copia (sobreescribe) sobre el anterior.
3705  De esta manera, la información correspondiente al registro borrado no estará
3706  presente en el archivo de datos.
3707  Esto es una consecuencia del ajuste al borrar un registro, pudiendo no
3708  ser así, si no se realizara el mismo.
3709 \layout Standard
3710
3711 En el caso de los registros multibloque, se eliminará la porción del registro
3712  contenida en el primer bloque y se actualizarán de manera conveniente los
3713  archivos índice, para restaurarlos a un valor verdadero.
3714 \layout Standard
3715
3716 Ver: 
3717 \family typewriter 
3718 emufs_tipo3_borrar_registro()
3719 \layout Subsection
3720
3721 Obtención de estadísticas
3722 \layout Standard
3723
3724 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
3725  cantidad de bloques, cantidad de registros, espacio libre total, espacio
3726  libre promedio, espacio libre máximo y mínimo, etc.
3727 \layout Standard
3728
3729 Esta información es el resultado de ciertos cálculos realizados tanto en
3730  el archivo de datos como en los archivos índice.
3731 \layout Standard
3732
3733 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
3734  del archivo de datos, espacio libre total, cantidad de registros, cantidad
3735  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
3736  libres, etc.
3737 \layout Standard
3738
3739 Ver: 
3740 \family typewriter 
3741 emufs_tipo3_leer_estadisticas()
3742 \layout Subsection
3743
3744 Compactación del archivo de datos
3745 \layout Standard
3746
3747 Esta función intenta reorganizar el archivo de manera que el espacio libre
3748  sea lo menor posible, recordando siempre que un registro no puede ser almacenad
3749 o en mas de un bloque excepto que el tamaño del registro sea mayor que el
3750  del bloque.
3751 \layout Standard
3752
3753 Para realizar esto, se aprovecha la funcionalidad de 
3754 \emph on 
3755 emufs_tipo3_grabar_registro() 
3756 \emph default 
3757 ya que esta tiene la capacidad de determinar una posición mas eficiente
3758  en el archivo para un registro.
3759  Por esto lo que se hace es levantar uno por uno los registros y volverlos
3760  a grabar, de ese modo todos los 
3761 \emph on 
3762 gaps 
3763 \emph default 
3764 que pudieron haberse formado por la eliminación de registros serán cubiertos
3765  por otros.
3766 \layout Standard
3767
3768 Al estar utilizando recuperación de 
3769 \emph on 
3770 id`s
3771 \emph default 
3772  borrados, esto me asegura que el registro borrado-guardado conservará el
3773  id al grabarse.
3774 \layout Standard
3775
3776 Al finalizar este proceso se verifica si existen bloques vacíos para truncar
3777  el archivo.
3778  Lo mismo se debe hacer con el archivo de espacios libres .
3779 \emph on 
3780 fsc 
3781 \emph default 
3782 el cual disminuye su tamaño también.
3783 \layout Standard
3784
3785 Ver: 
3786 \family typewriter 
3787 void emufs_tipo3_compactar()
3788 \layout Section
3789
3790 Consideraciones y Políticas de Diseño
3791 \layout Standard
3792
3793 Se han tomado ciertas consideraciones para algunos casos particulares que
3794  se pueden presentar durante el uso/ejecución de la aplicación.
3795 \layout Enumerate
3796
3797 Cada registro tiene un encabezado que indica el 
3798 \emph on 
3799 id 
3800 \emph default 
3801 del mismo.
3802 \layout Enumerate
3803
3804 Si el tamaño del registro es mayor que el tamaño del bloque el registro
3805  se particionará en la cantidad de bloques que sea necesario, pero siempre
3806  se guardará desde el comienzo de un bloque, esto quiere decir que nunca
3807  se podrá encontrar un comienzo de registro en algún lugar de un bloque
3808  que no sea el comienzo del mismo.
3809 \layout Enumerate
3810
3811 Si el registro se divide en mas de un bloque, se le coloca el id como encabezado
3812  igualmente, pero en el archivo .
3813 \emph on 
3814 idx
3815 \emph default 
3816  solo se guarda el primer bloque.
3817  En el 
3818 \emph on 
3819 .fsc
3820 \emph default 
3821  se actualizan todos los bloques con el espacio libre que realmente tienen.
3822 \layout Chapter
3823
3824 EMUFS View (interfaz gráfica)
3825 \layout Section
3826
3827 Introducción
3828 \layout Standard
3829
3830 La interfaz de visualización de EMUFS permite interactuar con los distintos
3831  tipos de archivos para cada conjunto de datos almacenado (ya sean facturas,
3832  articulos, o notas de facturas).
3833 \layout Section
3834
3835 Instalación
3836 \layout Standard
3837
3838 Para poder correr la interfaz gráfica necesitará previamente compilarla
3839  (así como compilar los programas auxiliares), para ello necesitará cumplir
3840  con los siguiente requisitos:
3841 \layout Enumerate
3842
3843 Compilador gcc versión 3.3.x preferentemente.
3844  No podemos garantizar la compatibilidad con otras versiones debido a cambios
3845  drásticos que sufrieron las versiones anteriores.
3846 \layout Enumerate
3847
3848 Parser XML libxml2 versión 2.6.x .
3849  Versiones 2.5 y anteriores son incompatibles en la API y no funcionarán.
3850 \layout Enumerate
3851
3852 libncurses version 5 o superior (probado con 5.4).
3853 \layout Enumerate
3854
3855 GNU Make.
3856 \layout Subsection
3857
3858 Compilar GUI
3859 \layout Standard
3860
3861 Para compilar la GUI solo debe ejecutar el comando make dentro del directorio
3862  raíz del proyecto.
3863  Esto compilará primero una biblioteca estática con los manejadores de los
3864  3 tipos de archivo y luego compilará la GUI.
3865 \layout LyX-Code
3866
3867 #~/emufs/> make
3868 \layout Subsection
3869
3870 Preparar el banco de pruebas
3871 \layout Standard
3872
3873 Antes de comenzar a utilizar la GUI deberá generar los archivo XML desde
3874  donde serán leídos los datos para generar los archivos que luego se utilizará.
3875  Para ello el proceso de compilación creará 2 ejecutable : generar_fact
3876  y generar_art, que se ubicarán en la carpeta generar dentro de emufs_gui.
3877 \layout Standard
3878
3879 Estos programas generan facturas y artículos respectivamente en forma aleatorio,
3880  utilizando diccionarios de datos para llenar los campos.
3881  Primero deberá ejecutar generar_art, ya que éste último crea un diccionario
3882  de artículos que luego utilizará generar_fact para los items de las facturas.
3883 \layout Standard
3884
3885 Ambos programas reciben 2 parámetros : el nombre de archivo de salida y
3886  la cantidad de entradas a generar.
3887 \layout Standard
3888
3889 El generador de facturas fue diseñado para cumplir con los porcentajes pedidos
3890  por el enunciado en algunos aspectos.
3891  La cantidad de facturas por dia del mes es aleatoria.
3892 \layout Section
3893
3894 Línea de comandos
3895 \layout Standard
3896
3897 El programa acepta varios parámetros, algunos de ellos opcionales, otros
3898  obligatorios dependiendo de las elecciones realizadas.
3899 \layout Standard
3900
3901 Para obtener una completa descripción de los parámetros el programa acepta
3902  
3903 \begin_inset Quotes eld
3904 \end_inset 
3905
3906 -h
3907 \begin_inset Quotes erd
3908 \end_inset 
3909
3910  o 
3911 \begin_inset Quotes eld
3912 \end_inset 
3913
3914 --help
3915 \begin_inset Quotes erd
3916 \end_inset 
3917
3918  para mostrar una ayuda en línea.
3919 \layout Standard
3920
3921 Si el programa es ejecutado sin parámetros tratará de recuperar los artículos
3922  y las facturas desde archivo previamente creados.
3923 \layout Standard
3924
3925 Para crear un archivo de artículos a partir de un archivo XML bien formado,
3926  se debe ejecutar el programa con la opción 
3927 \begin_inset Quotes eld
3928 \end_inset 
3929
3930 -a
3931 \begin_inset Quotes erd
3932 \end_inset 
3933
3934 .
3935  Dicha opción espera que el siguiente parámetro sea el nombre del archivo
3936  a leer, y que éste útimo tenga extensión xml (notar que es solo minúsculas).
3937  A continuación espera encontrar el tipo de archivo que se quiere crear,
3938  pudiendo ser éste último 1, 2 ó 3.
3939  De ser el tipo de archivo con bloques, se le exigirá que ingrese como último
3940  parámetro el tamaño del mismo.
3941 \layout Standard
3942
3943 Para crear el archivo de facturas es el mismo procedimiento, solo que utilizando
3944  el parámetro 
3945 \begin_inset Quotes eld
3946 \end_inset 
3947
3948 -f
3949 \begin_inset Quotes erd
3950 \end_inset 
3951
3952 .
3953  Luego de los parámetros de tipo y tamaño de bloque debe especificarse el
3954  tipo y tamaño de bloque para el archivo de notas.
3955  
3956 \layout Standard
3957
3958 Debe saber que estos parámetros no son mutuamente excluyentes, por lo que
3959  podrá utilizarlos al mismo tiempo.
3960 \layout Section
3961
3962 Características
3963 \layout Standard
3964
3965 A continuación se da una lista detallada de las operaciones que son posibles
3966  hacerse desde esta interfaz :
3967 \layout Itemize
3968
3969 Alta, baja y modificación de Artículos.
3970  Para ello se abrirá una ventana donde se podrá editar comodamente los datos.
3971 \layout Itemize
3972
3973 Alta, baja y modificación
3974 \begin_inset Foot
3975 collapsed true
3976
3977 \layout Standard
3978
3979 En la modificación de una factura no se podrán cambiar ni la cantidad de
3980  items y los datos de los mismo!.
3981  La nota si podrá ser modificada.
3982 \end_inset 
3983
3984  de Facturas.
3985 \layout Itemize
3986
3987 Ver registros.
3988  Ver fisicamente los registros de cualquiera de los archivos sin importar
3989  el tipo al que pertenezcan.
3990  Desde aquí podrá tambien eliminar, agregar o modificar el registro actual.
3991 \layout Itemize
3992
3993 Ver Bloques.
3994  Para aquellos archivos que hallan sido creados con un tipo con bloques,
3995  podrá verlos fisicamente, viendo el bloque actual y los anteriores/posteriores.
3996 \layout Itemize
3997
3998 Ver las estadísticas de cada archivo según su tipo, para realizar comparativas
3999 \layout Itemize
4000
4001 Cambiar el formato de cualquier tipo o parametros de archivo.
4002 \layout Itemize
4003
4004 Compactar los archivos.
4005 \layout Section
4006
4007 Decisiones de Diseño
4008 \layout Standard
4009
4010 Durante el desarrollo se han tomado ciertas decisiones en el diseño o restriccio
4011 nes.
4012  En este punto nos centraremos en las especificas tomadas por la interfaz
4013  de visualización, y no tomaremos en cuenta las que ponen los tipos de archivo
4014  por si solos.
4015 \layout Enumerate
4016
4017 La cantidad de items por factura es igual a 10 para archivos de registro
4018  de longitud fija y bloque parametrizado (TIPO 3).
4019  Esta decición fue tomada por poner un valor típico de items que puede haber
4020  en una factura, evaluando un caso de un comercio chico.
4021  Como el tipo de archivo permite cortar un registro y guardarlo en varios
4022  bloques consecutivos, la restricción de cantidad solo es un hecho de elección,
4023  y así pusieramos 100, 1000, 10000 no habría diferencia, ya que el tipo
4024  de archivo lo guardaría sin problemas.
4025 \layout Enumerate
4026
4027 Si el archivo es de TIPO 3 y se agregan más de 10 items estos son truncados
4028  y descartados sin aviso al usuario.
4029  Esta fue una desición basada en el tiempo del proyecto.
4030  De tener que validar y consultar al usuario se hubiera perdido tiempo de
4031  mucho valor para completar objetivos más importantes del TP.
4032 \layout Enumerate
4033
4034 Los campos son delimitados por el caracter nulo (en caso de los strings)
4035  y por la longitud del tipo de dato en caso de los campos numéricos.
4036  De esta forma se aprovechan las características de manejo de string en
4037  C.
4038 \layout Section
4039
4040 Vista de Registros
4041 \layout Standard
4042
4043 Un ejemplo de vista de registros es la que se observa a continuación :
4044 \layout Standard
4045
4046
4047 \begin_inset Graphics
4048         filename gui_ver_registros.eps
4049         width 14cm
4050         keepAspectRatio
4051
4052 \end_inset 
4053
4054
4055 \layout Standard
4056
4057 Como puede verse el registro actual se ve resaltado respecto de los demás.
4058  También se puede observar que en este caso (el bloque es de 2000 bytes)
4059  no entra toda la información en pantalla, pero es posible desplazar utilizando
4060  las teclas A y Z.
4061 \layout Standard
4062
4063 Los datos binarios son convertidos a texto para ser mostrados, siendo la
4064  representación elegida :
4065 \layout Itemize
4066
4067 (XXX) : Representa un ID.
4068  En el caso de las facturas también aparece en los datos el número de índice
4069  de la nota asociada con esta representación.
4070 \layout Itemize
4071
4072 {XXX} : Representa el tamaño de los datos.
4073  Esto siempre y cuando el registro sea de longitud variable (TIPO1 y TIPO2).
4074 \layout Standard
4075
4076 También es posible ejecutar acciones de edición sobre el registro seleccioado,
4077  así como buscar por ID de registro.
4078 \layout Standard
4079
4080 Cuando se procesa la información en crudo (es decir, el area de datos) algunos
4081  bytes son modificados para evitar errores visuales.
4082  Un caso es cuando el bytes es compuesto por 8 bits de valor 0 (caracter
4083  
4084 \backslash 
4085 0).
4086  Lo que se hace es cambiarlo por un caracter que tenga representacion visual
4087  (en este caso un *).
4088  Lo mismo suscede para los caracteres de control (
4089 \backslash 
4090
4091 \backslash 
4092
4093 \backslash 
4094 r por ejemplo) y los espacion.
4095  Esta política fue tomada ya que estos caracteres modifican la salida en
4096  pantalla, y de no evitar su envío a la pantalla, producirían resultados
4097  inesperados en la visualización.
4098 \layout Section
4099
4100 Bugs conocidos
4101 \layout Standard
4102
4103 A continuación se enumera los errores que sabemos que existen, que no hemos
4104  tenido tiempo de corregir, pero que no hacen al TP en sí :
4105 \layout Enumerate
4106
4107 Si la consola o terminal cambia de tamaño la GUI no sigue el nuevo tamaño,
4108  pudiendose producir defectos visuales.
4109  Esto es debido a que se debe capturar una señal que envia el SO, pero no
4110  pudimos hacer que funciones con todas las terminales bajo X, por lo que
4111  se decidio dejarlo para cuando tengamos tiempo.
4112 \layout Enumerate
4113
4114 Si la GUI fue compilada con -DDEBUG y no se utiliza un PIPE para redirigir
4115  la salida de error estandar, es posible que algun componente del programa
4116  emita un mensaje de debug o warning y esta cause defectos de visualización
4117  o el programa deje directamente de funcionar.
4118  Esto es un defecto de la biblioteca NCurses.
4119 \layout Enumerate
4120
4121 Cuando se cargan datos desde el XML y este contiene caracteres extendidos,
4122  estos son mostrados en UTF8 en la pantalla.
4123  Si no posee una consola configurada en UTF8 verá los caracteres extendidos
4124  en su representación ASCII (2 caracteres por cada caracter extendido).
4125  Esto se da a causa de que la LibXml maneja de forma interna todo en UTF8
4126  sin importar el encoding declarado en el XML.
4127  El encoding solo lo tienen en cuenta para guado se guarde.
4128  No nos hemos tomado el trabajo de hacer la conversión solo por cuestiones
4129  de tiempo.
4130 \layout Chapter
4131
4132 Conclusiones
4133 \layout Standard
4134
4135 Las comparaciones, pruebas, etc...
4136 \the_end