Sequential File - XChanitoX/Proyecto1_BD2 GitHub Wiki
Nuestros registros a ser utilizados para esta implementación deben poseer los siguientes campos de manera pública:
int nextDel;
char ref;
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);
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
ychar 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 archivoauxfile.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 deldatafile.dat
escribiendo su posición y referencia en el mismo y el registro se almacena en el auxiliar.
-
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 eldatafile.dat
procedemos a realizar el salto entre archivos utilizando la posición lógica de cada registro. Finalmente, retornamos el registro en cuestión.
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
yauxfile.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.
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
yref = INVALID
. - Todas las actualizaciones realizadas a los archivos correspondientes deben ser escritas respectivamente.