METROPOLITANA DE IZTAPALAFA

Transcripción

METROPOLITANA DE IZTAPALAFA
U ~ I Y ~ R S I DAUTOWOMA
A~
METROPOLITANA DE IZTAPALAFA
PROYECTO FINAL
PARA OPTAR POR L A LICENCIATURA
DE C O ~ t P U T ~ C I DE
O ~ LA DIVISION
DE C1Lftb.l
IrTAC
3 BASICAS E INVENILRIA
TITULO: SIMULACION DE ARCHIVOS KSAM
DE LA HP-3BM A UN M I ~ ~ O C O M ~ ~ ~
TADORA,
111678
J
>
\
INTRODUCCION
Si.tni-tlaiiidn d e
M a n e j a s de U i r e c t a r i n s y
Archivas
MS-DCISnF-n
este
p r o y e c t o se 1.l e v o a c a b o e s t a Ejimu1ac:j.oi.i p n r que
es
impor-.
tante
s a b e r el corriparta.m:i.ento de como se i m p l a n t a n 10s comando.;
d e una rnicr-o t:c3r? ;iu-c:h 1.v a s i KEjarn-3~:Wi:l con sus respec::t j. vasi
d e MC-Dos
:l. 3 . a v e s .
ESTRUCTURA DEL MODELO
ESTRUCTURA DE ARCHIVOS KSAM
...,.
Un a r c h i v a
C::E~~~~-..AK)O
s c ~ nd e un
ARCHIVO DE DATOS JUNTOSCON SUS LLAVE.
solo
archiva
Fisica:
L o r i reqistr\o:; d e d a t o s se g r a b a n en un a r c h i v o d e d a t o s
en el. n r d e n en el ct-ta1 f u e r b n r e c i b i d o s de un prngrarna( E l 2t:Lt:i.mo
r e g i s t ; r o adic:iiinada siemprTe es er;cr-ii;o al f i n a l del. ; ~ . r c : h i v c ~ .
t
TECNICAS
APEKDICE B
Y ESTRUCTURA INTERNAS DE ARCHIVOS KSAM/3000
VISTA GENERAL
Los archivos KSAM pueden s e r usados eficazmente sin niconoci
miento de como estan estructurados l o s archivos o como s e d e t e r d
na e l tamaño
f a c t o r d e l bloqueo. Los valores de nDEFAüLTn pro=
v i s t o s p a r a capacidad d e l archivo, bloqueo de llaves, número de
entradas l l a v e , y ass sucesivamente, son eficaceff en muchas a p l i caciones. Este apéndice provee soporte de programRcidn sofistica
da con información sobre como estan estructurados l o s archivos
KSAM, como es asignado e l espacio de disco a un archivo KSAM, y
como es asignado e l espacio de memoria para l o s segmentos de datos
extra usados cuando un archivo ESAM es modificado o accesado.
Tal información puede s e r Ú t i l para mejorar l a ejecuci6n basada
en l a aplicación p a r t i c u l a r o
-
---
---
KSTRUCTURA DE ARCHIVOS KSAM
Un archivo KSAM/3000 es dos archivos f í s i c o s : un archivo de datos
La porción d e l archivo de datos de un a r
chivo KSAM contiene todos l o s datos en e l archivo 9 nada d s que-
y un archivo de l l a v e s .
datos. Los r e g i s t r o s de datos estan grabados en e l archivo de da
t o s en e l orden en e l cual fueron r e c i b i d o s de un programa,
(ElÚ l t i m o r e g i s t r o adicionado siempre es e s c r i t o a l f i n a l d e l archiv o . ) Este orden cronológico no esta necesariamente en secuencia
por e l v a l o r de l a l l a v e , A l tiempo que e l archivo 88 a b i e r t o ,
usted puede e s p e c i f i c a r que l o s r e g i s t r o s deben s e r e s c r i t o s en
secuencia por la l l s v e primaria, pero e l modo de "DEZ'AüLT" es g r a
bar l o s r e g i s t r o s en cualquier ordeno
--
-
d e l archivo de llaves de un archivo KSAM contiene l a s
entradas l l a v e que mantienen l a secuencia de l o s r e g i s t r o s de datos. Cuando w3 r e g i s t r o de datos es grabado en e l archivo de datos, una entrada l l a v e es adicionada por cada l l a v e d e f i n i d a para
e l archivo, y l a s conexiones secuenciales entre entradas l l a v e
son actualizadas, Esto s i g n i f i c a que s i hay u p ~
l l a v e primaria y
dos a l t e r n a s , t r e s entradas l l a v e s6n adicionadas por cada nuevo
r e g i s t r o de dBtos, y t r e s s e r i e s de apuntadores son actualizados
para r e f l e j a r l a nueva secuencia de l l a v e s de cada l l a v e .
La porción
--
La estructura d e l archivo de datos es i g u a l a l a de cualquier archivo MPE. Los r e g i s t r o s da datos pueden s e r de longitud f i j a o
v a r i a b l e . S i es f i j a , csda r e g i s t r o es d e l tamaño especificado
cuando e l archivo fu6 creado ( E l tamaño de "DEFAULT" es equivalen
t e a un sector de disco de 128 palabras). S i es v a r i a b l e , e l t a z
zafio a6tuai de cada negkstro es incluido en e l r e g i s t r o mismo; y
e l tamaño máximo de cualquier r e g i s t r o es usado para determinar
el bloqueo. Por ttDEFAUI/I"t,l o s r e g i s t r o s de datos son bloqueados
de de a un registro por bloque,
-
-
- 1 -
Bloque de c o n t r o l . Este bloque de 128 palabras contiene informaci6n del archivo de datos asociado con el archivo de l l a v e s y guar
da una huella d e l número y t i p o s de accemo a l archivo de l l a v e s ,
También e s p e c i f i c a e l número de l l a v e s (Primarias y Alternas) def i n i d a s pare e l archivo KSAM, E l nombre d e l archivo de dato6 ;y
el número de l l a v e s son esenciales para asociar e l archivo de l l a
ves con e l de datos. E l nfimero de l l a v e s determina cuantas entra
das hay en e l bloque descriptor de l l a v e .
-
4
-
Bloque d e s c r i p t o r de l l a v e . Este bloque de 128 palabras contiene
una entrada de 8 palabras por cada l l a v e definida para e l archivo
KSAM. La primera entrada describe l a l l a v e primaria, l a s i uient e entrada describe l a primera l l a v e a l t e r n a ( s i hay algunay, y
cada entrada subsecuente describe una l l a v e a l t e r n a adicional,
La primer p a l a b r a de cada entrada apunta a l bloque r a í z para e88
llave; otro dato importante es l a posición de l a l l u v e en e l re(Consulte l a f i g u r a B-5)
g i s t r o d e l a r c h i v o d e datos.
-
- 7 -
I
l
I
I
f
1
i
RELACION DE L.4 LLAVE AL ARCHIVO DE DATCS
1
E 1 propósito d e l archivo KSAM es mantener e l orden de l o s registros en e l archivo de datos, Para mantener e l orden secuencia1
para cada l l a v e , l o s bloques de l l a v e s estan conectados a t r a v e s
de apuntadores.
Además de e s t o s apuntadores, cada entrada l l a v e
también debe cantener un apuntador enlaeaaido e l v a l o r de l a l l a d
ve a l r e g i s t r o de d a t o s que contiene e l v a l o r de l l a v e correspon
-
diente.
Cuando e l archivo KSAM es creado, cada l l a w es d e f i n i d a con su
p o s i c i ó n i n i c i a l en e l r e g i s t r o de datos, su longitud y BU t i p o .
La p o s i c i dn i n i c i a l es e s p e c i f i c a d a como l a p o s i c i ó n d e l caracter donde empieza e l v a l o r de l a l l o v e ; l a longitud es e l número
mLíximo de c a r a c t e r e s usados por e l m l o r de l a l l a v e ; e l t i p o de
l a l l a v e es e l t i p o de v a l o r : un integrador, una s e r i e de caract e r e s o un integrador de d o b l e palabra.
Así, s i l a l l a v e primaria e s d e f i n i d a coho una s e r i e de caracteres que empieza en la p o s i c i ó n 3 y t i e n e 20 caracteres de longitud, entonces KSAM espera que cada r e g i s t m d e d a t o s ooaten&z?áun
v a l o r en esas posiciones. Todo l o que e s t a l o c a l i z a d o en l a POs i c i ó n d e f i n i d a e s tratado como l a l l a v e primaria y determina el
orden en e l cual los r e g i s t r o s de d a t o s estan en secuencia,
E l orden en e l cual los r e g i s t r o s son fisicamente grabados en e l
archivo de datos es llamado secuencia cronológica. Esta secuem
c i a puede ser o no también una secuencia por l l a v e . Si l o s re-g i s t r o s fueron grabados en el archivo en secuencia por l a l l a v e
primaria, eneonces estn secuenc%a y l a c r o n o l ó t i c a son iguales,
S i n embargo, s i hay una llave alterna para el archivo, es muy
improbable que l a secuencia de l a l l a v e a l t e r n a sea l a misma que
--
l a secuencia cronológica,
N O T A
La secuencia de l l a v e s en archivo KSAM
siempre es er! orden ascendente p o r el
v a l o r de l a llave.
Consulte l a f i g u r a B-7 para un diagrama s i m p l i f i c a d o de l a r e l a ción entre llaves primarias en el archivo de l l a v e s y sus r e g i s tros asociados en e l archivo de datos.
(Un diagrama similar POd r í a ser hecho p a r a l a l l a v e alterna),
E l diagrama muestra e l
apuntador en cada entrada l l a v e apuntando directamente a un se-gistro en e l archivo de datos.
-
Cuando un r e g i s t r o de datos e s l o c a l i z a d o p o r e l v a l o r de l a 11%
ve, e l bloque raíz es examinado primero, usando un método de bus
queda binaria.
S i l a l l a v e e s t a en e l bloque r a f e , l a bus uedatermina, S i no, el valor de l l a v e esta e n t r e dos w l o r e s 8 e l
bloque r a í z o es menor aue el v a l o r más b a j o o es mayor que e l
valer más Rito.
--
-
-
11
-
I
Usando el apuntador de la p o s i c i ó n apropiada, se localiza un blo
que d e l siguiente nivel, Entonces este bloque es examinado en %i
busca de l a l l a v e seieccionada. Otra vez, s i la llave es encont r a d a , la busqueda termina. S i l a llave no es hallada en e s t e
nivel, el apuntador aprohiado del siguiente nivel es usado y la
busqueda continfia.
-
Cuando el valor de I n l l a v e seleccionada e8 hallado, el apunta--'
dor a l archivo de d a t o s asociado con aquel v a l o r es usftdo para
l o c a l i z a r el registro en el. archivo de datos.
-
- 12 -
I
I
ESTRUCTUIiR DEL ARCHIVO DE LLAVES KSAM
Un archivo d e l l a v e s KCAM consta de t r e s t i p o s de informaci6n:
CONTROL
-
Contiene información general de c o n t r o l t a l
como e l nombre d e l archivo KSAM, y e l número
de l l a v e s d e f i n i d a s para e l archivoa
DESCRIPTOR DE
LLAVE
-
eontiene información general para cada l l a v e
t a l como l a p o s i c i ó n i n i c i a l d e l campo l l a v e
en e l r e g i s t r o de datos y l a p e s i c i d n en e l
archivo de l l a v e s de l a entrada r a í z l l a v e .
ENTRADAS LLAVE
-
-
- Cada
entrada l l a v e contiene informacidn acerca de una l l a v e asociada con un r e g i s t r o de datos.
,
Esta informacidn consta de:
J S ~v a l o r
de la l l a v e .
Tin apuntador de un r e g i s t r o d e l archivo de
datos con e l mismo v a l o r de l a l l a v e .
La infovmación de contleol y descripción de l l a v e esta contenida en dos bloques ( r e g i s t r o s físicos) en e l i n i c i o de cada archivo.
Apuntadores de o t r o s r e g i R t r o s con e l archi
vo de l l a v e s .
Sin t e n e r en cuenta e l número de l l a v e s en e l archivo, cada bloque
t i e n e 128 palabras (un s e c t o r ) de l o q $ t u d . Así cada archivo de
l l a v e s esta precedido de dos sectores de información de c o n t r o l y
descripción de l l a v e s .
Las entradas l l a v e también estan organizadas dentro de bloques de
un tamaño f i j o , Sin embargo, el número exacto d e bolques y e l t a
maño de cada blaque esta basado en una variedad de fmtores, tal-cg
mo e l tamaño de l a l l a v e , e l número de l l a v e s en e l archivo, e l
número de v a l o r e s para cada l l a v e , e l f a c t o r de bloqueo de l l a v e s ,
y as€ sucesivamente,
(El c á l c u l o d e l tamaño d e l bloque de llaves
e s discutido más tarde en esta sección).
Estos bloques de entradas de l l a v e estan organizades en estructura ARBOEB discutida
teriormente. Una estructura separada de l l a v e s es actualizada pa
ra cada l l a v e definida para e l archivo. De e s t a manera pueden .l l e g a r a s e r 16 estructuras de Arb01 separadas en un s o l o archivo
-
--
KSAM,
Consulte l a f i g u c a B-4 para un diagrama s i m p l i f i c a d o de un archivo de l l a v e s KSAM, con dos l l a v e s , organizado en una estructura
de ARBOL de dos n i v e l e s . Para una descripción detallada de l o s
tres tipos de bloques consulte l a f i g u r a B-5 y B-6.
--
- 6 -
.-. .' . - ~.
.
,
__...
- ..
--
.
= Apuntador
Valor de. Llave
I
L
1 1 I+
Raíz
1 . 3 '
II
I. -/
Figura B-?. Estructura de Arbol-B de dos n i v e l e s
-
Adicionando o borrando l l a v e s . Cuando un bloque de l l a v e 8 está
lleno y nuevas l l a v e s son adicionadas, e l bloque de n i v e l r a í z pue
de necesitar que sea introducido y adicionarlilo un nuevo n i v e l alARBOL, Este proceso es i l u s t r a d o en l a figura B-2 donde la adición de una nueva l l a v e a un bloque parcialmente lleno no afectala estructura del ARBOL, pero l a ddicibn de una segunda l l a v e a l
bloque lleno causa l a d i v i s i ó n de éste.
Otra vez, e s t e ejemplo asume e l tamaño d n i m de bloque de l l a v e s
por cuestión de simplicidad, Note que toda la actualización d e l
archivo de l l a v e s es eJecutada en e l segmento de datos e x t r a KSAM
donde el espacio es asignado para una l l a v e más que e l t a m d o d e l
bloque de l l a v e s . Este permite l a adición de una l l a v e a un bloq
que "llenot'. Antes que el bloque sea l e i d o en e l archivo de llaves, es d i v i d i d o de modo nue e l tamdo de blooue de l l a v e s es ac4
tualizado.
- 3 -
. .
.
7 Estructura bioque If15 ~ ~ 1 1 ~ ~ ~ 1 6 ~ 0raíz
~ 2 1(padre)
de llaves d e dos
[+It-
n i v e l e s (todos l o s
bloques llenos)
I
ins orción
división
4
,-
Estructura bloque
de llaves d e t r e s
niveles ( e n t r a d a s
sombreadas vacías)
Figura R-3.
r a í z (padre)
+--- rama (padre-hijo)
Aumento de dos a tres niveles de árbol
-
Note que los bloques de llaves siempre deben ser definidos con
niímero uniforme de l l a v e s ,
Como resultado, c u m d o una l l a v e
adicionada a un bloque lleno, habrá un valor medio para formar
bloque en un ~ u e v onivel. Esto mantiene el balance esencial
l a estructura árbol-B.
un
es
un
de
Cuando registros del archivo de datos son borrados, dos bloques
del mismo n i v e l (hermanos) pueden ser mezclados en un 8010 bloque.
S i siificientes r e g i s t r o s son borrados, a l bloque raiz pued e s e r mezclado en un nivel mayor, reduciendo con ello el número
de niveles en l a estructura de llaves,
- 5 -
La estructura d e l archivo de l l a v e s es d s compleja.
E l archivo
garti-
de 1 1 8 ~ - 8e s t a organizado de modo que l o c a l i z a r una l l a v e
c u l m r e q u i e r a e l menor nfimero de accesos. Para este prop s i t o ,
l o s archivos de l l a v e s estan organizados en UPB estructura p a r t í
c u l a r Conocida como un tiATtBOL-Btl -'I-*La estructura de ARBOEBtiene dos ventajas p r i n c i p a l e s :
----
El número de accesos a l archivo e u t a limitado a l número de nive
l e s en e l ARBOL. S i hay dos n i v e l e s , no más de dos l e c t u r a s
d e l archivo de l l a v e s son necesarias para l o c a l i z a r una l l a v e
particular.
El archivo de l l a v e s e s t a balanc.eado.
Ksto s i g n i f i c a que cada
apuntador de n i v e l asociado con un v a l o r de l l a v e p a r t i c u l a r
apunta a aproximadamente a t ~ n t o svalores de l l a v e maybres como
menores d e l siguiente n i v e l d e l ARBOL,
--
La estructura de A R B O E B es explicada enseguida, seguida de como
l o s archivos de llaves KSAM usan esta estructura.
1 Descrita en ftORG.AWIZATION AND MAIN!PENANCE OF U G B ORDERED INDEXEStt (Organización y Mantenimiento de Indices de Gran O r d e w
miento)t BAYER Y McCRBIGm, Acta Informatica, SI?RIETGEB VERLAG
1973, paginas 173-189.
ESTRUCTURA DB ARBOL-B
En un ARBOL-B hay un bloque de nivel r a í z que apunta a bloquee en
un n i v e l más b a j o . En e l más baa0 nivel, l o s bloques son llamados hojas y no hacen r e f e r e n c i a a o t r o n i v e l . En una 6structura
de dos niveles (Vea la f i g u r a B-1)
Todos l o s bloques d e l segundo
nivel son
S i el ARBOL t i e n e más de dos n i v e l e s , bloques
intermedios (nudos o ramas) son referenciados por un n i v e l mayor
y e l l o s mismos referencian un n i v e l menor. A menos que e s t e n i v e l
menor sea una h o j a , también r e f e r e n c i a un n i v e l más bajo. Esto
continúa hasta que e l n i v e l más b a j o (HOJA) es encontrado.
-
El concepto d e n i v e l mayor y menor no se r e f i e r e a l o s v a l o r e s de
l l a v e s , Los v a l o r e s de l l a v e s d e l bloque r a í z siempre son c8ntrA
cos y apuntan a bloques con v a l o r e s más a l t o s y más bajos, A s í
que s i hay dos entradas en un n i v e l r a i z o rama, habrá t r e s apuntadores e n el siguiente n i v e l : uno para l o s v a l o r e s de l l a w meno
res que e l v a l o r de l a p r i m e r a l l a v e , uno p a r a l o s v a l o r e s de l l a
ve menores %;ucla segunda l l a v e pero mayores que l a primera, y
uno para l o s valores de l l a v e mayores que l a segunda.
-
---
Dentro de cada bloque, los valores son almacenados en orden asceg
dente, Aunque no todos l o s bloques estan l l e n o s de valores, cada
bloque e s un ARBOL tiene e l mismo tamaño. La figura B-'l ilustra
UTI ARBOL sencillo de dos niveles con u n bloque r a í z y t r e s bloquea
Hojas, La raíz es un bloque s e n c i l l o y cads Hoja es un bloque
d e l mismo tamaño.
(Este ejemplo l o usa e l tamaño mínimo KSAM de
bloque de l l a v e s consistente en cuatro entradas l l a v e por b l 0 ' 3 ~ 6 ) .
--
-
Bloque de entradas l l a v e , Cada bloque en e l archivo de l l a v e s
contiene, además de l o s v a l o r e s de l a s llaves, apuntadores que
enlazan l o s bloques de l l a v e s entre sf, y apuntiadores que enla-zan cada v a l o r l l a v e a un r e g i s t r o de datos asociado. Precedido estas entradas, e l primer dato en cada bloque de l l a v e s e8 l a
d i r e c c i ó n del archivo en e l d i s c o , y e l s i g u i e n t e dato e s e l numero de l l a v e s en e l bloque,
I
Todos l o s accesos a bloques de l l a v e s para busqueda y modificaci6n son ejecutadas en e l segmento de datos extra. La d i r e c c i ó n
en d i s c o de cada bloque de l l a v e s asegura que e l bloque e8 r e g r e
sado a su posición c o r r e c t a en e l disco.
-
La f i g u r a B-6 i l u s t r a l a composición general de todos l o s bloques
de entradas l l a v e . Cada valor l l a v e es seguido por un apuntador
d e l r e g i s t r o de datos 7 un apuntador d e l bloque d e l s i g u i e n t e n i
v e l con v a l o r e s de liEave mayores. &lprimer apuntador en cada
hloque apunta a un bloque d e l siguiente n i v e l coa v a l o r e s de l l a
ve menores. Estos apuntadores son puestOs en ceros para bloques
de l l a v e s que no t i e n e n s i g u i e n t e n i v e l (las HOJAS de una estruc
t u r a de ARBOL).
--
-
DE ENTRAD.AS LLAVE
BLOQUE
~~
5 PALABRAS EXTRAS
~~
,la--- 2 PALABRAS
LJirección en d i s c o
$-Llaves
en e l bloque 4-- I PALABBA
Apuntador a l , s iauiente h--- c rn- REAS
n i v e l en e l íirbz 1
~~
-1
VALOR DE
LA LLAVE
Apuntador a Reg. ;3atos+2
Apuntador a Sig. ;Jive1 IqVALOR DE
nli-rA
PALABRAS
2 PALABRAS
LA LLAVE
Apuntador a Beg. D a t o s ‘ l e - 2
Apuntador a Sig. Nivell-2
PALABRAS
PAZABRAS
I
I
i
>
VALOR DP LA LLAVE
Apiintador a S i g . ?live1 4FIGURA
E-6.
2 PALABRA6
FSTRUCTURA DEL BLOQUE DE ENTRADAS LLAVB
-
10
-
1
BLOQUE; DZ: CONTROL (primer bloque en cada a r c h i v o de l l a v e s )
0
-
4
-
3
--
29
- 58
61
59
63
Identifica e l
archivo de d a t o s
a s o c i a d o c o n el
a r c h i v o de l l a v e s
-
hombre d e l Archivo
--
1 5 I Pecha/Hora
I
17--VersiOn
19 J$ d e H-e g i s t r o s
21 if" d e Llioques
2 2 ' y r 'álmras u l t bl oque
23 h'actor de Hloqueo
24 -yamano deRegistro
18
20
16
-
-
Llamadas I n t r ; . n s e c o s
(cada uno de d o b l e
I
Contadores de a c c e s o s
) t o t a l e s a l archivo, usado
por qornando VERIFY
palabra)
62
60 V Contador
n
B dE
e L eLc t u r-a s .
54
Cont:idor D i v i s i o n e s
77 L_ _L \ - d e f i n i d a s
158
E s p e c i f i c a número
de l l a v e s
archivo
para e l
BLOQUE DESCRIPTOR DE LLAVE
b i t s = O l 3 4 7 8
1 5 p a l a,bra
P.punt a d o r al bloqr a í z d e llave primar.ia
Pos 1c i ó n en regisQ-p
de 1l a v e p r i m a r i a
4
D=Ban d e r a llaves d u p l i c a d a s
reservado
Apufitador a bloque-rafz
__P
d e l r i . l l a v e alterna
Posición en registro_--.----p
de I r a . l l a v e a l t e r n a
Nombre de i r s u a r i o , cuenta,
rupo 3 grupo d e " c a s a "
74 s a l a b r a s cada C
w
dados p o r F?FYTNFC
p
Llave
Primari
6
I
I
16
Entradas a d i c i o n a l e s
/>a
15 llaves alternas $
' 79
.
'
C
'230
-
127
DEL
ARCñIVO DE CA’POS
NOMBRE
6
NUMEEiO DE LLAVES
--L
FILEXI I 2
ci -LIZ
BLOQUE DE CONTROL
-
BLOQUE DESCRIPTOR DE LLAVE
LLAVE ALTERNA DE
I
RAIZ (PADRE)
I
/
/
(HIJOS)
A BLOQUE RAIZ
Di3 LLAVE
PRIAIARIA
AREAS SOlldBREADAS
I* 1 I* t=I--
\-
RAIZ (PADRE)
/
DISPONIBLES PARA
NUEVAS ENTRADAS
HOJAS (HIJOS)
SECUENCIA DE LLAVE PRIMARIA
AA AC BC DC EE GH JM MX NO XT
SECUENCIA DE LLAVE ALTYRIVA
2 5 6 7 11 12 14 18 36 42
- = APUNTADOR A L SIGUIENTE NIVEL FN EL ARBOL
FIGURA B-4.
ESTRUCTURA DE ARCHIVO Dk: LLAVSS KSAM CON DOS LIJAV.ES
- 8 -
.3
ARCHIVO DE DATOS
ARCHIVO DE LLPIVXS
( FFILSX )
(FI EX)
fl
Nombre
4 .
FILEX I
Llaves
I
12
I
Bloque de Control
Llave
Llave
Primaria Alterna
(bloques no mostrados)
Bloque Descriptor
de Llaves
Posicion Apuntadores a Registros de Datos
Llave
F'rimaria
I
L
3
p
-CJ¿
Reg.
bytes
25 Nim.
O
*
r
I
hpunt a a
-
I
1
2
Bloque
Raíz
I 3
I
4
5
punt a a
loque
iguie
ive 1 nt
I
6
7
I
I
8
I
9
AA AC BC DC EE GH JM MX NO
Secuencias :
Llave p r i m a r i a :
Cronológica
Llave alterna:
Cronológics :
BC GH MX NO XT JM EE DC AC
2 5 6 7 11 12 I 4 18 36
7
6 36 18 1 4 42 12
2
5
4
11
-F i g u r a B-7.
E e l a c i Ó n entre Archivo de Llaves y Archivo de Datos
-
13
-
-
- .,
-*
TAMARO DEL ARCHIVO KS:?M
E l tamaiío d e l archivo de datos e s calculado por e l tamaño de cada
r e g i s t r o (Para r e g i s t r o s de longitud f i j a ) .
Para r e g i s t r o s de
longitud v a r i a b l e , se c a l c u l a por l a máxima ocurrencia d e l tamaño
de l o s bloques de datos Be cada bloque. Por llDEFAUi~T1l,un archivo de datos KSAM contiene 1024 r e g i s t r o s (o bloquea) en e l cual
cada r e g i s t r d (o bloque) t i e n e 1024 palabras de longitud. Este
tamaño de "DEFAULT" adapta cada bloque dentro de ocho sectores de
d i s c o (cada s e c t o r t i e n e 126 palabras de longitud), y r e s u l t a en
un archivo de datos de 8192 sectores.
--
--
E l c á l c u l o del tamaño del archivo de l l a v e s es más complejo. Est a basado en e l número t o t a l &e l l a v e s en e l archivo (Primarias y
Alternas)t el tamaño de cada entrada l l a v e (Incluyendo l a de a r r i
b a ) , e l numero esperado de r e g i s t r o s de datos e s p e c i f i c a d o cuando
e l archivo e s creado, mas e l espacio pasa p e r m i t i r l a d i v i s i ó n de
bloques cuando se incremente e l número de entradas l l a v e .
El número de entradas p o r l l a v e por l o general e8 exactamente el
mismo número de r e g i s t r o s de datos esperados. Por "DEFAULT",
KSAM usa e l número máximo de r e g i s t r o s de datos e s p e c i f i c a d o ,
o
e l v a l o r de llI>EFAULT1' de 1324 r e g i s t r o s . Este número e s m u l t i p l i
cado por cada llave además de l a l l a v e primaria para l l e g a r a i nií
mero t o t a l de entradas l l a v e en e l archivo.
---
E l tamaño de cada entrada l l a v e y e l número de entradas l l a v e por
bloque ( E l f a c t o r de bloqueo) son usados pars determinar el tamaño del bloque de l l a v e s . Puesto que todos los bloques en e l ar-chivo de l l a v e s deben t e n e r e l mismo tamdo, KSAY a j u s t a e l fact o r de bloqueo de modo que todas las l l a g e s , s i n tener en cuenta
s u tamaño, usen e l mismo tamaño de bloque. También, este f a c t o r
de bloqueo puede s e r ajustado de modo que no sea malgastado e l e8
patio en disco.
(Un bloque siempre empieza en f r o n t e r a de secotor). Por "DEFAULT", el f a c t o r de bloqueo es ajustado de modo
que el tamaño d e 1024 palabras es usado p o r todos l o s bloques de
-
--
l l a v e s para todas l a s l l a v e s en e l archivo.
A causa de l a naturaleza de l a estructura ARBOEB, s e debe d e j a r
bastante s i t i o en e l archivo de l l a v e s para que e l archivo pueda
ser incrementado de manera balanceada. Cuando ocurre l a d i v i s i ó n
de bloque6 como resultado de adicionar nuevos v a l o r e s l l a v e , hast a l a mitad de cada bloque de llaves puede t e n e r espacios vacios.
Para p e r m i t i r t a l expansión, e l tamdo del archivo de l l a v e s e s
calculado, y emtonces duplicado.
-
La s i g u i e n t e discusión describe exactamente como c á l c u l a KSU el
tamaño d e l bloque de llaves y entnnces e l tamaño t o t a l d e l archivo de l l w e s . Estos c a l c u l o s son u t i l e s principalmente s i usted
no usa l o s v a l o r e s de "DFZAULT" para e l f a c g o r de bloqueo de l l a v e s y para e l número de entradas llave. En t a l e s casos pueden ayudarle a determinar e l tamaño d e bloque y e l tamaño de archivo
más e f i c a z para su aplicación.
-
'I4
-
I
TAMABO DEL BLOíJJE DE LLAVES
El tamaño del bloque de llaves puede a f e c t a r l a compiiejidad de l a
e s t r u c t u r a de ARBOL y e s t a puede a f e c t a r e l tiempo de acceso. Pa
ra entender l a relación entre tamaño de bloque y tiempo de acceso,
consideremos l a s siguientes r e g l a s generales:
-
15
-
Rntre más grande e l bloque, menos
8et
t i e n e que d i v i d i r , y entre
menos divisiones, menos n i v e l e s en e l ARBOL.
Entre más n i v e l e s en e l ARBOL, es necesario más tiempo de recuperación de memoria p a r a l o a a l i z a r una l l a v e particular.
De esto seguiría que p a r a reducir e l tiempo de acceso, deberia de
f i n i r bloques grandes. Esto es c i e r t o solamente hasta c i e r t o p<'
t o , Dependiendo del número t o t a l de l l a v e s esperado en e l archi=
vo, un tamaño de bloque muy grande puede resultar en una gran c4n
t i d a d de espacio sin usar en cada bloque.
T a m b i h , e l f a c t o r debloqueo puede resultar en espacio de disco s i n usar puesto que to
dos l o s bloques deben i n i c i a r en fronteras de saGtor.
-
KSAM provee un f a c t o r de bloqueo por l'DEFAULT'l que produce un blo
que con lü24 palebras. Bste tamdo ha probado ser e f i c i e n t e para
muchos archivos. Usted puede, s i n embargo, borrar este bloqueo
de llDEFAULT1l especificando un v a l o r en el parámetro bloqueo de
l l a v e s de l a opción; KEY en e l comando BUI.LD, o en la palabra 19
ue cualquier factor de bloqueo
del parámetro KSAM FOPEN,
que especifique t i e n e un v aNote
l o r rn nimo puesto que KSAM incrementa
e s t e f a c t o r de t a l manera que l a menor cantidad de espacio en d i s
co sea desperdiciada.
---
-
i!
uespués de crear un archivo KSAM, puede usar e l comando VERIFY de
HSAMUTIL, p a r a determinar e l número de n i v e l e s necesarios para el
archivo, v'ERIFY también muestra e l f a c t o r de bloqueo actual usa:
do en l a ereacidn d e l archivo para que pueda saber s i su factor
d e bloqueo ha sido incrementado.
-
Calculando e l tamaño d e l bloque de l l a v e s . E l t a m d o d e l bloque
de l l a v e s esta basado en l o s siguientes f a c t o r e s :
E l tamaño d e l l a v e en BYTES (KS),
&l tamaño de l a entrada l l a v e en palabras (ES).
E l número d e entradas l l a v e por bloque, f a c t o r de bloqueo (BE')
Una vez que e l tamaño d e l bloque es determinado se calcula el ni
mero de sectores necesarios p a r a guardar un bloque. S i este va
lor (NB) desperdicia e s p a c i o en los sectore8, KSAM a j u s t a el faz
t o r de bloqueo para prod.ucir un tamaño de bloque que use e l menor
número d e sectores llenando cada uno t a n completamente como sea
posible, Note que cuando KSAM usa e l tamaño de "DEEFAUIiT" de
1024, calcula un f a c t o r de bloqueo p o r e l mismo m6todo.
---
Zos siguientes pasos muestran como KSAM determina e l tamdo
bloque basado en un ffictor de bloqueo mínimo especificado.
N
J ,
O
T
A
E l signo s i g n i f i c a redondear hacia abajo e l
resultado d e l algorítmo entre corchetes a l
siguiente número entero; r 7 s i g n i f i c a re-dondear h a c i a a r r i b a ,
del
--
1,
Calcula e l tamaño de l a entrada (ES) en palabrae con e l tama
ño de l l a v e (KS) en bytes, y entonces
dos palabras a c a
da apuntador en l a entrada l l a v e (Vea l a f i g u r a B-6),
KSAMusa e l siguiente algoritmo para ejecutar ebte cálculo:
ES =
2,
L(KS+’I)/2J
+
4
S i e l factor de bloqueo (BF) f u 6 e s p e c i f i c a d o como un número’
impar, KSAM envía un mensaje de e r r o r * De l o contrario, usa
e l factor de bloaueo especificado para continuar e l cálculo
del tamaño d e l bloque,
3.
Determina e l tamaño d e l bloque (BS) multiplicando e l tamdo
de l a entrada l l a v e p o r e l f a c t o r de bloque y sumando 5 pala
bras. (Las cinco pslabras son: l a s tres palabras de informa
ciÓn de control d e l i n i c i o de cada bloque, más dos palabrasVea l a f i g u r a B-6).
p a r a el apuntador f i n a l en e l bloque.
KSAM usa e l logaritmo:
BS =
(ES x BF)
+ 5
‘
--
Puesto que los bloques siempre i n i c i a n en fronteras aé sector,
e s t e tamaño de bloque calculado puede dejar algo de espacio de
sector sin usar. Los siguientes gasos muestran como KSAM determina e l tamaño de bloque mas e f i c a z , y s i este tamaño d i f i e r e
d e l tamaño calculado por e l factor de bloqueo especificado, como
ajusta KSAM e l f a c t o r de bloqueo hacia arriba para producir e l
tamaño de bloque Óptimo.
--
-
40
-
DeterminR e l número de sectores requeridos para guardar e l
bloque del tama6o calculado. S i e l resultado no e s un número
entero, redondea hacia arriba a l sector entero más aercano.
RSAM determina e l número de sectores por bloque (NB) como s i
gue :
NB
5.
rBS/128?
Multiplica e l número de sectores por bloque poc 128 gara determinar el tamaño d e bloque óptimo:
BS
6.
=
=
NB x 128
S i e l tamaño de bloque 6ptimo calculado en e l paso 5 d i f i e r e
d e l tamaño de b1oqv.e calculado en e l paso 3, o si e l tamaño
de bloque de ”DEFAULT” de 1024 es usado, KSAM ajusta e l fact o r d e bloqueo a uno que oroduaca e l tamaño de bloque óptimo,
Usa e l siguiente algoritmo para determinar el número de entra
das l l a v e que es conveniente en e l bloque y, s i e 8 un número’
impar, l o reduce en uno,
( E l f a c t o r de bloqueo debe ser un
número par).
BF
=
r(
L (BS-5)/XS 1 -1)/2 7 x 2
TAnilAflCl DEL ARCHIVO DE LLAVES
KSAM usa el f a c t o r de bloqueo y e l número de sectores por bloquepare determinar e l tamaño máximo d e l archivo en sectores para a l o
Jar el archivo de l l a v e s . Además, gSAM necesita conocer el nÚme=
ro máximo de entradas l l a v e por esperar, y e l número de l l a v e s
(primarias y alternas) definidas para e l archivo a l crearlo.
-8
El d e r 0 máximo d e entradas llave para cada l l a v e puede 88r espec i f i c a d o en e l parámetro numentries (Número de entradas) de l a op
ción KEYENTRIES d e l comando BUILD o en el parametEo KSAMPARAM
( P a r h e t r o HSAM) d e FOPEN, S i n embargo, e l límite d e l archivo usualmente esta basado en e l número máximo de r e g i s t r y de datos.
Este v a l o r 3 s especificado en el garámetro MJME2EC (Numero de re-g i s t r o s ) de l a opción D I S C = d e l comando BUILD, o en e l par6metro
FILESIZE (Tamaño de archivo) de FOPEN. S i no e s especificado en
ninguno d e estos lugares, KSAM asume e l l í m i t e de archivo de
"DEFAULT" da 1024 entradas l l a v e e
-0-
---
Puesto que e l número d e r e g i s t r o s en e l archivo de datos puede ser
usado para calcular e l número máximo de llvses para una sola llave, cada l l a v e a d i c i o n a l definida por e l archivo causa que e l t a maño d e l archivo sea aumentado.
Cuando el tamaño d e l archivo ha sido calculado, XSAM usa e s t e valor para asignar el n6mero d e sectores en disco al archivo de l l a
ves cada vez que e l archivo sea abierto.
-
El tamaño d e l a c h i v o de llaves esta basado en las siguientes factores :
E l número de entradas l l a v e s p o r bloque, o e l f a c t o r de bloqueo
(BF)
E l número de bloques p o r sector (NB).
E l n6mero máximo d e entradas l l a v e por una l l a v e
(FL).
E l n&ro de l l a v e s definidas para e l arcbivo de llaves.
KSAM
usa la s i g u i e n t e f ó r m u l a para determinar el tamaño d e l arch&
vo d e l l a v e s en sectores para un archivo con una l l a v e :
= ( r"&L/BF 7~
2)
x
IQB
E s t a fórmula se deriva en los pasos siguientes:
(FL) se d i v i d e por el número d e entradas l l a v e por bloque (BF) para encontrar e l nÚmero de bloaues en el arcb.ivo, Si uo es un número entero,
se redondea h e c i a a r r i b a p a r a i n c l u i r todos l o s bloques.
I. E1 número máximo de entradas l l a v e
-
Ir,
-
-
2.
3.
El número resultante d e bloques es multiplicedo p o r 2. Xsta
duillicación d e l número d. bloques de l l a v e s Be.hace para peg
mitir s i t i o p a r a expansion cuando e l numero de n i v e l e s en un
archivo de llaves se expande debido a l a d i v i s i ó n de bloques.
Finaixente, e l número de bloques e s multiplicado p o r e l n h e
r o d e bloques por s e c t o r (HB) para h a l l a r e l número t o t a l d e
s e c t o r e s necesarios para contener todas l a s entradas l l a v e , &
N
O
T
A
.F;1 tamaño del a r c h i v o (FS) calculado p o r e l algo
ritmo anterior no incluye l o s dos s e c t o r e s requz
ridos para información de c o n t r o l .
.
I
si
e l archivo t i e n e colo u,na llave. suma 2 a l tamaño d e l archi(3's + 2) Dara obtener e l tamaño t o t a l d e l archivo. ~1v a l o r
2 r e p r o s e n t a L l o s dos s e c t o r e s d e l i n i c i o de cada archivo de l l a v e s conteniendo información d e c o n t r o l y descripción de l l a v e .
VO
S i e l archivo de llaves t i e n e l l a v e s múltiples, entonces el tama
So da bloque óptimo de cada l l a v e debe ser determinado. r;l tamz
ño de bloque m&s grande se s e l e c c i o m entonces como e l t a m d o de
bloque stan8ar.rparactodars:La$ l l a v e s en e l archivo KSAM. (KSAM
no permite bloques de l l a v e s de longitud v a r i a b l e ) .
Puesto que
e l tamaño de bloque d e algunas llaves ha sido cambiado, e l f a c t o r
de bloqueo (BF) debe ser calculado para e s t a s l l a v e s usando e l
algoritmo :
-
---
Un tamaño de archivo separado es entonces calculado basado en
sus varios factores de bloque. ~1 tamaño t o t a l del archivo de
l l a v e s e s i u a l a l a suma de v a l o r e s de todos e s t o s tamaños de
archivo (FS más 2 para los dos s e c t o r e s de c o n t r o l .
7
-
--
M para c a l c u l a r e l
tamaño de un archivo de una l l a v e . La f i g u r a B-9 muestra. como
c a l c u l a KSAM e l tamaño d e archivo de l l a v e s para un archivo con
dos llaves. Cada tamaño d e archivo de l l a v e s (FS) es calculaUo
por separado, y entonces e l f a c e o r de bloqueo y e l tamaño del 8'11
chivo de l a l l a v e c:)n e l tamaño de bloque más pequeño es r e c a l c Ü
lado
La f i g u r a B-E! sumariza los pasos que usa W
-
Para un archivo con una l l a v e , KSBK simplemente suma 2 s e c t o r e s
a l tamaño del archivo (FS) calculado para l a l l a v e simple,
- 19 -
I
,
I
!
I
I
I
I
KS
E:;
BF
BS
FL
NB
FS
r7
T A W 0 DE LLAVE E N BYTES
TAMARO DE ENTRADA LLAVX ‘EN P A L A B R A S
FACTOR DE BLOQUEO (No. DE ENTRADAS LLAVE POR BLOQUE:
TAMARO DE BLOQUE DE LLAVES
LIMITE DEL ARCHIVO DE DATOS EN REGISTROS
NUMERO DE SBCTORES POR ELOQIJE DE L L A V E S
;PAMAl?O DEL ARCHIVO DI3 LLAVES EN SECTORES
R3DONDEO H A C I A ARRIBA L i REDONDEO HACIA A B A J O
v
-q
KO
35’
MENOR .# DE PALABRAS QUE
il G P E C I P I C A D A ?
CONTIEIN3 LA ENTRADA LLAVE
i
SI
NO
BF = NUMERO PAR? __e ERROR
BS = 1024
(DEFAULT )
3 PALAERAS DE CONTROL MAS
135 = (ESxBF)+S 9-----2 PALABRAS DE APUMTADOR
I
I9
. DE PALABRAS EN SECTOR
NB =TBS/1287
I_
ES
y
t
T A m O DE BLoQUE OPTIMO
= NB x 128
SF =r(L( BS-5)/EBJ-1)/2 7 x 2 B--- BF AJUSTADO
v
F~~,?JITMERODE ENTRADAS L L A V E EN
BLOWE
\
‘=L--REDONIIEADO
AL # PAR BNTERC
MAS CERCANO
J
.
FL S S P E C I F I C A D O ? NO
FL = 1024 (DEFAULT)
I
I
FS = ( r P L / B F l x 2 ) x XB
4
DOBLE NUMERO DE BLW.UI
P A 6 A DIVISION DE
BLOQUES
-
20
-
b.suma un archivo con 2 liaves definido como:
KS = 13
Y& = 53
FL = 1024 ( d e f a u l t )
PL = 1024 (default)
BP = 20
BF = 12
Yálculo de PS:
ES= (53+1)/2 +4 = 27+4 = 31
ES= (l3+’l)/2 +4=7+4=11
BS=(1 1x20)+5=225
BS= (31~12)+5= 377
NB= 377/128 = 2.9 = 3 s e c t NBm 225/128 = 1.75 -2 sectores
BF= ( (384-5)/31 -1)/2 X2
B s = ~ 281256
x~
= ( q2.2 4 ) / 2 x2
*BPI ( (256-5)/11 -1)/2 ~2
2 ( 22.,8 -1,J/2 ~2
= (12-1)/Q x2
= 5.5 ~2 = 6x2 = 12
= (22-1)/2 x2
FS=( 1024/12 x 2 ) ~ 3
= 10.5 x2=11x2=22
FS=( 1024/22 x2)x2
= ( 85.3 ~ 2 ) ~ 3
=Yl6 sectores
=( 46.5 ~ 2 ) ~ 2
B S = ~ X I ~ ~ = ~ W
=I88 sectores
Puesto que. l a l l a v e 1 t i e n e e l tamano de bloque m6s grande (38
p a l a b r a s en 3 s e c t o r e s ) , su f a c t o r de bloqueo no es cambiado.
Qfnct3T d e bloqueo d e le l l a v e 2 es ajustado de modo que teng
e l mismo tamano de bloque. e
;:
usan l o s siguientes valores:
-
tamaño de entrada calculado p a r a l l a v e 2
tamaño d e bloque de l l a v e 1 (usada para l l a v e 2)
FL=’lOZ4
(Tamaño de archivo en palabras p o r d e f a u l t
NB-3 -nljmero
de s e c t o r e s necesarios p a r a cada bloque de
384 p a l a b r a s
ES=I’I
?3S=384
Q---
Zalcula e l nuevo Tactor d e bloqueo para lleve 2:
BF= ( (784-5/‘11-1)/2 x2
= ( ’34.4 - 1 v 2
= 16.5 ~ 2 1 x 3=
x2
186 sectores
Sumando l o s dos taaanos de archivo y adicionando dos sectores
p a r a i n f o r m q c i ó n d e cqntrol y d e s c r i p c i ó n de l l a v e s , e l tamaño
t o t a l d e l archivo en sectores e s :
516 + 186 + 2 = ’704 sectores
* E l alB;ori.tmo p a r a c a l c u l a r 9F puede ser expresado m8s simple
si el resultado puede s e r checado por un número p a r :
BF= SS-51ES
si BF es un número impar, entonces BF=BF-I
j.
de llaves alternas en e l archivo.
Puesto que e s t a fórmula (Ver
Tabla B-3) mantiene e l segmento d e d a l o s e x t r a tan pequeño como
es compatible con la e f i c i e n c i a , e l mero de "DEFAULT" de area8
reservadas a bloques de l l a v e s debe ser usado, excepto en caso8
e s p e c i a l e s . (Para d e t a l l e s , r e f e r i r s e a l tamaño del segmento
d e d a t o s e x t r a después en e s t a sección).
-
NülvIlERO
DE SEGMENTOS DE DATOS EXTRA
K8hM daslgna un ecgmento de dai708 extra para,cada al.ahiva X0AM
Puesto que mas de un proceso pue
a b i e r t o por un proceso a c t i v o .
d e u s a r el mismo archivo durante el acceso compartido, un archivo quizá r e q u i e r a un número de segmentos de datos extra, Así '=
e l n6mero de segmentos de datos e x t r a depende de ambos: e l nÚme
ro de a r c h i v o s KSAM y e l número de usuarios que usan siwíltanea
mente e l archivo. (Consulte l a figura B-AO),
-
ARCFIKVO KSAM
FILEX
---
Otro f a c t o r que puede a f e c t a r l a ejecución cuando l o s archivos
RSAM son usados es e l número y tamaño de l o s segmentos d e datos
e x t r a KSAM, Un segmento de datos e x t r a (XDS) e s t a en una área de
memoria usada como una área reservada (BUFFER) durante el acceso
a l archivo KSAM. Cada segmento de datos e x t r a contiene:
4
Información e s t a d í s t i c a d e l archivo usado (Listada p o r e l co-mando VERIFY).
Datos d e l bloque de c o n t r o l y d e l bloque d e s c r i p t o r de l l a v e s ,
l o s primeros dos s e c t o r e s de cada archivo de l l a v e s KSAM.
-
Un área de t r a b a j o (WORKIMG STORAGE) suficientemente grande pa
ra contener un r e g i s t r o de datos y dos entradas de l l a v e s .
Un
.
á r e a reservada p a r a e l bloque de dgtos suficientemente
de para contener un bloque d e l archivo de datos.
gran
-
A l manos uno, ;y h a s t a 20, areas reservadas para bJoques de l l a
ves, s u f i c i e n t e cada uno para contener un bloque de llaveo
Cilando e l archivo de l l a v e s es examinado en bhsca da un r e g i s t r o
< e datos p a r t i c u l a r , e l bloque raíz y l o s bloques de nivel más ba
j o , como se n e c e s i t e , son movidos hacia l a s áreas reeervadas en
e l segyento de d z t o s extra. Las entradas l l a v e son comparada8
Cuando e l bloque de datos e s l o c a l i z a d o
en e l area d e trabajo.
se l e mueve h i c i a su área reservada d e l segmento de datos e x t r a y
cuando e l r e g i s t a o de datos p a r t i c u l a r se l o c a l i z a , se l e mueve
h->cia e l á r e a de trabajo.
-
-
Puesto que cada archivoKSAM a b i e r t o es alojado en un segmento de
datos e x t r a y cada se mento de datos extra puede ser hasta de 32K
p a l a b r a s de longitlid 32,767 palabras) l o s archivos KSAM pueden
usar mucha memoria. Cuando no hay s u f i c i e n t e sitio en memoria pa
r a todos l o s segmentos de datos extra, deben ser intsrcambiados
entre memoria y discc, según se necesite. Este intercambio puede
hacer lento e l acceso a los archivos KSAM.
'f
-
Para mininizar e l intercambio usted puede r e d u c i r e l
número de
-
archivos KSAM a l combinar v a r i o s archivos en uno solo. Esto reduce automaticamente e l número de segmentos de datos e x t r a , y p u ~
de s e r una manera e f e c t i v a para mejorar l a ejecución, p a r t i c u l a r
mente cuando los archivos son compartidos ppr un número de usuarios. ( R e f e r i r s e a l número de segmentos d e datos e x t r a , abajo),
Disminuir e l tamaño g l o b a l d e l segmento de datos e x t r a quiza reduzca e l i.ntercambio de los segmentos de datos extra. S i n embar
go, reduciendo el n6mero de aseas reservadas aL bloque! de llaves
en el segmento Be datos extra guirsa inoremente el intercambio de
l o s bloques de llaves antre e l archivo llave y el segmento de dc
t o s e x t r a durante l a busaueda de un archñvo. Por "DEFAULT", KSAM
asigna a r e a s reservadas de acuerdo a una formula que toma en cue0
t a el tipo d e acceso por e l cual e l archivo e s t a a b i e r t o , e l nÚme
r o de niveles en l a estructura d e l archivo de l l a v e s 0 e l número-
-
22
-
~
I
I
TAVIfiO DEL SEGMENTO
D E DATOS EXTRA
I
E l tamaño de cada segmento de datos extTa asociado con un archivo a b i e r t o KSAM e s determinado por e l numero d9 areas reservadas
a bloques de l l a v e s , conteniendo e l t a m d o de cada area reservada, e l tamaÍio d e l a r e a reservada a l bloque de datos, y a UD grado menor, e l tamaño de l a entrada l l a v e y e l tamaño d e l r e g i s t r o
(Consulte l a f i g u r a B-Al)
de datos.
Inicialmente (Cuando un archivo e s t a abierto), 12 K palabras estan asignadas a l segmento de datos extra. Si e s necesario menos
espacio que e l actual, e l espacio e x t r a no es usado, pero permaSi se n e c e s i t a más, e l segmento de
nece en l a memoria v i r t u a l .
d a t o s extra original es liberado y un nuevo segmento de datos ex
t r a es asignado con e l tamaño actual necesitado,
-
E l tamaño máximo d e cualquier sesmento de dntos e x t r a es de 32 K
palabras. E l tamaño a.ctua1 se c a l c u l a cpn:
E l tamaño t o t a l c é l área de l a s e s t a d í s t i c a s y e l &ea
d e trab.ajo.
E l t o t a l d e l a s areas reservadas a datos.
-
r1;l
tamaño de cada área reservada lo1 bloque de l l a v e s y e l nÚme
r o d e areas reservadas asignadas.
Las e s t a d í s t i c a s y e l área d e t r a b a j o tiene aproximadamente I 1/2
H BYTES de longitud, dependiendo de v a r i a b l e s tales como e l tamg
ño de la entrada llave y e l tamaño de l a entrada de datos, &l
tamaño bel bloque de datos s e basa en e l tamaño de cada bloque
de datos d e l archivo.
Cada área reservada a l bloque de llaves
deba d e s e r l o suficientemente erande para contener todas las en
t r a d a s l l a v e de un bloque más una entrada l l a v e usada cuando nu:
vas llaves son edicionadas a un bloque l l e n o .
(Como se describ i ó a l p r i n c i p i o , v e r figura B-2)-
.-
-
-
E l tamaño del bloque d e l l a v e s por ''DEIPAUL'P" es de 2 BYTES (1024
palabras) y el tamaño máximo d e l &ea reservada a l bloque de l l a
ves e s de 4KBYTES (2048 palabras),
Si un bloque de l l a v e s es
rcás grsnde gue 4 K BYTES KSAM reduce e l tamaño d e l bloque de modo que ningun bloque l l e g u e a ser más grande de l o conveniente
en e l 6rEa reservada a las l l a v e s en e l segmento de datos extra.
Así, la v a r i a b l e p r i n c i p a l en e l tamaño d e l segmento de datos ex
t r n es e l número de áreas reservadas a l bloque de l l a v e s o
---
- 24 -
1
--
natos usados >
-.
por VERIFY
BLOQUE DE CONTROL
DE ESTADISTICAS
Y
-
Registro de d a t o s
a c t u a l y area d e
comparación de
llaves
Bloque d.e
datos actus1
'
-
BLCIQUE DESCRPTOR
DE LLAVE
A
(aprox. 1.5 bytes)
Area de t r a b a j o
($iorking S t o r a g e )
Area rese-rvada a l
bloque de datos
B
(máximo 4 palabras)
Area reservada al
bloque de llaves
A.rea reservada a l
tlloque de llaves
C
0
:{asta 20 areas
I
I
reservadas(buffer)
a bloques de llaves
por
tamafio de buffers
de bloque de llaves
(tamaño mRximo p o r
bloque = 4K bytes)
# de buffers
Tamano t o t a l d e l Segmento de Datos Extra = A + B
+
C,
(máximo 32K palabras)
-
Figura B-11. Segmento de Datos Extra KSAU
- 25 -
111678
Número de areas reservadas a bloques de l l a v e s , E l Número d& es
tos depende del t i p o de acceso p o r e l cual e l archivo esta abies
t o , e l número de l l a v e s en e l archivo, y e l número de niveles e5
l a estructura de ARBOL para cada l l a v e .
(Consulte l a Tabla B-1
pera d e t a l l e s ) .
i(;l menor número de areas reservadas e s asigngdo
para acceso de l e c t u r a solamente, a menos que l a l l v a e primaria
tenga muchos n i v e l e s en su estructura, Más areas reservadas se-,
requieren usualmente para accesos de grabar, leer/grabar o actua
l i z a c i ó n . U 1 número de areas reservadas para acceso de l e c t u r a se
incrementa con e l número de n i v e l e s usados por l a l l a v e , pero
nunca es menor de uno. E l número de aTeas reservadas para acceso de grabacion se incrementa con e l numero de l l a v e s a l t e r n a s
en e l archivo, pero nunca e s .enor de s e i s , Nl número de áreas
reservadas para todos l o s demas t i p o s de accesos se incrementa
con e$ número de l l a v e s a l t e r n a s y con e l número de n i v e l e s de
cada l l a v e , pero nunca es menor de cuatro.
---
menos que e s p e c i f i q u e un número p a r t i c u l a r de areas reservadas
a bloques de l l a v e s , KSPPM asigna areas reservadas en e l segmento
d e datos e x t r a d e acuerdo a %as c a r a c t e r i s t i c a s d e l archivo como
se muestrs en l a Tabla B-I.
A
Tabla I3-1. Número d e b u f f e r s de bloques de l l a v e s asignadas p o r
default
!
T i p o d v Acceso
Areas Reservadas ( b u f f e r s ) Asignadas
E1cceso s o l o
Lectura
1 b u f f e r por n i v e l en l l a v e s con muchos n i v e l e 1
(mínimo 1 y hasta 20 b u f f e r s )
Acceso solo
Escritura
3 b u f f e r s por l l a v e p r i m a r i a + 3 buffers por
l l a v e alterna + 3 b u f f e r s
(ninimo 3 y hasta 30 b u f f e r s )
-
1
1 b u f f e r .or n i v e l en l a estructura de l l a v e
Otros accesos
(Lectura/Escritura n r i m a r i a + 1 b u f f e r p o r n i v e l en l a estructura'
o Actualización.'
? e l l a v e alterns. + 3 buffers
(un mínimo de 3 y un mhximo de 20 b u f f e r s )
Note que puede determinar e l número de n i v e l e s p o r l l a v e con e l
comando VERIFY de KUAMTTIL.
Por ejemplo, s i e l archivo e s a b i e r t o para l e c t u r a solamente, y
l a l l a v e Única n e c e s i t a dos n i v e l e s , dos "BUFFERS" de bloques de
l l a v e s son asignados. S i e l archivo e s a b i e r t o para grabación
unicamenbe, y hay una l l a v e a l t e r n a en e l archivo, nueve "BUFFERE"
de bloques de l l a v e s son asignados.
S i e s t e mismo archivo e8 a-
b i e r t o para acceso de actualización, l a l l a v e primaria usa dos n i v e l e s , y l a l l a v e a l t e r n a usa t r e s , entonces un t o t a l de ocho
"BUFFERS" es asignado
-
26
-
S i desea borrar e l nÚmero de "BUFFERS" de bloque de l l a v e s asig-
nado por "DEFAULTt1 puede usar e l comando de Y[PE:BILE antes de ab r i r e l archivo, o d a r e l parámetro 2BUMBUPFERS (Número de "BUFFERS" )de FOPEN cuando abra e l archivo pogramaticamente.
La ecuación de archivo e s e s p e c i f i c a d a como sigue:
:FILE F1LENAME:DEV =
,, #BUFFERS
1
----
E l segmento de datos e x t r a KSAM asignara espacio p a r a tantos
tlBUFFERS1tde bloque de l l a v e s como usted especifique, hasta un
máximo de 20, (Note que e l t e r c e r parámetro n3V= es interpretado cono e l número de t'BVFEERS" de bloques de l l a v e s s o l o cuando
e l nombre del archivo es u11 archivy KSAM: para archivos MPE 88-0
tander, e s t e parámetro indica e l numero de copias a listar del
archivo )
-
.
Otra manera de reducir e l número de 'BUPFERS" de bloque de lla-ves es usar lo-men00 las l l a v e s alternas, o a j u s t a r el f a c t o r de
bloqueo d o modo que l a estructura d e l archivo de l l a v e s use me-nos niveles. Caalquiera de e s t o s métodos es e f i c á z cuando e l
--
archivo es grabado o actualizado, más que cuando es simplemente
leído"
Note que cuando carga un archivo KSAM con grandes cantidades de
datos, debería incrementarse e l número de "BUFFERS" de l l a v e s . A
de l l a v e s ea el segmento de datos extra, o l o más
más 11BUFF7?,RStt
parecido a é s t o , cuando un nueve dato es adicionado, l a s p o s i c i -o..
nes para l o s v a l o r e s de la nueva l l a v e se hallaran en memoria.
Esto reduce los accesos a d i s c o y puede r e d u c i r s i g n i f i c a t i v a m e n
t e e l tiempo que toma cargar e l archivo.
-
-
Por ejemplo, s i e s t a volviendo a cargar un archivo KSAM después
de una f a l l a del sistema, debería usar e l comando :FILE para incrementar e1 número de "BUFF3RS" a l máximo de 20 'BIYFFERS".
Entnnces, despu6s m e e l a c h i v o es cargedo, puede p e r m i t i r l e r e v e r
t i r e l número de "BUFFERS" de "DEFAULT" e s t a b l e c i d o p o r KSAM pa=
r a e l archivo p a r t i c u l a r .
SEGMENTOS DE DATOS EXTRA CON ACCESO COWARTID0
E l segmento de datos e x t r a asignado a cada archivo a b i e r t o actúa
como un bloque de c o n t r o l para el archivo. E l segmento de datos
e x t r a contiene no s o l o l b s "BUFFERS" de l o s bloques actuales d e
datos y l l a v e s , sino también l a Última información de c o n t r o l pa
r a e l archivo. Esta información incluye l o s apuntadores lógicoy cronológico de r e g i s t r o que indican e l r e g i s t r o que e s t a siendo
accesado en e s e m v e n t n . porque l a p o s i c i ó n d e l apuntador actual
no esta en un n€Xkaque..de'nso común", cuando algunos programas
abren e l mismo archivo, cada uno puede a l t e r a r l a estructura d e l
archivo de l l a v e s adicionando o borrando r e g i s t r o s de modo que
l o s apuntadores dados p o r o t r o s programas pueden apuntar a l re-g i s t r o eqiiivocado s i n que aquellos o t r o s programas esten concien
t e s de e l l o ,
27
---
-
-
Los procedimientos independientes d e apuntador posicionan e l a-puntador s i n importar l e p o s i c i ó n actual. Los procedimientos de
pendientes de apuntador deben saber en cual r e g i s t r o e s t a actuar
mente posicionado e l apuntador para poder operar correctamente.
Todos los procedimientos a l i s t a d o s en l a Tabla B-2 afectan e l 8puntador d e l a misma manera, Para usar e s t o s procedimientos correctamente, e s importante entender como mueve cada uno el a p u w
tador, ye sea posicionando e l apuntador directamente o avanzando
desde l a p o s i c i ó n actual.
En general, cuando e l archivo e s "RANDOM", e l apuntador es posicionado directamente. P o r ejemplo, una llamada's FFINDBYICEY ( O
CKSTART O BYSTART) posiciona e l apuntador l ó g i c o en una l l a v e
p a r t i c u l a r en e l archivo de l l a v e s basado en e l v a l o r de l l a v e
e s p e c i f i c a d o en l a llamada; y una laapada a FPOXNT posiciona e l
apuntador cronoldgico a un r e g i s t r o particular determinado p o r
---
su
-
número de registro cronolbgico.
Cuando e l acceso a l archivo es secuencia1 o e l archivo e s t a s i e n
do modificado, e l posicionamiento d e l apuntador no es d i r e c t o ST'
no es en r e l a c i ó n a su posición p r e v i a . Dependiendo l a secuencra
en la cual los procedimientos son ejecutados, e l apuntador puede
o no puede avanzar a l s i g u i e n t e r e g i s t r o en secuencia cronológlca
o por l l a v e , Internamente tma bandera e s usada para i n d i c a r SI
avanza o no e l apuntador. Esta bandera, l a bandera "DE NO AVANZARtt es colocado en f a l s e (Falso) s i e l apuntador avanza secuencialmente, y en TRUE (Verdadero) s i no avanza. Algunos procedimientos nunca prueban l a bandera; e s t o s son en g e n e r a l , l o s procedimientos independientes de apirntadores que colocan e l apuntador directamente. Otros procedimientos prueban l a bandera y a-vanzan e l apuntador si la bandera es f a l s a ; generalmente, e s t o s
son procedimientos que leen el archivo o posicionan el apuntador
secuencialmente. La Tabla B-3 sumariza cuando el apuntador e8
colocado o avanzado. (Note que solo se a l i s t a n l o s procedimient o s UPL; cheque l a Tabla B-2 para l o s procedimientos BASIC o COBO? equivalentes)
-
S
- 20 -
^I
-....
x
...-,-.
-
.,
._ .
. ...
.
.
Para hacer seguro que l a Última p o s i c i d n de apuntador e s guardada en e l archivo mis bién que en e l segmento de datos e x t r a sepa
rado, los programas que comparten e l mismo archivo KSAM deben usar un esquema cerrado. Cada v e z que un programa atrapa un arochivo XSAM, l a información de c o n t r o l es t r a n s f e r i d a d e l archivo
a l segmento d e datos e x t r a ; y cuando un proghzma s u e l t a un ar--chivo KSAM e l cnntenido d e l segmento de datos e x t r a es grabado
de regreso en e l archivo.
Así, cada programa debería atrapar un'
archivo KSAM antes de e j e c u t a r cualquier procedimiento que posicione un apuntador de r e g i s t r o (Procedimientos independiente -DRapuntador), y no s o l t a r e l archivo h a s t a que todos los procedimientos que dependen de e s t a p o s i c i ó n de apuntador (Procedlmientos
Eependiente -DR- Apuntador),
hayan completado su ej?cu--ción. Esto e s c i e r t o a pesar d e s i e l apuntador es cronologico
(Apuntando a iin r e g i s t r o en e l archivo de datos) o es lógico (Apuntando a una l l a v e en el archivo de l l a v e s ) .
Ambos t i p o s de
apuntador son actualizsdos en e l segmeato de datos e x t r a d e l archivo abierto.
-
-
-
La Tabla B-2 lista todos los procedimientos que a f e c t a n o son
afectados p o r los apuntadores de r e g i s t r o .
--
T a b l a B-2. Dependencia de Apuntador
Procedimientos
Independientes
FFINDBYKEY
CKBTART
BKSTART
IFFINDN
1
A%
: a&
t
Lógico
L6gico
t
Procedimientos
Dependientes
FREAD
I
1
,
CKHEAD
BKREAD
FSPACX
Tipo de
Apuntador
Lógico
Lógico
FWRITE
CP 8 R I TE
BKWXITE
1 FPOINT
FREADDIR
Lógico
Lógico
Cronoijgico
I
I
I
I
3'READBYKEY
CKREADBX'YEY
EKREAD BYKEY
I
FREMOVE
CKDELE'TE
I BKDELETE
1IFUPDATE
CKREWRITE
LdgiCo
Lógico
BJSRERJ3ITE
I FREADC
Cronoiógico"
procedimiento que da e l apuntador l ó g i c o también da el
cronológico; pero s ó l o FPOIXi! da e l apuntador l ó g i c o a s í
*Cada
como e l ~ r o u o l ó ~ ; i c a .
- 29 111678
.
u
_
_
-
Los procedimientos independientes d e apuntador p o s i c i o n a n e l
--
---
apuntador s i n importar l a p o s i c i ó n acturrl. Los p r o c e d i m i e n t o s
dependientes d e apuntador deben s a b e r en c u á l r e g i s t r o está
actualmente p o s i c i o n a d o el apuntador pare poder o p e r a r c o r r e c t a mente.
Todos los procedimientos a l i s t a d o s en l a T a b l a B-2, a f e c t a n e l I
apuntador d e la misma manera. Para usar e s t o s procediznientos cor r e c t a a e n t e , e s importante entender cómo mueve cada uno e l apuntador, yj~a sea posicionando e l apuntador d i r e c t a m e n t e o avanzando
desde l a p o s i c i ó n actual.
En g e n e r a l , cuando e l a c c e s o a l a r c h i v o es "random", el apuntador
e s posicionado d i r e c t s a e n t e . Por ejemplo una llamada a FFINDIIYKEY
( o CKSTART o BKSTART) p o s i c i o n a e l apuntridor l ó g i c o en una l l a v e
p a r t i c u l a r e n e1 a r c h i v o d e l l a v e s basado e n e l v a l o r d e l l a v e
e s p e c i f i c a d o e n l a llamada; y una llamada a FPOINT p o s i c i o n a e l
epuntodor c r o n o l ó g i c o a un r e g i s t r o p a r t i c u l a r determinado por s u ni'íaero de r e g i s t r o c r o n o l ó g i c o .
-
--
Cuando, e l q c c e s o a l a r c h i v o e s s e c u e n c i a 1 o e l a r c h i v o e s t á
s i e n d o modificado, e l p o s i c j . o n a n i e n t o d e l apuntador no e s d i r e c t o
sic0 va en relación B su p o s f c i 6 n p r e v i a . Dependiendo d e la secuencia en l a c u s l l o s procedimientos yon e j e c u t a d o s , e l apuntad o r puede o no puede avanzar a l s i g u i e n t e r e g i s t r o e n s e c u e n c i a
CronolÓgica o por l l a v e , Tnternamente, se usa una bandera para
i n c l i c R r s i avanza o no e l apuntador. m t a bandera, l a bandera d e
"NCJ Avanzar" es colocarle en VALSE ( f a l s o ) s i e l apuntador avanza
s e c u e n c i a l m e n t e , y en TRUE (verdadero) s i no avanza. Algunos
procedimientos nunca prueben l a bandera; é s t o s s o n , en g e n e r a l ,
l o s procedimientos i n d q e n d i e n t e s d e apuntador que c o l o c a n e l
apuntador directamiente. Otros procedimientos prueban l a bandera
.y avafizan e l apuntador s i l a bandera e s FALSE ( f a l s a ) ; g e n e r a l mente, é s t o s s o n procedimientos que l e e n e l a r c h i v o o p o s i c i o n a n .
e l apuntsdor s e c u e n c i a l m e n t e , La T a b l a B-3 sumariza cuándo e s
c o l o c s d o o avanzado e l apuntador. (Note que solo se a l i s t a n los
procedimientos SPL; cheque l a T a b l a B-2 para los procedimientos
e q u i v a l e n t e s BASIC o COBOL. )
-
--
--
--
i?.suma un n r c h i v o con 2 llaves d e f i n i d o como:
KEY=B,I ,53,12
KEY= B ,54,13 ,20
P a r a L l a v e I:
KS=53
FL=lOS4 ( d e f a u l t )
BF=l;Z
Para L l a v e 2:
KS=l3
FL=1024 ( d e f a u l t )
1
BF=20
Puesto cpe l a l l a v e I t i e n e e l tamaño de bloque más grande (384
p a l a b r a s e n 3 s e c t o r e s ) , su f a c t o r d e bloqueo no es cambiado.
Y1 f a c t o r d e bloqueo d e l a llave 2 es a j u s t a d o de modo que tenga
el m i s m o tamafo d e bloque. Se usan los s i g u i e n t e s v a l o r e s :
E S = l I ----Tamano d e entrada c a l c u l a d o p a r a L l a v e 2
BS=384~-------~Tamaiio d e bloque de llave 1 (usada para l l a v e 2)
FL.=1034 eTeniaño d e a r c h i v o en p a l a b r a s p o r d e f a u l t
NB=3 ."-EÚmero d e s e c t o r e s n e c e s a r i o s p a r s cada bloque d e
383 palabras
Sumando l o s d o s tarnaaus de a r c h i v o y adicionando d o s s e c t o r e s par
informqción d e c o n t r o l y d e s c r i p c i ó n de l l a v e , e l tamaño t o t a l de
archivo en s e c t o r e s e s :
516 + 186 + 2 = 704 s e c t o r e s
* E1 algoritmo p a r a calcular BF puede s e r expresado mks simple
s i el resultado puede s e r checado por un n b e r o par:
BF= BS:-S/fi;S s i BF e s un número impar, e n t o n c e s BP=BF-I
Figura fi-9,
C6lcul.o d e l tsmiiGo t o t a l Be un a r c h i v o de l l a v e s
c:)n dos l l a v e s
Tabla B-3. Sumario de Apuntadores de R e g i s t r o
L
I
I n i c i o de Llamada
Chequeo de
Bandera DNA
Apuntador
D/Iiegistro
-
-
-
F i n de Llamada
Procedimiento
Apuntador Colocación
D/Registro Bandera DNA
FFINDSYmY
Posicionado VERDADERO
FFINDN
Posicionado VERDADERO
-
?os i c ionado FREADB-YKEY
-
-
VERDADERO
Avanza
FALSO
VERDADERO
--
-
-
FSPACE
-
FREMOVE
-
-
FUl'DATE
-
-
-
;
~~~~
-
~
4
I
FALSO
VERDADERO
1
FALSO
Posi&&onado VERDADERO
Avanza
( v a l o r d/'llave
cambiado)
-
Avanza
VERDADERO
FALSO
VERDADERO
Poaicionado VERDADERO
FPOINT
Dsicionado FREADDIR
VERDADERO
FALSC
-
FRF4AD
n
.
Avanza
FALSO
Avanza
F7ÑRIT3
-
-
FALSO
~
FALSO
FREADC
Avanza
~
Avanza :
Mueve apuntador l ó g i c o a l s i g u i e n t e r e g i s t r o en
s e c u e n c i a de l l a v e o mueve apuntador c r o n o l ó g i c o
al s i g u i e n t e r e g i s t r o en s e c u e n c i a c r o n o l ó g i c a .
P o s i c i onado: Coloca apuntador en r e q i s t r o e s p e c i f i c a d o en l a
1- I .-, '3 (i -%
$7,
Por ejemplo, s i llama a FREADEYKEY, e s t e p o s i c i o n a e l apuntador
un v a l o r de l l a v e e s p e c i f i c a d o . Después de la llamada, el apuntador lógico permanece posicionado en esta l l a v e y l a bandera
de no avanzar es c o l o c a d a en f a l s o ,
S i l a siguiente llamada es
a PREAD, FSPACE O FRqADC, entonces e l apuntador e s avanzado a l a
s i g u i e n t e l l a v e en s e c u e n c i a de l l a v e a n t e s de que estos procedi
mientos e j e c u t e n sus funciones. A s í , después de FREADBYKEY, u
llamada a FREAD l e e r í a e l s i g u i e n t e r e g i s t r o , no volvería a l e e r
e l mismo scgistro, .y una llamada a PSEACE movería e l apuntador
r e l a t i v o a l rrgistro siguiendo l a l e c t u r a d e l r e g i s t r o ,
a
-
30
-
program Simula-Directorio;
label
F INPROGRAM ;
const
{constantes requeridas para el manejo de Bitreel
= 52;
MaxLonqRecDat
MaxLongKey
= 41;
LonqPagina
= 24;
Orden
= 12;
LonqPilaPaqina
= 10;
MaxAl tura
= 4;
icomtantes definidas del usuario3
DUPLICADAS
= 1;
NO-DUPLICfrDAS
= o;
type
STRING79
STRING40
STRIN68
STRINE6
STRING3
TIPO-RESPUESTA
IOVIIIENTO
.permite que ex is.^ llaves dup icada5
{no permite la existencia de llaves duplicadas1
= stringi791;
= stringC401;
=
=
=
=
type
KEYREC
strinqCE1;
strinqC61;
stringC31;
(NO-RESPUESTA, FLECHA, TECLA, RETURN);
(NINGUNO, IZQUIERDO, DERECHO, ARRIW, ABAJO) ;
= record
DIRRWT,
DIR-DES1,
DIR-DES2 ,
DIR-DES3,
DIR-DES4
end;
type
DIRREC
: STRINGE;
= record
DIRKEY
ARCHIW
EXTENSION
end;
: CTRIffi40;
: STRIN68;
: STRIN63;
{$I ACCESO.TOL1
($1 OETENKEY.TOL)
{$I ADDKEY.TOL1
{$I CCINKEY.TOL3
($1 STRINGS.TOL>
{$I INOUT.TOL>
t51 HENUS.TOL3
PRc\Rc\METROS :
DPATH
DIR-LLAVE
(in) - el camino como io digita el usuario
(out) - la llave de salida ya editada;
*-
procedure Concatena-Llave ivar DPATH
var DIR-LLAVE
: CTRING79;
: STRING4Ci);
var
TEHPPATH
CTRINGI
CTRINGF
TEMP-KEY
: CTRING79;
: STRINGB;
: CTRINGB;
: KEY-REG;
begin
TEHPPATH :=
STRINGI :: "; STRINGF := "; DIRLLAVE := ";
'; CTRINGF := '
T E W P A T H := DPATH; STRINGI :=
if (TEIIPPATH = "1 then
(en caso de mande camina vacio, se va a la raiz)
TEMPPATH := ' \ ' ;
' I ;
I .
with TEMP-KEY do
begin
DIRROOT := "; DIR-DECl := "; DIR-DES2 := "; DIR-DES3 := "; DIR-Eclr := ";
DIR-ROOT := Copy (TEMPPATH, 1, 1);
Delete (CTRINGI, 1, Length (DIR-ROOT));
CTRINGF := Concat (DIRROOT, STRINGI);
DIRROOT := CTRINGF;
CTRINGF := '
'; CTRINGI := '
';
Delete (TEMPPATH, 1, 11;
DIR-DES1 := Copy (TEMPPATH, 1, P O S ( ' \ ' , TEW-PATH) - 1);
Delete (CTRINGI, 1, Length(DIR-üEC1) );
CTRINGF := Concat (DIR-DESl, CTRINGI 1;
DIR-DES1 := CTRINGF;
>.
'; CTRINGF := '
STRINGI := '
Delete (TEMPPATH, 1, P a s ( ' \ ' , TEMPPATH));
DIR-DES2 := Copy (TEHPPATH, 1, P O S ( ' \ ' , TDIPPATH) - 1);
Delete (CTRINGI, 1, Length(DIR-DES2));
CTRINGF := Concat (DIR-DES2, CTRINGI 1;
DIR-DES2 := STRINGF;
CTRINGI := '
'; STRINGF := '
Delete (TEMPPATH, 1, Pos ( ' \ ' , TEMPPATH));
DIR-DES3 := Copy (TEMPPATH, 1, P O S ( ' \ ' , TEFIPPATH) - 1);
Delete (CTRINGI, 1, Length(D1R-DEC3));
CTRINGF := Concat (DIR-DES3, STRING11 ;
DIR-DES3 := CTRINGF;
'; C T R I W := '
CTRINGI := '
Delete (TEMPPATH, 1, Pos ( ' \ ' , TEMPPATH));
DIR-DES4 := Copy (TEMPPATH, 1, P O S ( ' \ ' , TEIIPPATH) - 1);
Delete (STRINGI, 1, Length(D1R-ES41 I ;
CTRINGF := Concat (DIR-DES4, CTRINGI);
DIR-DES4 := CTRINGF;
CTRINGI := '
'; CTRINGF := *
';
Delete (TEMPPATH, 1 , Pffi í ' i ' , TEMPPATH));
DIRLLAVE := Concat (DIRRMIT, DIR-DEC1, DIR-DES2, DIR-DES3, DIR-DES4) ;
1 .
1.
end;
end;
PARMETROC:
DI R-DAT
DIR-IND
n i n nn-r
(in/out)- archivo de datos;
(inlout) - archivo de indices;
- - -I . -!
-I:---i--;-
--
1
-._
1-
I
4
.
.".- ,.
^ L A "
I
. - - ---
procedure Leer-Directorio
(
var DIR-DAT : FileDatos:
var OIR-IND : Filelndice;
var DIRPATH : CTRING79;
NUHERO-ENTRADA : integer ) ;
var
RECORDLEC
LINEG,
COLUMNA,
COLUMNAEXT
RESPUESTA
I
: DIR-REC;
: integer;
: STRING79;
: integer;
begin
RESPUESTA := ' ' ;
LINEA := 8; COLUMNA := 4; COLUHNA-EXT := 13; I := O;
with RECORDLEC do
begin
repeat
ARCHIVO := ";
EXTENSION := ";
SigKey (DIR-IND, WERO-ENTRADA, DIRKEY );
Ob tenRec (DIR-DAT, "30-ENTRADA,
RECORDLEC 1;
(se encontraron datos en el directorial
i f OK then
begin
1 Si es el priaer record, nu lo imprime, de lo contrario despliega sus valores)
'1 and (EXTENSION O
i f ((DIR-KEY = DIRPeTH) and (ARCHIVO 0 '
begin
ColocarString (ARCHIVO, LINEA, COLUilNA, 3) ;
ColocarSt r ing (EXTENSION, LINEA, COLUIINA-EXT 3);
LINEA := LINEA t 1;
if (LINEB ) 161 then
begin
LINEA := 8;
WLUMA := COLUMNA t 13; COLMINAEXT := COLUHNAEXT t 13;
if (COLUMN4 ) 67) then
begin
Obtener-StringRespciesta (RESPUESTA, O, 1,
24, 35,
'Presione (ENTER) para continuar', 24, 2);
LINEA := 7; C
O
L
W
A := 4; COLUMNA-EXT := 13;
end;
ColocarString ('ARCHIVO.EXT',
LINEA - 1, C O L M , O);
,
",
end;
I := I + 1;
end;
end;
until (not OK);
Str (I, RESPUESTA);
ColocarString ('Numero de archivos en el directorio :
17, 4, 3);
end;
end;
'
+ RESPUESTA,
'
' ) I then
I
: F i ieDatros;
: FiieIndice;
procedure Deáp 1iega-Di rectorig ivar DIR-DPiT
i!ar DIR-IND
var DPATH
var
DIRLISTA
RECLLAVE
DI R P ATH,
RESPUESTA
NUMEROENTRADA
I
: STRINGA);
: DIR-REG;
: KEY-REG;
,
: STRING79;
: integer;
begin
RESPUESTA := ' ' ;
NUMERO-ENTRADA := O ;
I:= o;
with DIRLISTA do
beqin
ClrCcr;
ConstruyePantalla (18, 80);
Colocar-StringCentrado ('Desplegado de la lista del Directorio', 4 , O ) ;
Concatena-Llave (DPATH, DIR-KEY );
DIRPATH := DIRKEY;
BuscaKey (DIR-IND, NUMERO-ENTRADA, DIRKEY 1;
( la entrada existe 1
if OK then
begin
ARCHIVO := ";
EXTENSION := ' ' ;
ObtenRec (DIR-DAT, NUEROENTRADA, DIRLISTA) ;
Colocar-String ('DIRECTORIO :
6 , 4, 0);
Colocar-String (DPATH, 6 , 17, 3);
ColocarString ('ARCHIVO.EXT', 7 , 5, 0);
Colocar-String (ARCHIh, 1 1 , 11, 0);
ColocarString (EXTENSION, 12, 1 1 , O ) ;
Leer-üi rector io (DIR-DAT DIR-IND D IRPATH NUMEROENTRAMf ;
end
else
',
,
,
,
1 el directorio no existe 1
begin
ColocarStriq ('Directorio o canina erroneo', 13, 10, O ) ;
ColocarStriq (DPATH, 10, 11, O ) ;
end;
RESPUESTA := ' ' ;
ObtenerStringRespuesta (RESPUESTA, 1 , 1,
'Presione <ENTER> para continuar', 24, 2);
", 24, 35,
end;
end;
procedure Cambiar-Directorio (var DIR-DAT
var DIR-IND
var DPATH,
DDIR
: FileDatos;
: FileIndice;
: STRIN679);
vir
STRINGPATH,
RESPUESTA
CAMBIOKEY
NUEVO-DIR
STRINGPAD,
STRINGI,
STRINGF
NUMERO-ENTRADA
: STRING79;
: KEY-REC;
: DIRREC;
: STRIW;
: integer;
begin
RESPUESTA := ' ' ;
STRINGI :=
'; STRINGF :=
STRINGPATH := DPATH;
'
'; STRINGPPD :=
1
I . .
if (Pos ( ' \ ' , DPATH1 0 11 then
DPATH := Concat ( ' \ ' , DPATH);
isi se esta en el archivo raiz y se quiere subir de nivel, manda error1
if (Pos
DPATH 1 = 1 1 then
24, 54,
Obtener-StringRespuesta (RESPUESTA, O, 1,
'Error en el camino, presione (ENTER> para continuar', 24, 2)
( I . ' ?
",
else
begin
with NUEVO-DIR do
(inicia edicion de llave para el cambio de directorio)
begin
with CAYBIOKEY do
begin
DIR-ROOT := "; DIR-DES1 := "; DIR-DES2 :=
DIR-DES := "; DIR-DES4 := ";
DIRROOT := Copy (DPATH, 1, 1);
Delete (DPATH, 1, 1);
Delete (STRINGI, 1, 1);
STRINGF := Concat (DIR-ROOT, STRINGI);
DIR-ROOT := STRINGF;
STRINGF :=
'; STRING1 := '
i f (Pos('\', DPATH) 0 O) then
begin
DPATH) - 1);
DIR-DES1 := Copy (DPRTH, 1, POS
Delete (DPATH, 1, Pos('\', DPATH));
end
else
begin
DIR-DES1 := Copy (DPATH, 1, Length (DPATH));
Delete (DPATH, 1, length (DPATHI);
end;
Delete (STRINGI, 1, Length (DIR-DESíi);
STRINGF := Concat (DIR-DES¡, STRINGI1;
DIR-DES1 := STRINGF;
STRINGI := '
'; STRINGF := '
';
if (Pos('\', DPRTHI 0 O) then
beg 1n
DIR-DES2 := Copy (DPATH, 1, Pos ( ' \ ' , DPATH) - 1);
'
I
;
1 .
( ' \ I ,
^<-.-.uux
*
.
.
*
*
1
"
*
-
w*
"*
.-
"
I
I
en?
else
begin
I
DIR-DES? := C,opy (DPATH, 1, Length (DPATH));
D e l e t e íDWTti, 1, Length (DPATH));
end :
D e l e t e [STRINGI, 1, Length (DIR-DESí!));
STRINGF := Concat (DIR-DES2, CTRINGI) ;
DIR-DES2 := STRINGF;
STRINGI := '
'; STRINGF := '
if ( P o s ( ' \ ' , DPATY) 0 0) then
beg i n
DIR-DES3 := Copy (DPATH, 1, P o s
DPATH) - 1);
D e l e t e (DPATH, 1, Pos('\', DPATH));
end
else
beg 1n
DIR-DES3 := Copy (DPATH, 1, Length (DPATH));
D e l e t e (DPATH, 1, Length (DPATH));
end;
D e l e t e (STRINGI, 1, Length (DIR-DES3));
STRINGF := Concat (DIR-DES3, STRINGI);
DIR-DES3 := STRINGF;
'; STRINGF := '
'
i
CTRINGI := '
if (Pos('\', DPATH) { > O) then
beg 1n
DIR-DES4 := Copy (DPATH, 1, POS
DPATH) - 1);
D e l e t e (DPATH, 1, Pos('\', DPATH));
end
else
begin
DIR-DES4 := Copy (DPATH, 1, Length (DPATH));
D e l e t e (DPATH, 1, Length (DPATH));
end;
D e l e t e (STRINGI, 1, Length (DIR-DES4));
STRINGF := Concat (DIR-DES4, STRINGI);
DIR-DES4 := STRINGF;
'; CTRINW := '
';
CTRINGI := '
if (DIR-DES4 = STRINGPAD) then
DIR-DES4 := STRINGI;
2 .
( I \ ' ,
( ' \ I ,
{Si se desea pasar d e un dir., h i j o a l dir., padre, se v a l i d a el camina1
:. ya que salo debe ser p o s i b l e pasar a l d i r e c t o r i o inmediato s u p e r i o r d e l
(cada s u b d i r e c t o r i o , simula a l a i n s t r u c c i o n (Chdir
d e l DOS!
..>
( (DIR-DES3 = STRINGPAD) and (DIR-DES4 = CTRINGI 1) then
DIR-DES3 := CTRINGI
else
beg i n
if (DIP-DES3 = STRINGPAD) then
begin
O b t e n e r S t r i n g R e ~ u e t a(RESPUESTA, O, 1,
24, 54,
'Error e n el camino, p r e s i o n e {ENTER) para continuar', 24, 2);
DIR-ROOT := 'ERROR' ;
end;
end ;
if ((DIR-DES2 = STRINGPAD) and (DIR-DES3 = STRING11 and
(DIR-DES4 = STRINGI)) then
DIR-DES2 := CTRINGI
else
beg 1n
i f (DIR-DES2 = STRINGPAD) then
begin
24, 54,
Obtener-StringRespuesta (RESPUESTA, O, 1,
'Error e n el camina, p r e s i o n e {ENTER) para Continuar', 24, 2);
if
",
"
nio onnr
.- grnnnn,.
*
Y
,
1
- ,
._ .~
--
end;
end ;
i f ((DIR-DES1 = STRINGPAD) and (DIR-DES2 = STRINGI) and (DIR-DES3 = STRINGI)
and (DIR-DES4 = STRINGI)) then
DIR-DES1 := CTRINGI
el e
Eeg i n
if (DIR-DES1 = STRINGPAD) then
begin
Obtener-~tring-Respuesta (RESPUESTA, O, 1,
24, 54,
'Error en el camino, presione <ENTER> para continuar', 24, 2);
DIR-ROOT := 'ERROR';
end;
end;
",
DIR-KEY := Concat (DIRROOT, DIR-DESl, DIR-DES2, DIR-DES3, DIR-DES4) ;
DPATH := ";
DPATH := Concat (DPATH, DIRROOT);
i f (DIR-DES1 0 STRINGI) then
DPATH := Concat (DPATH, DIR-DEC1);
if (DIR-DES2 0 STRINGI) then
DPATH := Concat (DPATH, DIR-DEW;
i f (DIR-DEW 0 STRINGI) then
DPATH := Concat (DPATH, DIR-DEW);
i f (DIR-DES4 O STRINGI) then
DPATH := Concat (DPATH, DIR-DES4);
DDIR := DIRROOT;
ColocarString ( DIRKEY, 10, 10, 3);
end;
if (DDIR <> 'ERROR') then
(Busca el directorio al cual se desea hacer el cambio1
begin
BuscaKey (DIR-IND, NUMERO-ENTRADA, DIRKEY 1;
ColocarString (DIRKEY, 14, 10, 01;
i f OK then
DPATH := DIRKEY
else
begin
Colocar-String ('Directorio o camino errorneo', 13, 10, 0);
ColocarString (DPATH, 10, 11, O);
end;
end ;
RESPUESTA := ' ' ;
ObtenerCtringRespuesta ( RESPUESTA, 1, 1,
24, 35,
'Presione (ENTER} para continuar', 24, 2);
end;
end ;
i f (DDIR = 'ERROR') then
DPATH := STRINGPATH;
end;
**,
procedure CrearNuevo-Directorio (var DIR-DAT
-7-
..ir(
: FileDatos;
r
.
.
.
*.
-
4
var
RESPUESTA,
STRINGPATH,
NUEVO-DIR
STRINGI,
NGF
STRI
NUEVO-RECORD
NUEVA-L LAVE
NUMERO-ENTRADA
TEMPKEY,
TEMPKEY 1
R
TEMP-DI
: STRING79;
: CTRINGB;
: DIRREC;
: KEYREC;
: integer;
: STRING40;
: STRIffiE;
begin
RESPUESTA := ' ' ;
NUEVO-DIR := ' ';
CTRINGI := '
';
STRINGF := '
NUEVO-DIR := ' ' ;
CTRIWIITH := DPIITH;
TEMP-KEY := ";
TEMPKEY 1 := ' ' ;
TEMP-DIR := ";
) or
-2ngth (DPATH)= U 1) then
i f ((Pos('\', DPCITH) {
DPCITH := Concat ( ' \ DPATH);
Obtener-String-Respuesta (NUEVO-DIR, 3, 8, 'NM1BRE :
6, 4,
'Digite el nombre del directorio, debe ser nombre valido de DE', 24, 2);
Str-AMayusculas (NUEVO-DIR)j
TEMP-DIR := NUEVO-DIR;
with NUEVO-RECORD do
I .
I ,
',
(inicia edicion de la llave para crear el subdirectorio}
begin
with NUEVA-LLAVE do
begin
DIR-ROOT := "; DIR-DES1 := "; DIR-DES2 := ";
D I R O S 3 := "; DIR-DES4 := "; DIR-KEY := ";
if ((Length (DPATH) = 1) or (LengthWATHi = 8)) then
begin
'
i
DIR-ROOT := ' \
DIR-DES1 := STRINGI; DIR-DES2 := STRINGI;
DIR-DES3 := STRINGI; DIR-DES4 := STRINGI;
DIR-KEY := Concat (DIRROOT, DIR-DES1, DIR-DES, DIR-DES3, DIR-DESI);
end
else
beg 1n
DIR-ROOT := Copy (DPCITH, 1, 11;
Delete (STRINGI, 1, Length(DIRRO0T)1;
STRINGF := Concat (DIR-ROOT, STRINGI);
DIRROOT := STRINGF;
CTRINGF :=
'; CTRINGI := '
1
Delete (DPATH, 1, 1);
DIR-DES1 := CopyíDPATH, 1, Pos('\',DPATH) - 1);
Delete (STRINGI, 1, Length(DIR-DES1));
CTRINGF := ConcatiDIR-DES1, STRINGI);
DIR-DES1 := STRINGF;
'; STRINGF := '
i
CTRINGI := '
Delete (DPIITH, 1, Pos('\', DPATH));
DIR-DES2 := Copy(DPATH, 1, P O S ( ' \ ' DPATH) - 11;
Delete (STRINGI, 1, Length(DIR-DESh);
STRINGF := ConcatíDIR-DES& STRINGI);
DIR-DES2 := CTRINGF;
CTDTtiCI
a=
'
'.
CTRTWC
n=-'*
.
'i
,
,
'
*
*
&
.
"
.
u
._a-
I
v
-IIX.L...-.E
Belete @PATH, 1, Pos(",', DPATHii;
DIR DES3 := CopyíDPATH, 1, Píls('\',DPATH)
Deléte (STRINGI, 1, Length IDIR-DES31) ;
CTRINGF := Concat íDIR-DES, STRINGI);
DIR-DES3 := STRINGF;
STRINGI := '
'; CTRINGF := '
Delete (DPATH, 1, Pos('\', DPATH));
1);
-
';
DIR-DES4 := Copy(DPCITH, 1, Pof;('\',DPBTH) - 1);
Delete (STRING1, 1, Length (DIR-DEC4) ) ;
STRINGF := Concat (DIR-DEC4, STRINGI);
DIR-MC4 := CTRINGF;
STRINGI := '
'; STRINGF := *
Delete (DPCITH, 1, Pos('\', DPATH));
if (DIR-DES4 = CTRINGI) then
DIR-KEY := Concat (Dill-ROOT, DIR-DE%, DIR-MS2, DIR-DES& DIR-DESI
1 .
else
:si l a llave fue mal creada se rnaneia bandera de error)
DIRKEY := 'ERROR';
end ;
if (DIR-KEY O 'ERROR' 1 then
begin
i f (Length (NUEVO-DIR) 0 8) then
begin
Delete (STRINGI, 1, Length (NUEVO-DIR));
CTRINGF := Concat (NUEVO-DIR, CTRINGI);
NUEVO-DIR := STRINGF;
'; STRINGI :=
STRINGF := '
'
1
end;
TEMPKEY := DIR-KEY;
i f (DIR-DES1 = CTRINGI) then
DIR-KEY := Comat (DIRROOT, NUEVO-DIR, STRINGI, STRINGI, CTRINGI)
else
begin
if (DIR-DES = STRINGI) then
DIR-KEY := Concat (DIRROOT, DIR-DECI, NUEVO-DIR, CTRINGI, STRING11
else
begin
if (DIR-DES3 = STRINGI) then
DIR-KÉY:= Concat (DIRROOT, DIR-DE%, DIR-DES2, NUEVO-DIR,
STRING11
else
begin
i f (DIR-DEM = CTRINGI) then
DIR-KEY := Concat (DIRROOT, DIR-DES1, DIR-DES, DIR-DES:,
NUEVO-D I R I ;
end;
end;
end;
TEMPJEYl := DIR-KEY;
EncontrarKey (DIR-IND, NUMEP.0-ENTRCIDA, DIR-KEYI ;
(Si el subdirectorio ya existe, manda mensap? de error1
if Oi: then
Co1ocarStrii-q ('ERROR: Directorio duplicado
else
begin
ARCHIVO := TEMP-DIR;
EXTENSIUN := 'DIR ;
QIR-KEY := TEMP-kEV;
Colocar-String (TEMP-EY, IO, 10, 3);
AddRec
, 10, 8,
2)
(DIR-DAT, NUMEPO-Et4TRADCI, NUEVORECORD);
HddLey rDfR-IND, N~HERU-ENTRCID~,DIR-YEY) ;
ilIRJEY := '; APCHIVO := ' ; EXTENSION := ';
UIR-1 EY := "EMF-! EY 1;
- - - *ira
it^.iurrrld.Au'&+-I*L
Ah&-%-="-
Csi ei
directorio no e!ii5tei
se pr;i~úra r:~ai.inr
..
:.e.;
i
f Di::
t/\Eri
tpj 1q
&2,CHli.,&-j :L
'
s
+
E:(TERCI(& := .
';
(iddRec íEtzR-üAT, NUPiEROENTRADA, NUEVO-RECORD);
(iddKej (CX-IND, NUMERO-ENTRADA, DIR-KEY 1;
em;
end:
ent:
else
Colocar-String ('Erm: No mas espacio en niveles', 10, 8, 2);
RESPUESTA := ' ' ;
Obtener-String-Respuesta (RESPUESTA, O, 1, ", 24, 35,
'Presione (ENTER> para continuar', 24, 2);
end;
end;
DPATH := STRINGPATH;
end;
b
f
DESCRIPCION:
Este procedimiento recorre el archivo secuencialmente, y mantiene algunos
controles utiles en las rutinas que se manejan mas adelante.
procedure Recorrer-Directorio ívar DIR-MT: FileDatos;
var DIR-IND : FileIndice;
var EXISTE : boolean;
ARCH-BUSC : CTRIW;
EXT-EUCC : STRING3;
KEYBUSC : STRIN640;
var TEMP-NUN-ENT : integer);
var
RECORD-DIR
RESPUESTA
TEMP-KEY
NUMERO-ENTRADA
: DIR-REG;
: STRINGA;
: STRIN640;
: integer;
begin
i se supone que el archivo existe}
EXISTE := true;
TUIP-NUM-ENT := O;
with RECORD-DIR do
begin
DIR-KEY := KEY-NSG;
BuscaKey (DIR-IND, "!€ROENTWUHl, RECORD-DIR) ;
TEWKEY := KEY-BUSC;
repeat
SigKey (DIR-IND, NUKRO-ENTRhDDCI, DIR-KEY 1;
TEMPNUM-ENT := NUMERO-ENTRADA;
ObtenRec (DIR-DbT, NUrBRO-ENTRbDA, RECORD-DIR);
if OK then
begin
inicia la conparacion 1
if (íARCHIV0 = ARRCH-BUCC) and (EXTENSION = EXT-BUS)) then
EXISTE := true
else
EXISTE := false;
anA*
-
- *.
-
'
.
*
.
~
I
C
w
~
-"-&I
I
. ILLI
*-.,.
DESCRIPCION:
Esta rutina sirvbe para salvar archivos con extension 'FIL', es decir, que no
son directorios, simula a l comando (SAVE}.
procedure Salvar-Archivo (var DIR-DAT : FileDatos;
var DIR-IND : FileIndice;
var DPATH : STRING79);
var
RESPUESTA
NOMBRE-ARCH1VO
NUEVORECORD
LLAVE RECORD
STRINGI,
STRINGF
NUMEROENTRADA
EXISTE
DIRLLAVE
: STRIN679;
: STRIN679;
: DIR-REC;
: KEYREC;
: STRINGEI;
: integer;
: boolean;
: STRING40;
begin
RESPUESTA := ";
'; STRINGF := '
NOMBRE-ARCHIVO := "; STRINGI := '
Obtener-String-Respuesta (NUHBRE-ARCHIVO, 3, 8, 'NOMBRE :
6, 4,
'Digite e l nombre del archivo, debe ser un nombre valido de DOS', 24,21;
Str-A-Ha yusculas (NOHERE-ARCHIVO 1;
with NUEVO-RECORD do
begin
ConcatenaLlave (DPATH, DIRLLAVE1;
DIRKEY := DIRLLAVE;
1 .
',
ARCHIVO :=
'
,
EXTENSION := ' ';
BuscaKey (DIR-IND, NUMEROENTRADA, DIR-KEY 1;
i f OK then
begin
ARCHIVO := NüMüRE-ARCHIVO;
EXTENSION := 'FIL' ;
Recorrer-Directorio (DIR-DCIT, DIR-IND, EXISTE, ARCHIVO, EXTENSION, DIRKEY, NUIIEROENTRADA) ;
i f (not EXISTE) then
begin
MdRec (DIR-MT, NWlEROENTRADCI, NUEVO-RECüRDi;
AddKey (DIR-IND, NUMERO-ENTRAM, DIR-KEY );
Obtener-StringRespuesta (RESPUESTA, 3, 1,
24, 42,
'Archivo salvado, presione <ENTER>para continuar
24, 2);
end
else
Obtener-StringRespuesta (RESPUESTA, 3, 1, ' 24, 42,
' Archivo ya existente, presione CENTER} para continuar', 24, 2);
end
else
24, 48,
Obtener-StringRespuesta (RESPUESTO, 3, 1,
'ERROR: Camino errorneo, presione CENTER>para continuar
24, 2);
end;
",
',
*,
' I ,
end;
',
1
rL
DESCRIPCION:
Este procedimiento renombra un archivo ya exixtente enn un directorio,
simula al comando (RENCIME}.
procedure Renombrar-Archivo (var DIR-MT : FileDatos;
var DIR-IND : FileIndice;
var DPATH : STP.ING79);
var
RESPUESTA
NOMBRE-ARCH
NUEVO-NOMBRE
NOMBRE-EXT
RENREC
REN-KEY
DI R-L LAVE
TEHPNMENT
NUMERO-ENTRAN
EXISTE
,
,
: STRING79;
: STRINGE;
: CTRIffi3;
: DIR-REC;
: KEY-REC;
: STRIffi40;
: integer;
: boolean;
begin
RESPUESTA := ' ' ;
NOMBRE-ARCH := "; MEW-NOMBRE := "; NOMBREEXT := ";
TEHP_NtlM-ENT := O ;
Obtener-StringRespuesta (RESPUESTA, 3 , 17, 'NOIIBRE : 6, 4,
'Digite nombre del archivo y nuevo nombre, formato DOS sin extension', 24, 2);
Str-AMayusculas (RESPUESTA) :
NOMBRE-ARCH := Copy (RESPUESTA, 1 , POS ( '
RESPUESTA) - 1);
NUEVONOMBRE := Copy (RESPUESTA, Pos í ' ' RESPUESTA) t 1 , Length (RESPUESTA)i;
',
',
,
RESPUESTA := ' ;
DIRLLAVE := ' ' ;
ConcatenaLlave (DPATH, DIR-LLAVE i;
with REN-REC do
begin
DIR-KEY := ";
DIR-KEY := DIRLLAVE;
ARCHIVO := '
Y
EXTENSION := ' ' ;
BuscaKey (DIR-IND, NUMEROENTRADA, DIR-KEY ;
i f OK then
begin
EXTENSION := 'FIL';
ARCHIVO := NOMBRE-ARCH;
Recorrer-Directorio (DIR-MT, DIR-IND, EXISTE, WCHIVO, EXTENSION, DIR-KEY, TEMP-NLMENT) ;
i f (EXISTE) then
begin
ARCH I VO := NUEVONOMBRE ;
EXTENSION := 'FIL';
NUMEROENTRADA := TEHPNM-ENT;
ColocaRec (DIR-DAT, NUHERO-ENTRADA, RENREC) ;
Colocar-String ('Archivo renombrado...', 10, E, 1);
end
else
ColocaError ('ERROR: Archivo no existe, presione cualquier tecla para continuar', 24, 2);
end;
end;
{
DESCRIPCION:
Este procedimiento cancela un archivo de un directorio dado por DPATH;
simula el funcionamiento del comando {DEL>.
procedure Borrar-Archivo (var DIR-DAT : FileDatos;
var DIR-IND : FileIndice;
var DPATH : STRINGA);
var
RESPUESTA
: STRING79;
: STRING8;
NMBRE-ARCH
RENREC
: DIRREC;
RENKEY
: KEYREC;
DIR-L LAVE
: STRIN640;
TEMP-NlHENT
MMEROENTRADA : integer;
EXISTE
: boo 1ea n ;
,
begin
RESPUESTA := ' ' ;
NOMBRE-ARCH := ' ' ;
TEMPNUMENT := O;
Obtener-StringRespuesta (RESPUESTA, 3 , 8, "OMERE : 6, 4,
'Digite nodre del archivo a borrar, sin extension', '24, 2);
Str-A-tlayusculas (RESPUESTA);
NOMBRE-ARCH := RESPUESTA;
RESPUESTA := ' ' ;
DIRLLAVE := ' ' ;
Concatena-Llave (DPATH, DIRLLAVE) ;
with RENREC do
begin
DIRJEY := ";
DIRKEY := DIRLLAW;
ARCHIVO := '
';
EXTENSION := '
;
BuscaKey (DIR-IND, NUMEROENTRADA, DIR-KEY 1;
if OK then
begin
EXTENSION := 'FIL';
ARCHIVO := NOMBRE-ARCH;
Recorrer-Directorio (DIR-DAT, DIR-IND, EXISTE, MCHIVO, EXTENSION, DIRKEY, TEMP-NLiMENT) ;
',
if (EXISTE) then
begin
NUMEROENTRADA := TEIP-NMENT;
CanKey (DIR-IND, NUIIERDENTRADA, DIRKEY) ;
CanRec (DIR-DAT, NUMEROENTRADA) ;
Colocar-String ('Archivo cancelado...', 10, 8, 1);
end
else
ColocaError ('ERROR: Archivo no existe, presione cualquier tecla para continuar', 24, 2);
end;
end ;
Obtener-StringRespu~ta (RESPUESTA, U, 1 ,
24, 42,
'Presione <ENTER> para continuar', 24, 2);
end:
",
<
i
DESCRIPCION :
Esta rutina busca un archivo en todo el arbol, y manda los caminos en los que
existe el archivo
procedure Buscar-Archivo (var DIR-DAT : FileDatos;
var DIR-IND : FileIndice;
var DPATH : STRIN679);
va r
RESPUESTA
NMIBRE-ARCH
NOMBRE-EXT
BLISCAREC
BUSCALLAVE
I,
MIMERO-ENTRAM
StrI
: STRING79;
: STRING8;
: STRING3;
: DIR-REC;
: KEY-REC;
: integer;
: STRIffi3;
begin
RESPUESTA := "; NMlBREARCH := "; NOHBREEXT := ";
I := 0;
Obtener-String-Respuesta (RESPUESTA, 3, 12, 'NMBRE :
6, 4,
'Digite e l nombre del archivo a buscar con extension, en formato DOS
24, 2);
Str-A-ilayusculas (RESPUESTA);
NOMBREARCH := Copy (RESPUESTA, 1, POS ( ' ' RESPUESTA 1 - 1);
NOMBREEXT := Copy (RESPUESTA, Pos('.', RESPUESTA) + 1 , LengthíRESPUESTA));
',
',
.,
RESPUESTA := ' ' ;
with BUSCFiREC do
begin
LimpiaKey (DIR-IND) ;
repeat
SigKey (DIR-IND, NUMEROENTRCIDA, DIRKEY) ;
Obterdiec (DIR-DAT, NUHERO-ENTRADA, BUSCAREC) ;
i f OK then
begin
i f ((ARCHIVO = NOMBRE-ARCH) and (EXTENSION = NOMBREEXT) 1 then
begin
Colocar-String ('DIRECTORIO : 6, 4 , O);
ColocarString (DIR-KEY, 6 , 17, 3);
ColocarString í'MCHIVO.EXTENSIO", 7, 5, O ) ;
ColocarString (ARCHIVO, 8 , 4, 3 ) ;
Colocar-String (Extension, 8 , 13, 3 ) ;
Obtener-String-Respuesta (RESPUESTA, 1 , l,", 24, 48,
'Presione (ENTER) para continuar Busqueda', 24, 2);
Colocar-String í '
8 , 4, O ) ;
Colocar-String ( '
8 , 13, O);
I := I + 1;
end;
end;
until (not OK);
RESPUESTA := ' ' ;
Str (I:& StrI);
i f ( 1 0 0 ) then
beg i n
Obtener-String-Respuesta (RESPUESTA 1 1 , *',24, 50,
'El archivo a buscar existe ' + btri t ' veces... Presione (ENTER}',
end
else
flhtenar S t r i n n Racntiacts IEIECDIICCTB i 1
.?&*$J+
,
',
',
',
"
_I
24, 2);
~
DESCRIPCION :
Esta rutina cancela un directorio dado por DPATH; si y solo si este direc
torio no tiene ningun archivo o subdirectorio. En caso de no estar vacio
manda un mensaje de error.
procedure Cancela-Director i o (var DIR-DAT : FileDatos;
val DiR-IND : FileIndice;
: STRING79);
var DPATH
var
RESPUESTA
NOMBRE-ARCH
RENREC
REN-KEY
TEMPPATH
TEMP-OIRLLAVE,
DIR-LLAVE
I,
TEMP-NUMENT
NUMEROENTRADA
EXISTE
StrI
,
: STRIffi79;
: STRING&
: DIRREC;
: KEY-REC;
: STRINü79;
: STRINü40;
: integer;
: boolean;
: STRIffi3;
begin
RESPUESTI4 := ' ' ;
NOMBRE-ARCH := ' ' ;
TEMPNUN-ENT := O;
ObtenerStringRespuesta (RESPUESTA, 3, 8, 'NOMBRE :
6, 4,
'Diqite nombre del directorio a borrar, sin extension', 24, 2);
St r-A-Mayusculas (RESPUESTA1i
NOMBRE-ARCH := RESPUESTA;
RESPUESTA := ' ' ;
DIR-LLAVE := ' ' ;
Concatena-L lave (DPATH, DIR-LLAVE1;
with REN-REC do
begin
DIR-KEY := ' ' i
D IR-KEY := D IR L LAVE ;
ARCHIVO := '
';
EXTENSION := '
' =1
BuscaKey (DIR-IND, NUHERO-ENTRADA, DIR-KEY 1;
i f OK then
begin
EXTENSION := 'DIR';
MCHIVO := NOE1BRE-ARCH;
Recorrer-Directorio (DIR-DAT, DIR-IND, EXISTE, ARCHIVO, EXTENSION, DIR-KEY, TEMP-NUMENT) ;
',
i f (EXISTE) then
begin
RESPUESTA := NOMBRE-ARCH;
TEMPPATH := Concat (DPATH, RECPUESTCI,
ConcatenaLlave (TEWPATH, TEMP-DIRLLAW) ;
DIR-KEY := TE&-DIRLLAW;
Buscaifey (DIR-IND, NUMEROENTRADA, DIR-KEY 1;
i f Ok then
I \ ' ) ;
'
:= 0;
repeat
ARCHIVO := "; EXTENSION := ";
SigKey (DIR-IND, NUMEROJNTRADA, DIR-KEY 1;
ObtenRec (DIR-DAT, NUMERO-ENTRADA, REM-REC) ;
if OK then
begin
if ((DIRKEV = TEMP-DIRLLAVE) and (C1RCHIVO <> '
'1 and (EXTENSION 0 ' '
i
ithen
I:= I t 1 ;
end;
until ((not OK) or (I <> O));
if í I 0 O 1 then
begin
Str í1:3, StrI);
ColocaError ('ERROR: no se puede cancelar directorio, tiene ' t STRI t ' archivos <ENTER>', 24, 2)
end
else
beg in
DIRKEV := TEMP-DIRLLAVE;
BuscaKey (DIR-IND, NUIIERO-ENTRADA, DIRKEV) ;
CanKey (DIR-IND, NUMEROENTRAIM, DIRKEV) ;
CanRec (DIR-DAT, NUMERO-ENTRADA) ;
NUMEROENTRADA := TEHP-NUMENT;
CanKey (DIR-IND, NUMERO-ENTRADA, DIR-KEY) ;
CanRec (DIR-DAT, NUMEROENTRADA) ;
Colocar-String ('Directorio cancelado..
10, 8, 1);
end;
end;
...
',
end
else
ColocaError ('ERROR: Directorio no existe, presione cualquier tecla para continuar', 24, 2);
end;
end;
RESPUESTA := ' ;
Obtener-String-Respuesta (RESPUESTA, O , 1, ' ' 24, 42,
'Presione <ENTER> para continuar', 24, 2);
end;
,
c
DESCRIPCION:
Este programa simula el manejo de archivos de RS-DOC. Para tal efecto se utiliza
una estructura de Btarbol; los comandos que realiza son:
DIR : despliega el contenido de un directorio.
CHDIR : cambia de directorio, de acuerdo al camino especificado por el usuario
MKDIR : construye un subdirectorio.
SAVE : salva un archivo en el directorio dado
RENAME: renombra un archivo de un directorio
DEL : borra un archivo de un directorio
FIND : busca un archivo dado y despliega el camino para llegar a el. Si
el archivo existe en mas de un directorio, manda todos los caminos
por los que se puede llegar a e l , es decir en que directorios esta.
RMDIR : cancela un directorio si este se encuentra vacio, en casa contrario,
manda un mensaje de error.
var
RESPUESTA
DIR DAT ,
: CTRING79;
: FileDatos:
I
begin
SECPUESTA := ' ' ;
ClrScr;
Const ruyePanta1l a ( 16, 58 1;
Co locarstr inqCentrado í 'UNIVERSIDAD aUTONOMA HETROPOLITFiNA- IZTAPALAPA'
4, 2);
Colocar-StringCentrado ('PROYECTO I y I1
7, O);
ColacarStringCentrado ('"SIMULA flWJ0 DE DIRECTORIOS Y MCHIVOS MS-DOS" ' 10, 3);
Colocar-StringCentrado í 'AUTORES: ROS4 ZURITA VALDOVINOS
MAT: a 2 ~ 0 w 14,
, o);
Colocar-StringCentrado ( '
15, U);
Colocar-StringCentrado ('ABRIL 12 91', 19, 2);
Obtener-StrinqRespuesta (RESPUESTA, O, 1,
24, 35,
'Presione (ENTER> para continuar', 24, 2);
I n i t Indice;
,
*,
,
',
'
I
,
{apertura del archivo de datos y del archivo de indices)
AbreArchivo (DIR-DAT, 'DIR.DAT' Sizeof (DIRREC) 1;
i f OK then
CIbreIndice (DIR-IND, ' D R I D X ' , MaxLongKey, DUPLICADAS);
,
{si los archivos no existen se pregunta a l uwsario si desea crearlos}
i f not OK then
begin
ClrScr;
ConstruyePantalla (5, 60);
repeat
Colocar-String ('Presione S para crear los archivos N para salir',
23, 2, O);
ColocarStrinq í'S', 23, 11, 2);
ColocarStrinq ('N', 23, 37, 2);
Obtener-StrinqRespuesta (RESPUESTA, 1, 1,
'El archivo de datos no existe. Se crea W N ) ?
11, 15,
23, 35);
i f (Length (RESPUESTA) = U) then
Write (Chr (7) i
else
i f (not íREcPüESTAI11 i n ['St,
' s ' , '11'11) then
Write (Chr(7)i;
until (RESPUESTAClI i n C'S', 'N', 's', 'n'l);
I
",
,
I N ' ,
i f (RESPUESTA111 i n C'S', "5'1) then
begin
CoiocarString ('Creando los archivos de datos y de indices', 13, 15, 2);
,
Construyekhivo (DIR-DAT, 'DIR.DAT'
Sizeof (DIR-REC) i
;
ConstruyeIndice (DIR-IND, 'DIR. IDX', MaxLongKey, WPLICADCIS);
with NWVO-DIRREC do
begin
with NWVALLAVE do
begin
DIRROOT := ";
DIR-DES1 :=
9
DIR-DES2 := '
?
DIR-DES3 := '
';
111678
nrUTR3
---i
.z
'
DIF-QDQT := ' \
'
i
3
EIP-1 EY := Concat ( D I F R O O T , DIR-DE%, DIR-DES?,
DIH-DEC4) ;
end i
ARCHIVO := '
9
EXTENSION := ' ';
AddRec ( DIR-DAT M E R O E N T R A D A , NUEVO-DIRREC ;
Mdkey (QIR-IND, NUMERO-ENTRADA, D I R K E Y i;
end
[with!
DIR-DESI,
,
end
else
goto FI NPROGRAHA;
{el usuario desea la salida}
end;
with NUEVO-DIRREC da
begin
with NUEVA-LLCIVE do
begin
DIR-ROOT := ' \
DIR-DES1 := '
'.';
D I R O S 2 := '
';
DIR-DES3 := '
f
DIR-DES4 := *
D I R K E Y := Concat ( D I R R O O T , DIR-DES1, D I R - D E S , DIR-DES3, DIR-DES4);
DDIR := D I R K E Y ;
end;
BuscaKey (DIR-IND, NUIIERO-ENTRCIDA, DIR-KEY ;
*.
if OK then
begin
Ob tenRec (DIR-DAT, NUMEROENTRADA, NUEVO-DIRREC) ;
DIR-PATH := D I R K E Y ;
end
else
begin
Colocar-String('ENTRADCI NO E X I S T E ' + DDIR, 11, 10, O ) ;
D I R P A T H := D I R K E Y ;
end;
end;
{whit!
DPATH := ";
TEMPPATH := ' ' ;
repeat
RESPUESTA := ' ' ;
COMANDO := ' ' ;
if (DPATH <> " I then
begin
TEMPPATH := DPATH;
D I R P A T H := DPATH;
end;
ClrScr;
ConstruyePantall a (19, 80) ;
ColocarString ('PATH
: t D I R P A T H , 5, 4 , O);
ColocarString ('NOnBRE : ' 1 6 , 4, O ) ;
Colocar-String í'COllANDOC: D i r , cHdir, mKdir, sAve, Rename, dEl, Find, rMir :
ColocarString í ' D ' , 24, 12, 2);
ColocarStrinq ('H', 24, 18, 2);
Colocar-String ('K', 24, 25, 2);
Colocar-String ('A', 24, 32, 2);
ColocarString ('R', 24, 37, 2);
Colocar-String ('E', 24, 46, 21;
Colocar-Strinq ('F', 24, SO, 2);
Colocar-String í'M', 24, 57, 2);
Obtener-StringRespuesta (COMFINDO, 3 , 1 , 'COMANDO :
4, 4 ,
24, 64);
-e,
is
M-
..__..
i-irrrunwnn\,\
",
',
-
', 24, 2, O);
m-r
s.."
,
--+
*
A
*
-
-.-----
-- -_ --"-.-
if !C@MBNDO <,>; 'S') then
begin
Obtener-StringRespuesta (DPATH, 3, 40, 'PATH : ', 5, 4,
C t r-B-i'íayuscul as (DPATH1;
end;
DDIR := DPATH;
if (COMANDO = "1 then
COflANDO := 'X ' ;
case COMCINDO of
'Ill: begin
Despliega-Directorio (DIR-DAT, DIR-IND, DPATH);
end;
'H': begin
Cambiar-Di rector io (DIR-DAT , DIR-IND , DPATH , DDIR ) ;
end;
'K': begin
CrearNuevo-D i rectorio (DIR-DAT, DIR-IND , DPATH i ;
end;
'A': SalvarArchivo (DIR-DAT, DIR-IND, DPATH);
'R ' : Renombrar-Arch ivo (DIR-DAT, DIR-IND, DPATH1;
'E': Borrar-Archivo (DIR-DAT, DIR-IND, DPATH);
'F' : Buscar-Archiva (DIR-DAT, DIR-IND, DPATH);
Y ' : Cancela-Directorio (DIR-DAT, DIR-IND, DPATH);
end;
until (COMCINW = 'S'i;
CierraArchivo (DIR-DAT);
CierraIndice (DIR-INDi ;
FINPROGRW:
C1rScr ;
Colocar-String ('gracias
end.
... hasta la vista', 12, 40, 7);
", 24, 6 4 ) ;
>I---------------------------------------------------------
{
1
PRINCIPIiA CICCECO.TOL
____-----__I-----
{----------------------------------------------------------------------------
(*$A+,IR-* ,
I
type
TaStr64 = strinql641;
FileDatos = record
case Integer of
O : íF
: file;
Primerlibre,
Numerali
bre,
Intl,
Int2,
: Inteqer);
NurnRec
1 : íFil2
: arrayEU..121 of Byte;
TaNombre : arrayt1..641 of Char);
end;
TaKeyStr = str i
nqC HaxLonqKey1;
TaItem
= record
DataRef,PaginaRef : Integer;
Key : TaKeyStr;
end;
TaPagina = record
ItemsEnPagina
: O. .LonqPaqina;
: Integer;
RefPaqinaAnt
: arraytl..LonqPaginal of TaItm;
Itwrray
end;
TaPaqinaPtr = 'TaPaqina;
TaCecBusqueda =
record
Paq i
naRef I
tem4rrIná ice : I
nteqer;
end;
TaPath
= arrayll..HaxAltural of TaSecBusqueda;
FileIndice = record
DataF
: FileDator;;
: Boolean;
CiDuplKeyn
: Integer;
KeyL,RR,PP
: TaPath;
Path
end;
FileIndicePtr = 'FileIndice;
TaStackRec = record
Pagina
: TaPagina;
IndiceFPt r
: FileIndicePtr;
Pag inaRef
: Inteqer;
k tuali
zado
: Boolean;
end;
TaCtackRecPtr = 'TaCtackRec;
TaPaginaStack = arrayll..LongPiiaPaginaI of TaCtackRec;
TaPaqinaflap = arrayll..LongPilaPaqinal of Integer;
TaRecordBuffer =
record
case Integer of
O : (Pagina : TaStackRec);
1 : íR : array~l..MaxlonqRecDatl of Byte);
2 : (1 : Integer);
end;
,
vor
10status : Integer;
OK
: Boolean;
TaRecBuf : TaRecordBuffer;
TaPaginaStk : TaPaginaStack;
I
n
..
-.
.
'L
1
3
1
procedure TaChecalOívar DatF : FileDatos; R : Integer);
vir
I : Integer;
begin
if IOstatus 0 O then with DatF do
begin
Wri teln;
Writeln(’acceu, I/O error ‘,IOstatus);
Writei’kchivo: ’ ) ;
I := 1;
while OrdíTaNoffibreCIli 0 O do
begin
Write(TaNombreCI1); I := Succ(1);
end;
Writeln(’ Record ‘,R);
Writeln(’Programa abortado’);
Halt;
end;
end;
procedure #tenRec(var DatF
R
var Buffer
begin
Ceek(DatF.F,R) ;
IOstatus := IOresult;
TaCheca IO (DatF,R);
BlockRead (DatF .F ,Euf fer ,1 ) ;
IOstatus := IOresult;
TaCheca IO (DatF,R) ;
end;
: FileDatos;
: Integer;
1;
procedure ColocaRec (var DatF: FileDatos;
R
: Integer;
var Buffer
1;
begin
Seek (DatF F ,R);
ICktatus := IOresult;
TaChecaIO (DatF,R);
BlockWrite(DatF,F,Euffer, 1);
IOstatus := IOrewlt;
TaChecaIO(DatF,R) ;
end;
.
procedure ConstruyeArchivo(var DatF : Fileüatos;
FNombre : TaStr64;
LongRec : Integer);
begin
Assign (DatF F, FNombre 1;
IOstatus := IOresiilt;
TaChecaIO(DatF, O);
Rewrite (DatF .F ,LongRec ;
IOstatus := IOresuit;
if IOstatus = BF1 then
OK := false
else
.
begin
TaChecaIOíDatF ,O);
DatF.PrimerLibre := -1;
DatF.NuineroLibre := O;
DatF.int1 := 0;
DatF.Int2 := O;
Move (DatF Pr imerL I bre, TaRecBuf y E 1;
.
L.lii.l
”-
-*.
<”.
---.
. . ~ . ~
i
”
I-_- ”
>
.
*
~
proceuure kreArchivo(var DatF : FileDatos;
FNombre : TaCtr64;
LongRec : Integer);
begin
Assign (DatF F ,FNombre 1;
IOstatus := IOresult;
TaCheca IO (DatF ,O ;
Reset !Da tF .F, LongRec ;
IOstatus := IOresult;
if IOstatus = 1 then
OK := false
else
begin
TaChecaIO (DatF,O) ;
Ob tenRec (DatF ,O, TaRecEluf 1;
Move íTaRecBuf ,DatF .PrimerL ibre,ü 1;
DatF.NumRec := Fi1eSizeíDatF.F);
OK := true;
end;
end;
.
procedure Cierrakhivoívar DatF : FileDatos);
begin
DatF.Int2 := DatF.NumRec;
Move (DatF .Pr imerL ibre,TaRecBuf ,B ;
ColocaRec (DatF,O,TaRecBufI ;
Close íDatF.F 1;
IOstatus := IOresult;
TaChecaIO (DatF,O) ;
end;
procedure NuevoRec (var DatF : FileDatos;
var R
: Integer i
;
begin
if DatF.PrimerLibre = -1 then
begin
R := DatF.NumRec;
DatF.NumRec := Succ (DatF.NumReci
end
else
begin
R := DatF.PrimerLibre;
ObtenRec íDatF,R,TaRecBuf 1;
DatF.PrimerLibre := TaRecBuf .I;
DatF.NumeroLibre := DatF.NumeroLibre - 1;
end;
end;
procedure dddRec(var DatF : FileDatos;
var R
: Integer;
1;
var Buffer
begin
NuevoRec(DatF,R);
Co 1ocaRec (DatF ,R ,Buf fer ) ;
end;
: FileDatos;
: Integer);
procedure CanRecívar DatF
R
begin
TaRecBuf .I := DatF.PrimerLibre;
.7
1
?,
,r.
I r
n
r
"
7.
*:
r)atF.Priiner!ibre := R;
CatF.NumeroLibre := DatF.NumeroLibre + 1;
end;
,:function LongFile(var DatF : FileDatw) : Integer;
begin
LongFile := DatF.NumRec;
end;
function RecsUsados(var DatF : FileDatosi : Integer;
begin
RecsUsados := DatF.NumRec - DatF.NuiaeroLibre - 1;
end; 1
procedure Init Indice;
var
I : Integer;
begin
for I := i to LonqPiiaPaqina do
begin
TaPaginaCtkC 11.IndiceFPtr := ni 1;
TaPaginaCtkCI1 .Actualizado := false;
TaPgMapCIl := I ;
end;
end;
procedure TaEmpacar ívar Pagina : TaPagina;
KeyL : Integer);
var
I : Integer;
P : arrayCO..MaxIntl of Byte absolute Pagina;
begin
if KeyL .O MaxLongKey then
for I := 1 to LongPagina do
Move~Pagina.It~ArrayCIl,P~~I- 1) * (KeyL t 5)
end i
t
31,KeyL t 5 ) ;
procedure TaDeSmpacar(var Pagina : TaPagina;
WeyL : Integer);
var
I : Integer;
P : arrayCO..MaxIntl of Byte absolute Pagina;
begin
i f KeyL 0 MaxLongKey then
for I := LongPagina downto 1do
Move(PC[I - 1) * (KeyL t 5 ) t 31,Paqina.IteaiClrraytII,KeyL + 5 ) ;
end;
procedure Construye1ndice(var IdxF
FNombre
LonqKey,
C
: Fi lelndice;
: TaCtr64;
: Integer);
var
K : Integer;
begin
K := (LonqKey t Ji*LongPagina t 3 ;
ConstruyeAchivo(IdxF.DataF,FNoinbre,K) ;
1dxF.CiDuplKeys := C 0 O;
1dxF.KeyL := LongKey;
1dxF.RR := O;
1dxF.PP := O;
end;
: Filelndice;
pracedure AbreIndicetvar IdxF
FNombre : TaCtrb4;
, .*_
L
*
l
-11
'e.
___lll.
' _
_ "m?l'3,
_ - _.. ,
9
r
: Integer);
var
K : Integer;
begin
K := (LongKey t 51 * LonqPagina t 3;
AbreArchivoí IdxF.DataF,FNombre,K);
1dxF.CiDuplKeys := S <'. (5;
IdxF.KeyL := LongKey;
1dxF.RR := 1dxF.Da taF. Int1;
1dxF.PP := O;
end;
2
procedure Cierraíndiceívar IdxF : FileIndice);
var
I : Integer;
begin
for I := 1to LonqPilaPagina do
with TaPaginaCtkCII do
if IndiceFPtr = ClddriIdxFl then
begin
IndiceFPtr := nil;
if Actualizado then
begin
TaEmpacar íPaqina ,IdxF KeyL 1;
ColocaRecí IdxF.DataF,Pag i naRef ,Pagina);
Actualizado := false;
end;
end;
IdxF.DataF.Int1 := 1dxF.W;
CierraArchivo(1dxF.DataF) ;
end;
.
procedure TaUltimfí : Integer);
var
J , K : Integer;
begin
J := 1;
while (TaPgMapCJl O I) and íJ
J := J t 1;
for K := J to
<
LongPilaPagina) do
-
LongPilaPagina - 1 do
TaPgMapCKl := TaPgMapEK t 11;
TaPgMapCLongPilaPaginal := I ;
end;
procedure TaObtenerPagina(var IdxF : FileIndice;
R
: Integer;
var PgPtr : TaPaginaPtr);
var
I
: Integer;
Encontro : Boolean;
begin
I :=
13;
repeat
I := I t 1;
with TaPaginaCtkCIl do
Encontro := (IndiceFPtr = Addr(1dxFi) and (PaginaRef = R);
until Encontro or (I = LongPilaPagina);
if not Encontro then
begin
I := TaPgMapC11;
with TaPaginaCtkLIl do
begin
if Actualizado then
begin
T
.
T
,
_____
fn...
I-.
1
i
c
d
_. ----
I
- . - I - 1'
.
ColocaRec í IndiceFPt r * .Oa taF ,Pa5 inaF.ef,Pagina ) ;
end:
ObtenRec í IdxF.DataF ,R ,Pagina 1;
TaDesempacar(Pagina,1dxF.KeyL) ;
IndiceFPtr := Addr(IdxF1;
PaginaRef := R;
Actualizado := false;
end;
end;
TaUlt imo(1);
PgP t r := Addr (TaPagi
naStkC I
1;
end;
procedure TaNuevaPaqina(var IdxF : FileIndice;
var R
: Integer;
var PgPtr
: TaPaqinaPtr);
var
I: Integer;
begin
I
:= TaPqMap[ll;
with TaPaginaCtkCII do
begin
i f Actualizado then
begin
TaEmpacar(Paqina IndiceFPt r .KeyL 1;
Co locaRec( IndiceFPt r I . DataF ,Paq inaRef,Pagina 1;
end;
NuevoRec (IdxF.DataF,R) ;
IndiceFPtr := Addr(1dxF);
PaqinaRef := R;
Actualizada := false;
end;
TaUlt iaoi1i ;
PqPtr := Addr (TaPaqinaCtk[II);
end;
I
,
procedure TaClctualizaPagina(PgPtr : TaPaqinaPtr);
var
P : TaCtackRecPtr absolute PqPtr;
begin
P^.Fictualizado := true;
end;
procedure TaRegresaPaginaivar PgPtr : TaPaginaPtr);
var
P : TaCtackRecPtr absolute PgPtr;
begin
with PA do
begin
CanRec ( IndiceFPtr A DataF,PaqinaRef 1;
IndiceFPtr := nil;
Actualizado := false;
end;
end;
procedure TaXKey (var K;
KeyL : Integer);
var
Key : TaKeyStr absolute K;
begin
i f Ord(KeyC01) > KeyL then KeyCOl := Chr(KeyLi;
end;
function TaCompKeys(var Ki,
KZ;
3:lp : Boolean 1 : Integer;
var
Keyl : TaKeyCtr absolute #1;
Key2 : TaKeyCtr absolute K2;
begin
i f Keyl = Key2 then
i f Dup then
TaCompKeys := DR1 - DR2
else TaCompKeys := O
else
if Key1 > Keyl then
TaCoRipKeys := 1
else TaCompKeys := - 1;
end;
procedure LimpiaKey(var IdxF : FileIndice);
begin
1dxF.PP := O;
end;
procedure AddKey(var IdxF
: Fileindice;
var ProcDatRef : Integer;
var ProcKey
1;
va r
PKey
: TaKeyCtr absolute ProcKey;
PrPgRef1 ,
, PrPgRef2,
: Integer;
C,I,K,L
PasoArriba : Boolean;
PaginaPtrl,
PaginaPtr2 : TaPaginaPtr;
Proclteml,
ProcItem2 : TaItem;
procedure Busca (PrPgRef1 : Integer);
var
R : Integer;
procedure Inserta;
begin
TaObtenerPagina(IdxF,PrPgRef1,PaginaPtrl);
with PaginaPtrlA do
begin
if ItmsEnPagina { LonqPagina then
begin
ItemsEnPagina := ItemsEnPagina + 1;
for I := ItefasEnPagina downto R + 2 do
ItemArray[II := IteaCIrrayEI - 11;
ItemArrayCR t 11 := ProcIteml;
Pasdrriba := false;
end
else
begin
TaNuevaPaqina ( IdxF,PrPgRef2,Pag inaPtr2) ;
if R <= Orden then
begin
if R = Orden then
ProcItem2 := ProcIteml
else
begin
ProcItem2 := ItemArrayCOrdenl;
for I := Orden downto R t 2 do
ItemArrayEIl := ItemArrayCI - 11;
ItemArrayER t 11 := ProcIteml;
end;
for I := 1 to Orden do
PaginaPtrY. IteiRClrrayCI1 := ItemArrayCI
end
else
begin
R := R - Orden;
ProcItem2 := ItemArrayCOrden t 11;
t
Orden];
JaqinaP:r2'.!temArrayCIl
:= ItemArraylI t Orden + 11;
PaginaPtr2^.!t~mArrayiRl := ProcIteml;
for I := Ft + 1 to Ordm do
Pa-inaPtr2".ItemcirrayCIl := ItemArrayCI t Orden];
end ;
ItemsEnPagina := Orden;
PaginaPtrL".ItemsEnPagina := Orden;
PaginaPtr2". RefPaginaAnt := ProcItem2.PaginaRef;
ProcItem2,PaginaRef := PrPgRef2;
ProcIteml := ProcItem2;
TaActua 1 izapagina(PaginaPtr2);
end;
end;
TaActua1 izapagina (Pa9inaPtrl ) ;
end;
begin
if PrPgRefl = O then
begin
PasoClrriba := true;
with ProcIteml do
begin
Key := PKey;
DataRef := ProcDatRef;
PaginaRef := O;
end;
end
else
begin
TaObtenerPagina( IdxF ,PrPqRef1,Paginaptr11;
with PaginaPtrlA do
begin
L := 1;
R := ItemsEnPagina;
repeat
K := íL t R ) div 2;
C := TaCompKeys(PKey,
ItemArrayCKl.Key,
ProcDatRef,
I temArrayCK1.DataRef,
1dxF.CiDuplKeys );
if C <= O then
R := K
if C
>=
- 1;
O then
L := K t 1;
until R { L;
if L - R > 1 then
begin
OK := false;
Pasdrriba := false;
end
else
begin
if R = O then
Busca (RefPaginaAnt)
else BuscaiItenArrayCRl.PaginaRef);
if PasoCIrriba then
Inserta;
end;
end;
end;
end;
beg in
with IdxF do
L--<-
,
!,
a ' X Key (Prey e
j
r L !;
Ok := true;
Busca (RR);
i f PasoArriba then
begin
PrPgRefl := RR;
TaNuevaPagina( IdxF ,RR,Pag inaPtr11;
with PaginaPtrl^ do
beg i n
ItemsEnPagina := 1;
RefPaginaAnt := PrPgRefl;
ItemArray[ll := Prod teml;
end;
TaActualizapagina(PaginaPtrl ;
end;
PP := o;
end;
end;
I
\
(*$A+, R- W3* 1
procedure CigKey(var IdxF
: FileIndice;
var PracDatRef : Integer;
var PracKey
1;
var
PKey
: TaKeyCtr absolute Procliey;
: Integer;
PagPtr : TaPaginaPtr;
begin
with IdxF do
begin
i f PP = O then
R
R := RR
else
with PathCPPI da
begin
TaObtenerPagina( IdxF,PaginaRef ,PagP tr 1;
R := PagPtr" .ItemArrayCIteiaArrIndicel .PaginaRef ;
end;
while R O O do
begin
PP := PP + 1;
with PathCPPl do
begin
PaginaRef := R;
ItemArrIndice := O;
end;
TaOb tenerPagina í IdxF,R,PagP tr 1;
R := PagPtr".RefPaginaAnt;
end ;
if PP C> O then
begin
while (PP > 11 and
(PathCPP I,It d r r Indice = PagPtr *, ItemsEnPagina ) da
begin
PP := PP - 1;
TaObtenerPagina í IdxF,Pa th [PPI .Pag inaRef PagPtr 1;
end;
i f PathtPP1.ItemArrIndice C PaqPtr* .ItemsEnPagina then
with PathCPPl da
begin
ItemArrIndice := ItemfirrIndice t 1;
with PagPtr^. I t e d r r a y í I t ~ r r I m l i c e ldo
begin
PKey := Key; PracDatRef := DataRef;
end;
end
else PP := O;
end;
OK := PP C} 0;
end;
end;
,
: Fileindice;
procedure PrevKey(var IdxF
var PracDatRef : Integer;
var ProcKey
);
var
DL
n
T-i'-.
C4-
-h--lsn+- (2n-1
- 1 ~ .
L_
Ily--LI
I*xL
uu-I--L.
--
--
~~-~~~
qT--
-
: Integer;
PayPtr : TaPayinaPtr;
beg i
n
with IdxF do
begin
i f PP = O then
R := RR
el5.e
idith PathCPP1 do
begin
TaObtenerPag ina( IdxF,PaqinaRef ,PaqPtr ;
ItemArrIndice := Itemíirrindice - 1
;
i f ItemArrIndice = 0 then
R := PaqPtr'.RefPaginaAnt
else R := PagPtr",ItemArrayCItentCIrrIndicel.PaqinaRef;
end;
while R 0 O do
begin
TaObtenerPaqina( IdxF,R,PaqP tr ;
PP := PP + 1;
with PathCPPl do
begin
PaqinaRef := R;
I
teniArrInd ice := PagPtr I
temsEnPaqina ;
end;
with PaqPtrA do
R := 1ternArraylItemsEnPaginal.PaqinaRef;
end;
i f PP 0 O then
begin
while (PP > 1) and (Path[PPI.ItemflrrIndice = 0) do
begin
PP := PP 1;
TaObtenerPaqi
na ( IdxF,Path CPP 1.Paq inaRef,PagPtr ;
end;
i f PathCPPl.1temArrIndice > O then
with PagPtr".ItemArrayCPathCPPl. ItemArrInáiceldo
begin
PKey := Key;
ProcDatRef := DataRef;
end
else PP := O;
end;
:= PP 0 o;
end;
end;
F.
-
w.
: FileIndice;
procedure TaEncontrarKey(var IdxF
var ProcDatRef : Integer;
var PrwKey
)i
var
PKey
: TaKeyStr absolute ProcKey;
PrPgRef,
C,K,L,R : Integer;
RKey
: TaKeyStr;
PaqPtr : TaPaqinaPtr;
begin
with IdxF do
begin
TaXKey (PKey,Keyl) ;
OK := false;
PP := o;
PrPqRef := RR;
while íPrPgRef <> 0) and not OK do
begin
__
--
+,---w--".-,~---.--.,""
.---
<-C.-*
.---
PathiPP1.PaqinaRef := PrPgRef;
TaObtenerPayiina[ IdxF,PrPqRef ,PagPtr 1;
with PaqPtrA do
begin
L := 1;
R := IteisEnPagina;
repeat
K := í L + R1 div 2;
C := TaCompKeysíPKey,
I
temArrayCK1.Key,
O,
1temArrayCKl.DataRef
CiDuplKeys
1;
i f C (= O then
R := K - 1;
i f C )= O then
L := K + 1;
until R < L;
i f L - R > 1then
begin
ProcDatRef := 1tenArrayCKl.DataRef;
R := K;
OK := true;
end;
i f R = O then
PrPgRef := RefPag inaAnt
else PrPqRef := Ite~rrayCR1,PaginaRef;
end;
Path[PPl.ItemArrIndice := R;
end;
i f not OK and íPP > O) then
begin
while (PP > 1) and íPathlPP1,IteniCirrIndice = 0) do
PP := PP - 1;
i f Path[PPl.ItemArrindice = O then
PP := O;
end;
end;
end;
,
: FileIndice;
procedure EncontrarKey (var IdxF
var ProcDatRef : Integer;
var PrwKey
1;
var
PKey
: TaKeyCtr absolute ProcKey;
TempKey : TaKeyStr;
begin
TaEncontrarKey( IdxF,ProcDa tRef PKey 1;
i f not OK and IdxFSiDuplKeys then
begin
TempKey := PKey;
CigKey íIdxF,ProcDatRef ,PKeyi ;
OK := OK and íPKey = TempKeyl;
end;
end;
,
procedure BuscaKey(var IdxF : FileIndice;
var ProcDatRef : Integer;
var ProcKeyi;
var
PKey ; TaKeyStr absolute ProcKey;
be in
qaEncontrarKey íIdxF,ProcDatRef ,PKey) ;
i f not DK then
;
CigKey (IdxF,ProcDatRef ,PKey i
?
.
V
I
.

Documentos relacionados