* -------------------------------------------------------- */ /* **** btutil.c **** contient les...

10
------------------------------------------------ */ .c **** s fonctions utilitaires du programme () -- Obtient et initialise le noeud racine et insere une clef. -- Place NOKEY dans tous les espaces "clef" et NIL dans les espaces () -- Retourne YES si la clef est dans le noeud, sinon retourne NO. Dans chaque cas, la position de la clef est mise dans pos. () -- Insere la clef et le fils droit dans la page. Scinde le noeud par la creation d'un nouveau noeud et par le déplace tié des clefs vers ce nouveau noeud. Effectue la promotion de la cle u rrn du nouveau noeud.

Upload: simon-torres

Post on 04-Apr-2015

102 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: * -------------------------------------------------------- */ /* **** btutil.c **** Contient les fonctions utilitaires du programme create_root() -- Obtient

/* -------------------------------------------------------- */

/*

**** btutil.c ****

Contient les fonctions utilitaires du programme

create_root() -- Obtient et initialise le noeud racine et insere une clef.pageinit() -- Place NOKEY dans tous les espaces "clef" et NIL dans les espaces "fils"search_node() -- Retourne YES si la clef est dans le noeud, sinon retourne NO.

Dans chaque cas, la position de la clef est mise dans pos.ins_in_page() -- Insere la clef et le fils droit dans la page.split() -- Scinde le noeud par la creation d'un nouveau noeud et par le déplacement de la moitié des clefs vers ce nouveau noeud. Effectue la promotion de la clef du milieu et du rrn du nouveau noeud.

*/

Page 2: * -------------------------------------------------------- */ /* **** btutil.c **** Contient les fonctions utilitaires du programme create_root() -- Obtient

/*create_root() -- Obtient et initialise le noeud racine et insere une clef.*/

create_root(clef key, short left, short right){

BTPAGE page;short rrn;

rrn = getpage();pageinit(&page);page.key[0] = key;page.child[0] = left;page.child[1] = right;page.keycount = 1;btwrite(rrn,&page);putroot(rrn);return(rrn);

}

/* -------------------------------------------------------- */

Page 3: * -------------------------------------------------------- */ /* **** btutil.c **** Contient les fonctions utilitaires du programme create_root() -- Obtient

/*pageinit(): Place NOKEY dans tous les espaces "clef" et NIL dans les espaces fils */

pageinit(BTPAGE *p_page) /* p_page est un pointer vers une page */{

int j;

for (j = 0; j < MAXKEYS; j++) {p_page->key[j].matricule = NIL;p_page->key[j].RRN_Fich_Prin =

NIL;p_page->child[j] = NIL;

}p_page->child[MAXKEYS] = NIL;

return 0;}

Page 4: * -------------------------------------------------------- */ /* **** btutil.c **** Contient les fonctions utilitaires du programme create_root() -- Obtient

/*

**** btio.c ****

Ce fichier contient les fonctions b-arbre impliquees directementdans les entres/sorties

btopen() -- Ouvre le fichier "btree.dat" qui contient le b-arbre.btclose() -- Ferme "btree.dat"getroot() -- Obtient le rrn du noeud racine a partir des deux premiers octets de btree.dat.putroot() -- Place le rrn du noeud racine dans les deux premiers octets de btree.dat.create_tree() -- Cree "btree.dat" ainsi que le noeud racinegetpage() -- Obtient le prochain bloc disponible dans "btree.dat" pour une nouvelle pagebtread() -- Lit le numero rrn de la page a partir de "btree.dat"btwrite() -- Ecrit le numero rrn de la page dans "btree.dat"

*/

Page 5: * -------------------------------------------------------- */ /* **** btutil.c **** Contient les fonctions utilitaires du programme create_root() -- Obtient

/* -------------------------------------------------------- */btopen() -- Ouvre le fichier "btree.dat" qui contient le b-arbre.int btopen(void){

btfd = fopen("btree.dat", "w+b");return(btfd > 0);

}

/* -------------------------------------------------------- */

Page 6: * -------------------------------------------------------- */ /* **** btutil.c **** Contient les fonctions utilitaires du programme create_root() -- Obtient

/* getroot() -- Obtient le rrn du noeud racine a partir des deux premiers octets de btree.dat */

