From: Nicolás Dimov Date: Sun, 30 May 2004 05:12:50 +0000 (+0000) Subject: rompo todo porque me la banco... a ver si alguien se da cuenta por que se cuelga... X-Git-Tag: svn_import_r684~95 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/74c6776ce0ae5ea218cf0363af040bf260b2c72b?hp=673b6744b98968c1a0fd6856b5a9dcd636c06b7c rompo todo porque me la banco... a ver si alguien se da cuenta por que se cuelga cuando quiero crear un indice. en el tipo3_bplus_main creo el emu, y despues mando a crear el indice pero dentro de emufs_agregar_indice iguala dos punteros y muere ahi.. --- diff --git a/emufs/emufs.c b/emufs/emufs.c index 445f278..60e340d 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -299,17 +299,32 @@ EMUFS *emufs_abrir(const char *filename) 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; @@ -410,6 +425,7 @@ int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDIC /* 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; diff --git a/emufs/indice_b.c b/emufs/indice_b.c index 7597661..dfd4ff3 100644 --- a/emufs/indice_b.c +++ b/emufs/indice_b.c @@ -75,6 +75,7 @@ void emufs_indice_b_crear(INDICE *idx) memcpy(bloque, &header, sizeof(B_NodoHeader)); fwrite(bloque, idx->tam_bloque, 1, fp); + free(bloque); fclose(fp); } @@ -1401,4 +1402,3 @@ int b_borrar_dup_clave(INDICE *idx, INDICE_DATO k_dato, INDICE_DATO dato) } #include "indice_b_asc.c" - diff --git a/emufs/indices.c b/emufs/indices.c index 83dd5f6..4e1b7ab 100644 --- a/emufs/indices.c +++ b/emufs/indices.c @@ -83,6 +83,7 @@ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, IND /* 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); diff --git a/emufs/tipo1.c b/emufs/tipo1.c index 4e72fee..fb21da5 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -994,7 +994,7 @@ int emufs_tipo1_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato) 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*/ @@ -1016,18 +1016,13 @@ int emufs_tipo1_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato) 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)); @@ -1040,7 +1035,6 @@ int emufs_tipo1_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato) 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); } @@ -1055,6 +1049,16 @@ int emufs_tipo1_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato) 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; } diff --git a/emufs/tipo1_bplus_main.c b/emufs/tipo1_bplus_main.c index 48cbafb..adac6a9 100644 --- a/emufs/tipo1_bplus_main.c +++ b/emufs/tipo1_bplus_main.c @@ -4,6 +4,41 @@ #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; iindices, num_nodo); + printf("NODO: (hijo)clave\n"); + printf("Nivel: %d\n", nodo->nivel); + for (i=0; icant_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) @@ -40,9 +75,10 @@ int main (int argc,char* argv[]) 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); @@ -122,15 +158,19 @@ clave.i_clave = 99; 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++){ @@ -143,6 +183,8 @@ for ( i=0; i<10000; i++){ free(r); } */ + +ver_arbol(emu); emufs_destruir(emu); return 0; diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 4faabe7..9771588 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -855,7 +855,7 @@ int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato) 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*/ @@ -863,6 +863,7 @@ int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato) 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; @@ -877,17 +878,13 @@ int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato) 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) ){ @@ -913,6 +910,16 @@ int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato) 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; } diff --git a/emufs/tipo3_bplus_main.c b/emufs/tipo3_bplus_main.c index 7a539a1..a17470b 100644 --- a/emufs/tipo3_bplus_main.c +++ b/emufs/tipo3_bplus_main.c @@ -21,7 +21,7 @@ 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"); @@ -30,7 +30,7 @@ void ver_arbol(EMUFS *emu) 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)) ){ @@ -76,14 +76,17 @@ int main (int argc,char* argv[]) 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; @@ -152,15 +155,28 @@ clave.i_clave = 93; 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");