]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
leer registro bplus.. hecho y testeado muy tibiamente en tipo1 y 3
authorNicolás Dimov <ndimov@gmail.com>
Sat, 29 May 2004 19:57:29 +0000 (19:57 +0000)
committerNicolás Dimov <ndimov@gmail.com>
Sat, 29 May 2004 19:57:29 +0000 (19:57 +0000)
emufs/tipo1.c
emufs/tipo1.h
emufs/tipo1_bplus_main.c
emufs/tipo3.c
emufs/tipo3.h
emufs/tipo3_bplus_main.c

index bf15663f5f660e5c64308650ebef36e8c656e416..60ee65b247ef39b1151f77c76b34376913158a64 100644 (file)
@@ -1036,3 +1036,57 @@ int emufs_tipo1_eliminar_ordenado(EMUFS *emu, CLAVE clave, int *err)
        free(bloque);
        return 0;
 }
        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; i<cant_reg; i++){
+               /*copio el tamanio del registro*/
+               memcpy(&tam_reg, aux+sizeof(EMUFS_REG_ID), sizeof(EMUFS_REG_SIZE));
+               /*leo la clave*/
+               clave_ajena = emufs_indice_generar_clave(emu->indices, 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;
+}
index 1f3308809f2e3fd650029c79c903c36516e12e5c..bfdec841c6e9e36f29b386ca29ececbaa949739a 100644 (file)
@@ -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);
 
 /** 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_ */
 #endif /* _EMUFS_TIPO1_H_ */
index 81a0487cbb68269cda1b555e41e4a3101f0324f3..48cbafb4424a47f0d24a490184d99e70dc611979 100644 (file)
@@ -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;
        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 =";
        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);
        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;
 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);
 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++){
 
 /*
 for ( i=0; i<10000; i++){
index 435e86cad5923e1474a8fdb14f1affebee6a3eaa..04156e9e6582918825d5ec978174ca81dc016529 100644 (file)
@@ -869,3 +869,56 @@ int emufs_tipo3_eliminar_ordenado(EMUFS *emu, CLAVE clave, int *err)
        free(bloque);
        return 0;
 }
        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; i<cant_reg; i++){
+               /*leo la clave*/
+               clave_ajena = emufs_indice_generar_clave(emu->indices, 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;
+}
index df448c1b8d2fa7b9d3455ebaad7eb21d7ef62732..cd2b53e6c7df69dca5401a53d4566063c5f86886 100644 (file)
@@ -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);
 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_ */
 #endif /* _EMUFS_TIPO3_H_ */
index e4aff57f66e72252549c4d536f402522baa587ca..b43432baef221da59913691e15deec46eca870be 100644 (file)
@@ -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;
        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 =";
        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);
 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();       
 /*for ( i=0; i<10000; i++){
        srandom(i);
        clave.i_clave = random();