Skip to content
Snippets Groups Projects

Draft: #7 alternative kv db

Open Philipp Rothmann requested to merge #7_alternative_kv_db into master
Files
12
+ 35
16
use crate::domain::Dname;
use std::path::PathBuf;
use chrono::{Utc, DateTime};
use chrono::{Utc, DateTime, Duration};
use std::net::{Ipv4Addr, Ipv6Addr};
use log::{info, warn, error};
use std::sync::{Mutex, Arc};
@@ -8,27 +8,22 @@ use serde::{Serialize, Deserialize};
use serde_json as json;
use crate::ffdyndns::Token;
use crate::sha256;
use rocksdb::IteratorMode;
pub mod rocksdb;
pub mod redis;
/// a database abstraction
pub trait Database {
pub trait Database: Sync {
fn get(&self, key: String) -> Option<Vec<u8>>;
fn set(&self, key: String, val: Vec<u8>) -> Result<(),()>;
fn delete(&self, key: String);
// pub fn get_all_domains(&self) -> Vec<Domain> {
// let db = self.conn.lock().unwrap();
// let mut stmt: sqlite::Statement = db.prepare("SELECT * FROM domains").unwrap();
// stmt.query_map(
// params![],
// |row| Ok(Domain::from_row(row))
// ).unwrap().map(|x| x.unwrap()).collect()
// }
// the following methods are provided if the above are implemented
fn insert_new_domain(&self, d: &Domain) {
self.set(
@@ -50,7 +45,17 @@ pub trait Database {
fn update_lastupdate(&self, domain: &String, lastupdate: DateTime<Utc>) {
let mut d = self.get_domain(domain).unwrap();
d.lastupdate = Some(lastupdate);
d.lastupdate = lastupdate;
self.conn.lock().unwrap().put(
sha256!(domain),
json::to_vec(&d).unwrap()
).unwrap();
}
pub fn update_validity(&self, domain: &String, valid_until: DateTime<Utc>) {
let mut d = self.get_domain(domain).unwrap();
d.valid_until = valid_until;
self.set(
sha256!(domain),
@@ -86,6 +91,17 @@ pub trait Database {
fn exists(&self, d: &String) -> bool {
self.get_domain(d).is_some()
}
pub fn get_all(&self) -> Vec<Domain> {
self.conn
.lock()
.unwrap()
.iterator(IteratorMode::Start)
.map(|(_, v)| {
json::from_slice(&*v).unwrap()
})
.collect()
}
}
@@ -93,7 +109,8 @@ pub trait Database {
pub struct Domain {
pub domainname: String,
pub token: Token,
pub lastupdate: Option<DateTime<Utc>>,
pub lastupdate: DateTime<Utc>,
pub valid_until: DateTime<Utc>,
pub ipv4: Option<Ipv4Addr>,
pub ipv6: Option<Ipv6Addr>,
}
@@ -111,22 +128,24 @@ impl Domain {
}
impl Domain {
pub fn new_with_token(domain: Dname, token: String) -> Self {
pub fn new_with_token(domain: &Dname, token: String, validity: Duration) -> Self {
Self {
domainname: domain.to_string(),
token: token,
lastupdate: None,
lastupdate: Utc::now(),
valid_until: Utc::now() + validity,
ipv4: None,
ipv6: None
}
}
/// creates a new Domain object and generates a random token
pub fn new(domain: String) -> Self {
pub fn new(domain: String, validity: Duration) -> Self {
Self {
domainname: domain,
token: crate::ffdyndns::generate_token(),
lastupdate: None,
lastupdate: Utc::now(),
valid_until: Utc::now() + validity,
ipv4: None,
ipv6: None
}
Loading