]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
Expongo el obtener siguiente de secuencial indexado, via la funcion en indince obtene...
authorAlan Kennedy <kennedya@3dgames.com.ar>
Sun, 30 May 2004 22:01:43 +0000 (22:01 +0000)
committerAlan Kennedy <kennedya@3dgames.com.ar>
Sun, 30 May 2004 22:01:43 +0000 (22:01 +0000)
emufs/emufs.h
emufs/indice_bplus.c
emufs/indice_bplus.h
emufs/indices.c
emufs/indices.h
emufs/tipo1.c
emufs/tipo3.c
emufs/tipo3_bplus_main.c

index 7c4e6933dbc9ee1b464fb8c13dfea231724dd545..66b4e79986d9a0c2db657bd2871bcb1bc06c82dc 100644 (file)
@@ -123,6 +123,7 @@ struct _emu_fs_t {
        int (*borrar_registro)(struct _emu_fs_t*, CLAVE, INDICE_DATO); /**< Método para borrar un registro */
        EMUFS_Estadisticas (*leer_estadisticas)(struct _emu_fs_t *); /**< Método para obtener estádisticas sobre el archivo */
        void (*compactar)(struct _emu_fs_t *); /**< Método para compactar el archivo reorganizándolo físicamente */
+       B_PLUS_KEYBUCKET* (*obtener_claves_raw)(struct _emu_fs_t*, int); 
        char *nombre; /**< Nombre del archivo */
 
        /* Lista de Indices */
index c1a8059b41c80c4e600c1f645fdd7c6a87796344..d2df758199ba77d61309f0871400aca0cb246fd6 100644 (file)
@@ -758,6 +758,11 @@ CLAVE emufs_b_plus_obtener_sig_clave(EMUFS *emu, CLAVE key) {
                /* Busco el ancla para esta key */
                emufs_b_plus_get_bloque(idx,&query,0);          
                idx->keybucket = emufs_tipo3_obtener_claves_raw(emu,query.num_bloque);
+               /* Dejo el el iterador listo para la leer el siguiente, pues puede estar por el medio */
+               i = idx->keybucket->cant_keys - 1;
+               while (i >= 0 && emufs_indice_es_menor(idx,key,idx->keybucket->claves[i])) --i;
+               i++;
+               idx->keybucket->current_key = i;
                printf ("\nLevante bloque nro: %li y obtuve un bucket con %i keys\n",query.num_bloque,idx->keybucket->cant_keys);       
                printf ("La primera clave del bucket que devuelvo es: %i\n",idx->keybucket->claves[0].i_clave);                                         
        }
@@ -777,8 +782,8 @@ CLAVE emufs_b_plus_obtener_sig_clave(EMUFS *emu, CLAVE key) {
                        while (i >= 0 && emufs_indice_es_menor(idx,key,idx->keybucket->claves[i])) --i;
                        i++;
                        idx->keybucket->current_key = i;                        
-                       printf ("\nLevante bloque nro: %li y obtuve un bucket con %i keys\n",query.num_bloque,idx->keybucket->cant_keys);       
                        printf ("La primera clave del bucket que devuelvo es: %i\n",idx->keybucket->claves[0].i_clave);                                         
+                       printf ("Deje el iterador en %i\n",i);
                }
        }               
        
index 012eb294bee7e5b1fc39ad50f02a3a3c1334dfa3..6cbd1f245fa0c11a4c2dd2925a64583ecfe4e98a 100644 (file)
@@ -7,11 +7,6 @@
 \r
 #define SIZE_B_PLUS_HEADER (sizeof(int)*2)\r
 \r
-typedef struct _index_dat_ {\r
-       EMUFS_BLOCK_ID num_bloque;\r
-       CLAVE clave;\r
-} INDEX_DAT;\r
-\r
 /** Estructura que define un nodo B+. Para los nodos hojas, el ultimo valor de hijo, será el nro\r
  *  de nodo con el que se encadena el actual. (Lista de nodos a nivel hoja. Sequence Set).\r
  */\r
index 5e48ae5b441b80c09fd51399becbf49ca79f5eea..680e01ab70439941120271ff2f5ab116d19fe1be 100644 (file)
@@ -89,7 +89,7 @@ INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_FUNCION funcion, IND
                        emufs_b_plus_crear(tmp);
                        tmp->obtener_menor_clave = emufs_b_plus_obtener_menor_clave;
                        tmp->obtener_mayor_clave = emufs_b_plus_obtener_mayor_clave;
