X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/51ed490d1caf11b5645abef4dd473e5a5b520856..04345653bb228ff86af5c3f4116bef6c41dd8446:/emufs/b_plus.c?ds=sidebyside diff --git a/emufs/b_plus.c b/emufs/b_plus.c index e69de29..052b112 100644 --- a/emufs/b_plus.c +++ b/emufs/b_plus.c @@ -0,0 +1,57 @@ +/** Arbol B+ */ +#include "b_plus.h" + +/** Crea un nuevo nodo y lo inicializa */ +NODO_B_PLUS emufs_b_plus_crearnodo(INDICE *idx, int es_hoja) { + + NODO_B_PLUS nodo; + int nonheader_bytes = 0; + int size_claves = 0; + int size_hijos = 0; + + nodo.es_hoja = es_hoja; + nodo.nivel = 0; + nodo.cant_claves = 0; + + /* Calculamos lo que ocupan las cadenas de bytes claves + hijos */ + nonheader_bytes = idx->tam_bloque - sizeof(int)*3; + size_claves = (nonheader_bytes - sizeof(int))/2; + size_hijos = size_claves + sizeof(int); + nodo.claves = (int*) malloc(size_claves); + nodo.hijos = (int*) malloc(size_hijos); + memset(nodo.claves,'1',size_claves); + memset(nodo.hijos,'9',size_hijos); + + return nodo; +} + +/** Crea el archivo indice B+ */ +int emufs_b_plus_crear(INDICE *idx) { + + FILE *fp; + NODO_B_PLUS raiz; + int size_claves = (idx->tam_bloque - SIZE_B_PLUS_HEADER - sizeof(int))/2; + int size_hijos = size_claves + sizeof(int); + + /* Creamos el archivo que contendra el indice */ + fp = fopen(idx->filename, "w"); + PERR("Creando indice"); + fprintf(stderr, "Archivo = (%s)\n", idx->filename); + if (fp == NULL) { + PERR("Error al crear el archivo"); + return -1; + } + + /* Creamos el nodo raiz y lo guardamos el en indice */ + raiz = emufs_b_plus_crearnodo(idx,0); + fwrite(&raiz,SIZE_B_PLUS_HEADER,1,fp); + fwrite(raiz.claves,size_claves,1,fp); + fwrite(raiz.hijos,size_hijos,1,fp); + fclose(fp); + + /* Liberamos areas de memoria reservadas para claves e hijos */ + free(raiz.claves); + free(raiz.hijos); + + return 0; +}