new: implement and fix few more database functions
This commit is contained in:
parent
16992760ad
commit
17a073838d
@ -5,6 +5,8 @@
|
|||||||
typedef enum lm_query_index {
|
typedef enum lm_query_index {
|
||||||
QUERY_CREATE_TABLE = 0,
|
QUERY_CREATE_TABLE = 0,
|
||||||
QUERY_INSERT_PACKAGE = 1,
|
QUERY_INSERT_PACKAGE = 1,
|
||||||
|
QUERY_SELECT_PACKAGE = 2,
|
||||||
|
QUERY_DELETE_PACKAGE = 3,
|
||||||
} lm_query_index_t;
|
} lm_query_index_t;
|
||||||
|
|
||||||
extern char *queries[];
|
extern char *queries[];
|
||||||
@ -21,16 +23,16 @@ typedef bool (*lm_database_keeps_eachfunc_t)(lm_pkg_t *pkg, char *path, void *da
|
|||||||
lm_database_t *lm_database_new(char *path);
|
lm_database_t *lm_database_new(char *path);
|
||||||
void lm_database_free(lm_database_t *db);
|
void lm_database_free(lm_database_t *db);
|
||||||
|
|
||||||
|
bool lm_database_find(lm_database_t *db, lm_pkg_t *pkg, char *name);
|
||||||
bool lm_database_add(lm_database_t *db, lm_pkg_t *pkg);
|
bool lm_database_add(lm_database_t *db, lm_pkg_t *pkg);
|
||||||
bool lm_database_del(lm_database_t *db, lm_pkg_t *pkg);
|
bool lm_database_del(lm_database_t *db, lm_pkg_t *pkg);
|
||||||
bool lm_database_find(lm_database_t *db, lm_pkg_t *pkg);
|
|
||||||
|
|
||||||
bool lm_database_files_del(lm_database_t *db, lm_pkg_t *pkg);
|
bool lm_database_files_foreach(lm_database_t *db, lm_pkg_t *pkg, lm_database_files_eachfunc_t func);
|
||||||
bool lm_database_files_add(lm_database_t *db, lm_pkg_t *pkg, char *path, char *hash);
|
bool lm_database_files_add(lm_database_t *db, lm_pkg_t *pkg, char *path, char *hash);
|
||||||
bool lm_database_files_get(lm_database_t *db, lm_pkg_t *pkg, char *path, char *hash);
|
bool lm_database_files_get(lm_database_t *db, lm_pkg_t *pkg, char *path, char *hash);
|
||||||
bool lm_database_files_foreach(lm_database_t *db, lm_pkg_t *pkg, lm_database_files_eachfunc_t func);
|
bool lm_database_files_del(lm_database_t *db, lm_pkg_t *pkg);
|
||||||
|
|
||||||
bool lm_database_keeps_del(lm_database_t *db, lm_pkg_t *pkg);
|
|
||||||
bool lm_database_keeps_add(lm_database_t *db, lm_pkg_t *pkg, char *path);
|
|
||||||
bool lm_database_keeps_contains(lm_database_t *db, lm_pkg_t *pkg, char *path);
|
|
||||||
bool lm_database_keeps_foreach(lm_database_t *db, lm_pkg_t *pkg, lm_database_keeps_eachfunc_t func);
|
bool lm_database_keeps_foreach(lm_database_t *db, lm_pkg_t *pkg, lm_database_keeps_eachfunc_t func);
|
||||||
|
bool lm_database_keeps_contains(lm_database_t *db, lm_pkg_t *pkg, char *path);
|
||||||
|
bool lm_database_keeps_add(lm_database_t *db, lm_pkg_t *pkg, char *path);
|
||||||
|
bool lm_database_keeps_del(lm_database_t *db, lm_pkg_t *pkg);
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
lm_pkg_t *lm_package_new();
|
lm_pkg_t *lm_package_new();
|
||||||
void lm_package_free(lm_pkg_t *pkg);
|
void lm_package_free(lm_pkg_t *pkg);
|
||||||
bool lm_package_verify(lm_pkg_t *pkg);
|
bool lm_package_verify(lm_pkg_t *pkg);
|
||||||
|
void lm_package_init(lm_pkg_t *pkg);
|
||||||
|
|
||||||
bool lm_package_data_load(lm_pkg_t *pkg, char *file);
|
bool lm_package_data_load(lm_pkg_t *pkg, char *file);
|
||||||
void lm_package_data_free(lm_pkg_t *pkg);
|
void lm_package_data_free(lm_pkg_t *pkg);
|
||||||
@ -18,6 +19,8 @@ bool lm_package_depend_add(lm_pkg_t *pkg, char *depend);
|
|||||||
size_t lm_package_depend_count(lm_pkg_t *pkg);
|
size_t lm_package_depend_count(lm_pkg_t *pkg);
|
||||||
size_t lm_package_depend_strlen(lm_pkg_t *pkg);
|
size_t lm_package_depend_strlen(lm_pkg_t *pkg);
|
||||||
bool lm_package_depend_tostr(lm_pkg_t *pkg, char *buffer);
|
bool lm_package_depend_tostr(lm_pkg_t *pkg, char *buffer);
|
||||||
|
bool lm_package_depend_fromstr(lm_pkg_t *pkg, char *buffer);
|
||||||
|
void lm_package_depend_free(lm_pkg_t *pkg);
|
||||||
|
|
||||||
size_t lm_package_keep_count(lm_pkg_t *pkg);
|
size_t lm_package_keep_count(lm_pkg_t *pkg);
|
||||||
bool lm_package_keep_add(lm_pkg_t *pkg, char *path);
|
bool lm_package_keep_add(lm_pkg_t *pkg, char *path);
|
||||||
|
@ -46,13 +46,14 @@ bool lm_ctx_package_verify(lm_ctx_t *ctx, char *name, char *version) {
|
|||||||
|
|
||||||
bool lm_ctx_package_is_installed(lm_ctx_t *ctx, char *name, char *version) {
|
bool lm_ctx_package_is_installed(lm_ctx_t *ctx, char *name, char *version) {
|
||||||
lm_database_t *db = lm_ctx_database_new(ctx);
|
lm_database_t *db = lm_ctx_database_new(ctx);
|
||||||
|
lm_pkg_t pkg;
|
||||||
|
|
||||||
if(NULL == db)
|
if(NULL == db)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool ret = false;
|
bool ret = lm_database_find(db, NULL, name, version);
|
||||||
ret = lm_database_package_find(db, name, version);
|
|
||||||
|
|
||||||
lm_database_free(db);
|
lm_database_free(db);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,8 +15,9 @@ char *queries[] = {
|
|||||||
" version TEXT NOT NULL," \
|
" version TEXT NOT NULL," \
|
||||||
" size INT NOT NULL," \
|
" size INT NOT NULL," \
|
||||||
" depends TEXT NOT NULL);",
|
" depends TEXT NOT NULL);",
|
||||||
|
|
||||||
"INSERT INTO packages VALUES (?, ?, ?, ?, ?)",
|
"INSERT INTO packages VALUES (?, ?, ?, ?, ?)",
|
||||||
|
"SELECT * FROM packages WHERE name = '?'",
|
||||||
|
"DELETE from packages WHERE name = '?'",
|
||||||
};
|
};
|
||||||
|
|
||||||
lm_database_t *lm_database_new(char *path){
|
lm_database_t *lm_database_new(char *path){
|
||||||
|
@ -8,34 +8,34 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <strings.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){
|
if(NULL == db || NULL == pkg){
|
||||||
lm_error_set(LM_ERR_ArgNULL);
|
lm_error_set(LM_ERR_ArgNULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
char depends[lm_package_depend_strlen(pkg)];
|
char depends[lm_package_depend_strlen(pkg)];
|
||||||
sqlite3_stmt *insert = NULL;
|
sqlite3_stmt *st = NULL;
|
||||||
bool ret = false;
|
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));
|
pdebug(__func__, "(%s) failed to prepare statement: %s", db->path, sqlite3_errmsg(db->sql));
|
||||||
lm_error_set(LM_ERR_DbSqlPrepareFail);
|
lm_error_set(LM_ERR_DbSqlPrepareFail);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
sqlite3_bind_text(insert, 1, pkg->name, strlen(pkg->name), SQLITE_STATIC);
|
sqlite3_bind_text(st, 1, pkg->name, strlen(pkg->name), SQLITE_STATIC);
|
||||||
sqlite3_bind_text(insert, 2, pkg->desc, strlen(pkg->desc), SQLITE_STATIC);
|
sqlite3_bind_text(st, 2, pkg->desc, strlen(pkg->desc), SQLITE_STATIC);
|
||||||
sqlite3_bind_text(insert, 3, pkg->version, strlen(pkg->version), SQLITE_STATIC);
|
sqlite3_bind_text(st, 3, pkg->version, strlen(pkg->version), SQLITE_STATIC);
|
||||||
sqlite3_bind_int64(insert, 4, pkg->size);
|
sqlite3_bind_int64(st, 4, pkg->size);
|
||||||
|
|
||||||
if(!lm_package_depend_tostr(pkg, depends)){
|
if(!lm_package_depend_tostr(pkg, depends)){
|
||||||
pdebug(__func__, "(%s) failed to convert depends to string: %s", db->path, lm_strerror());
|
pdebug(__func__, "(%s) failed to convert depends to string: %s", db->path, lm_strerror());
|
||||||
goto end;
|
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));
|
pdebug(__func__, "(%s) failed to execute insert statement: %s", db->path, sqlite3_errmsg(db->sql));
|
||||||
lm_error_set(LM_ERR_DbSqlInsertFail);
|
lm_error_set(LM_ERR_DbSqlInsertFail);
|
||||||
goto end;
|
goto end;
|
||||||
@ -43,11 +43,88 @@ bool lm_database_package_add(lm_database_t *db, lm_pkg_t *pkg){
|
|||||||
|
|
||||||
ret = true;
|
ret = true;
|
||||||
end:
|
end:
|
||||||
if(NULL != insert)
|
if(NULL != st)
|
||||||
sqlite3_finalize(insert);
|
sqlite3_finalize(st);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lm_database_package_find(lm_database_t *db, lm_pkg_t *pkg){
|
bool lm_database_find(lm_database_t *db, lm_pkg_t *pkg, char *name){
|
||||||
return true;
|
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;
|
||||||
}
|
}
|
||||||
|
@ -55,9 +55,5 @@ void lm_package_data_free(lm_pkg_t *pkg){
|
|||||||
free(pkg->desc);
|
free(pkg->desc);
|
||||||
free(pkg->name);
|
free(pkg->name);
|
||||||
free(pkg->version);
|
free(pkg->version);
|
||||||
|
lm_package_depend_free(pkg);
|
||||||
if(NULL != pkg->depends){
|
|
||||||
for(int i = 0; pkg->depends[i] != NULL; i++)
|
|
||||||
free(pkg->depends[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -43,6 +43,17 @@ bool lm_package_depend_add(lm_pkg_t *pkg, char *depend){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lm_package_depend_free(lm_pkg_t *pkg){
|
||||||
|
if(NULL == pkg)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(int i = 0; pkg->depends[i] != NULL; i++)
|
||||||
|
free(pkg->depends[i]);
|
||||||
|
free(pkg->depends);
|
||||||
|
|
||||||
|
pkg->depends = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
size_t lm_package_depend_strlen(lm_pkg_t *pkg){
|
size_t lm_package_depend_strlen(lm_pkg_t *pkg){
|
||||||
size_t len = 1;
|
size_t len = 1;
|
||||||
|
|
||||||
@ -76,3 +87,22 @@ bool lm_package_depend_tostr(lm_pkg_t *pkg, char *buffer){
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool lm_package_depend_fromstr(lm_pkg_t *pkg, char *buffer){
|
||||||
|
if(NULL == pkg){
|
||||||
|
lm_error_set(LM_ERR_ArgNULL);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lm_package_depend_free(pkg);
|
||||||
|
|
||||||
|
if(NULL == buffer)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
char *save = NULL, *dep = NULL;
|
||||||
|
while((dep = strtok_r(buffer, ",", &save)) != NULL)
|
||||||
|
if(!lm_package_depend_add(pkg, dep))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -8,10 +8,15 @@
|
|||||||
|
|
||||||
lm_pkg_t *lm_package_new(){
|
lm_pkg_t *lm_package_new(){
|
||||||
lm_pkg_t *pkg = malloc(sizeof(lm_pkg_t));
|
lm_pkg_t *pkg = malloc(sizeof(lm_pkg_t));
|
||||||
bzero(pkg, sizeof(lm_pkg_t));
|
lm_package_init(pkg);
|
||||||
return pkg;
|
return pkg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lm_package_init(lm_pkg_t *pkg){
|
||||||
|
bzero(pkg, sizeof(lm_pkg_t));
|
||||||
|
}
|
||||||
|
|
||||||
void lm_package_free(lm_pkg_t *pkg){
|
void lm_package_free(lm_pkg_t *pkg){
|
||||||
lm_package_data_free(pkg);
|
lm_package_data_free(pkg);
|
||||||
|
bzero(pkg, sizeof(lm_pkg_t));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user