Gestion des fichiers à accès direct en Gforth


L'accès direct




La sauvegarde des informations est essentielle, un langage informatique se doit donc de manipuler, lire, écrire et modifier les données d'un fichier aisément, Gforth ne fait pas exception et autorise différents accès aux fichiers.

L'accès séquentiel permet d'accéder aux enregistrements dans leur ordre d'écriture sur le disque. Rechercher un enregistrement réside en l'unique possibilité de parcourir successivement tous les enregistrements précédents sur le disque.

L'accès direct permet de retrouver directement un nième enregistrement. Afin de pouvoir se positionner sur un élément précis, il faut que la taille de chaque enregistrement soit définie préalablement.
Le fichier correspond donc à un tableau, avec le numéro d'un enregistrement on peut donc définir facilement sa position sur le disque et pointer directement sur lui afin de le lire ou de le modifier.


L'accès direct avec Gforth


Il faut définir les éléménts qui vont composer l'enregistrement

exemple:

date                          : 10 caractères ( ../../.... )
crédit                       : 10 caractères ( nnnnnn.nn ) nombre codé en caractères avec deux décimales
débit                         : 10 caractères ( nnnnnn.nn )
type de paiement      : 20 caractères
commentaires            : 50 caractères
validation                   : 1 caractère
                                   -------------------
total                     101 caractères

Chaque enregistrement aura donc une longueur de 101 caractères

le tampon d'enregistrement peut être créé comme ceci :
 
create enregistrement 101 allot



\\ -------------------------------------------------------
\\ ouvre une base déjà existante sur le disque dur
\\ -------------------------------------------------------
: ouvrir_base        ( adr u --- identification )
    r/w open-file throw
;

\\ --------------------------------------------------------------
\\ crée le nom d'une nouvelle base vide sur le disque dur
\\ --------------------------------------------------------------
: creer_base        ( adr u --- identification )
    w/o create-file throw
;

Ces deux mots réclament le nom de la base pointée par ( adr u ) et laisse sur la pile le numéro d'identification du fichier qui sera indispensable à chaque opération effectuée dans la base.

application :

variable base1                                   \\ créé une variable pour stocker l'identification de la base ouverte
s" ./mouvements.dat" ouvrir_base   \\ Ouvre la base mouvements.dat, le mot s" laisse sur la pile l'adresse et la longueur
base1 !                                              \\ Dorénavant pour identifier le fichier on fait base1 @




\\ ---------------------------------------------------
\\ ajouter un enregistrement à la fin du fichier
\\ ---------------------------------------------------
: ajout                ( adr u identification --- )
    dup dup file-size throw rot reposition-file throw write-line throw
;

\\ ----------------------------------------------------
\\ écrit un enregistrement d'après son numéro
\\ ----------------------------------------------------
: ecrit_enregistrement    ( adr long identification num --- )
    2 pick * 0 2 pick reposition-file throw write-line throw
;    

\\ ------------------------------------------------
\\ lit un enregistrement d'après son numéro
\\ -----------------------------------------------
: lit_enregistrement     ( adr long identification num --- )
    2 pick * 0 2 pick reposition-file throw read-line throw drop drop
;

Ces trois mots vont écrire et lire directement dans la base

application :

enregistrement 101 base1 @ ecrit_enregistrement 5

        - enregistrement    : laisse l'adresse du tampon sur la pile
        - 101                      : longueur de l'enregistrement
        - base1 @               : empile l'identificateur du fichier ouvert
        - 5                         : 5 ème enregistrement



\\ ------------------------------------------------------
\\ empile le nombre d'enregistrements de la base
\\ -------------------------------------------------------
: nbr_enregistrements    ( long identification --- nbr )
    file-size throw drop swap /
;

Ce mot empile le nombre total d'enregistrements que contient le fichier

application :

101 base1 @ nbr_enregistrements

        - 101                  : longueur de chaque enregistrements
        - base1 @           : identificateur du fichier


\\ ------------------------------
\\ Ferme la base de données
\\ ------------------------------
: ferme_base            ( identification --- )
    close-file throw
;

Ce dernier mot clôture le fichier

application :

base1 @ ferme_base

        - base1 @           : identificateur du fichier ouvert


Pour gérer un gros fichier à accès direct il serait pertinent de créer un fichier d'index qui contiendrait exclusivement le champs sur-lequel on veut faire une recherche (par exemple la date) ainsi que le numéro d'accès à l'enregistrement le tout dans un fichier à accès séquentiel, cela autoriserait une gestion facile des lectures/écritures dans la base de données.




14/09/2012
0 Poster un commentaire

Ces blogs de Informatique & Internet pourraient vous intéresser