-                       PERR("AÚN NO IMPLEMENTADO DEL TODO!!!!!!!!");
+                       tmp->obtener_sig_clave_isam = emufs_b_plus_obtener_sig_clave;                   
                        break;
        }
 
index 2063bc046b4ed4a406f93c401a083727efc141f4..3833d5d1a65ea72fe4955f9a6d4fc0586c550efe 100644 (file)
@@ -48,6 +48,12 @@ typedef union _data_ {
        int i_clave;
 } CLAVE;
 
+/** Estructura utilizada para querys del B_PLUS */
+typedef struct _index_dat_ {
+       unsigned long num_bloque;
+       CLAVE clave;
+} INDEX_DAT;
+
 /** Bucket de keys en bloque para B+ */
 typedef struct _keybucket_ {
        int cant_keys;
@@ -85,8 +91,8 @@ typedef struct _indices_h_ {
 
        CLAVE (*obtener_menor_clave)(struct _indices_h_ *idx);
        CLAVE (*obtener_mayor_clave)(struct _indices_h_ *idx);
-
        CLAVE (*obtener_sig_clave)(struct _indices_h_ *idx, CLAVE k);
+       CLAVE (*obtener_sig_clave_isam)(struct _emu_fs_t* emu, CLAVE k);
 
        char *nombre;   /**< Nombre único de busqueda del indice */
        char *filename; /**< nombre del archivo de indice */
index e986c591fb650397840d24c70d141733930004cd..e5975133cf9e00b00e10358b28b2411c66df995c 100644 (file)
@@ -99,6 +99,7 @@ int emufs_tipo1_inicializar(EMUFS* efs)
        efs->leer_estadisticas = emufs_tipo1_leer_estadisticas;
        efs->compactar         = emufs_tipo1_compactar;
        efs->modificar_registro  = emufs_tipo1_modificar_registro;
+       efs->obtener_claves_raw = emufs_tipo1_obtener_claves_raw;
        efs->tam_reg = 0;
        return EMUFS_OK;
 }
index 49a94d0b22c3249ca7cd7a7a07ef07abdb22f6d2..1381ce4bc426e1e866494be4ea524e5b2cda0adc 100644 (file)
@@ -65,6 +65,7 @@ int emufs_tipo3_inicializar(EMUFS* efs)
        efs->leer_estadisticas = emufs_tipo3_leer_estadisticas;
        efs->compactar         = emufs_tipo3_compactar;
        efs->modificar_registro = emufs_tipo3_modificar_registro;
+       efs->obtener_claves_raw = emufs_tipo3_obtener_claves_raw;
        efs->tam_reg = 0;
        return EMUFS_OK;
 }
@@ -715,8 +716,7 @@ EMUFS_REG_ID emufs_tipo3_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
                } /*aca deberia estar apuntando al final de los registros. espacio libre*/
                fs -= sizeof(int); /*footer*/
                if ( fs >= size+sizeof(EMUFS_REG_ID) ){ /* puedo meter el registro en este bloque*/
-                       PERR("GRABO ORDENADO");         
-                       printf("clave: %d    bloque: %d\n", query.clave, query.num_bloque);                     
+                       PERR("GRABO ORDENADO");                 
                        grabar_ordenado_en_bloque(emu, ptr, size, bloque, query.num_bloque, fs, err);
                        /*en teoria el nuevo registro no debe cambiar el ancla, por lo cual no actualizo el arbol*/
                        free(bloque);
index c851c828b2b04f4e3fed56387c685dedb7b26a18..34c2210ad333ec126764d8af7385eeb50de6d7bc 100644 (file)
@@ -245,7 +245,7 @@ querydata.clave = prekey.clave;
 while (emufs_indice_es_menor(emu->indices,querydata.clave,postkey.clave))
 {
        q = querydata;
-       querydata.clave = emufs_b_plus_obtener_sig_clave(emu,querydata.clave);
+       querydata.clave = emu->indices->obtener_sig_clave_isam(emu,querydata.clave);
        printf("Sig de %i es %i\n",q.clave.i_clave,querydata.clave.i_clave);
 }
 
@@ -255,7 +255,7 @@ querydata = q;
 while (emufs_indice_es_menor(emu->indices,querydata.clave,postkey.clave))
 {
        q = querydata;
-       querydata.clave = emufs_b_plus_obtener_sig_clave(emu,querydata.clave);
+       querydata.clave = emu->indices->obtener_sig_clave_isam(emu,querydata.clave);
        printf("Sig de %i es %i\n",q.clave.i_clave,querydata.clave.i_clave);
 }