return NULL;
}
/* Asigna punteros a funciones. */
- efs->leer_bloque = emufs_tipo3_leer_bloque;
- efs->leer_registro_raw = emufs_tipo3_leer_registro_raw;
- efs->leer_registro = emufs_tipo3_leer_registro;
- efs->grabar_registro = emufs_tipo3_grabar_registro;
- efs->borrar_registro = emufs_tipo3_borrar_registro;
- efs->leer_estadisticas = emufs_tipo3_leer_estadisticas;
- efs->modificar_registro = emufs_tipo3_modificar_registro;
- efs->compactar = emufs_tipo3_compactar;
- efs->leer_bloque_raw = emufs_tipo3_leer_bloque_raw;
+ emufs_tipo3_inicializar(efs);
break;
- }
+
+ case T4:
+ /* Lee cabeceras propias. */
+ if (!fread(&(efs->tam_bloque), sizeof(EMUFS_BLOCK_SIZE), 1, fp)) {
+ free(efs->nombre);
+ free(efs);
+ fclose(fp);
+ return NULL;
+ }
+ emufs_tipo4_inicializar(efs);
+ break;
+
+ case T5:
+ if ((!fread(&(efs->tam_bloque), sizeof(EMUFS_BLOCK_SIZE), 1, fp)) ||
+ (!fread(&(efs->tam_reg), sizeof(EMUFS_REG_SIZE), 1, fp)))
+ {
+ free(efs->nombre);
+ free(efs);
+ fclose(fp);
+ return NULL;
+ }
+ /* Asigna punteros a funciones. */
+ emufs_tipo5_inicializar(efs);
+ }
fclose(fp);
return efs;
/* y que no exista un indice primario */
PERR("Agregando indice");
tmp = emu->indices;
+ PERR("IGUALE");
while (tmp) {
if (strcmp(tmp->nombre, nombre)==0) {
error = 1;
memcpy(bloque, &header, sizeof(B_NodoHeader));
fwrite(bloque, idx->tam_bloque, 1, fp);
+ free(bloque);
fclose(fp);
}
}
#include "indice_b_asc.c"
-
/* llenar metodos */
/* hacer que la cantidad de claves quede par o impar, no me acuerdo (SAGAR)!!!*/
PERR("Creando indice con Arbol B+");
+ emufs_b_plus_crear(tmp);
tmp->size_claves = (tmp->tam_bloque - SIZE_B_PLUS_HEADER - sizeof(CLAVE))/2;
tmp->size_hijos = tmp->size_claves + sizeof(CLAVE);
emufs_b_plus_crear(tmp);
INDEX_DAT query;
int result, iter, cant_reg, leidos;
EMUFS_REG_SIZE tam_reg;
- CLAVE clave_ajena;
+ CLAVE clave_ajena, ancla;
int err = 0;
/*cargo el query para buscar*/
PERR("NO SE CARGO EL BLOQUE");
return -1;
}
+ /*me fijo si el que tengo que eliminar es el ancla del bloque*/
+ ancla = emufs_indice_generar_clave(emu->indices, bloque+sizeof(EMUFS_TIPO1_REG_HEADER));
/*leo la cantidad de registros en el bloque*/
memcpy(&cant_reg, bloque+emu->tam_bloque-sizeof(int), sizeof(int));
/*busco y elimino*/
iter = 0;
aux = bloque;
- /*me fijo si el que tengo que eliminar es el ancla del bloque*/
- clave_ajena = emufs_indice_generar_clave(emu->indices, bloque+sizeof(EMUFS_TIPO1_REG_HEADER));
- if ( emufs_indice_es_igual(emu->indices, clave, clave_ajena) ){
- /* TENGOQ QUE BORRAR LA CLAVE DEL ARBOL !!!!*/
- /* Y HAY QUE BORRAR EL BLOQUE DEL ARCHIVO*/
- }
- leidos = 0;
while ( iter < emu->tam_bloque /*&& leidos < cant_reg*/){
memcpy(&tam_reg, aux+sizeof(EMUFS_REG_ID), sizeof(EMUFS_REG_SIZE));
clave_ajena = emufs_indice_generar_clave(emu->indices, aux+sizeof(EMUFS_TIPO1_REG_HEADER));
iter += tam_reg+sizeof(EMUFS_TIPO1_REG_HEADER);
break;/*ya borre, corto aca*/
}
- leidos++;
iter += tam_reg+sizeof(EMUFS_TIPO1_REG_HEADER);
aux += tam_reg+sizeof(EMUFS_TIPO1_REG_HEADER);
}
free(bloque);
return -1;
}
+ /*me fijo si el que tengo que eliminar es el ancla del bloque*/
+ if ( emufs_indice_es_igual(emu->indices, clave, ancla) ){
+ if ( cant_reg == 0 )
+ emufs_b_plus_eliminar(emu->indices, clave, 0);
+ else {
+ /*obtengo la nueva ancla del bloque*/
+ query.clave = emufs_indice_generar_clave(emu->indices, bloque+sizeof(EMUFS_TIPO1_REG_HEADER));
+ emufs_b_plus_reemplazar_clave(emu->indices, ancla, query, 0);
+ }
+ }
free(bloque);
return 0;
}
#include "tipo1.h"
#include "indices.h"
#include "indice_bplus.h"
+int no_esta(int num, int* vec, int len)
+{
+ int i, res;
+ res = -1;
+ for(i=0; i<len; i++)
+ if ( vec[i] == num ) res = 0;
+ return res;
+}
+
+
+void ver_arbol(EMUFS *emu)
+{
+ NODO_B_PLUS *nodo;
+ int num_nodo, num_nodo_ant,i, tecla;
+ num_nodo =0;
+
+ while ( tecla != -1){
+ nodo = b_plus_leer_nodo(emu->indices, num_nodo);
+ printf("NODO: (hijo)clave\n");
+ printf("Nivel: %d\n", nodo->nivel);
+ for (i=0; i<nodo->cant_claves; i++)
+ printf("(%d)%d", nodo->hijos[i], nodo->claves[i]);
+ printf("(%d)",nodo->hijos[i]);
+ printf("\n");
+ printf("Ingrese proximo nodo a explorar, o -1 para salir: ");
+ scanf("%d",&tecla);
+ printf("%d\n",tecla);
+ if ( tecla!=0 &&((no_esta(tecla, nodo->hijos, nodo->cant_claves+1) == -1) || (nodo->nivel==0)) ){
+ num_nodo = num_nodo_ant;
+ printf("El nodo no existe o es nivel cero\n");
+ }
+ else num_nodo_ant = num_nodo = tecla;
+ b_plus_destruir_nodo(nodo);
+ }
+}
char* cargar_registro(char* texto_ini,int len_ini, CLAVE clave, char *texto_fin, int len_fin)
int tam_nodo = SIZE_B_PLUS_HEADER + sizeof(CLAVE)*5 + sizeof(CLAVE)*6;
EMUFS_REG_SIZE len, size;
int err=0;
+ INDICE_DATO dato;
texto = "PARTE COSNSTANTE, clave =";
- emu = emufs_crear("test",T1,512,0);
+ emu = emufs_crear("test",T4,512,0);
emufs_agregar_indice(emu,"claveidx",IND_PRIMARIO,IND_B_PLUS,IDX_INT,strlen(texto),tam_nodo, 0);
emufs_tipo1_eliminar_ordenado(emu, clave, &err);
clave.i_clave = 95;
emufs_tipo1_eliminar_ordenado(emu, clave, &err);
-clave.i_clave = 77;
-emufs_tipo1_eliminar_ordenado(emu, clave, &err);
*/
+
+clave.i_clave = 77;
+emufs_tipo1_eliminar_ordenado(emu, clave, dato);
+
+
PERR("LEYENDO REGISTRO");
-clave.i_clave = 99;
+clave.i_clave = 80;
r = emufs_tipo1_leer_registro_plus(emu, clave, &size, &err);
imprimir_reg(r, strlen(texto), size);
+free(r);
/*
for ( i=0; i<10000; i++){
free(r);
}
*/
+
+ver_arbol(emu);
emufs_destruir(emu);
return 0;
INDEX_DAT query;
int result, iter, cant_reg;
EMUFS_REG_SIZE tam_reg = emu->tam_reg;
- CLAVE clave_ajena;
+ CLAVE clave_ajena, ancla;
int err = 0;
/*cargo el query para buscar*/
query.clave = clave;
/*mando a buscar el bloque donde esta la clave que quiero eliminar*/
result = emufs_b_plus_get_bloque(emu->indices, &query, 0);
+ printf("bloque = %d\n", query.num_bloque);
if ( result == 1 ){
PERR("SE PRODUJO UN ERROR EN EL ARBOL");
return -1;
PERR("NO SE CARGO EL BLOQUE");
return -1;
}
+ /*me fijo si el que tengo que eliminar es el ancla del bloque*/
+ ancla = emufs_indice_generar_clave(emu->indices, bloque+sizeof(EMUFS_REG_ID));
/*leo la cantidad de registros en el bloque*/
memcpy(&cant_reg, bloque+emu->tam_bloque-sizeof(int), sizeof(int));
/*busco y elimino*/
iter = 0;
aux = bloque;
- /*me fijo si el que tengo que eliminar es el ancla del bloque*/
- clave_ajena = emufs_indice_generar_clave(emu->indices, bloque+sizeof(EMUFS_REG_ID));
- if ( emufs_indice_es_igual(emu->indices, clave, clave_ajena) ){
- /* TENGOQ QUE BORRAR LA CLAVE DEL ARBOL !!!!*/
- /* Y HAY QUE BORRAR EL BLOQUE DEL ARCHIVO*/
- }
while ( iter < emu->tam_bloque ){
clave_ajena = emufs_indice_generar_clave(emu->indices, aux+sizeof(EMUFS_REG_ID));
if ( emufs_indice_es_igual(emu->indices, clave, clave_ajena) ){
free(bloque);
return -1;
}
+ /*me fijo si el que tengo que eliminar es el ancla del bloque*/
+ if ( emufs_indice_es_igual(emu->indices, clave, ancla) ){
+ if ( cant_reg == 0 )
+ emufs_b_plus_eliminar(emu->indices, clave, 0);
+ else {
+ /*obtengo la nueva ancla del bloque*/
+ query.clave = emufs_indice_generar_clave(emu->indices, bloque+sizeof(EMUFS_REG_ID));
+ emufs_b_plus_reemplazar_clave(emu->indices, ancla, query, 0);
+ }
+ }
free(bloque);
return 0;
}
NODO_B_PLUS *nodo;
int num_nodo, num_nodo_ant,i, tecla;
num_nodo =0;
-
+
while ( tecla != -1){
nodo = b_plus_leer_nodo(emu->indices, num_nodo);
printf("NODO: (hijo)clave\n");
printf("(%d)%d", nodo->hijos[i], nodo->claves[i]);
printf("(%d)",nodo->hijos[i]);
printf("\n");
- printf("Ingrese proximo nodo a explorar -9 para ir al hermano derecho de una hoja, o -1 para salir: ");
+ printf("Ingrese proximo nodo a explorar, o -1 para salir: ");
scanf("%d",&tecla);
printf("%d\n",tecla);
if ( tecla!=0 &&((no_esta(tecla, nodo->hijos, nodo->cant_claves+1) == -1) || (nodo->nivel==0)) ){
EMUFS *emu;
int tam_nodo = SIZE_B_PLUS_HEADER + sizeof(CLAVE)*5 + sizeof(CLAVE)*6;
EMUFS_REG_SIZE len, size;
- int err=0, i;
+ int err=0, i, res;
+ INDICE_DATO dato;
+ INDEX_DAT q;
texto = "PARTE COSNSTANTE, clave =";
texto2= "FIN DE REGISTRO DE LONG CONSTANTE LO HAGO MAS LARGO PARA PROBAR CUANDO SE PARTE UN BLOQUE";
printf("TAMANIO DE LOS REGISTROS = %d\n",strlen(texto)+sizeof(CLAVE)+strlen(texto2));
- emu = emufs_crear("test",T3,512,strlen(texto)+sizeof(CLAVE)+strlen(texto2));
+ emu = emufs_crear("test",T5,512,strlen(texto)+sizeof(CLAVE)+strlen(texto2));
+ PERR("EMUFS CREADO");
emufs_agregar_indice(emu,"claveidx",IND_PRIMARIO,IND_B_PLUS,IDX_INT,strlen(texto),tam_nodo, 0);
-
+ PERR("INDICE AGREGADO");
/*REGISTRO 1*/
clave.i_clave = 77;
emufs_tipo3_eliminar_ordenado(emu, clave, &err);
clave.i_clave = 99;
emufs_tipo3_eliminar_ordenado(emu, clave, &err);
-clave.i_clave = 95;
-emufs_tipo3_eliminar_ordenado(emu, clave, &err);
+
clave.i_clave = 77;
-emufs_tipo3_eliminar_ordenado(emu, clave, &err);
+emufs_tipo3_eliminar_ordenado(emu, clave, dato);
+*/
+clave.i_clave = 99;
+emufs_tipo3_eliminar_ordenado(emu, clave, dato);
+
+
+/*
+q.clave.i_clave = 95;
+q.num_bloque = 2;
+res = emufs_b_plus_get_bloque(emu->indices, &q, 0);
+
+printf("Num Bloque: %d\nResultado: %d\n", q.num_bloque, res);
*/
+
+
+/*
PERR("LEYENDO REGISTRO");
-clave.i_clave = 98;
+clave.i_clave = 80;
err = 0;
r = emufs_tipo3_leer_registro_plus(emu, clave, &size, &err);
if (err) PERR(" NO SE LEYO EL REGISTRO");