fix: keep files during updates

This commit is contained in:
ngn 2024-08-03 23:04:27 +03:00
parent 7c3d0dc1f8
commit b27e31c66c
6 changed files with 58 additions and 11 deletions

View File

@ -15,13 +15,15 @@ enum lm_query_index {
QUERY_SELECT_ENTRY_SINGLE_2 = 3,
QUERY_DELETE_ENTRY_SINGLE = 4,
QUERY_SELECT_ENTRY_ALL = 5,
QUERY_CREATE_FILE_TABLE = 6,
QUERY_INSERT_FILE_SINGLE = 7,
QUERY_DELETE_FILE_ALL = 8,
QUERY_SELECT_FILE_SINGLE = 9,
QUERY_SELECT_FILE_ALL = 10,
QUERY_UPDATE_FILE_1 = 11,
QUERY_UPDATE_FILE_2 = 12,
QUERY_CREATE_FILE_TABLE = 6,
QUERY_INSERT_FILE_SINGLE = 7,
QUERY_DELETE_FILE_ALL = 8,
QUERY_DELETE_FILE_SINGLE = 9,
QUERY_SELECT_FILE_ALL = 10,
QUERY_SELECT_FILE_SINGLE = 11,
QUERY_UPDATE_FILE_1 = 12,
QUERY_UPDATE_FILE_2 = 13,
};
enum lm_columns {
@ -78,6 +80,7 @@ bool lm_database_files_next(
bool lm_database_files_add(
lm_database_t *db, lm_entry_t *entry, char *path, char *hash); // adds a file to the files database
bool lm_database_files_del(lm_database_t *db, lm_entry_t *entry); // dels all files of belonging to a entry
bool lm_database_files_del_single(lm_database_t *db, char *path);
void lm_database_files_next_free(lm_database_t *db, lm_entry_t *entry, char **path, char **hash,
bool *keep); // frees resources used for lm_database_files_next

View File

@ -141,6 +141,11 @@ bool __lm_ctx_extract_files(lm_ctx_t *ctx, lm_pkg_t *pkg, char *files, lm_ctx_in
continue;
}
if(exists(entry_path) && lm_database_files_iskeep(ctx->db, entry_path)){
pdebug(__func__, "not extracting %s, file is set as KEEP", entry_path);
continue;
}
rc = archive_write_header(writer, entry);
if (rc != ARCHIVE_OK) {
lm_error_set(LM_ERR_ArcWHeaderFail);
@ -216,6 +221,8 @@ bool lm_ctx_install(lm_ctx_t *ctx, lm_pkg_t *pkg, bool run_install, lm_ctx_insta
return false;
}
lm_ctx_temp_clear(ctx);
if(!extract_archive(ctx->temp, pkg->archive))
return false; // error set by function
@ -290,6 +297,8 @@ bool lm_ctx_install(lm_ctx_t *ctx, lm_pkg_t *pkg, bool run_install, lm_ctx_insta
pdebug(__func__, "(%lu) %s => %s", line_len, file, hash);
lm_database_files_del_single(ctx->db, file);
if(!lm_database_files_add(ctx->db, &pkg->data, file, hash)){
char *suberr = lm_strerror_dup();
pdebug(__func__, "failed to add file to the database for %s: %s", pkg->data.name, suberr);

View File

@ -3,10 +3,10 @@
#include "../../include/util.h"
#include "../../include/ctx.h"
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
bool lm_ctx_removeable(lm_ctx_t *ctx, lm_entry_t *entry){
if(NULL == ctx && NULL == entry){

View File

@ -99,6 +99,7 @@ size_t lm_ctx_sync(lm_ctx_t *ctx, bool do_update, lm_ctx_sync_callback_t callbac
goto next_list;
}
lm_ctx_temp_clear(ctx);
tempdir = lm_ctx_temp_dir(ctx, "list_extracted");
if(!do_update && !lm_pool_list_load(cur, tempdir)){

View File

@ -43,14 +43,17 @@ char *queries[] = {
"INSERT INTO files VALUES (?, ?, ?, ?)",
// QUERY_DELETE_FILE_ALL
"DELETE FROM files WHERE package = ?",
"DELETE FROM files WHERE package = ? AND keep = 1",
// QUERY_SELECT_FILE_SINGLE
"SELECT * FROM files WHERE path = ?",
// QUERY_DELETE_FILE_SINGLE
"DELETE FROM files WHERE path = ?",
// QUERY_SELECT_FILE_ALL
"SELECT * FROM files WHERE package = ?",
// QUERY_SELECT_FILE_SINGLE
"SELECT * FROM files WHERE path = ?",
// QUERY_UPDATE_FILE_1
"UPDATE files SET keep = 1 WHERE path = ?",

View File

@ -207,6 +207,37 @@ end:
return ret;
}
bool lm_database_files_del_single(lm_database_t *db, char *path){
if(NULL == db || NULL == path){
lm_error_set(LM_ERR_ArgNULL);
return false;
}
bool ret = false;
if(sqlite3_prepare(db->files_db, queries[QUERY_DELETE_FILE_SINGLE], strlen(queries[QUERY_DELETE_FILE_SINGLE]), &db->files_st, NULL) != SQLITE_OK){
pdebug(__func__, "failed to prepare statement for deleting %s: %s", path, sqlite3_errmsg(db->files_db));
lm_error_set(LM_ERR_DbSqlPrepareFail);
goto end;
}
sqlite3_bind_text(db->files_st, 1, path, strlen(path), SQLITE_STATIC);
if(!lm_database_step_all(db->files_st)){
pdebug(__func__, "failed to execute delete statement for deleting %s: %s", path, sqlite3_errmsg(db->files_db));
lm_error_set(LM_ERR_DbSqlDeleteFail);
goto end;
}
ret = true;
end:
if(NULL != db->files_st){
sqlite3_finalize(db->files_st);
db->files_st = NULL;
}
return ret;
}
bool lm_database_files_next(lm_database_t *db, lm_entry_t *entry, char **path, char **hash, bool *keep){
if(NULL == db || NULL == entry || NULL == path || NULL == hash || NULL == keep){
lm_error_set(LM_ERR_ArgNULL);