#include "b_plus.h"
/* Private prototypes */
+int b_plus_grabar_nodo(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_node);
NODO_B_PLUS *b_plus_leer_nodo(INDEXSPECS *idx, int num_node);
+NODO_B_PLUS *b_plus_crearnodo(INDEXSPECS *idx);
+
/** Crea un nuevo nodo y lo inicializa */
-NODO_B_PLUS *emufs_b_plus_crearnodo(INDEXSPECS *idx, int es_hoja) {
+NODO_B_PLUS *b_plus_crearnodo(INDEXSPECS *idx) {
NODO_B_PLUS *nodo = (NODO_B_PLUS*)malloc(sizeof(NODO_B_PLUS));
- nodo->es_hoja = es_hoja;
nodo->nivel = 0;
nodo->cant_claves = 0;
FILE *fp;
NODO_B_PLUS *raiz;
+ int error = 0;
/* Creamos el archivo que contendra el indice */
fp = fopen(idx->filename, "w");
- PERR("Creando indice");
- fprintf(stderr, "Archivo = (%s)\n", idx->filename);
+ PERR("Creando indice con nodo raiz");
if (fp == NULL) {
PERR("Error al crear el archivo");
return -1;
}
+ fclose(fp);
/* Creamos el nodo raiz y lo guardamos el en indice */
- raiz = emufs_b_plus_crearnodo(idx,1);
- fwrite(raiz,SIZE_B_PLUS_HEADER,1,fp);
- fwrite(raiz->claves,idx->size_claves,1,fp);
- fwrite(raiz->hijos,idx->size_hijos,1,fp);
- fclose(fp);
+ raiz = b_plus_crearnodo(idx);
+ error = b_plus_grabar_nodo(idx,raiz,0);
/* Liberamos areas de memoria reservadas */
free(raiz->claves);
free(raiz->hijos);
free(raiz);
- return 0;
+ return error;
}
/** Busca el nro de bloque donde se debe guardar un reg con clave X */
NODO_B_PLUS *curnode;
/* Comienzo leyendo la raiz, entry point de toda funcion */
- printf ("Buscando donde insertar clave: %i\n",query->clave.i_clave);
+ printf ("Buscando donde insertar clave: %i\n\n",query->clave.i_clave);
curnode = b_plus_leer_nodo(idx,0);
if (curnode == NULL) return -1;
/* Mientras no encontre la hoja con la clave, busco.. */
- while ((curnode->es_hoja == 0) && curnode)
+ while ((curnode->nivel > 0) && curnode)
{
}
+ free(curnode);
+
return 0;
}
int i = 0;
FILE *fp;
- NODO_B_PLUS *memnode = (NODO_B_PLUS*)malloc(sizeof(NODO_B_PLUS));
- char *disknode = (char*)malloc(sizeof(idx->tam_bloque));
+ NODO_B_PLUS *memnode = b_plus_crearnodo(idx);
+ char *disknode = (char*)malloc(idx->tam_bloque);
if (disknode == NULL) return NULL;
if (memnode == NULL) return NULL;
/* Open up file */
- fp = fopen(idx->filename, "r");
+ fp = fopen(idx->filename, "r+");
if (fp == NULL) {
free(disknode);
free(memnode);
/* Pudimos leer un nodo de disco, ahora lo transformamos a nodo mem */
memcpy(memnode,disknode,SIZE_B_PLUS_HEADER);
memcpy(memnode->claves,disknode+SIZE_B_PLUS_HEADER,idx->size_claves);
- memcpy(memnode->hijos,disknode+SIZE_B_PLUS_HEADER,idx->size_hijos);
+ memcpy(memnode->hijos,disknode+SIZE_B_PLUS_HEADER+idx->size_claves,idx->size_hijos);
free(disknode);
- printf("Dumping nodo leido...\n");
- printf("Nivel: %i Cant Claves: %i Es Hoja: %i\n",memnode->nivel,memnode->cant_claves,memnode->es_hoja);
+ printf("Dumping Node_%i\n",num_node);
+ printf("Nivel: %i Cant Claves: %i\n",memnode->nivel,memnode->cant_claves);
printf("Claves:");
for (i = 0; i < idx->size_claves/sizeof(int); ++i) printf(" %i",memnode->claves[i]);
printf("\nHijos:");
return memnode;
}
+
+int b_plus_grabar_nodo(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_node)
+{
+ FILE *fp;
+
+ fp = fopen(idx->filename, "r+");
+ if (fp == NULL) return -1;
+
+ fseek(fp,num_node*sizeof(NODO_B_PLUS),SEEK_SET);
+ fwrite(nodo,SIZE_B_PLUS_HEADER,1,fp);
+ fwrite(nodo->claves,idx->size_claves,1,fp);
+ fwrite(nodo->hijos,idx->size_hijos,1,fp);
+ fclose(fp);
+
+ return 0;
+}