From: Nicolás Dimov Date: Wed, 26 May 2004 20:52:17 +0000 (+0000) Subject: insertar ordenado por la mitad para tipo1, despues copio y pego para tipo3, deberia... X-Git-Tag: svn_import_r684~177 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/f78b0c305fbd6faa89e3f211d5d97a16204fa7bf?ds=sidebyside insertar ordenado por la mitad para tipo1, despues copio y pego para tipo3, deberia funcionar... auque tengo que cambiar un par de cosas --- diff --git a/emufs/b_plus.c b/emufs/b_plus.c index e215714..462a237 100644 --- a/emufs/b_plus.c +++ b/emufs/b_plus.c @@ -378,7 +378,7 @@ int b_plus_insert_nonfull(INDEXSPECS *idx, NODO_B_PLUS *nodo, int num_nodo, INDE return 0; } -int b_plus_insertar(INDEXSPECS *idx, INDEX_DAT *query) +int emufs_b_plus_insertar(INDEXSPECS *idx, INDEX_DAT *query) { NODO_B_PLUS *raiz; diff --git a/emufs/b_plus.h b/emufs/b_plus.h index 873b532..ba0b775 100644 --- a/emufs/b_plus.h +++ b/emufs/b_plus.h @@ -33,11 +33,11 @@ typedef struct nodo_b_plus { /** TODO */ int emufs_b_plus_crear(INDEXSPECS *idx); int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *query); +int emufs_b_plus_insertar(INDEXSPECS *idx, INDEX_DAT *query); int emufs_b_plus_actualizar_nodo(INDEX_DAT *dataset); int emufs_b_plus_buscar(); int emufs_b_plus_destuir(); int b_plus_insertar_clave(INDEXSPECS *, INDEX_DAT *); -int b_plus_insertar(INDEXSPECS *idx, INDEX_DAT *query); NODO_B_PLUS *b_plus_leer_nodo(INDEXSPECS *idx, int num); #endif diff --git a/emufs/b_plus_test.c b/emufs/b_plus_test.c index 0dc7603..9e258e5 100644 --- a/emufs/b_plus_test.c +++ b/emufs/b_plus_test.c @@ -20,7 +20,7 @@ for (i=1;i<34;++i) { querydata.num_bloque = i; querydata.clave.i_clave = i; -b_plus_insertar(&indice,&querydata); +emufs_b_plus_insertar(&indice,&querydata); } /* diff --git a/emufs/emufs.h b/emufs/emufs.h index 7e04f55..5befe36 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -176,4 +176,5 @@ int debug_ver_estadisticas(EMUFS *emu); int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset, unsigned int tam_bloque); INDICE_DATO *emufs_buscar_registros(EMUFS *emu, char *indice, char *data, int *cant); + #endif /* _EMUFS_H_ */ diff --git a/emufs/tipo1.c b/emufs/tipo1.c index fa1c012..99cf50c 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -75,6 +75,9 @@ static void* emufs_tipo1_leer_bloque(EMUFS*, EMUFS_BLOCK_ID, int*); static EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS*, void*, EMUFS_BLOCK_ID, EMUFS_FREE, int*); + +CLAVE insertar_odenado_en_bloque(EMUFS *emu, void *ptr, void *bloque, int num_bloque); + /*------------------ Funciones públicas ----------------------*/ int emufs_tipo1_inicializar(EMUFS* efs) @@ -724,6 +727,53 @@ int emufs_tipo1_block_jump(EMUFS* efs, FILE* fp, EMUFS_BLOCK_ID block_count) return EMUFS_OK; } +/*crea un bloque y devuelve en numero del mismo*/ +EMUFS_BLOCK_ID create_new_block(EMUFS *emu) +{ + FILE *fp; + char name[255]; + char *dummy; + EMUFS_BLOCK_ID num; + + /* obtengo nombre del archivo */ + strcpy(name, emu->nombre); + strcat(name,".dat"); + + if ( (fp=fopen(name,"a+")) == NULL ){ + PERR("NO SE PUDO ABRIR EL ARCHIVO"); + return -1; + } + + dummy = (char*)malloc(emu->tam_bloque); + memset(dummy, 0, emu->tam_bloque); + fwrite(dummy, emu->tam_bloque, 1, fp); + + num = (ftell(fp)-emufs_tipo1_header_size())/emu->tam_bloque; + fclose(fp); + free(dummy); + return num; +} + +/*devuelve un numero de bloque siguiente al ultimo*/ +EMUFS_BLOCK_ID get_new_block_number(EMUFS *emu) +{ + FILE *fp; + char name[255]; + EMUFS_BLOCK_ID num; + + /* obtengo nombre del archivo */ + strcpy(name, emu->nombre); + strcat(name,".dat"); + + if ( (fp=fopen(name,"a+")) == NULL ){ + PERR("NO SE PUDO ABRIR EL ARCHIVO"); + return -1; + } + num = (ftell(fp)-emufs_tipo1_header_size())/emu->tam_bloque; + fclose(fp); + return num+1; +} + void emufs_tipo1_escribir_reg_chunk_en_memoria(char* dst, EMUFS_TIPO1_REG_HEADER header, char* reg, EMUFS_REG_SIZE reg_size) { @@ -743,3 +793,135 @@ void emufs_tipo1_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, c (*siguiente) = emufs_tipo1_leer_bloque(efs, id+1, &err); (*size1) = (*size2) = (*size3) = efs->tam_bloque; } + +int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, int *err) +{ + #ifdef ESTO_NO_ANDA_TODAVIA + CLAVE clave, clave_ajena; + EMUFS_BLOCK_ID num_bloque = get_new_block_number(emu); + EMUFS_TIPO1_REG_HEADER header; + EMUFS_REG_SIZE tam_reg; + INDEX_DAT query; + char *bloque, *aux, *new_bloque, *registro; + int cant_reg, i, j; + + /*le asigno un posible numero de bloque para el caso en que no encuentre donde meterlo*/ + query.num_bloque = 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*/ + /*en query->num_bloque tengo el bloque donde debo meter el registro*/ + /*debo insertar el reg en el bloque en forma ordenada*/ + /*si es el menor de todos tengo que cambiar el ancla en el arbol*/ + /*si no entra, tengo que insertar una nueva clave en el arbol y separar los registros en 2 bloques*/ + if ( emu->indices->emufs_b_plus_get_bloque(ind, &query) == -1 ){ + /*creo un bloque nuevo*/ + bloque = (char*) malloc(emu->tam_bloque); + if (bloque == NULL){ + PERR("NO SE PUDO CREAR EL BLOQUE"); + return -1; + } + header.id = emufs_idx_get_new_id(efs, err); + header.size = size; + cant_reg = 1; + /*pongo la cabecera en el registro*/ + memcpy(bloque, &header, sizeof(EMUFS_TIPO1_REG_HEADER)); + /*inserto el footer en el bloque*/ + memcpy(bloque+emu->tam_bloque-sizeof(int), &cant_reg, sizeof(int)); + /*inserto el registro en el bloque*/ + if ( size <= emu->tam_bloque-sizeof(EMUFS_TIPO1_REG_HEADER)-sizeof(int) ) + memcpy(bloque+sizeof(EMUFS_TIPO1_REG_HEADER), ptr, size); + else { + PERR("NO ENTRA EL REGISTRO EN EL BLOQUE!!!!!"); + free(bloque); + return -1; + } + /*hago lugar en el archivo para grabar*/ + if ( num_bloque != create_new_block(emu) ) PERR("NUMEROS DE NUEVO BLOQUE DISTINTOS"); + /*grabo el bloque en el archivo*/ /* OJO CON LO DE FS = 0 */ + emufs_tipo1_grabar_bloque_fsc(emu, bloque, query->num_bloque, EMUFS_NOT_FOUND, err); + /*agrego la clave al arbol*/ + emufs_b_plus_insertar(emu->indices, &query); + free(bloque); + return 0; + } else { /*tengo que meter el registro en el bloque que me dijo el arbol*/ + /*leo el bloque correspondiente*/ + bloque = emufs_tipo1_leer_bloque(emu, num_bloque, err); + /*me fijo cuantos registros hay en el */ + memcpy(&cant_reg, bloque+emu->tam_bloque-sizeof(int), sizeof(int)); + /*me fijo si entra en nuevo reg en el bloque */ + aux = bloque; + for (i=0; i= size ){ /* puedo meter el registro en este bloque*/ + insertar_odenado_en_bloque(emu, ptr, bloque, query->num_bloque); + /*en teoria el nuevo registro no debe cambiar el ancla, por lo cual no actualizo el arbol*/ + return 0; + /*aca va lo que saque*/ + } else { /* el registro no entra en el bloque, hay que crear uno nuevo y desparramar */ + new_bloque = (char*)malloc(emu->tam_bloque); + for(i=0; itam_bloque); + aux = new_bloque; + for (i=0; itam_bloque-fs < sizeof(EMUFS_TIPO1_REG_HEADER)+emu->indices->offset ){ + PERR("ESTOY LEYENDO FUERA DEL BLOQUE!!!"); + free(new_bloque); + return clave; + } + clave_ajena = emufs_indice_generar_clave(emu->indices, bloque); /*leo la clave*/ + bloque -= sizeof(EMUFS_TIPO1_REG_HEADER); /*vuelvo al principio*/ + if ( inum_bloque, EMUFS_NOT_FOUND, err); + clave = emufs_indice_generar_clave(emu->indices, new_bloque+sizeof(EMUFS_TIPO1_REG_HEADER)); + free(new_bloque); + return clave; + #endif CAMBIAR +} diff --git a/emufs/tipo1.h b/emufs/tipo1.h index ef89e12..9ebb2da 100644 --- a/emufs/tipo1.h +++ b/emufs/tipo1.h @@ -39,6 +39,7 @@ #define _EMUFS_TIPO1_H_ #include "emufs.h" +#include "b_plus.h" /** Inicializa un EMUFS para poder ser utilizado como un archivo tipo1. * @@ -73,4 +74,5 @@ void emufs_tipo1_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, char **anterior, char **siguiente, EMUFS_BLOCK_SIZE *size1, EMUFS_BLOCK_SIZE *size2, EMUFS_BLOCK_SIZE *size3); +int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, int *err); #endif /* _EMUFS_TIPO1_H_ */ diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 28eafd5..24d2e72 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -585,7 +585,7 @@ void emufs_tipo3_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, c (*size1) = (*size2) = (*size3) = efs->tam_bloque; } -int emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, INDICE *indice, int *err) +int emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, int *err) { #ifdef ESTO_NO_ANDA_TODAVIA CLAVE clave, clave_aux; @@ -596,9 +596,9 @@ int emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, INDICE *indice, int *er /*le asigno un posible numero de bloque para el caso en que no encuentre donde meterlo*/ query.num_bloque = num_bloque; /*saco la clave del stream*/ - query.clave = emufs_indice_generar_clave(indice, ptr); + query.clave = emufs_indice_generar_clave(emu->indices, ptr); /*mando a buscar en el arbol el bloque correspondiente a esa clave*/ - indice->emufs_b_plus_get_bloque(ind, &query); + emu->indices->emufs_b_plus_get_bloque(ind, &query); /*en query->num_bloque tengo el bloque donde debo meter el registro*/ /*cargo el bloque*/ @@ -613,6 +613,9 @@ int emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, INDICE *indice, int *er /*si no entra, tengo que insertar una nueva clave en el arbol y separar los registros en 2 bloques*/ + + + #endif /*ESTO_NO_ANDA_TODAVIA*/ return 0; } diff --git a/emufs/tipo3.h b/emufs/tipo3.h index 84f610f..88be270 100644 --- a/emufs/tipo3.h +++ b/emufs/tipo3.h @@ -141,6 +141,6 @@ void emufs_tipo3_leer_bloque_raw(EMUFS *emu, EMUFS_BLOCK_ID block_id, char **act * \param ind Indice del archivo. * \param err Codigo de error devuelto en caso de falla. */ -int emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, INDICE *ind, int *err); +int emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, int *err); #endif /* _EMUFS_TIPO3_H_ */