aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJokler <jokler.contact@gmail.com>2017-11-04 22:46:39 +0100
committerJokler <jokler.contact@gmail.com>2017-12-24 00:40:06 +0100
commit5928afc3bf83661cd3b11130a31a2d97ef135a9e (patch)
tree4d1ad028c3a7130eb98c18ef5b97bea9f52f2e2f
parentf3d679da59a64711ef96042668b26dffd1e662d5 (diff)
downloadfrippy-5928afc3bf83661cd3b11130a31a2d97ef135a9e.tar.gz
frippy-5928afc3bf83661cd3b11130a31a2d97ef135a9e.zip
Add MySql as a possible database for the Factoids plugin
-rw-r--r--Cargo.lock67
-rw-r--r--Cargo.toml26
-rw-r--r--migrations/.gitkeep0
-rw-r--r--migrations/2017-11-03-164322_create_factoids/down.sql1
-rw-r--r--migrations/2017-11-03-164322_create_factoids/up.sql4
-rw-r--r--src/lib.rs7
-rw-r--r--src/plugins/factoids/database.rs72
-rw-r--r--src/plugins/factoids/mod.rs16
8 files changed, 178 insertions, 15 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 3466ce6..91693d5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -210,6 +210,55 @@ dependencies = [
]
[[package]]
+name = "derive-error-chain"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "diesel"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mysqlclient-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "diesel_codegen"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "diesel 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "diesel_infer_schema 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "dotenv 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "diesel_infer_schema"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "diesel 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "dotenv"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "derive-error-chain 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "dtoa"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -302,6 +351,9 @@ name = "frippy"
version = "0.3.1"
dependencies = [
"clippy 0.0.177 (registry+https://github.com/rust-lang/crates.io-index)",
+ "diesel 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "diesel_codegen 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "dotenv 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
"frippy_derive 0.1.0",
"futures 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -625,6 +677,15 @@ dependencies = [
]
[[package]]
+name = "mysqlclient-sys"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "native-tls"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1327,6 +1388,11 @@ dependencies = [
"checksum crypt32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e34988f7e069e0b2f3bfc064295161e489b2d4e04a2e4248fb94360cdf00b4ec"
"checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850"
"checksum debug_unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9a032eac705ca39214d169f83e3d3da290af06d8d1d344d1baad2fd002dca4b3"
+"checksum derive-error-chain 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3c9ca9ade651388daad7c993f005d0d20c4f6fe78c1cdc93e95f161c6f5ede4a"
+"checksum diesel 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "304226fa7a3982b0405f6bb95dd9c10c3e2000709f194038a60ec2c277150951"
+"checksum diesel_codegen 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a42ca5c9b660add51d58bc5a50a87123380e1e458069c5504528a851ed7384"
+"checksum diesel_infer_schema 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf1957ff5cd3b04772e43c162c2f69c2aa918080ff9b020276792d236be8be52"
+"checksum dotenv 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d6f0e2bb24d163428d8031d3ebd2d2bd903ad933205a97d0f18c7c1aade380f3"
"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
"checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3"
"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
@@ -1373,6 +1439,7 @@ dependencies = [
"checksum mime_guess 2.0.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "013572795763289e14710c7b279461295f2673b2b338200c235082cd7ca9e495"
"checksum mio 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0e8411968194c7b139e9105bc4ae7db0bae232af087147e72f0616ebf5fdb9cb"
"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
+"checksum mysqlclient-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "879ce08e38739c54d87b7f8332a476004fe2a095f40a142a36f889779d9942b7"
"checksum native-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04b781c9134a954c84f0594b9ab3f5606abc516030388e8511887ef4c204a1e5"
"checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09"
"checksum num 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cc4083e14b542ea3eb9b5f33ff48bd373a92d78687e74f4cc0a30caeb754f0ca"
diff --git a/Cargo.toml b/Cargo.toml
index 87c9052..5ff779f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -18,6 +18,9 @@ name = "frippy"
path = "bin/main.rs"
doc = false
+[features]
+mysql = ["diesel", "diesel_codegen", "dotenv"]
+
[dependencies]
irc = "0.12.5"
tokio-core = "0.1.10"
@@ -34,6 +37,25 @@ serde_json = "1.0.3"
glob = "0.2"
frippy_derive = { path = "frippy_derive" }
-unicode_names = { git = 'https://github.com/Jokler/unicode_names', branch = 'update-to-latest-unicode' }
-clippy = {version = "*", optional = true}
+[dependencies.unicode_names]
+git = 'https://github.com/Jokler/unicode_names'
+branch = 'update-to-latest-unicode'
+
+[dependencies.diesel]
+version = "0.16.0"
+optional = true
+features = ["mysql"]
+
+[dependencies.diesel_codegen]
+version = "0.16.0"
+optional = true
+features = ["mysql"]
+
+[dependencies.dotenv]
+version = "0.10.1"
+optional = true
+
+[dependencies.clippy]
+version = "*"
+optional = true \ No newline at end of file
diff --git a/migrations/.gitkeep b/migrations/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/migrations/.gitkeep
diff --git a/migrations/2017-11-03-164322_create_factoids/down.sql b/migrations/2017-11-03-164322_create_factoids/down.sql
new file mode 100644
index 0000000..58c2110
--- /dev/null
+++ b/migrations/2017-11-03-164322_create_factoids/down.sql
@@ -0,0 +1 @@
+DROP TABLE factoids
diff --git a/migrations/2017-11-03-164322_create_factoids/up.sql b/migrations/2017-11-03-164322_create_factoids/up.sql
new file mode 100644
index 0000000..84e9f9d
--- /dev/null
+++ b/migrations/2017-11-03-164322_create_factoids/up.sql
@@ -0,0 +1,4 @@
+CREATE TABLE factoids (
+ name VARCHAR(32) PRIMARY KEY,
+ content VARCHAR(5000) NOT NULL
+)
diff --git a/src/lib.rs b/src/lib.rs
index 5d15802..1f5514e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -31,6 +31,13 @@
//! Frippy uses the [log](https://docs.rs/log) crate so you can log events
//! which might be of interest.
+#[cfg(feature = "mysql")]
+#[macro_use]
+extern crate diesel;
+#[cfg(feature = "mysql")]
+#[macro_use]
+extern crate diesel_codegen;
+
#[macro_use]
extern crate log;
#[macro_use]
diff --git a/src/plugins/factoids/database.rs b/src/plugins/factoids/database.rs
index 7a6f568..dbf136c 100644
--- a/src/plugins/factoids/database.rs
+++ b/src/plugins/factoids/database.rs
@@ -1,18 +1,74 @@
-use std::fmt;
+#[cfg(feature = "mysql")]
+extern crate dotenv;
use std::collections::HashMap;
-pub trait Database: Send + Sync + fmt::Debug {
- fn insert(&mut self, name: String, content: String) -> Option<String>;
- fn get(&self, name: &str) -> Option<&str>;
+#[cfg(feature = "mysql")]
+use diesel::prelude::*;
+
+#[cfg(feature = "mysql")]
+use diesel::mysql::MysqlConnection;
+
+pub trait Database: Send {
+ fn insert(&mut self, name: &str, content: &str) -> Option<()>;
+ fn get(&self, name: &str) -> Option<String>;
}
impl Database for HashMap<String, String> {
- fn insert(&mut self, name: String, content: String) -> Option<String> {
- self.insert(name, content)
+ fn insert(&mut self, name: &str, content: &str) -> Option<()> {
+ self.insert(String::from(name), String::from(content)).map(|_| ())
+ }
+
+ fn get(&self, name: &str) -> Option<String> {
+ self.get(name).cloned()
+ }
+}
+
+#[cfg(feature = "mysql")]
+#[derive(Queryable)]
+struct Factoid {
+ pub name: String,
+ pub content: String,
+}
+
+#[cfg(feature = "mysql")]
+table! {
+ factoids (name) {
+ name -> Varchar,
+ content -> Varchar,
+ }
+}
+
+#[cfg(feature = "mysql")]
+#[derive(Insertable)]
+#[table_name="factoids"]
+struct NewFactoid<'a> {
+ pub name: &'a str,
+ pub content: &'a str,
+}
+
+
+#[cfg(feature = "mysql")]
+impl Database for MysqlConnection {
+ fn insert(&mut self, name: &str, content: &str) -> Option<()> {
+ let factoid = NewFactoid {
+ name: name,
+ content: content,
+ };
+
+ ::diesel::insert(&factoid)
+ .into(factoids::table)
+ .execute(self)
+ .ok()
+ .map(|_| ())
}
- fn get(&self, name: &str) -> Option<&str> {
- self.get(name).map(String::as_str)
+ fn get(&self, name: &str) -> Option<String> {
+ factoids::table
+ .filter(factoids::columns::name.eq(name))
+ .limit(1)
+ .load::<Factoid>(self)
+ .ok()
+ .and_then(|v| v.first().map(|f| f.content.clone()))
}
}
diff --git a/src/plugins/factoids/mod.rs b/src/plugins/factoids/mod.rs
index a13bba6..5f9f99a 100644
--- a/src/plugins/factoids/mod.rs
+++ b/src/plugins/factoids/mod.rs
@@ -1,5 +1,6 @@
extern crate rlua;
+use std::fmt;
use self::rlua::prelude::*;
use irc::client::prelude::*;
use irc::error::Error as IrcError;
@@ -8,11 +9,11 @@ use std::sync::Mutex;
use plugin::*;
mod database;
-use self::database::*;
+use self::database::Database;
static LUA_SANDBOX: &'static str = include_str!("sandbox.lua");
-#[derive(PluginName, Debug)]
+#[derive(PluginName)]
pub struct Factoids<T: Database> {
factoids: Mutex<T>,
}
@@ -40,7 +41,7 @@ impl<T: Database> Factoids<T> {
let name = command.tokens.remove(0);
try_lock!(self.factoids)
- .insert(name, command.tokens.join(" "));
+ .insert(&name, &command.tokens.join(" "));
server.send_notice(&command.source, "Successfully added")
}
@@ -63,7 +64,6 @@ impl<T: Database> Factoids<T> {
}
fn exec(&self, server: &IrcServer, mut command: PluginCommand) -> Result<(), IrcError> {
-
if command.tokens.len() < 1 {
self.invalid_command(server, &command)
@@ -88,7 +88,7 @@ impl<T: Database> Factoids<T> {
}
}
} else {
- String::from(factoid)
+ factoid
};
server.send_privmsg(&command.target, &value)
@@ -170,3 +170,9 @@ impl<T: Database> Plugin for Factoids<T> {
}
}
}
+
+impl<T: Database> fmt::Debug for Factoids<T> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write!(f, "Factoids {{ ... }}")
+ }
+}