summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib.rs5
-rw-r--r--src/plugins/factoids/database.rs57
-rw-r--r--src/plugins/factoids/mod.rs20
-rw-r--r--src/plugins/mod.rs1
4 files changed, 61 insertions, 22 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 4407e6a..8b55dab 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -34,11 +34,6 @@
#[cfg(feature = "mysql")]
#[macro_use]
extern crate diesel;
-#[cfg(feature = "mysql")]
-extern crate diesel_infer_schema;
-#[cfg(feature = "mysql")]
-#[macro_use]
-extern crate diesel_migrations;
#[macro_use]
extern crate log;
diff --git a/src/plugins/factoids/database.rs b/src/plugins/factoids/database.rs
index 522c9d0..1af586e 100644
--- a/src/plugins/factoids/database.rs
+++ b/src/plugins/factoids/database.rs
@@ -26,6 +26,8 @@ pub struct Factoid {
pub created: NaiveDateTime,
}
+#[cfg(feature = "mysql")]
+use self::mysql::factoids;
#[cfg_attr(feature = "mysql", derive(Insertable))]
#[cfg_attr(feature = "mysql", table_name="factoids")]
pub struct NewFactoid<'a> {
@@ -40,6 +42,7 @@ pub struct NewFactoid<'a> {
pub trait Database: Send {
fn insert(&mut self, factoid: &NewFactoid) -> DbResponse;
fn get(&self, name: &str, idx: i32) -> Option<Factoid>;
+ fn delete(&mut self, name: &str, idx: i32) -> DbResponse;
fn count(&self, name: &str) -> Result<i32, &'static str>;
}
@@ -65,6 +68,13 @@ impl Database for HashMap<(String, i32), Factoid> {
self.get(&(String::from(name), idx)).map(|f| f.clone())
}
+ fn delete(&mut self, name: &str, idx: i32) -> DbResponse {
+ match self.remove(&(String::from(name), idx)) {
+ Some(_) => DbResponse::Success,
+ None => DbResponse::Failed("Factoid not found"),
+ }
+ }
+
fn count(&self, name: &str) -> Result<i32, &'static str> {
Ok(self.iter()
.filter(|&(&(ref n, _), _)| n == name)
@@ -72,15 +82,18 @@ impl Database for HashMap<(String, i32), Factoid> {
}
}
-// MySql
+// Diesel automatically define the factoids module as public.
+// For now this is how we keep it private.
#[cfg(feature = "mysql")]
-table! {
- factoids (name, idx) {
- name -> Varchar,
- idx -> Integer,
- content -> Text,
- author -> Varchar,
- created -> Timestamp,
+mod mysql {
+ table! {
+ factoids (name, idx) {
+ name -> Varchar,
+ idx -> Integer,
+ content -> Text,
+ author -> Varchar,
+ created -> Timestamp,
+ }
}
}
@@ -88,22 +101,34 @@ table! {
impl Database for MysqlConnection {
fn insert(&mut self, factoid: &NewFactoid) -> DbResponse {
use diesel;
-
match diesel::insert_into(factoids::table)
.values(factoid)
.execute(self) {
Ok(_) => DbResponse::Success,
- Err(_) => DbResponse::Failed("Database error - possible duplicate"),
+ Err(e) => {
+ debug!("DB Insertion Error: {:?}", e);
+ DbResponse::Failed("Database error - possible duplicate")
+ }
}
}
fn get(&self, name: &str, idx: i32) -> Option<Factoid> {
- factoids::table
- .find((name, idx))
- .limit(1)
- .load::<Factoid>(self)
- .ok()
- .and_then(|v| v.into_iter().next())
+ factoids::table.find((name, idx)).first(self).ok()
+ }
+
+ fn delete(&mut self, name: &str, idx: i32) -> DbResponse {
+ use diesel;
+ use self::factoids::columns;
+ match diesel::delete(factoids::table
+ .filter(columns::name.eq(name))
+ .filter(columns::idx.eq(idx)))
+ .execute(self) {
+ Ok(_) => DbResponse::Success,
+ Err(e) => {
+ debug!("DB Deletion Error: {:?}", e);
+ DbResponse::Failed("Failed to delete factoid")
+ }
+ }
}
fn count(&self, name: &str) -> Result<i32, &'static str> {
diff --git a/src/plugins/factoids/mod.rs b/src/plugins/factoids/mod.rs
index bb83700..fcbbb79 100644
--- a/src/plugins/factoids/mod.rs
+++ b/src/plugins/factoids/mod.rs
@@ -11,7 +11,7 @@ use time;
use chrono::NaiveDateTime;
use plugin::*;
-mod database;
+pub mod database;
use self::database::{Database, DbResponse};
static LUA_SANDBOX: &'static str = include_str!("sandbox.lua");
@@ -63,6 +63,23 @@ impl<T: Database> Factoids<T> {
}
}
+ fn remove(&self, server: &IrcServer, command: &mut PluginCommand) -> Result<(), IrcError> {
+ if command.tokens.len() < 1 {
+ return self.invalid_command(server, command);
+ }
+
+ let name = command.tokens.remove(0);
+ let count = match try_lock!(self.factoids).count(&name) {
+ Ok(c) => c,
+ Err(e) => return server.send_notice(&command.source, e),
+ };
+
+ match try_lock!(self.factoids).delete(&name, count - 1) {
+ DbResponse::Success => server.send_notice(&command.source, "Successfully removed"),
+ DbResponse::Failed(e) => server.send_notice(&command.source, &e),
+ }
+ }
+
fn get(&self, server: &IrcServer, command: &PluginCommand) -> Result<(), IrcError> {
let (name, idx) = match command.tokens.len() {
@@ -257,6 +274,7 @@ impl<T: Database> Plugin for Factoids<T> {
let sub_command = command.tokens.remove(0);
match sub_command.as_ref() {
"add" => self.add(server, &mut command),
+ "remove" => self.remove(server, &mut command),
"get" => self.get(server, &command),
"info" => self.info(server, &command),
"exec" => self.exec(server, command, true),
diff --git a/src/plugins/mod.rs b/src/plugins/mod.rs
index f860d88..2e85932 100644
--- a/src/plugins/mod.rs
+++ b/src/plugins/mod.rs
@@ -11,4 +11,5 @@ pub use self::url::Url;
pub use self::emoji::Emoji;
pub use self::currency::Currency;
pub use self::factoids::Factoids;
+pub use self::factoids::database;
pub use self::keepnick::KeepNick;