From d9e03cdb69471ca6543aa08494b2c622061d3f30 Mon Sep 17 00:00:00 2001 From: AleksArt Date: Wed, 1 Nov 2023 16:15:03 -0300 Subject: [PATCH 1/2] added list implementacion --- include/libspm.h | 4 +-- src/get.c | 2 +- src/list.c | 84 ++++++++++++++++-------------------------------- src/update.c | 78 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+), 60 deletions(-) create mode 100644 src/update.c diff --git a/include/libspm.h b/include/libspm.h index 11dfd6f..aa7aad6 100755 --- a/include/libspm.h +++ b/include/libspm.h @@ -50,8 +50,8 @@ struct package //test int list_installed(); -int count_installed(); -int get_installed(int index); +int update(); +int upgrade(); //end test diff --git a/src/get.c b/src/get.c index 1e262e3..d3d4b1e 100755 --- a/src/get.c +++ b/src/get.c @@ -70,5 +70,5 @@ char* get(struct package* i_pkg, const char* out_path) void sync() { // Download the "all.db" file to the specified path - downloadRepo("all.db", getenv("SOVIET_ALL_DB_PATH")); + downloadRepo("all.db", getenv("ALL_DB")); } diff --git a/src/list.c b/src/list.c index 73cce01..f28656c 100644 --- a/src/list.c +++ b/src/list.c @@ -12,64 +12,34 @@ //will print the content of INSTALLED_DB int list_installed() - { - msg(INFO, "listing installed packages from %s", getenv("INSTALLED_DB")); - if(0 == 1) - { - sqlite3_stmt *stmt; - int rc; - - // Prepare the SQL query - const char *sql = "idfk"; - rc = sqlite3_prepare_v2(getenv(INSTALLED_DB), sql, -1, &stmt, NULL); - if (rc != SQLITE_OK) { - msg(ERROR, "SQL error: %s -- %d", sqlite3_errmsg(INSTALLED_DB), rc); - return 1; - } - - // Bind the value for the parameter in the SQL query - sqlite3_bind_text(stmt, 1, "idk", -1, SQLITE_STATIC); - - // Execute the PRINT statement or smth. - rc = sqlite3_step(stmt); - if (rc != SQLITE_DONE) { - msg(ERROR, "Error executing PRINT statement or smth: %s\n", sqlite3_errmsg(INSTALLED_DB)); - return -1; - } - - // Finalize the statement. - rc = sqlite3_finalize(stmt); - if (rc != SQLITE_OK) { - msg(ERROR, "Error finalizing PRINT statement or smth: %s\n", sqlite3_errmsg(INSTALLED_DB)); - return -1; - } - - return 0; - } - - } - -//will return the ammount of packages installed INSTALLED_DB -int count_installed() - { - int count = 1; - - // do sql magic here - - msg(INFO, "there are %d installed packages", count); - - return count; +{ + msg(INFO, "listing installed packages from %s", getenv("INSTALLED_DB")); + + //shame that print_all_data uses msg, this could have been so clean + sqlite3_stmt *stmt; + char *zErrMsg = 0; + int rc; + + // Prepare the SQL query + const char *sql = "SELECT Name, Version, Type FROM Packages"; + rc = sqlite3_prepare_v2(INSTALLED_DB, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + msg(ERROR, "SQL error: %s", zErrMsg); + sqlite3_free(zErrMsg); + return 1; } -//will print the content of INSTALLED_DB at a specific index -int get_installed(int index) - { - int count = 0; - char* out = "test"; - //out = sql magic - - msg(INFO, "%s is installed at %d", out, index); - - return count; + // Execute the SQL query + while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) { + printf("\x1b[31;1;1m %s \x1b[0m %s - %s \n", sqlite3_column_text(stmt, 0), sqlite3_column_text(stmt, 1), sqlite3_column_text(stmt, 2)); + } + // Check if the SQL query was successful + if (rc != SQLITE_DONE) { + fprintf(stderr, "SQL error: %s", zErrMsg); + sqlite3_free(zErrMsg); + return -1; } + + return 0; +} diff --git a/src/update.c b/src/update.c new file mode 100644 index 0000000..a7fecff --- /dev/null +++ b/src/update.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include "sqlite3.h" // SQLite database library + +// Include necessary headers +#include "libspm.h" +#include "cutils.h" + +//should probably add there to the header when we are done + +//will print the content of INSTALLED_DB +int update() +{ + msg(INFO, "listing installed packages from %s", getenv("INSTALLED_DB")); + + //shame that print_all_data uses msg, this could have been so clean + sqlite3_stmt *stmt; + char *zErrMsg = 0; + int rc; + + // Prepare the SQL query + const char *sql = "SELECT Name, Version, Type FROM Packages"; + rc = sqlite3_prepare_v2(INSTALLED_DB, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + msg(ERROR, "SQL error: %s", zErrMsg); + sqlite3_free(zErrMsg); + return 1; + } + + // Execute the SQL query + while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) { + printf("\x1b[31;1;1m %s \x1b[0m %s - %s \n", sqlite3_column_text(stmt, 0), sqlite3_column_text(stmt, 1), sqlite3_column_text(stmt, 2)); + } + + // Check if the SQL query was successful + if (rc != SQLITE_DONE) { + fprintf(stderr, "SQL error: %s", zErrMsg); + sqlite3_free(zErrMsg); + return -1; + } + + return 0; +} + +int upgrade() +{ + msg(INFO, "listing installed packages from %s", getenv("INSTALLED_DB")); + + //shame that print_all_data uses msg, this could have been so clean + sqlite3_stmt *stmt; + char *zErrMsg = 0; + int rc; + + // Prepare the SQL query + const char *sql = "SELECT Name, Version, Type FROM Packages"; + rc = sqlite3_prepare_v2(INSTALLED_DB, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + msg(ERROR, "SQL error: %s", zErrMsg); + sqlite3_free(zErrMsg); + return 1; + } + + // Execute the SQL query + while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) { + printf("\x1b[31;1;1m %s \x1b[0m %s - %s \n", sqlite3_column_text(stmt, 0), sqlite3_column_text(stmt, 1), sqlite3_column_text(stmt, 2)); + } + + // Check if the SQL query was successful + if (rc != SQLITE_DONE) { + fprintf(stderr, "SQL error: %s", zErrMsg); + sqlite3_free(zErrMsg); + return -1; + } + + return 0; +} From 32fe1b52a165d7fc35b1fb78a96bd8b0278a270c Mon Sep 17 00:00:00 2001 From: AleksArt Date: Wed, 1 Nov 2023 18:16:49 -0300 Subject: [PATCH 2/2] finished update and upgrade --- include/libspm.h | 1 + src/list.c | 40 +++++++++++++++++++++- src/update.c | 87 ++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 114 insertions(+), 14 deletions(-) diff --git a/include/libspm.h b/include/libspm.h index aa7aad6..8c071a9 100755 --- a/include/libspm.h +++ b/include/libspm.h @@ -50,6 +50,7 @@ struct package //test int list_installed(); +int count_installed(); int update(); int upgrade(); diff --git a/src/list.c b/src/list.c index f28656c..63d8320 100644 --- a/src/list.c +++ b/src/list.c @@ -40,6 +40,44 @@ int list_installed() sqlite3_free(zErrMsg); return -1; } - + + msg(INFO, "%d packages installed", count_installed()); return 0; } + +//count installed +int count_installed() +{ + int count; + + sqlite3_stmt *stmt; + char *zErrMsg = 0; + int rc; + + // Prepare the SQL query + const char *sql = "SELECT COUNT(*) FROM Packages"; + rc = sqlite3_prepare_v2(INSTALLED_DB, sql, -1, &stmt, NULL); + if (rc != SQLITE_OK) { + msg(ERROR, "SQL error: %s", zErrMsg); + sqlite3_free(zErrMsg); + return 1; + } + // Execute the SQL query + while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) { + count = (int)sqlite3_column_int(stmt, 0); + } + + if (rc != SQLITE_DONE) { + msg(ERROR, "Error executing statement: %s\n", sqlite3_errmsg(INSTALLED_DB)); + return -1; + } + // Check if the SQL query was successful + if (rc != SQLITE_DONE) { + fprintf(stderr, "SQL error: %s", zErrMsg); + sqlite3_free(zErrMsg); + return -1; + } + + return count; +} + diff --git a/src/update.c b/src/update.c index a7fecff..797c78b 100644 --- a/src/update.c +++ b/src/update.c @@ -13,25 +13,45 @@ //will print the content of INSTALLED_DB int update() { - msg(INFO, "listing installed packages from %s", getenv("INSTALLED_DB")); - - //shame that print_all_data uses msg, this could have been so clean + msg(INFO, "fetching updates"); + sqlite3_stmt *stmt; char *zErrMsg = 0; int rc; + int new_version_found = 0; // Prepare the SQL query - const char *sql = "SELECT Name, Version, Type FROM Packages"; + const char *sql = "SELECT Name, Version FROM Packages"; rc = sqlite3_prepare_v2(INSTALLED_DB, sql, -1, &stmt, NULL); if (rc != SQLITE_OK) { msg(ERROR, "SQL error: %s", zErrMsg); sqlite3_free(zErrMsg); return 1; } - + // Execute the SQL query while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) { - printf("\x1b[31;1;1m %s \x1b[0m %s - %s \n", sqlite3_column_text(stmt, 0), sqlite3_column_text(stmt, 1), sqlite3_column_text(stmt, 2)); + struct package* local = calloc(1, sizeof(struct package)); + struct package* remote = calloc(1, sizeof(struct package)); + local->name = (char*)sqlite3_column_text(stmt, 0); + local->version = (char*)sqlite3_column_text(stmt, 1); + msg(ERROR, "don't ask why this is here"); + remote->name = local->name; + retrieve_data_repo(ALL_DB, remote); + if(remote->version == NULL) + { + msg(ERROR, "No package %s exists in repo", local->name); + } + else + { + if(strcmp(local->version, remote->version) != 0) + { + msg(INFO, "package %s is at version %s, available version is %s", local->name, local->version, remote->version); + new_version_found = 1; + } + } + free(local); + free(remote); } // Check if the SQL query was successful @@ -40,21 +60,29 @@ int update() sqlite3_free(zErrMsg); return -1; } - + if(new_version_found != 0) + { + msg(WARNING, "new version found for one or more packages, use --upgrade to upgrade"); + } + else + { + msg(WARNING, "all packages are up to date"); + } + return 0; } int upgrade() { - msg(INFO, "listing installed packages from %s", getenv("INSTALLED_DB")); - - //shame that print_all_data uses msg, this could have been so clean + msg(INFO, "upgrading"); + sqlite3_stmt *stmt; char *zErrMsg = 0; int rc; + int new_version_installed = 0; // Prepare the SQL query - const char *sql = "SELECT Name, Version, Type FROM Packages"; + const char *sql = "SELECT Name, Version FROM Packages"; rc = sqlite3_prepare_v2(INSTALLED_DB, sql, -1, &stmt, NULL); if (rc != SQLITE_OK) { msg(ERROR, "SQL error: %s", zErrMsg); @@ -64,7 +92,36 @@ int upgrade() // Execute the SQL query while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) { - printf("\x1b[31;1;1m %s \x1b[0m %s - %s \n", sqlite3_column_text(stmt, 0), sqlite3_column_text(stmt, 1), sqlite3_column_text(stmt, 2)); + struct package* local = calloc(1, sizeof(struct package)); + struct package* remote = calloc(1, sizeof(struct package)); + local->name = (char*)sqlite3_column_text(stmt, 0); + local->version = (char*)sqlite3_column_text(stmt, 1); + msg(ERROR, "don't ask why this is here"); + remote->name = local->name; + retrieve_data_repo(ALL_DB, remote); + if(remote->version == NULL) + { + msg(ERROR, "No package %s exists in repo", local->name); + } + else + { + if(strcmp(local->version, remote->version) != 0) + { + msg(INFO, "upgrading %s from %s to %s", local->name, local->version, remote->version); + uninstall(local->name); + char* format = get(local, local->name); + + if (format == NULL) { + msg(ERROR, "Failed to download package %s", local->name); + return 1; + } + + f_install_package_source(local->name, 0, format); + new_version_installed = 1; + } + } + free(local); + free(remote); } // Check if the SQL query was successful @@ -73,6 +130,10 @@ int upgrade() sqlite3_free(zErrMsg); return -1; } - + if(new_version_installed == 0) + { + msg(WARNING, "all packages are up to date"); + } + return 0; }