#define _EMUFS_TIPO1_H_
#include "emufs.h"
+#include "indice_bplus.h"
-int emufs_tipo1_inicializar(EMUFS*);
+/** Inicializa un EMUFS para poder ser utilizado como un archivo tipo1.
+ *
+ * \param efs Estructura a inicializar.
+ * \return Código de error o EMUFS_OK si no hubo error.
+ */
+int emufs_tipo1_inicializar(EMUFS* efs);
+
+int emufs_tipo4_inicializar(EMUFS* efs);
+
+/** Lee el registro \c reg_id y devolviendo su contenido. */
+void* emufs_tipo1_leer_registro(EMUFS*, CLAVE, EMUFS_REG_SIZE*, int*);
+
+/** Graba un registro en el archivo. */
+EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS*, void*, EMUFS_REG_SIZE, int*);
+
+/** Borra un registro de del archivo. */
+int emufs_tipo1_borrar_registro(EMUFS*, CLAVE, INDICE_DATO);
-/** Lee el registro \param id_reg y lo almacena en \param ptr */
-int emufs_tipo1_leer_registro(EMUFS *emu, EMUFS_REG_ID id_reg, void *ptr,
- EMUFS_REG_SIZE tam_reg);
+/** Método para modificar un registro. */
+EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS *emu, CLAVE k, void*, EMUFS_REG_SIZE, int*, INDICE_DATO);
-/** Lee el bloque \param num_bloque y lo almacena en \param ptr */
-int emufs_tipo1_leer_bloque(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, void *ptr);
+/** Método para leer un registro con todo su bloque asociado. */
+void* emufs_tipo1_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID id, EMUFS_REG_SIZE *size, int *pos);
-/** Graba el registro apuntado por \param ptr en el archivo */
-EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* emu, void* ptr, EMUFS_REG_SIZE);
+/** Obtiene estádisticas del archivo */
+EMUFS_Estadisticas emufs_tipo1_leer_estadisticas(EMUFS*);
-/** Graba el bloque apuntado por \param ptr en el archivo */
-int emufs_tipo1_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num_bloque);
+/** Método para compactar el archivo reorganizándolo físicamente */
+void emufs_tipo1_compactar(EMUFS*);
-EMUFS_REG_ID emufs_tipo1_get_id(EMUFS *emu);
+/** Lee un bloque y su contexto, en bruto (con cabeceras). */
+void emufs_tipo1_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual,
+ char **anterior, char **siguiente, EMUFS_BLOCK_SIZE *size1,
+ EMUFS_BLOCK_SIZE *size2, EMUFS_BLOCK_SIZE *size3);
+
+/** Inserta un registro en el archivo, ordenado por clave principal*/
+EMUFS_REG_ID emufs_tipo1_insertar_ordenado(EMUFS *emu, void *ptr, EMUFS_REG_SIZE size, int *err);
-int emufs_tipo1_buscar_registro(EMUFS *emu, EMUFS_REG_ID id_reg);
+/** Elimina un registro de clave CLAVE del archivo con ayuda del arbol B+*/
+int emufs_tipo1_eliminar_ordenado(EMUFS *emu, CLAVE clave, INDICE_DATO dato);
-int emufs_tipo1_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg,
- EMUFS_REG_SIZE tam_reg);
+void *emufs_tipo1_leer_registro_plus(EMUFS *emu, CLAVE clave, EMUFS_REG_SIZE *size, int *err);
-/*
-int emufs_tipo1_buscar_lugar(EMUFS *emu, EMUFS_REG_SIZE tam_reg,
- EMUFS_FREE *free_space);
-*/
+EMUFS_REG_ID emufs_tipo1_modificar_registro_plus(EMUFS *emu, CLAVE k, void*, EMUFS_REG_SIZE, int*, INDICE_DATO);
+B_PLUS_KEYBUCKET *emufs_tipo1_obtener_claves_raw(EMUFS *emu, int num_bloque);
#endif /* _EMUFS_TIPO1_H_ */