X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/8bc5985288b46b993316b85bf2e13899c1a09292..c1df639f58f6d3c08247c1543916644e375f8ce2:/emufs/tipo3.c diff --git a/emufs/tipo3.c b/emufs/tipo3.c index ac73429..7333d72 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -59,13 +59,18 @@ void* emufs_tipo3_leer_registro(EMUFS *emu, CLAVE clave, cant_bloques = 1; /*si existe, lo busco en el archivo de bloques*/ - if (emu->indices != NULL) { + if ((emu->indices != NULL) && (*err != 1)) { /* TODO : Verificar donde esta el indice primario */ dato = emu->indices->existe_entrada(emu->indices, clave); block = dato.bloque; ID = dato.id; + PERR("Use indice"); } else { - /* TODO ID de donde lo puedo sacar :-) , lo cargo en CLAVE ? */ + /* Si no tengo claves, uso el campo entero para pasar un ID + * directamente. + */ + PERR("Use directo"); + ID = clave.i_clave; block = emufs_idx_buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/ } if ( block == EMUFS_NOT_FOUND ){ @@ -349,9 +354,14 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, CLAVE k) cant_bloques = 1; PERR("Buscando datos del registro en el indice"); - dato = emu->indices->existe_entrada(emu->indices, k); - num_bloque = dato.bloque; /*emufs_idx_buscar_registro(emu, ID);*/ - ID = dato.id; + if (emu->indices != NULL) { + dato = emu->indices->existe_entrada(emu->indices, k); + num_bloque = dato.bloque; + ID = dato.id; + } else { + ID = k.i_clave; + num_bloque = emufs_idx_buscar_registro(emu, ID); + } if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque, &err))) { /* TODO Manejo de errores */ @@ -472,9 +482,9 @@ EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *emu) return stats; } -EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *data, EMUFS_REG_SIZE size, int *error) +EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, CLAVE k, void *data, EMUFS_REG_SIZE size, int *error) { - /*emufs_tipo3_borrar_registro(emu, id);*/ + emufs_tipo3_borrar_registro(emu, k); return emufs_tipo3_grabar_registro(emu, data, size, error); } @@ -575,24 +585,47 @@ 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, CLAVE clave, int offset, EMUFS_BLOCK_ID num_bloque, int *err) +CLAVE obtener_clave(void *ptr, INDICE *ind) { - FILE *f; - char f_name[255]; - char *bloque; - int size; - CLAVE clave_ant; + CLAVE c; + switch (ind->tipo_dato) { + case IDX_INT: memcpy(&c, ptr+ind->offset, sizeof(int)); + break; + case IDX_FLOAT: memcpy(&c, ptr+ind->offset, sizeof(float)); + break; + case IDX_STRING: /*no hago nada pero saco el warning*/ + } + return c; +} + +int emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, INDICE *indice, int *err) +{ + #ifdef ESTO_NO_ANDA_TODAVIA + CLAVE clave, clave_aux; + EMUFS_BLOCK_ID num_bloque = get_new_block_number(emu); /*implementar esto*/ + INDEX_DAT query; + char *bloque, *new_bloque, *registro; - strcpy(f_name, emu->nombre); - strcat(f_name, ".dat"); + /*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 = obtener_clave(ptr, indice); + /*mando a buscar en el arbol el bloque correspondiente a esa clave*/ + indice->emufs_b_plus_get_bloque(ind, &query); + /*en query->num_bloque tengo el bloque donde debo meter el registro*/ - bloque = emufs_tipo3_leer_bloque(emu, num_bloque, err); - if (err){ - PERR("NO SE PUDO LEER EL BLQUE"); + /*cargo el bloque*/ + bloque = emufs_tipo3_leer_bloque(emu, query.num_bloque, err); + if (err != 0){ + PERR("NO SE PUDO LEER EL BLOQUE"); return -1; } + /*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*/ + #endif ESTO_NO_ANDA_TODAVIA return 0; }