From f3e4ffbcce02ff1b6325686b583afb904bcccd38 Mon Sep 17 00:00:00 2001 From: theMackabu Date: Sun, 17 Dec 2023 20:27:48 -0800 Subject: [PATCH] add redis wrapper --- Cargo.lock | 32 ++++++++++++ Cargo.toml | 1 + src/main.rs | 139 ++++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 163 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 087162f..e192997 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -685,6 +685,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "concurrent-queue" version = "2.3.0" @@ -1992,6 +2002,21 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redis" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c580d9cbbe1d1b479e8d67cf9daf6a62c957e6846048408b80b43ac3f6af84cd" +dependencies = [ + "combine", + "itoa", + "percent-encoding", + "ryu", + "sha1_smol", + "socket2 0.4.10", + "url", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -2271,6 +2296,7 @@ dependencies = [ "mongodb", "peg", "pickledb", + "redis", "reqwest", "rhai", "rhai-fs", @@ -2468,6 +2494,12 @@ dependencies = [ "digest", ] +[[package]] +name = "sha1_smol" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" + [[package]] name = "sha2" version = "0.10.8" diff --git a/Cargo.toml b/Cargo.toml index 93f9eb2..446dc9c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,3 +30,4 @@ reqwest = { version = "0.11.22", features = ["blocking"] } rhai = { version = "1.16.3", features = ["serde_json", "serde"] } mongodb = { version = "2.8.0", features = ["sync"], default-features = false } pickledb = { version = "0.5.1", features = ["json", "bincode", "cbor", "yaml"] } +redis = "0.24.0" diff --git a/src/main.rs b/src/main.rs index 4edc037..7832dcf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ use config::structs::Config; use lazy_static::lazy_static; use macros_rs::{crashln, str, string, ternary}; use pickledb::PickleDb; +use redis::{Client as RedisClient, Commands}; use regex::{Captures, Error, Regex}; use reqwest::blocking::Client as ReqwestClient; use serde::{Deserialize, Serialize}; @@ -183,7 +184,7 @@ mod json { } #[export_module] -mod mongo { +mod mongo_db { #[derive(Clone)] pub struct Client { pub client: Option, @@ -222,7 +223,6 @@ mod mongo { pub fn connect() -> Client { let config = config::read().database.unwrap(); - match MongoClient::with_uri_str(config.mongo.unwrap().server.unwrap_or("".to_string())) { Ok(client) => Client { client: Some(client) }, Err(_) => Client { client: None }, @@ -366,7 +366,7 @@ mod mongo { } #[export_module] -mod kv { +mod kv_db { #[derive(Clone)] pub struct KV<'s> { pub db: &'s RefCell, @@ -418,10 +418,131 @@ mod kv { } #[export_module] -mod sqlite {} +mod sqlite_db {} #[export_module] -mod redis {} +mod redis_db { + #[derive(Clone)] + pub struct Redis { + pub client: Option, + } + + pub fn connect() -> Redis { + let config = config::read().database.unwrap(); + match RedisClient::open(config.redis.unwrap().server) { + Ok(client) => Redis { client: Some(client) }, + Err(_) => Redis { client: None }, + } + } + + #[rhai_fn(global, return_raw)] + pub fn set(redis: Redis, key: String, value: String) -> Result<(), Box> { + let mut conn = redis.client.unwrap().get_connection().unwrap(); + match conn.set::(key, value) { + Err(err) => Err(format!("{}", &err).into()), + Ok(_) => Ok(()), + } + } + + #[rhai_fn(global)] + pub fn get(redis: Redis, key: String) -> String { + let mut conn = redis.client.unwrap().get_connection().unwrap(); + match conn.get::(key) { + Ok(data) => data, + Err(_) => string!(""), + } + } + + #[rhai_fn(global)] + pub fn del(redis: Redis, key: String) -> String { + let mut conn = redis.client.unwrap().get_connection().unwrap(); + match conn.del(key) { + Ok(data) => data, + Err(err) => err.to_string(), + } + } + + #[rhai_fn(global)] + pub fn expire(redis: Redis, key: String, s: i64) -> String { + let mut conn = redis.client.unwrap().get_connection().unwrap(); + match conn.expire(key, s) { + Ok(data) => data, + Err(err) => err.to_string(), + } + } + + #[rhai_fn(global)] + pub fn persist(redis: Redis, key: String) -> String { + let mut conn = redis.client.unwrap().get_connection().unwrap(); + match conn.persist(key) { + Ok(data) => data, + Err(err) => err.to_string(), + } + } + + #[rhai_fn(global)] + pub fn ttl(redis: Redis, key: String) -> String { + let mut conn = redis.client.unwrap().get_connection().unwrap(); + match conn.ttl(key) { + Ok(data) => data, + Err(err) => err.to_string(), + } + } + + #[rhai_fn(global)] + pub fn rename(redis: Redis, key: String, new: String) -> String { + let mut conn = redis.client.unwrap().get_connection().unwrap(); + match conn.rename(key, new) { + Ok(data) => data, + Err(err) => err.to_string(), + } + } + + #[rhai_fn(global)] + pub fn append(redis: Redis, key: String, value: String) -> String { + let mut conn = redis.client.unwrap().get_connection().unwrap(); + match conn.append(key, value) { + Ok(data) => data, + Err(err) => err.to_string(), + } + } + + #[rhai_fn(global)] + pub fn inc(redis: Redis, key: String, value: i64) -> String { + let mut conn = redis.client.unwrap().get_connection().unwrap(); + match conn.incr(key, value) { + Ok(data) => data, + Err(err) => err.to_string(), + } + } + + #[rhai_fn(global)] + pub fn dec(redis: Redis, key: String, value: i64) -> String { + let mut conn = redis.client.unwrap().get_connection().unwrap(); + match conn.decr(key, value) { + Ok(data) => data, + Err(err) => err.to_string(), + } + } + + #[rhai_fn(global)] + pub fn exists(redis: Redis, key: String) -> bool { + let mut conn = redis.client.unwrap().get_connection().unwrap(); + match conn.exists(key) { + Ok(bool) => bool, + Err(_) => false, + } + } + + #[rhai_fn(global, return_raw)] + pub fn keys(redis: Redis, filter: String) -> Result> { + let mut conn = redis.client.unwrap().get_connection().unwrap(); + match conn.keys(filter) { + Ok(data) => to_dynamic::>(data), + Err(_) => to_dynamic::>(vec![]), + } + } +} #[export_module] mod sqlx {} @@ -603,19 +724,19 @@ async fn handler(url: Path, req: HttpRequest, config: Data) -> i // add redis support, sqlx, if let Some(database) = &config.database { if let Some(_) = &database.kv { - let kv = exported_module!(kv); + let kv = exported_module!(kv_db); engine.register_static_module("kv", kv.into()); } if let Some(_) = &database.sqlite { - let sqlite = exported_module!(sqlite); + let sqlite = exported_module!(sqlite_db); engine.register_static_module("sqlite", sqlite.into()); } if let Some(_) = &database.mongo { - let mongo = exported_module!(mongo); + let mongo = exported_module!(mongo_db); engine.register_static_module("mongo", mongo.into()); } if let Some(_) = &database.redis { - let redis = exported_module!(redis); + let redis = exported_module!(redis_db); engine.register_static_module("redis", redis.into()); } } -- GitLab