new: add remove operation
This commit is contained in:
@ -20,10 +20,7 @@ bool lm_database_changes_update(lm_database_t *db, lm_pkg_t *pkg, char *file){
|
||||
char changes_path[strlen(db->dir)+sizeof(changes_file)];
|
||||
join(changes_path, db->dir, changes_file);
|
||||
|
||||
if(!copy_file(changes_path, file))
|
||||
return false; // error set by function
|
||||
|
||||
return true;
|
||||
return copy_file(changes_path, file);
|
||||
}
|
||||
|
||||
bool lm_database_changes_del(lm_database_t *db, lm_pkg_t *pkg){
|
||||
|
@ -43,7 +43,7 @@ char *queries[] = {
|
||||
"DELETE FROM files WHERE package = '?'",
|
||||
|
||||
// QUERY_SELECT_FILE_SINGLE
|
||||
"SELECT * FROM files WHERE path = '?'",
|
||||
"SELECT * FROM files WHERE path = ?",
|
||||
|
||||
// QUERY_SELECT_FILE_ALL
|
||||
"SELECT * FROM files WHERE package = '?'",
|
||||
@ -126,3 +126,12 @@ void lm_database_free(lm_database_t *db){
|
||||
|
||||
free(db);
|
||||
}
|
||||
|
||||
bool lm_database_step_all(sqlite3_stmt *st){
|
||||
int rc = 0;
|
||||
|
||||
while((rc = sqlite3_step(st)) == SQLITE_ROW)
|
||||
continue;
|
||||
|
||||
return rc == SQLITE_DONE;
|
||||
}
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "../../include/error.h"
|
||||
#include "../../include/util.h"
|
||||
|
||||
#include <sqlite3.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <strings.h>
|
||||
@ -10,6 +11,65 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
size_t lm_database_files_count(lm_database_t *db, lm_pkg_t *pkg){
|
||||
size_t count = 0;
|
||||
|
||||
if(NULL == db || NULL == pkg){
|
||||
lm_error_set(LM_ERR_ArgNULL);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if(sqlite3_prepare(db->files_db, queries[QUERY_SELECT_FILE_ALL], strlen(queries[QUERY_SELECT_FILE_ALL]), &db->files_st, NULL) != SQLITE_OK){
|
||||
pdebug(__func__, "failed to prepare statement for selecting all: %s", sqlite3_errmsg(db->files_db));
|
||||
lm_error_set(LM_ERR_DbSqlPrepareFail);
|
||||
return false;
|
||||
}
|
||||
|
||||
sqlite3_bind_text(db->files_st, FILES_COLUMN_PACKAGE, pkg->name, strlen(pkg->name), SQLITE_STATIC);
|
||||
|
||||
while(sqlite3_step(db->files_st) == SQLITE_ROW)
|
||||
count++;
|
||||
end:
|
||||
if(NULL != db->files_st){
|
||||
sqlite3_finalize(db->files_st);
|
||||
db->files_st = NULL;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
bool lm_database_files_contains(lm_database_t *db, lm_pkg_t *pkg, char *path){
|
||||
char *package = NULL;
|
||||
bool ret = false;
|
||||
|
||||
if(NULL == db || NULL == path){
|
||||
lm_error_set(LM_ERR_ArgNULL);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if(sqlite3_prepare(db->files_db, queries[QUERY_SELECT_FILE_SINGLE], strlen(queries[QUERY_SELECT_FILE_SINGLE]), &db->files_st, NULL) != SQLITE_OK){
|
||||
pdebug(__func__, "failed to prepare statement for selecting %s: %s", path, sqlite3_errmsg(db->files_db));
|
||||
lm_error_set(LM_ERR_DbSqlPrepareFail);
|
||||
goto end;
|
||||
}
|
||||
|
||||
sqlite3_bind_text(db->files_st, FILES_COLUMN_PATH, path, strlen(path), SQLITE_STATIC);
|
||||
|
||||
if(sqlite3_step(db->files_st) != SQLITE_ROW){
|
||||
pdebug(__func__, "failed to execute select statement for selecting %s: %s", path, sqlite3_errmsg(db->files_db));
|
||||
lm_error_set(LM_ERR_DbSqlSelectFail);
|
||||
goto end;
|
||||
}
|
||||
|
||||
package = (char*)sqlite3_column_text(db->files_st, FILES_COLUMN_PACKAGE-1);
|
||||
ret = eq(package, pkg->name);
|
||||
end:
|
||||
if(NULL != db->files_st){
|
||||
sqlite3_finalize(db->files_st);
|
||||
db->files_st = NULL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool lm_database_files_matches(lm_database_t *db, char *path, char *hash){
|
||||
char *hashdb = NULL;
|
||||
bool ret = false;
|
||||
@ -25,15 +85,15 @@ bool lm_database_files_matches(lm_database_t *db, char *path, char *hash){
|
||||
goto end;
|
||||
}
|
||||
|
||||
sqlite3_bind_text(db->files_st, 1, path, strlen(path), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->files_st, FILES_COLUMN_PATH, path, strlen(path), SQLITE_STATIC);
|
||||
|
||||
if(sqlite3_step(db->files_st) != SQLITE_DONE){
|
||||
if(sqlite3_step(db->files_st) != SQLITE_ROW){
|
||||
pdebug(__func__, "failed to execute select statement for selecting %s: %s", path, sqlite3_errmsg(db->files_db));
|
||||
lm_error_set(LM_ERR_DbSqlSelectFail);
|
||||
goto end;
|
||||
}
|
||||
|
||||
hashdb = (char*)sqlite3_column_text(db->files_st, 1);
|
||||
hashdb = (char*)sqlite3_column_text(db->files_st, FILES_COLUMN_HASH-1);
|
||||
ret = eq(hashdb, hash);
|
||||
|
||||
end:
|
||||
@ -59,15 +119,15 @@ bool lm_database_files_iskeep(lm_database_t *db, char *path){
|
||||
goto end;
|
||||
}
|
||||
|
||||
sqlite3_bind_text(db->files_st, 1, path, strlen(path), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->files_st, FILES_COLUMN_PATH, path, strlen(path), SQLITE_STATIC);
|
||||
|
||||
if(sqlite3_step(db->files_st) != SQLITE_DONE){
|
||||
if(!lm_database_step_all(db->files_st)){
|
||||
pdebug(__func__, "failed to execute select statement for selecting %s: %s", path, sqlite3_errmsg(db->files_db));
|
||||
lm_error_set(LM_ERR_DbSqlSelectFail);
|
||||
goto end;
|
||||
}
|
||||
|
||||
iskeep = sqlite3_column_int64(db->files_st, 2);
|
||||
iskeep = sqlite3_column_int64(db->files_st, FILES_COLUMN_KEEP-1);
|
||||
ret = iskeep == 1;
|
||||
|
||||
end:
|
||||
@ -79,38 +139,6 @@ end:
|
||||
|
||||
}
|
||||
|
||||
bool lm_database_files_next(lm_database_t *db, lm_pkg_t *pkg, char **path, char **hash, bool *keep){
|
||||
if(NULL == db || NULL == pkg || NULL == path || NULL == hash || NULL == keep){
|
||||
lm_error_set(LM_ERR_ArgNULL);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(NULL == db->files_st &&
|
||||
sqlite3_prepare(db->files_db, queries[QUERY_SELECT_FILE_ALL], strlen(queries[QUERY_SELECT_FILE_ALL]), &db->files_st, NULL) != SQLITE_OK){
|
||||
pdebug(__func__, "failed to prepare statement for selecting all: %s", sqlite3_errmsg(db->files_db));
|
||||
lm_error_set(LM_ERR_DbSqlPrepareFail);
|
||||
return false;
|
||||
}
|
||||
|
||||
else if(NULL != db->files_st){
|
||||
free(*path);
|
||||
free(*hash);
|
||||
*path = NULL;
|
||||
*hash = NULL;
|
||||
}
|
||||
|
||||
if(sqlite3_step(db->files_st) != SQLITE_ROW){
|
||||
sqlite3_finalize(db->files_st);
|
||||
db->files_st = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
*path = strdup((char*)sqlite3_column_text(db->files_st, 0));
|
||||
*hash = strdup((char*)sqlite3_column_text(db->files_st, 1));
|
||||
*keep = sqlite3_column_int(db->files_st, 2) == 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool lm_database_files_add(lm_database_t *db, lm_pkg_t *pkg, char *path, char *hash){
|
||||
bool ret = false;
|
||||
|
||||
@ -125,15 +153,15 @@ bool lm_database_files_add(lm_database_t *db, lm_pkg_t *pkg, char *path, char *h
|
||||
goto end;
|
||||
}
|
||||
|
||||
sqlite3_bind_text(db->files_st, 1, path, strlen(path), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->files_st, 2, hash, strlen(hash), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->files_st, FILES_COLUMN_PATH, path, strlen(path), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->files_st, FILES_COLUMN_HASH, hash, strlen(hash), SQLITE_STATIC);
|
||||
if(lm_package_keep_contains(pkg, path))
|
||||
sqlite3_bind_int(db->files_st, 3, 1);
|
||||
sqlite3_bind_int(db->files_st, FILES_COLUMN_KEEP, 1);
|
||||
else
|
||||
sqlite3_bind_int(db->files_st, 3, 0);
|
||||
sqlite3_bind_text(db->files_st, 4, pkg->name, strlen(pkg->name), SQLITE_STATIC);
|
||||
sqlite3_bind_int(db->files_st, FILES_COLUMN_KEEP, 0);
|
||||
sqlite3_bind_text(db->files_st, FILES_COLUMN_PACKAGE, pkg->name, strlen(pkg->name), SQLITE_STATIC);
|
||||
|
||||
if(sqlite3_step(db->files_st) != SQLITE_DONE){
|
||||
if(!lm_database_step_all(db->files_st)){
|
||||
pdebug(__func__, "failed to execute insert statement for inserting %s: %s", pkg->name, sqlite3_errmsg(db->files_db));
|
||||
lm_error_set(LM_ERR_DbSqlInsertFail);
|
||||
goto end;
|
||||
@ -162,9 +190,9 @@ bool lm_database_files_del(lm_database_t *db, lm_pkg_t *pkg){
|
||||
goto end;
|
||||
}
|
||||
|
||||
sqlite3_bind_text(db->files_st, 1, pkg->name, strlen(pkg->name), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->files_st, FILES_COLUMN_PACKAGE, pkg->name, strlen(pkg->name), SQLITE_STATIC);
|
||||
|
||||
if(sqlite3_step(db->files_st) != SQLITE_DONE){
|
||||
if(!lm_database_step_all(db->files_st)){
|
||||
pdebug(__func__, "failed to execute delete statement for deleting %s: %s", pkg->name, sqlite3_errmsg(db->files_db));
|
||||
lm_error_set(LM_ERR_DbSqlDeleteFail);
|
||||
goto end;
|
||||
@ -178,3 +206,55 @@ end:
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool lm_database_files_next(lm_database_t *db, lm_pkg_t *pkg, char **path, char **hash, bool *keep){
|
||||
if(NULL == db || NULL == pkg || NULL == path || NULL == hash || NULL == keep){
|
||||
lm_error_set(LM_ERR_ArgNULL);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(NULL == db->files_st){
|
||||
if(sqlite3_prepare(db->files_db, queries[QUERY_SELECT_FILE_ALL], strlen(queries[QUERY_SELECT_FILE_ALL]), &db->files_st, NULL) != SQLITE_OK){
|
||||
pdebug(__func__, "failed to prepare statement for selecting all: %s", sqlite3_errmsg(db->files_db));
|
||||
lm_error_set(LM_ERR_DbSqlPrepareFail);
|
||||
return false;
|
||||
}
|
||||
sqlite3_bind_text(db->files_st, FILES_COLUMN_PACKAGE, pkg->name, strlen(pkg->name), SQLITE_STATIC);
|
||||
}
|
||||
|
||||
else if(NULL != db->files_st){
|
||||
free(*path);
|
||||
free(*hash);
|
||||
*path = NULL;
|
||||
*hash = NULL;
|
||||
}
|
||||
|
||||
if(sqlite3_step(db->files_st) != SQLITE_ROW){
|
||||
sqlite3_finalize(db->files_st);
|
||||
db->files_st = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
*path = strdup((char*)sqlite3_column_text(db->files_st, FILES_COLUMN_PATH-1));
|
||||
*hash = strdup((char*)sqlite3_column_text(db->files_st, FILES_COLUMN_HASH-1));
|
||||
*keep = sqlite3_column_int(db->files_st, FILES_COLUMN_KEEP-1) == 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
void lm_database_files_next_free(lm_database_t *db, lm_pkg_t *pkg, char **path, char **hash, bool *keep){
|
||||
if(NULL == db || NULL == pkg || NULL == path || NULL == hash || NULL == keep){
|
||||
lm_error_set(LM_ERR_ArgNULL);
|
||||
return;
|
||||
}
|
||||
|
||||
if(NULL != db->files_st)
|
||||
sqlite3_finalize(db->files_st);
|
||||
|
||||
if(NULL == *path)
|
||||
free(*path);
|
||||
|
||||
if(NULL == *hash)
|
||||
free(*hash);
|
||||
|
||||
*keep = false;
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
|
||||
bool lm_database_packege_add(lm_database_t *db, lm_pkg_t *pkg){
|
||||
bool lm_database_package_add(lm_database_t *db, lm_pkg_t *pkg){
|
||||
if(NULL == db || NULL == pkg){
|
||||
lm_error_set(LM_ERR_ArgNULL);
|
||||
return false;
|
||||
@ -23,16 +23,16 @@ bool lm_database_packege_add(lm_database_t *db, lm_pkg_t *pkg){
|
||||
goto end;
|
||||
}
|
||||
|
||||
sqlite3_bind_text(db->packages_st, 1, pkg->name, strlen(pkg->name), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->packages_st, 2, pkg->desc, strlen(pkg->desc), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->packages_st, 3, pkg->version, strlen(pkg->version), SQLITE_STATIC);
|
||||
sqlite3_bind_int64(db->packages_st, 4, pkg->size);
|
||||
sqlite3_bind_text(db->packages_st, PACKAGES_COLUMN_NAME, pkg->name, strlen(pkg->name), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->packages_st, PACKAGES_COLUMN_DESC, pkg->desc, strlen(pkg->desc), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->packages_st, PACKAGES_COLUMN_VERSION, pkg->version, strlen(pkg->version), SQLITE_STATIC);
|
||||
sqlite3_bind_int64(db->packages_st, PACKAGES_COLUMN_SIZE, pkg->size);
|
||||
|
||||
if(!lm_package_depend_tostr(pkg, depends)){
|
||||
pdebug(__func__, "failed to convert depends to string for inserting %s: %s", pkg->name, lm_strerror());
|
||||
goto end;
|
||||
}
|
||||
sqlite3_bind_text(db->packages_st, 5, depends, strlen(depends), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->packages_st, PACKAGES_COLUMN_DEPENDS, depends, strlen(depends), SQLITE_STATIC);
|
||||
|
||||
if(sqlite3_step(db->packages_st) != SQLITE_DONE){
|
||||
pdebug(__func__, "failed to execute insert statement for inserting %s: %s", pkg->name, sqlite3_errmsg(db->packages_db));
|
||||
@ -63,7 +63,7 @@ bool lm_database_package_find(lm_database_t *db, lm_pkg_t *pkg, char *name){
|
||||
goto end;
|
||||
}
|
||||
|
||||
sqlite3_bind_text(db->packages_st, 1, name, strlen(name), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->packages_st, PACKAGES_COLUMN_NAME, name, strlen(name), SQLITE_STATIC);
|
||||
|
||||
if(sqlite3_step(db->packages_st) != SQLITE_ROW){
|
||||
pdebug(__func__, "got no rows for %s", name);
|
||||
@ -80,12 +80,12 @@ bool lm_database_package_find(lm_database_t *db, lm_pkg_t *pkg, char *name){
|
||||
// we are initing it just in case the caller didn't
|
||||
lm_package_init(pkg);
|
||||
|
||||
pkg->name = strdup((char*)sqlite3_column_text(db->packages_st, 0));
|
||||
pkg->desc = strdup((char*)sqlite3_column_text(db->packages_st, 1));
|
||||
pkg->version = strdup((char*)sqlite3_column_text(db->packages_st, 2));
|
||||
pkg->size = sqlite3_column_int64(db->packages_st, 3);
|
||||
pkg->name = strdup((char*)sqlite3_column_text(db->packages_st, PACKAGES_COLUMN_NAME-1));
|
||||
pkg->desc = strdup((char*)sqlite3_column_text(db->packages_st, PACKAGES_COLUMN_DESC-1));
|
||||
pkg->version = strdup((char*)sqlite3_column_text(db->packages_st, PACKAGES_COLUMN_VERSION-1));
|
||||
pkg->size = sqlite3_column_int64(db->packages_st, PACKAGES_COLUMN_SIZE-1);
|
||||
|
||||
char *depends = (char*)sqlite3_column_text(db->packages_st, 3);
|
||||
char *depends = (char*)sqlite3_column_text(db->packages_st, PACKAGES_COLUMN_DEPENDS-1);
|
||||
if(!lm_package_depend_fromstr(pkg, depends)){
|
||||
pdebug(__func__, "failed to load depends for finding %s: %s", pkg->name, lm_strerror());
|
||||
// error is set by the function
|
||||
@ -115,7 +115,7 @@ bool lm_database_package_del(lm_database_t *db, lm_pkg_t *pkg){
|
||||
goto end;
|
||||
}
|
||||
|
||||
sqlite3_bind_text(db->packages_st, 1, pkg->name, strlen(pkg->name), SQLITE_STATIC);
|
||||
sqlite3_bind_text(db->packages_st, PACKAGES_COLUMN_NAME, pkg->name, strlen(pkg->name), SQLITE_STATIC);
|
||||
|
||||
if(sqlite3_step(db->packages_st) != SQLITE_DONE){
|
||||
pdebug(__func__, "failed to execute delete statement for deleting %s: %s", pkg->name, sqlite3_errmsg(db->packages_db));
|
||||
@ -156,12 +156,12 @@ bool lm_database_package_next(lm_database_t *db, lm_pkg_t *pkg){
|
||||
|
||||
lm_package_init(pkg);
|
||||
|
||||
pkg->name = strdup((char*)sqlite3_column_text(db->packages_st, 0));
|
||||
pkg->desc = strdup((char*)sqlite3_column_text(db->packages_st, 1));
|
||||
pkg->version = strdup((char*)sqlite3_column_text(db->packages_st, 2));
|
||||
pkg->size = sqlite3_column_int64(db->packages_st, 3);
|
||||
pkg->name = strdup((char*)sqlite3_column_text(db->packages_st, PACKAGES_COLUMN_NAME-1));
|
||||
pkg->desc = strdup((char*)sqlite3_column_text(db->packages_st, PACKAGES_COLUMN_DESC-1));
|
||||
pkg->version = strdup((char*)sqlite3_column_text(db->packages_st, PACKAGES_COLUMN_VERSION-1));
|
||||
pkg->size = sqlite3_column_int64(db->packages_st, PACKAGES_COLUMN_SIZE-1);
|
||||
|
||||
char *depends = (char*)sqlite3_column_text(db->packages_st, 3);
|
||||
char *depends = (char*)sqlite3_column_text(db->packages_st, PACKAGES_COLUMN_DEPENDS-1);
|
||||
if(!lm_package_depend_fromstr(pkg, depends)){
|
||||
pdebug(__func__, "failed to load depends for finding %s: %s", pkg->name, lm_strerror());
|
||||
sqlite3_finalize(db->packages_st);
|
||||
@ -171,3 +171,15 @@ bool lm_database_package_next(lm_database_t *db, lm_pkg_t *pkg){
|
||||
return true;
|
||||
}
|
||||
|
||||
void lm_database_package_next_free(lm_database_t *db, lm_pkg_t *pkg){
|
||||
if(NULL == db || NULL == pkg){
|
||||
lm_error_set(LM_ERR_ArgNULL);
|
||||
return;
|
||||
}
|
||||
|
||||
if(NULL != db->packages_st)
|
||||
sqlite3_finalize(db->packages_st);
|
||||
|
||||
if(NULL != pkg)
|
||||
lm_package_free(pkg);
|
||||
}
|
||||
|
Reference in New Issue
Block a user