diff --git a/src/module/module_repo_rs.c b/src/module/module_repo_rs.c index 2f42be781fc116bc02710f0d717a2a302144e52a..a2e5639ca6e25395d74c4779c8fc6e914ec905ba 100644 --- a/src/module/module_repo_rs.c +++ b/src/module/module_repo_rs.c @@ -7,7 +7,15 @@ * Function from RUST * **********************/ -struct module_repo_rs_internal; +struct repo_rs_intern; + +extern size_t lkt_module_repo_rs_get_struct_size(void); +extern int32_t lkt_module_repo_rs_init(struct repo_rs_intern*, struct queue*, lkt_db*); +extern int32_t lkt_module_repo_rs_free(struct repo_rs_intern*); +extern int32_t lkt_module_repo_rs_update(struct repo_rs_intern*, struct lkt_uri *); +extern int32_t lkt_module_repo_rs_dry_update(struct repo_rs_intern*); +extern int32_t lkt_module_repo_rs_rescan(struct repo_rs_intern*); +extern int32_t lkt_module_repo_rs_import(struct repo_rs_intern*); /******************** * Export functions * @@ -16,78 +24,86 @@ struct module_repo_rs_internal; PRIVATE_FUNCTION int mod_new(va_list *va) { va_list copy; - struct module_repo_rs_internal **UNUSED repo; va_copy(copy, *va); - repo = (struct module_repo_rs_internal **)va_arg(copy, void **); + struct repo_rs_intern **repo = (struct repo_rs_intern **)va_arg(copy, void **); + struct queue *queue = va_arg(copy, struct queue *); + lkt_db *db = va_arg(copy, lkt_db *); + + if (NULL != *repo) { + LOG_ERROR("REPO", "Can't init two times the module"); + return 1; + } + *repo = safe_malloc(lkt_module_repo_rs_get_struct_size()); + + const int32_t ret = lkt_module_repo_rs_init(*repo, queue, db); + lkt_queue_make_available(queue, LKT_EVENT_DB_UPDATING); va_end(copy); - return 1; + LOG_ERROR_IF(ret, "REPO", "Failed to create the module"); + return ret; } PRIVATE_FUNCTION int mod_free(va_list *va) { va_list copy; - struct module_repo_rs_internal **UNUSED repo; + struct repo_rs_intern **repo; va_copy(copy, *va); - repo = (struct module_repo_rs_internal **)va_arg(copy, void **); - + repo = (struct repo_rs_intern **)va_arg(copy, void **); + const int32_t ret = lkt_module_repo_rs_free(*repo); va_end(copy); - return 1; + return ret; } PRIVATE_FUNCTION int -mod_close(va_list *va) { - va_list copy; - struct module_repo_rs_internal **UNUSED repo; - va_copy(copy, *va); - repo = (struct module_repo_rs_internal **)va_arg(copy, void **); - - va_end(copy); +mod_close(va_list *UNUSED va) { + LOG_ERROR("ERROR", "Operation 'close' not supported on module"); return 1; } PRIVATE_FUNCTION int mod_update(va_list *va) { va_list copy; - struct module_repo_rs_internal **UNUSED repo; + struct repo_rs_intern **repo; + struct lkt_uri *uri_ptr; va_copy(copy, *va); - repo = (struct module_repo_rs_internal **)va_arg(copy, void **); - + repo = (struct repo_rs_intern **)va_arg(copy, void **); + uri_ptr = (struct lkt_uri *)va_arg(copy, struct lkt_uri *); + const int32_t ret = lkt_module_repo_rs_update(*repo, uri_ptr); va_end(copy); - return 1; + return ret; } PRIVATE_FUNCTION int mod_dry_update(va_list *va) { va_list copy; - struct module_repo_rs_internal **UNUSED repo; + struct repo_rs_intern **repo; va_copy(copy, *va); - repo = (struct module_repo_rs_internal **)va_arg(copy, void **); - + repo = (struct repo_rs_intern **)va_arg(copy, void **); + const int32_t ret = lkt_module_repo_rs_dry_update(*repo); va_end(copy); - return 1; + return ret; } PRIVATE_FUNCTION int mod_rescan(va_list *va) { va_list copy; - struct module_repo_rs_internal **UNUSED repo; + struct repo_rs_intern **repo; va_copy(copy, *va); - repo = (struct module_repo_rs_internal **)va_arg(copy, void **); - + repo = (struct repo_rs_intern **)va_arg(copy, void **); + const int32_t ret = lkt_module_repo_rs_rescan(*repo); va_end(copy); - return 1; + return ret; } PRIVATE_FUNCTION int mod_import(va_list *va) { va_list copy; - struct module_repo_rs_internal **UNUSED repo; + struct repo_rs_intern **repo; va_copy(copy, *va); - repo = (struct module_repo_rs_internal **)va_arg(copy, void **); - + repo = (struct repo_rs_intern **)va_arg(copy, void **); + const int32_t ret = lkt_module_repo_rs_import(*repo); va_end(copy); - return 1; + return ret; } REG_BEGIN(repo_rs_reg) diff --git a/src/rust/liblektor-rs/src/compat.rs b/src/rust/liblektor-rs/src/compat.rs new file mode 100644 index 0000000000000000000000000000000000000000..0588c98aa0b5f67a27b04a9b4f3f2f7266a452d9 --- /dev/null +++ b/src/rust/liblektor-rs/src/compat.rs @@ -0,0 +1,9 @@ +pub const LEKTOR_TAG_MAX: usize = 256; + +pub struct LktQueue; +pub struct LktDb; +pub struct LktUri; + +pub type LktQueuePtr = *mut LktQueue; +pub type LktDbPtr = *mut LktDb; +pub type LktUriPtr = *mut LktUri; diff --git a/src/rust/liblektor-rs/src/lib.rs b/src/rust/liblektor-rs/src/lib.rs index 641e7637deffcb302b53363c7cb9e49fe6f87297..a691be2f8675d6d90ac1513a0fbbca57fdb5cb3a 100644 --- a/src/rust/liblektor-rs/src/lib.rs +++ b/src/rust/liblektor-rs/src/lib.rs @@ -1,9 +1,9 @@ #![allow(dead_code)] -mod module; +mod compat; mod database; mod mkv; +mod module; +pub(crate) use compat::*; pub(crate) use libc::{c_char, c_int, c_long, c_void, size_t}; - -pub const LEKTOR_TAG_MAX: usize = 256; diff --git a/src/rust/liblektor-rs/src/module/repo_rs.rs b/src/rust/liblektor-rs/src/module/repo_rs.rs index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..61a54d2724fe5ec27405d0dc4e34a6ed6d36c929 100644 --- a/src/rust/liblektor-rs/src/module/repo_rs.rs +++ b/src/rust/liblektor-rs/src/module/repo_rs.rs @@ -0,0 +1,47 @@ +use crate::*; + +type LktModuleRepoRsPtr = *mut LktModuleRepoRs; +struct LktModuleRepoRs { + queue: LktQueuePtr, +} + +#[no_mangle] +extern "C" fn lkt_module_repo_rs_get_struct_size() -> size_t { + std::mem::size_of::<LktModuleRepoRs>() +} + +#[no_mangle] +extern "C" fn lkt_module_repo_rs_init( + repo: LktModuleRepoRsPtr, + queue: LktQueuePtr, + db: LktDbPtr, +) -> i32 { + let _repo: &mut LktModuleRepoRs = unsafe { std::mem::transmute(repo) }; + 1 +} + +#[no_mangle] +extern "C" fn lkt_module_repo_rs_free(repo: LktModuleRepoRsPtr) -> i32 { + let _repo: &mut LktModuleRepoRs = unsafe { std::mem::transmute(repo) }; + 1 +} + +#[no_mangle] +extern "C" fn lkt_module_repo_rs_update(repo: LktModuleRepoRsPtr, uri: LktUriPtr) -> i32 { + 1 +} + +#[no_mangle] +extern "C" fn lkt_module_repo_rs_dry_update(repo: LktModuleRepoRsPtr) -> i32 { + 1 +} + +#[no_mangle] +extern "C" fn lkt_module_repo_rs_rescan(repo: LktModuleRepoRsPtr) -> i32 { + 1 +} + +#[no_mangle] +extern "C" fn lkt_module_repo_rs_import(repo: LktModuleRepoRsPtr) -> i32 { + 1 +}