From c1df639f58f6d3c08247c1543916644e375f8ce2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicol=C3=A1s=20Dimov?= Date: Wed, 26 May 2004 06:44:16 +0000 Subject: [PATCH] preparo un poco la cancha para empezar a insertar registros en el archivo de datos, perdon si descuajeringue algo --- emufs/b_plus.h | 2 +- emufs/b_plus_test.c | 11 ++++++++++- emufs/indices.c | 6 +++++- emufs/indices.h | 4 ++-- emufs/tipo3.c | 42 +++++++++++++++++++++++++++++++++++++++++- emufs/tipo3.h | 7 +++---- 6 files changed, 62 insertions(+), 10 deletions(-) diff --git a/emufs/b_plus.h b/emufs/b_plus.h index edabda0..873b532 100644 --- a/emufs/b_plus.h +++ b/emufs/b_plus.h @@ -32,7 +32,7 @@ typedef struct nodo_b_plus { /** TODO */ int emufs_b_plus_crear(INDEXSPECS *idx); -int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *dataset); +int emufs_b_plus_get_bloque(INDEXSPECS *idx, INDEX_DAT *query); int emufs_b_plus_actualizar_nodo(INDEX_DAT *dataset); int emufs_b_plus_buscar(); int emufs_b_plus_destuir(); diff --git a/emufs/b_plus_test.c b/emufs/b_plus_test.c index 3facd83..0dc7603 100644 --- a/emufs/b_plus_test.c +++ b/emufs/b_plus_test.c @@ -16,7 +16,6 @@ indice.filename = "idxbplus_primary.idx"; printf("\nTam Nodo: %i Size Claves: %i Size_Hijos: %i\n",indice.tam_bloque,indice.size_claves,indice.size_hijos); emufs_b_plus_crear(&indice); - for (i=1;i<34;++i) { querydata.num_bloque = i; @@ -30,12 +29,22 @@ querydata.clave.i_clave = 7; b_plus_insertar(&indice,&querydata); querydata.num_bloque = 7; +<<<<<<< .mine +querydata.clave.i_clave = 5; +b_plus_insertar_clave(&indice,&querydata); +======= querydata.clave.i_clave = 5; b_plus_insertar(&indice,&querydata); +>>>>>>> .r497 querydata.num_bloque = 5; +<<<<<<< .mine +querydata.clave.i_clave = 3; +b_plus_insertar_clave(&indice,&querydata); +======= querydata.clave.i_clave = 3; b_plus_insertar(&indice,&querydata); +>>>>>>> .r497 querydata.num_bloque = 8; querydata.clave.i_clave = 63; diff --git a/emufs/indices.c b/emufs/indices.c index 1728d19..2fcf1c4 100644 --- a/emufs/indices.c +++ b/emufs/indices.c @@ -65,6 +65,11 @@ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, IND PERR("Creando indice con Arbol B*"); PERR("AÚN NO IMPLEMENTADO!!!!!!!!"); break; + case IND_B_PLUS: + /* llenar metodos */ + PERR("Creando indice con Arbol B+"); + PERR("AÚN NO IMPLEMENTADO!!!!!!!!"); + break; } return tmp; @@ -205,4 +210,3 @@ int emufs_indice_es_igual(INDICE *idx, CLAVE c1, CLAVE c2) } return 0; } - diff --git a/emufs/indices.h b/emufs/indices.h index 2928b14..ad2686c 100644 --- a/emufs/indices.h +++ b/emufs/indices.h @@ -20,7 +20,8 @@ typedef struct _reg_def_ { /** Tipos de Indices conocidos */ typedef enum { IND_B, /**< Utilizacion de Arboles B */ - IND_B_ASC /**< Utilizacion de Arboles B* */ + IND_B_ASC, /**< Utilizacion de Arboles B* */ + IND_B_PLUS } INDICE_TIPO; typedef enum { @@ -128,4 +129,3 @@ int emufs_indice_es_menor(INDICE *idx, CLAVE c1, CLAVE c2); /** Compara 2 claves de la forma c1 == c2 */ int emufs_indice_es_igual(INDICE *idx, CLAVE c1, CLAVE c2); #endif - diff --git a/emufs/tipo3.c b/emufs/tipo3.c index a76725c..7333d72 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -585,7 +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) { + 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; + + /*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*/ + + /*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; } diff --git a/emufs/tipo3.h b/emufs/tipo3.h index 8283acd..84f610f 100644 --- a/emufs/tipo3.h +++ b/emufs/tipo3.h @@ -138,10 +138,9 @@ void emufs_tipo3_leer_bloque_raw(EMUFS *emu, EMUFS_BLOCK_ID block_id, char **act /** Inserta un registro ordenado segun el Arbol B+ lo indique * \param emu Esructura para manejar los archivos. * \param ptr Cadena de datos contenedora del registro. - * \param clave Clave de ordenamiento. - * \param offset Distancia en bytes hasta la clave. - * \param num_bloque Numero de bloque donde se insertara el registro. + * \param ind Indice del archivo. + * \param err Codigo de error devuelto en caso de falla. */ -int emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, CLAVE clave, int offset, EMUFS_BLOCK_ID num_bloque, int *err); +int emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, INDICE *ind, int *err); #endif /* _EMUFS_TIPO3_H_ */ -- 2.43.0