Adds line removing

Allows you to remove a specific ID in the book DB
this will also update the subsequent lines to be in numerical order
This commit is contained in:
SuperNovaa41 2024-01-24 18:16:05 -05:00
parent ebebe13f0e
commit 612224a100
3 changed files with 66 additions and 18 deletions

View File

@ -31,14 +31,34 @@ int get_next_id()
return atoi(id) + 1; return atoi(id) + 1;
} }
long find_id(int id_to_find) void update_line(char** line, int new_id)
{ {
FILE* csv; int i;
char* buffer; char* buffer;
size_t line_size = MAX_BUFFER_SIZE - 1; for (i = 0; i < MAX_BUFFER_SIZE; i++) {
int i, file_exists; if ((*line)[i] == ',')
long file_pos; break;
}
if (i == MAX_BUFFER_SIZE - 1) {
fprintf(stderr, "There was an error in %s file!\n", FILE_NAME);
exit(EXIT_FAILURE);
}
buffer = malloc(sizeof(char) * MAX_BUFFER_SIZE);
strncpy(buffer, (*line) + i, MAX_BUFFER_SIZE);
snprintf(*line, MAX_BUFFER_SIZE, "%d%s", new_id, buffer);
free(buffer);
}
void remove_line_from_file(int id_to_remove)
{
int file_exists, line_count;
FILE* csv;
FILE* new_csv;
char* line;
size_t line_size = MAX_BUFFER_SIZE;
file_exists = access(FILE_NAME, F_OK); file_exists = access(FILE_NAME, F_OK);
if (0 != file_exists) { if (0 != file_exists) {
@ -52,16 +72,25 @@ long find_id(int id_to_find)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
for(i = 0; i < id_to_find + 1; i++) new_csv = fopen("temp.csv", "w");
getline(&buffer, &line_size, csv);
file_pos = ftell(csv); line_count = 0;
while(getline(&line, &line_size, csv) != -1) {
if (id_to_remove > line_count) {
fprintf(new_csv, "%s", line);
} else if (id_to_remove < line_count) {
update_line(&line, line_count - 1);
fprintf(new_csv, "%s", line);
}
line_count++;
}
fclose(new_csv);
fclose(csv); fclose(csv);
return file_pos; remove(FILE_NAME);
rename("temp.csv", FILE_NAME); // new csv is now the original file, without that line
} }
void write_to_file(book_t* book) void write_to_file(book_t* book)
{ {
FILE* file; FILE* file;

View File

@ -19,11 +19,20 @@ int get_next_id();
void write_to_file(book_t* book); void write_to_file(book_t* book);
/** /**
* long find_id * void remove_line_from_file
* int id_to_find - The ID we're looking for * int id_to_remove - The book ID that we don't want anymore
* *
* Returns the position of a FILE to the line with the ID we're looking for * Removes a book from the CSV file
*/ */
long find_id(int id_to_find); void remove_line_from_file(int id_to_remove);
/**
* void update_line
* char** line - Pointer to the book entry string
* int new_id - The new ID that should be placed into this book entry
*
* Takes a book entry and changes the ID to the given one
*/
void update_line(char** line, int new_id);
#endif #endif

View File

@ -58,6 +58,7 @@ void do_ISBN_get(char* argv[])
void process_args(char* argv[]) void process_args(char* argv[])
{ {
int id;
if (0 == strcmp(argv[1], "--help")) { if (0 == strcmp(argv[1], "--help")) {
printf("%s - An ISBN lookup tool.\n", argv[0]); printf("%s - An ISBN lookup tool.\n", argv[0]);
printf("Author: Nathan Singer\n"); printf("Author: Nathan Singer\n");
@ -68,8 +69,19 @@ void process_args(char* argv[])
puts("[isbn] -- Attempts to download a book from the given ISBN-10 or ISBN-13 input."); puts("[isbn] -- Attempts to download a book from the given ISBN-10 or ISBN-13 input.");
puts("remove [id] -- Removes a book with the given ID from the book database."); puts("remove [id] -- Removes a book with the given ID from the book database.");
} else if (0 == strcmp(argv[1], "remove")) { } else if (0 == strcmp(argv[1], "remove")) {
// remove a book here if (NULL == argv[2]) {
return; printf("Not enough arguments! Try typing %s --help\n", argv[0]);
exit(EXIT_FAILURE);
}
id = atoi(argv[2]);
if (0 == id) {
printf("Invalid book ID given!\n");
exit(EXIT_FAILURE);
}
remove_line_from_file(id);
} else { } else {
// lets assume its an ISBN and let the other functions fail if its not // lets assume its an ISBN and let the other functions fail if its not
do_ISBN_get(argv); do_ISBN_get(argv);
@ -80,8 +92,6 @@ void process_args(char* argv[])
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
return 0;
if (1 == argc) { if (1 == argc) {
printf("Not enough arguments! Try typing %s --help\n", argv[0]); printf("Not enough arguments! Try typing %s --help\n", argv[0]);
return EXIT_FAILURE; return EXIT_FAILURE;