Hastic standalone https://hastic.io
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
1.7 KiB

3 years ago
use rusqlite::{params, Connection};
3 years ago
3 years ago
use serde::{Deserialize, Serialize};
3 years ago
3 years ago
use std::sync::{Arc, Mutex};
#[derive(Debug, Serialize, Deserialize)]
3 years ago
pub struct Segment {
pub id: Option<u64>,
pub start: u64,
pub end: u64,
}
3 years ago
// TODO: find a way to remove this unsafe
unsafe impl Sync for DataService {}
3 years ago
pub struct DataService {
3 years ago
connection: Arc<Mutex<Connection>>,
3 years ago
}
impl DataService {
pub fn new() -> anyhow::Result<DataService> {
let conn = Connection::open("./data.db")?;
conn.execute(
"CREATE TABLE IF NOT EXISTS segment (
id INTEGER PRIMARY KEY,
start INTEGER NOT NULL,
end INTEGER NOT NULL
)",
[],
)?;
3 years ago
Ok(DataService {
connection: Arc::new(Mutex::new(conn))
3 years ago
})
3 years ago
}
pub fn insert_segment(&self, segment: &Segment) -> anyhow::Result<u64> {
// TODO: merge with other segments
3 years ago
self.connection.lock().unwrap().execute(
3 years ago
"INSERT INTO segment (start, end) VALUES (?1, ?2)",
params![segment.start, segment.end],
)?;
Ok(10)
}
pub fn get_segments(&self, from: u64, to: u64) -> anyhow::Result<Vec<Segment>> {
3 years ago
let conn = self.connection.lock().unwrap();
3 years ago
let mut stmt =
conn.prepare("SELECT id, start, end FROM person WHERE ?1 < start AND end < ?2")?;
3 years ago
3 years ago
let res = stmt
.query_map(params![from, to], |row| {
Ok(Segment {
id: row.get(0)?,
start: row.get(1)?,
end: row.get(2)?,
})
})?
.map(|e| e.unwrap())
.collect();
3 years ago
Ok(res)
}
}