Sequential File - XChanitoX/Proyecto1_BD2 GitHub Wiki

Formato del registro

Nuestros registros a ser utilizados para esta implementación deben poseer los siguientes campos de manera pública:

int nextDel;
char ref;

Métodos Utilidad

En este apartado listaremos los principales metodos que fueron de utilidad para el desarrollo de las funciones principales requeridas.

void write_record(AddressType pos, fstream& file, Record& record, FileID FileID);
void read_record(AddressType pos, fstream&file, Record& record, FileID FileID);
void insert_all(vector<Record>& record);

Métodos implementados

Inserción de registros

void add_record(Record record);

Para la implementación de la siguiente función se siguio el siguiente "train of thoughts".

  • En caso el archivo se encuentre vacio, se escribe la información del primer registro recibido, en caso de que se intente insertar un bloque de registros. A su vez se le coloca el estado de eliminación/eliminado en falso y el archivo es escrito.

  • Una vez verificado el estado del archivo, se procede a revisar el estado del archivo auxiliar con la función is_full() verificando que no supere la capicidad máxima definida. De ser así, se reconstruye el archivo.

  • Consiguientemente, revisamos el estado de los archivos eliminados que se encuentran guardados en el archivo de datos datafile.dat, en caso sea falso se debe utilizar busqueda bineria. De caso contrario se utiliza la busqueda secuencial para encontrar el registro nuevo al que apuntaría.

  • Por último, procedemos a actualizar los atributos int nextDel y char ref del registro en función del nuevo registro a insertar y del registro nuevo a ser apuntado. Cabe recordar que todas las actualizaciones de los atributos de un registro se debe escribir otra vez en su archivo correspondiente. Para ello se tiene que analizar dos posibles casos:

    • Por un lado, cuando intentamos insertar un registro que posee una llave menor a la del primer registro almacenado en el archivo datafile.dat se debe actualizar los campos de utilidad del primer registro para ser escrito en el archivo auxfile.dat.

    • Por otra parte, vendria a ser cuando tenemos un archivo con todos los registros con su estado de eliminación true. En este, caso el nuevo registro a ser insertado pasa a ser el HEAD del datafile.dat escribiendo su posición y referencia en el mismo y el registro se almacena en el auxiliar.

Busqueda de registros

vector<Record> search(Key key);
  • Primero realizamos una busqueda secuencial con la llave dada a través de la función sequential_search que te retorna un par de Registros con el registro actual (key) y el que apunta al mencionado anteriormente. En el caso del que el registro en busqueda no se encuentre en el datafile.dat procedemos a realizar el salto entre archivos utilizando la posición lógica de cada registro. Finalmente, retornamos el registro en cuestión.

Busqueda de registros por rango

vector<Record> search_per_range(Key start, Key end);
  • Al igual que la busqueda de un registro, realizamos en un inicio una busqueda secuencial que nos retorna un par de registros, el de llav e start con el registro encontra y el que apunta a este, donde encontramos el limite inferior de la busqueda.
  • Luego, recorremos los registros realizando saltos entre los archivos datafile.dat y auxfile.dat verificando si los encontrados pertenecen al intervalo. En estas busquedas, utilizamos la posición lógica de cada registro, pero en la lectura se usa la física.
  • Se retorna un vector de registros con los registros encontrados en el rango dado.

Eliminación de registros

void remove_record(Key key);
  • En primer lugar, revisamos si existen registros con el valor de eliminación en true de caso contrario, se sale de la función.
  • En consiguiente, realizamos una busqueda a la llave dada con la finalidad de revisar si el registro a eliminar existe. Si existe, ubicamos el registro que apunta al que se desea eliminar. En caso este sea el primero, reescribimo el registro con el que apunta a este.
  • Por otra parte, una vez realizada la actualización del valor de eliminación del registro a eliminar, procedemos a actualizar los atributos del mismo nextDel = -1 y ref = INVALID.
  • Todas las actualizaciones realizadas a los archivos correspondientes deben ser escritas respectivamente.
⚠️ **GitHub.com Fallback** ⚠️