From: Alan Kennedy Date: Sat, 15 May 2004 23:53:05 +0000 (+0000) Subject: Creacion de archivo B+, con insercion de nodo raiz, basic stuff X-Git-Tag: svn_import_r684~242 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/7bef9a814dacda99e7bff6d2374b76a48bc13002?ds=sidebyside Creacion de archivo B+, con insercion de nodo raiz, basic stuff --- diff --git a/emufs/Makefile b/emufs/Makefile index f98675d..7c7f81e 100644 --- a/emufs/Makefile +++ b/emufs/Makefile @@ -1,7 +1,7 @@ CFLAGS=-Wall -g -ansi -pedantic -DDEBUG LDFLAGS=-lm -EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o indices.o indice_b.o +EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o indices.o indice_b.o b_plus.o all: libemufs.a tipo1_main tipo2_main tipo3_main b_test @@ -11,6 +11,9 @@ tipo2_main: tipo2_main.o $(EMUFS_COMMON) tipo3_main: tipo3_main.o $(EMUFS_COMMON) +b_plus_test: b_plus_test.o $(EMUFS_COMMON) +#b_plus_test: b_plus_test.o b_plus.o indices.o emufs.o + #b_test: b_test.o indice_b.o libemufs.a: $(EMUFS_COMMON) diff --git a/emufs/b_plus.c b/emufs/b_plus.c index 51a77e9..052b112 100644 --- a/emufs/b_plus.c +++ b/emufs/b_plus.c @@ -1,4 +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; +} diff --git a/emufs/b_plus.h b/emufs/b_plus.h index 16544d1..b498be6 100644 --- a/emufs/b_plus.h +++ b/emufs/b_plus.h @@ -3,30 +3,27 @@ #include #include #include "emufs.h" -typedef union _clave_b_plus { - int num; - /*fixme*/ -}CLAVE_B_PLUS; - + +#define SIZE_B_PLUS_HEADER (sizeof(int)*3) + /** Estructura que define un nodo B+. Para los nodos hojas, el ultimo valor de hijo, serĂ¡ el nro * de nodo con el que se encadena el actual. (Lista de nodos a nivel hoja. Sequence Set). */ typedef struct nodo_b_plus { int es_hoja; int nivel; /** Nivel del nodo */ - int cant; /** Cantidad de items en el nodo */ + int cant_claves; /** Cantidad de claves en el nodo */ int *claves; /** Claves del nodo */ int *hijos; /** Para nodo interno, ref nodos sucesores. Nodo hoja, ref a nro bloque en .dat */ } NODO_B_PLUS; - /** TODO */ -int b_plus_crear(); -int b_plus_insertar(); -int b_plus_eliminar(); -int b_plus_buscar(); -int b_plus_destuir(); +int emufs_b_plus_crear(INDICE *idx); +int emufs_b_plus_insertar(); +int emufs_b_plus_eliminar(); +int emufs_b_plus_buscar(); +int emufs_b_plus_destuir(); #endif diff --git a/emufs/b_plus_test.c b/emufs/b_plus_test.c new file mode 100644 index 0000000..a06eadd --- /dev/null +++ b/emufs/b_plus_test.c @@ -0,0 +1,14 @@ + +#include "b_plus.h" + +int main(int argc, char* argv[]) { + +/* Creamos un handler EMUFS, luego un Indice B+ y testing... */ +EMUFS *emu = emufs_crear("testbplus",T3,512, 128); +INDICE *indice = emufs_indice_crear(emu,"principal",0,0,0,0,sizeof(int)*12); +emufs_b_plus_crear(indice); +printf ("Yeiiiii\n"); + +return 0; + +}