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 */
/* 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);
}
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);
}
}
\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
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;
}
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;
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 */
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;
}
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;
}
} /*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);
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);
}
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);
}