From: Nicolás Dimov Date: Sat, 29 May 2004 00:49:11 +0000 (+0000) Subject: Limpio un poco el codigo, sigo debuggeando... cosa rara: inserta los registros orden... X-Git-Tag: svn_import_r684~133 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/dea2e663e8a5afc489e331721832c3dbfb4d2f09?ds=inline Limpio un poco el codigo, sigo debuggeando... cosa rara: inserta los registros ordenados PERO ALREVES --- diff --git a/emufs/common.c b/emufs/common.c index 3906e05..1182c29 100644 --- a/emufs/common.c +++ b/emufs/common.c @@ -46,7 +46,6 @@ long emufs_common_get_file_size(const char* filename, int* err) *err = EMUFS_ERROR_CANT_OPEN_FILE; return 0; } - fseek(file, 0, SEEK_END); file_size = ftell(file); fclose(file); if (file_size < 0) { diff --git a/emufs/emufs.c b/emufs/emufs.c index cd59b39..3803cf5 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -496,7 +496,6 @@ EMUFS_BLOCK_ID emufs_create_new_block(EMUFS *emu) dummy = (char*)malloc(emu->tam_bloque); memset(dummy, 0, emu->tam_bloque); fwrite(dummy, emu->tam_bloque, 1, fp); - printf("new_block ftell = %d\n", ftell(fp)); switch(emu->tipo){ case T1: num = (ftell(fp)-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE))/emu->tam_bloque; break; @@ -504,7 +503,7 @@ EMUFS_BLOCK_ID emufs_create_new_block(EMUFS *emu) } fclose(fp); free(dummy); - return num-1; + return num; } /*devuelve un numero de bloque siguiente al ultimo*/ diff --git a/emufs/tipo1.c b/emufs/tipo1.c index ffca191..1bc3d2b 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -747,7 +747,7 @@ void emufs_tipo1_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, c int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, int *err) { - CLAVE clave; + CLAVE clave, menor_clave_bloque_nuevo; EMUFS_BLOCK_ID num_bloque; EMUFS_TIPO1_REG_HEADER header; EMUFS_REG_SIZE tam_reg, move_size; @@ -757,10 +757,8 @@ int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, in int cant_reg, i, result, dif; /*le asigno un posible numero de bloque para el caso en que no encuentre donde meterlo*/ - PERR("LEO EL NUMERO DE BLOQUE SIGUIENTE"); num_bloque = emufs_get_new_block_number(emu); query.num_bloque = num_bloque; - printf("BLOQUE NUMBER : %d\n", num_bloque); /*saco la clave del stream*/ query.clave = emufs_indice_generar_clave(emu->indices, ptr); /*mando a buscar en el arbol el bloque correspondiente a esa clave*/ @@ -774,7 +772,6 @@ int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, in 1 = Error de lectura en algun nodo, abortar operacion en funcion invocante. */ result = emufs_b_plus_get_bloque(emu->indices, &query, 0); - printf("tengo que guardar en bloque: %d\n", query.num_bloque); if (result == 1){ PERR("SE PRODUJO UN ERROR EN EL ARBOL.. ABORTANDO"); return -1; @@ -834,11 +831,11 @@ int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, in /*en teoria el nuevo registro no debe cambiar el ancla, por lo cual no actualizo el arbol*/ free(bloque); return 0; - /*aca va lo que saque*/ } else { /* el registro no entra en el bloque, hay que crear uno nuevo y desparramar */ PERR(" COMO NO ENTRA DEBO DIVIDIR LOS REGISTROS EN 2 BLOQUES"); new_bloque = (char*)malloc(emu->tam_bloque); move_size=0; + aux = bloque; for(i=0; itam_bloque-move_size); + /*copio el resto del bloque al nuevo bloque*/ /*footer ¿?*/ + memcpy(new_bloque, aux, emu->tam_bloque-move_size/*-sizeof(int)*/); /*borro lo que sobra en el bloque original, guardando el footer*/ memset(aux, 0, emu->tam_bloque - move_size - sizeof(int)); - /*actualizo la cant de registros (footer)*/ + /*actualizo la cant de registros del bloque original (footer)*/ + i++; /* 0 a n hay n+1 */ memcpy(bloque+emu->tam_bloque-sizeof(int), &i, sizeof(int)); - PERR("PASE"); - /*grabo el bloque original*/ - printf("voya a grabar en bloque: %d\n", num_bloque); - emufs_tipo1_grabar_bloque_fsc(emu, bloque, num_bloque, EMUFS_NOT_FOUND, err); - PERR("GRABE EL BLOQUE 1 de 2"); /*actualizo el footer del nuevo bloque*/ dif = cant_reg - i; /*por las dudas*/ - memcpy(new_bloque+emu->tam_bloque, &dif, sizeof(int)); - /*genero un nuevo espacio para un bloque en el archivo y lo cargo en query - la clave ya estaba en query desde antes*/ - query.num_bloque = emufs_create_new_block(emu); - /*inserto el nuevo registro en el nuevo bloque y obtengo la clave del menor*/ - clave = grabar_ordenado_en_bloque(emu,ptr,size,new_bloque,query.num_bloque, emu->tam_bloque-move_size,err); + memcpy(new_bloque+emu->tam_bloque-sizeof(int), &dif, sizeof(int)); + menor_clave_bloque_nuevo = emufs_indice_generar_clave(emu->indices, new_bloque+sizeof(EMUFS_TIPO1_REG_HEADER)); + /* TENGO QUE VER EN CUAL DE LOS DOS BLOQUES METO EL REGISTRO NUEVO */ + if ( emufs_indice_es_menor(emu->indices, menor_clave_bloque_nuevo, clave) ){ + /*genero un nuevo espacio para un bloque en el archivo y lo cargo en queryla clave ya estaba en query desde antes*/ + query.num_bloque = emufs_create_new_block(emu); + printf("numero de bloque nuevo: %d\n", query.num_bloque); + /*inserto el nuevo registro en el nuevo bloque y obtengo la clave del menor*/ + clave = grabar_ordenado_en_bloque(emu,ptr,size,new_bloque,query.num_bloque, emu->tam_bloque-move_size,err); + /*actualizo el arbol con la nueva clave*/ + query.clave = clave; + emufs_b_plus_insertar(emu->indices, &query); + /*grabo el bloque original*/ + printf("numero de bloque viejo: %d\n", num_bloque); + emufs_tipo1_grabar_bloque_fsc(emu, bloque, num_bloque, EMUFS_NOT_FOUND, err); + } else { + /*grabo el bloque nuevo*/ + query.num_bloque = emufs_create_new_block(emu); + printf("numero de bloque nuevo: %d\n", query.num_bloque); + emufs_tipo1_grabar_bloque_fsc(emu, new_bloque, emufs_create_new_block(emu), EMUFS_NOT_FOUND, err); + printf("numero de bloque viejo %d\n", num_bloque); + grabar_ordenado_en_bloque(emu,ptr,size,bloque,query.num_bloque, fs-move_size,err); + + } if(*err != 0){ PERR("NO SE PUDO GRABAR ORDENADO"); free(new_bloque); free(bloque); return -1; } - /*actualizo el arbol con la nueva clave*/ - emufs_b_plus_insertar(emu->indices, &query); free(new_bloque); free(bloque); return 0; diff --git a/emufs/tipo1_bplus_main.c b/emufs/tipo1_bplus_main.c index 11b6c3b..771b1a2 100644 --- a/emufs/tipo1_bplus_main.c +++ b/emufs/tipo1_bplus_main.c @@ -41,10 +41,10 @@ int main (int argc,char* argv[]) EMUFS_REG_SIZE len; int err=0; - texto="PARTE CONSTANTE, clave ="; - emu = emufs_crear("test",T1,512,0); emufs_agregar_indice(emu,"claveidx",IND_PRIMARIO,IND_B_PLUS,IDX_INT,strlen(texto),tam_nodo); + + texto = "PARTE COSNSTANTE, clave ="; /*REGISTRO 1*/ clave.i_clave = 77; texto2="termina el texto re bonito CLAVE = 77"; @@ -65,7 +65,7 @@ int main (int argc,char* argv[]) PERR("REGISTRO 2 GRABADO"); free(r); -/*REGISTRO 3*/ +/*REGISTRO 3 texto2="Este es el fin del registro tres, puse tres en numero para que sea mas largo el texto CLAVE = 95"; clave.i_clave = 95; r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2)); @@ -75,7 +75,7 @@ int main (int argc,char* argv[]) PERR("REGISTRO 3 GRABADO"); free(r); -/*REGISTRO 4*/ +/*REGISTRO 4 texto2="REGISTRO CUATRO CLAVE = 99"; clave.i_clave = 99; r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2)); @@ -85,7 +85,7 @@ int main (int argc,char* argv[]) PERR("REGISTRO 4 GRABADO"); free(r); -/*REGISTRO 5*/ +/*REGISTRO 5 texto2="el quinto registro tiene un largo promedio como para entrar en el bloque CLAVE = 102"; clave.i_clave = 102; r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2)); @@ -96,7 +96,7 @@ int main (int argc,char* argv[]) free(r); /*REGISTRO 6*/ - texto2="El registro 6 no entra CLAVE = 106"; +/* texto2="El registro 6 no entra CLAVE = 106"; clave.i_clave = 106; r = cargar_registro(texto, strlen(texto), clave, texto2, strlen(texto2)); imprimir_reg(r, strlen(texto), strlen(texto)+strlen(texto2)+sizeof(CLAVE)); @@ -105,7 +105,7 @@ int main (int argc,char* argv[]) PERR("REGISTRO 6 GRABADO"); free(r); emufs_destruir(emu); - +*/ return 0; }