From 1cebaa0aee614e8b62cc612825db564f93bba657 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicol=C3=A1s=20Dimov?= Date: Sat, 29 May 2004 19:57:29 +0000 Subject: [PATCH] leer registro bplus.. hecho y testeado muy tibiamente en tipo1 y 3 --- emufs/tipo1.c | 54 ++++++++++++++++++++++++++++++++++++++++ emufs/tipo1.h | 2 ++ emufs/tipo1_bplus_main.c | 10 ++++++-- emufs/tipo3.c | 53 +++++++++++++++++++++++++++++++++++++++ emufs/tipo3.h | 2 ++ emufs/tipo3_bplus_main.c | 14 ++++++++++- 6 files changed, 132 insertions(+), 3 deletions(-) diff --git a/emufs/tipo1.c b/emufs/tipo1.c index bf15663..60ee65b 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -1036,3 +1036,57 @@ int emufs_tipo1_eliminar_ordenado(EMUFS *emu, CLAVE clave, int *err) free(bloque); return 0; } + +void *emufs_tipo1_leer_registro_plus(EMUFS *emu, CLAVE clave, EMUFS_REG_SIZE *size, int *err) +{ + CLAVE clave_ajena; + char *reg; + char *bloque, *aux; + INDEX_DAT query; + int result, cant_reg, i; + EMUFS_REG_SIZE tam_reg; + + /*cargo el query*/ + query.clave = clave; + query.num_bloque = 0; + /*hago la consulta*/ + + result = emufs_b_plus_get_bloque(emu->indices, &query, 0); + + if (result == -1){ + PERR("NO EXISTE EL BLOQUE"); + return NULL; + } + if (result == 1){ + PERR("SE PRODUJO UN ERROR EN EL ARBOL"); + return NULL; + } + /*leo el bloque*/ + bloque = emufs_tipo1_leer_bloque(emu, query.num_bloque, err); + /*busco el registro en el bloque*/ + /*copio la cantidad de registros*/ + memcpy(&cant_reg, bloque+emu->tam_bloque-sizeof(int), sizeof(int)); + aux = bloque; + for (i=0; iindices, aux+sizeof(EMUFS_TIPO1_REG_HEADER)); + if ( emufs_indice_es_igual(emu->indices, clave, clave_ajena) ){ + reg = (char*)malloc(tam_reg); + if (reg == NULL){ + PERR("NO SE PUDO CARGAR EL REGISTRO"); + *err = -1; + free(bloque); + return -1; + } + /*copio el registro*/ + memcpy(reg, aux+sizeof(EMUFS_TIPO1_REG_HEADER), tam_reg); + *size = tam_reg; + break; /*ya lo encontre, corto el for*/ + } + aux += tam_reg+sizeof(EMUFS_TIPO1_REG_HEADER); /*paso al proximo*/ + } + free(bloque); + return reg; +} diff --git a/emufs/tipo1.h b/emufs/tipo1.h index 1f33088..bfdec84 100644 --- a/emufs/tipo1.h +++ b/emufs/tipo1.h @@ -79,4 +79,6 @@ int emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, in /** Elimina un registro de clave CLAVE del archivo con ayuda del arbol B+*/ int emufs_tipo1_eliminar_ordenado(EMUFS *emu, CLAVE clave, int *err); + +void *emufs_tipo1_leer_registro_plus(EMUFS *emu, CLAVE clave, EMUFS_REG_SIZE *size, int *err); #endif /* _EMUFS_TIPO1_H_ */ diff --git a/emufs/tipo1_bplus_main.c b/emufs/tipo1_bplus_main.c index 81a0487..48cbafb 100644 --- a/emufs/tipo1_bplus_main.c +++ b/emufs/tipo1_bplus_main.c @@ -38,7 +38,7 @@ int main (int argc,char* argv[]) char *r; EMUFS *emu; int tam_nodo = SIZE_B_PLUS_HEADER + sizeof(CLAVE)*5 + sizeof(CLAVE)*6; - EMUFS_REG_SIZE len; + EMUFS_REG_SIZE len, size; int err=0; texto = "PARTE COSNSTANTE, clave ="; @@ -115,7 +115,7 @@ int main (int argc,char* argv[]) emufs_tipo1_insertar_ordenado(emu, r, len, &err); PERR("REGISTRO 7 GRABADO"); free(r); - +/* clave.i_clave = 93; emufs_tipo1_eliminar_ordenado(emu, clave, &err); clave.i_clave = 99; @@ -124,7 +124,13 @@ clave.i_clave = 95; emufs_tipo1_eliminar_ordenado(emu, clave, &err); clave.i_clave = 77; emufs_tipo1_eliminar_ordenado(emu, clave, &err); +*/ + +PERR("LEYENDO REGISTRO"); +clave.i_clave = 99; +r = emufs_tipo1_leer_registro_plus(emu, clave, &size, &err); +imprimir_reg(r, strlen(texto), size); /* for ( i=0; i<10000; i++){ diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 435e86c..04156e9 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -869,3 +869,56 @@ int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, int *err) free(bloque); return 0; } + +void *emufs_tipo3_leer_registro_plus(EMUFS *emu, CLAVE clave, EMUFS_REG_SIZE *size, int *err) +{ + CLAVE clave_ajena; + char *reg; + char *bloque, *aux; + INDEX_DAT query; + int result, cant_reg, i; + EMUFS_REG_SIZE tam_reg; + + tam_reg = emu->tam_reg; + /*cargo el query*/ + query.clave = clave; + query.num_bloque = 0; + /*hago la consulta*/ + + result = emufs_b_plus_get_bloque(emu->indices, &query, 0); + + if (result == -1){ + PERR("NO EXISTE EL BLOQUE"); + return NULL; + } + if (result == 1){ + PERR("SE PRODUJO UN ERROR EN EL ARBOL"); + return NULL; + } + /*leo el bloque*/ + bloque = emufs_tipo3_leer_bloque(emu, query.num_bloque, err); + /*busco el registro en el bloque*/ + /*copio la cantidad de registros*/ + memcpy(&cant_reg, bloque+emu->tam_bloque-sizeof(int), sizeof(int)); + aux = bloque; + for (i=0; iindices, aux+sizeof(EMUFS_REG_ID)); + if ( emufs_indice_es_igual(emu->indices, clave, clave_ajena) ){ + reg = (char*)malloc(tam_reg); + if (reg == NULL){ + PERR("NO SE PUDO CARGAR EL REGISTRO"); + *err = -1; + free(bloque); + return -1; + } + /*copio el registro*/ + memcpy(reg, aux+sizeof(EMUFS_REG_ID), tam_reg); + *size = tam_reg; + break; /*ya lo encontre, corto el for*/ + } + aux += tam_reg+sizeof(EMUFS_REG_ID); /*paso al proximo*/ + } + free(bloque); + return reg; +} diff --git a/emufs/tipo3.h b/emufs/tipo3.h index df448c1..cd2b53e 100644 --- a/emufs/tipo3.h +++ b/emufs/tipo3.h @@ -143,4 +143,6 @@ void emufs_tipo3_leer_bloque_raw(EMUFS *emu, EMUFS_BLOCK_ID block_id, char **act int emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, int *err); int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, int *err); + +void *emufs_tipo3_leer_registro_plus(EMUFS *emu, CLAVE clave, EMUFS_REG_SIZE *size, int *err); #endif /* _EMUFS_TIPO3_H_ */ diff --git a/emufs/tipo3_bplus_main.c b/emufs/tipo3_bplus_main.c index e4aff57..b43432b 100644 --- a/emufs/tipo3_bplus_main.c +++ b/emufs/tipo3_bplus_main.c @@ -38,7 +38,7 @@ int main (int argc,char* argv[]) char *r; EMUFS *emu; int tam_nodo = SIZE_B_PLUS_HEADER + sizeof(CLAVE)*5 + sizeof(CLAVE)*6; - EMUFS_REG_SIZE len; + EMUFS_REG_SIZE len, size; int err=0, i; texto = "PARTE COSNSTANTE, clave ="; @@ -119,6 +119,18 @@ clave.i_clave = 95; emufs_tipo3_eliminar_ordenado(emu, clave, &err); clave.i_clave = 77; emufs_tipo3_eliminar_ordenado(emu, clave, &err); + +*/ + +PERR("LEYENDO REGISTRO"); +clave.i_clave = 99; +err = 0; +r = emufs_tipo3_leer_registro_plus(emu, clave, &size, &err); +if (err) PERR(" NO SE LEYO EL REGISTRO"); + +imprimir_reg(r, strlen(texto), size); + + /*for ( i=0; i<10000; i++){ srandom(i); clave.i_clave = random(); -- 2.43.0