]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
Sigo puliendo el obtener siguiente, creo que ahora mas o menos pilotea, ni en pedo...
authorAlan Kennedy <kennedya@3dgames.com.ar>
Sun, 30 May 2004 20:16:37 +0000 (20:16 +0000)
committerAlan Kennedy <kennedya@3dgames.com.ar>
Sun, 30 May 2004 20:16:37 +0000 (20:16 +0000)
emufs/indice_bplus.c
emufs/tipo3_bplus_main.c

index a1c0e0a4e98a149b9155ae8c26554b70ac1be0d9..c1a8059b41c80c4e600c1f645fdd7c6a87796344 100644 (file)
@@ -759,23 +759,45 @@ CLAVE emufs_b_plus_obtener_sig_clave(EMUFS *emu, CLAVE key) {
                emufs_b_plus_get_bloque(idx,&query,0);          
                idx->keybucket = emufs_tipo3_obtener_claves_raw(emu,query.num_bloque);
                printf ("\nLevante bloque nro: %li y obtuve un bucket con %i keys\n",query.num_bloque,idx->keybucket->cant_keys);       
                emufs_b_plus_get_bloque(idx,&query,0);          
                idx->keybucket = emufs_tipo3_obtener_claves_raw(emu,query.num_bloque);
                printf ("\nLevante bloque nro: %li y obtuve un bucket con %i keys\n",query.num_bloque,idx->keybucket->cant_keys);       
-               printf ("\nLa primera clave del bucket que devuelvo es: %i\n",idx->keybucket->claves[0]);                                               
-       } 
-       else {
-               /* Veo si ya devolvi la ultima */
+               printf ("La primera clave del bucket que devuelvo es: %i\n",idx->keybucket->claves[0].i_clave);                                         
+       }
+
+       /* Si me pide el siguiente de una clave que no esta en este bucket, pido un nuevo! */
+       if (idx->keybucket != NULL) {
+               i = idx->keybucket->cant_keys - 1;
+               while (i >= 0 && !emufs_indice_es_igual(emu->indices,key,idx->keybucket->claves[i])) --i;
+               if (i < 0) {
+                       /* Debo obtener un nuevo bucket pues este debe ser de otro query viejo */
+                       free(idx->keybucket->claves);
+                       free(idx->keybucket);
+                       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);                                         
+               }
+       }               
+       
+       /* Veo si ya devolvi la ultima */
+       if (idx->keybucket != NULL)             
                if (idx->keybucket->current_key == idx->keybucket->cant_keys) {                 
                        /* Debo obtener un nuevo bucket de claves */            
                        if (b_plus_buscar_prepost(idx,idx->keybucket->claves[0],0,&query,1) != -1) {                            
                if (idx->keybucket->current_key == idx->keybucket->cant_keys) {                 
                        /* Debo obtener un nuevo bucket de claves */            
                        if (b_plus_buscar_prepost(idx,idx->keybucket->claves[0],0,&query,1) != -1) {                            
+                               free(idx->keybucket->claves);
+                               free(idx->keybucket);
                                idx->keybucket = emufs_tipo3_obtener_claves_raw(emu,query.num_bloque);
                                printf ("\nLevante bloque nro: %li y obtuve un bucket con %i keys\n",query.num_bloque,idx->keybucket->cant_keys);       
                                idx->keybucket = emufs_tipo3_obtener_claves_raw(emu,query.num_bloque);
                                printf ("\nLevante bloque nro: %li y obtuve un bucket con %i keys\n",query.num_bloque,idx->keybucket->cant_keys);       
-                               printf ("\nLa primera clave del bucket que devuelvo es: %i\n",idx->keybucket->claves[0]);                                                                               
-                               
+                               printf ("La primera clave del bucket que devuelvo es: %i\n",idx->keybucket->claves[0].i_clave);                                                                                                         
                        }
                        else return key;
                }
                        }
                        else return key;
                }
-       }
+       
                
                
-       /* Devuelvo el siguiente elemento del array */
+       /* Devuelvo el siguiente elemento del array solo si es mayor. Si es menor, lo skipeo */                 
        if (idx->keybucket->current_key < idx->keybucket->cant_keys) {
                i = idx->keybucket->current_key;
                idx->keybucket->current_key++;          
        if (idx->keybucket->current_key < idx->keybucket->cant_keys) {
                i = idx->keybucket->current_key;
                idx->keybucket->current_key++;          
index 4037e45f4a6f911baf77a5fd9c85861c01211e03..c851c828b2b04f4e3fed56387c685dedb7b26a18 100644 (file)
@@ -241,6 +241,17 @@ for (i=0; i<v->cant_keys; i++)
 prekey.clave = emufs_b_plus_obtener_menor_clave(emu->indices);
 postkey.clave = emufs_b_plus_obtener_mayor_clave(emu->indices);
 querydata.clave = prekey.clave;
 prekey.clave = emufs_b_plus_obtener_menor_clave(emu->indices);
 postkey.clave = emufs_b_plus_obtener_mayor_clave(emu->indices);
 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);
+       printf("Sig de %i es %i\n",q.clave.i_clave,querydata.clave.i_clave);
+}
+
+printf("Comienzo nuevo pedido de siguiente\n");
+q.clave.i_clave = 2100;
+querydata = q;
 while (emufs_indice_es_menor(emu->indices,querydata.clave,postkey.clave))
 {
        q = querydata;
 while (emufs_indice_es_menor(emu->indices,querydata.clave,postkey.clave))
 {
        q = querydata;