new: implement and fix few more database functions

This commit is contained in:
ngn
2024-07-02 06:04:29 +03:00
parent 16992760ad
commit 17a073838d
8 changed files with 144 additions and 29 deletions

View File

@ -15,8 +15,9 @@ char *queries[] = {
" version TEXT NOT NULL," \
" size INT NOT NULL," \
" depends TEXT NOT NULL);",
"INSERT INTO packages VALUES (?, ?, ?, ?, ?)",
"SELECT * FROM packages WHERE name = '?'",
"DELETE from packages WHERE name = '?'",
};
lm_database_t *lm_database_new(char *path){

View File

@ -8,34 +8,34 @@
#include <string.h>
#include <strings.h>
bool lm_database_package_add(lm_database_t *db, lm_pkg_t *pkg){
bool lm_database_add(lm_database_t *db, lm_pkg_t *pkg){
if(NULL == db || NULL == pkg){
lm_error_set(LM_ERR_ArgNULL);
return false;
}
char depends[lm_package_depend_strlen(pkg)];
sqlite3_stmt *insert = NULL;
sqlite3_stmt *st = NULL;
bool ret = false;
if(sqlite3_prepare(db->sql, queries[QUERY_INSERT_PACKAGE], strlen(queries[QUERY_INSERT_PACKAGE]), &insert, NULL) != SQLITE_OK){
if(sqlite3_prepare(db->sql, queries[QUERY_INSERT_PACKAGE], strlen(queries[QUERY_INSERT_PACKAGE]), &st, NULL) != SQLITE_OK){
pdebug(__func__, "(%s) failed to prepare statement: %s", db->path, sqlite3_errmsg(db->sql));
lm_error_set(LM_ERR_DbSqlPrepareFail);
goto end;
}
sqlite3_bind_text(insert, 1, pkg->name, strlen(pkg->name), SQLITE_STATIC);
sqlite3_bind_text(insert, 2, pkg->desc, strlen(pkg->desc), SQLITE_STATIC);
sqlite3_bind_text(insert, 3, pkg->version, strlen(pkg->version), SQLITE_STATIC);
sqlite3_bind_int64(insert, 4, pkg->size);
sqlite3_bind_text(st, 1, pkg->name, strlen(pkg->name), SQLITE_STATIC);
sqlite3_bind_text(st, 2, pkg->desc, strlen(pkg->desc), SQLITE_STATIC);
sqlite3_bind_text(st, 3, pkg->version, strlen(pkg->version), SQLITE_STATIC);
sqlite3_bind_int64(st, 4, pkg->size);
if(!lm_package_depend_tostr(pkg, depends)){
pdebug(__func__, "(%s) failed to convert depends to string: %s", db->path, lm_strerror());
goto end;
}
sqlite3_bind_text(insert, 5, depends, strlen(depends), SQLITE_STATIC);
sqlite3_bind_text(st, 5, depends, strlen(depends), SQLITE_STATIC);
if(sqlite3_step(insert) != SQLITE_OK){
if(sqlite3_step(st) != SQLITE_DONE){
pdebug(__func__, "(%s) failed to execute insert statement: %s", db->path, sqlite3_errmsg(db->sql));
lm_error_set(LM_ERR_DbSqlInsertFail);
goto end;
@ -43,11 +43,88 @@ bool lm_database_package_add(lm_database_t *db, lm_pkg_t *pkg){
ret = true;
end:
if(NULL != insert)
sqlite3_finalize(insert);
if(NULL != st)
sqlite3_finalize(st);
return ret;
}
bool lm_database_package_find(lm_database_t *db, lm_pkg_t *pkg){
return true;
bool lm_database_find(lm_database_t *db, lm_pkg_t *pkg, char *name){
if(NULL == db || NULL == name){
lm_error_set(LM_ERR_ArgNULL);
return false;
}
sqlite3_stmt *st;
bool ret = false;
if(sqlite3_prepare(db->sql, queries[QUERY_SELECT_PACKAGE], strlen(queries[QUERY_SELECT_PACKAGE]), &st, NULL) != SQLITE_OK){
pdebug(__func__, "(%s) failed to prepare statement: %s", db->path, sqlite3_errmsg(db->sql));
lm_error_set(LM_ERR_DbSqlPrepareFail);
goto end;
}
sqlite3_bind_text(st, 1, name, strlen(name), SQLITE_STATIC);
if(sqlite3_step(st) != SQLITE_ROW){
pdebug(__func__, "(%s) got no rows for %s", db->path, name);
lm_error_set(LM_ERR_DbSqlNotFound);
goto end;
}
if(NULL == pkg){
ret = true;
goto end;
}
// package pointer should already be free'd
// we are initing it just in case the caller didn't
lm_package_init(pkg);
pkg->name = strdup((char*)sqlite3_column_text(st, 0));
pkg->desc = strdup((char*)sqlite3_column_text(st, 1));
pkg->version = strdup((char*)sqlite3_column_text(st, 2));
pkg->size = sqlite3_column_int64(st, 3);
char *depends = (char*)sqlite3_column_text(st, 3);
if(!lm_package_depend_fromstr(pkg, depends)){
pdebug(__func__, "(%s) failed to load depends for %s (%s): %s", db->path, name, lm_strerror());
// error is set by the function
goto end;
}
ret = true;
end:
if(NULL != st)
sqlite3_finalize(st);
return ret;
}
bool lm_database_del(lm_database_t *db, lm_pkg_t *pkg){
if(NULL == db || NULL == pkg){
lm_error_set(LM_ERR_ArgNULL);
return false;
}
sqlite3_stmt *st;
bool ret = false;
if(sqlite3_prepare(db->sql, queries[QUERY_DELETE_PACKAGE], strlen(queries[QUERY_DELETE_PACKAGE]), &st, NULL) != SQLITE_OK){
pdebug(__func__, "(%s) failed to prepare statement: %s", db->path, sqlite3_errmsg(db->sql));
lm_error_set(LM_ERR_DbSqlPrepareFail);
goto end;
}
sqlite3_bind_text(st, 1, pkg->name, strlen(pkg->name), SQLITE_STATIC);
if(sqlite3_step(st) != SQLITE_DONE){
pdebug(__func__, "(%s) failed to execute delete statement: %s", db->path, sqlite3_errmsg(db->sql));
lm_error_set(LM_ERR_DbSqlInsertFail);
goto end;
}
ret = true;
end:
if(NULL != st)
sqlite3_finalize(st);
return ret;
}