]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/b_plus.c
7e2fa16c832dba97b8a0d9f9f4d49ec20c04043e
[z.facultad/75.06/emufs.git] / emufs / b_plus.c
1 /** Arbol B+ */
2 #include "b_plus.h"
3
4 /** Crea un nuevo nodo y lo inicializa */
5 NODO_B_PLUS emufs_b_plus_crearnodo(INDICE *idx, int es_hoja) {
6         
7         NODO_B_PLUS nodo;
8         int nonheader_bytes = 0;
9         int size_claves = 0;
10         int size_hijos = 0;
11         
12         nodo.es_hoja = es_hoja;
13         nodo.nivel = 0;
14         nodo.cant_claves = 0;
15
16     /* Calculamos lo que ocupan las cadenas de bytes claves + hijos */
17         nonheader_bytes = idx->tam_bloque - sizeof(int)*3;      
18         size_claves = (nonheader_bytes - sizeof(int))/2;
19         size_hijos = size_claves + sizeof(int);
20         nodo.claves = (int*) malloc(size_claves);
21         nodo.hijos = (int*) malloc(size_hijos);
22         memset(nodo.claves,'1',size_claves);
23         memset(nodo.hijos,'9',size_hijos);
24         
25     return nodo;        
26 }
27
28 /** Crea el archivo indice B+ */
29 int emufs_b_plus_crear(INDICE *idx) {
30         
31         FILE *fp;
32         NODO_B_PLUS raiz;
33         int size_claves = (idx->tam_bloque - SIZE_B_PLUS_HEADER - sizeof(int))/2;
34         int size_hijos = size_claves + sizeof(int);
35                 
36         /* Creamos el archivo que contendra el indice */
37         fp = fopen(idx->filename, "w");
38         PERR("Creando indice");
39         fprintf(stderr, "Archivo = (%s)\n", idx->filename);
40         if (fp == NULL) {
41                 PERR("Error al crear el archivo");
42                 return -1;
43         }
44         
45         /* Creamos el nodo raiz y lo guardamos el en indice */
46         raiz = emufs_b_plus_crearnodo(idx,0);
47         fwrite(&raiz,SIZE_B_PLUS_HEADER,1,fp);
48         fwrite(raiz.claves,size_claves,1,fp);
49         fwrite(raiz.hijos,size_hijos,1,fp);
50         fclose(fp);
51         
52         /* Liberamos areas de memoria reservadas para claves e hijos */
53         free(raiz.claves);
54         free(raiz.hijos);
55         
56         return 0;
57 }
58
59 /** Inserta una clave en el arbol */
60 INDEX_DAT emufs_b_plus_insertar(CLAVE clave)
61 {
62         INDEX_DAT insertado;