short getroot(void){

short root;

fseek(btfd, 0, SEEK_SET);if (fread(&root, sizeof(short), 1, btfd) == 0){

printf("Error: Unable to get root.\007\n");

exit(1);}return root;

}

Page 7: * -------------------------------------------------------- */ /* **** btutil.c **** Contient les fonctions utilitaires du programme create_root() -- Obtient

/* -------------------------------------------------------- *//*

**** driver.c ****

Le "pilote" pour la création et la manipulation de b-arbres.Crée ou ouvre un fichier b-arbre.Obtient la clef suivante et appelle la fonction insert pour l'insérer

dans l'arbre.Au besoin, driver peut créer une nouvelle racine pour l'arbre.

*/

Page 8: * -------------------------------------------------------- */ /* **** btutil.c **** Contient les fonctions utilitaires du programme create_root() -- Obtient

/* -------------------------------------------------------- *//* **** driver.c ****Le "pilote" pour la création et la manipulation de b-arbres. Crée ou ouvre un fichier b-arbre. Obtient la clef suivante et appelle la fonction insert pour l'inserer dans l'arbre. Au besoin, driver peut créer une nouvelle racine pour l'arbre. */#include "bt.h"int main(){ ……

/* ouverture du fichier index*/if btopen() root = getroot();else { btfd = fopen(``btree.dat``, ``wb+);root = create_root(key, NIL, NIL); }/* ouverture du fichier principal ETUDIANT.dat ….*/key = getclef(); /* une première clé..*/do{ promoted = insert(root, key, &promo_rrn, &promo_key);if (promoted) root = create_root(promo_key, root,

promo_rrn);key = getclef();} while(/* le fichier ETUDIANT n ’est pas épuisé*/);

}

Page 9: * -------------------------------------------------------- */ /* **** btutil.c **** Contient les fonctions utilitaires du programme create_root() -- Obtient

/* **** insert.c ****

Contient la fonction insert() qui insere une clef dans un b-arbre. S'appelle de maniere recursive tant quele bas de l'arbre n'est pas atteint.Alors, insert() insere une clef dans le noeud.Si le noeud est plein,

- appelle split() pour scinder le noeud- promouvoi la clef du milieu et le rrn du nouveau noeud

*//*

insert()Arguments:rrn: Le rrn de la page dans laquelle on fait l'insertion*promo_r_child: Le fils promu vers le prochain niveaukey: La clef a etre inseree ici ou plus bas*promo_key: La clef promue vers le prochain niveau

*/

Page 10: * -------------------------------------------------------- */ /* **** btutil.c **** Contient les fonctions utilitaires du programme create_root() -- Obtient

insert (short rrn, clef key, short *promo_r_child, clef *promo_key){ BTPAGE page, /* La page actuelle */ newpage; /* La nouvelle page cree dans le cas d'une separation */ int found, promoted; /* Des valeurs boolennes */ short pos, p_b_rrn; /* Le rrn promu d'en dessous */ clef p_b_key; /* La clef promue d'en dessous */

if (rrn == NIL) { /* Une fois passe le bas de l'arbre on promouvoit */*promo_key = key; /* la premiere clef pour qu'elle soit inseree au niveau d'une feuille */*promo_r_child = NIL; return (YES);}

btread(rrn, &page);found = search_node(key, &page, &pos);if (found) {

printf("Error: attempt to insert duplicate key: %d \n\007", key.matricule);return (0);}

promoted = insert(page.child[pos], key, &p_b_rrn, &p_b_key);if (!promoted)

return (NO); /* Pas de promotion */if (page.keycount < MAXKEYS)

{ins_in_page(p_b_key, p_b_rrn, &page); /* On peux inserer la clef et un */btwrite(rrn, &page); /* pointer dans cette page. */return (NO); /* Pas de promotion */

}else { split(p_b_key, p_b_rrn, &page, promo_key, promo_r_child, &newpage);

btwrite(rrn, &page);btwrite(*promo_r_child, &newpage); return (YES); /* Une promotion a lieu */}

}