Browse Source

segments begin

pull/25/head
Alexey Velikiy 3 years ago
parent
commit
1c520d80f6
  1. 3
      server/.gitignore
  2. 61
      server/Cargo.lock
  3. 1
      server/Cargo.toml
  4. 10
      server/src/api.rs
  5. 43
      server/src/api/segments.rs
  6. 9
      server/src/main.rs
  7. 62
      server/src/services/data_service.rs

3
server/.gitignore vendored

@ -1 +1,2 @@
target/*
target/*
data.db

61
server/Cargo.lock generated

@ -2,6 +2,17 @@
# It is not intended for manual editing.
version = 3
[[package]]
name = "ahash"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
dependencies = [
"getrandom 0.2.3",
"once_cell",
"version_check",
]
[[package]]
name = "aho-corasick"
version = "0.7.18"
@ -180,6 +191,18 @@ dependencies = [
"generic-array",
]
[[package]]
name = "fallible-iterator"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
[[package]]
name = "fallible-streaming-iterator"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
[[package]]
name = "fastrand"
version = "1.5.0"
@ -339,6 +362,18 @@ name = "hashbrown"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
dependencies = [
"ahash",
]
[[package]]
name = "hashlink"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf"
dependencies = [
"hashbrown",
]
[[package]]
name = "hastic"
@ -349,6 +384,7 @@ dependencies = [
"fastrand",
"openssl",
"parking_lot",
"rusqlite",
"serde 1.0.130",
"subbeat",
"tokio",
@ -530,6 +566,16 @@ version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "869d572136620d55835903746bcb5cdc54cb2851fd0aeec53220b4bb65ef3013"
[[package]]
name = "libsqlite3-sys"
version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abd5850c449b40bacb498b2bbdfaff648b1b055630073ba8db499caf2d0ea9f2"
dependencies = [
"pkg-config",
"vcpkg",
]
[[package]]
name = "linked-hash-map"
version = "0.5.4"
@ -958,6 +1004,21 @@ dependencies = [
"winapi",
]
[[package]]
name = "rusqlite"
version = "0.26.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a82b0b91fad72160c56bf8da7a549b25d7c31109f52cc1437eac4c0ad2550a7"
dependencies = [
"bitflags",
"fallible-iterator",
"fallible-streaming-iterator",
"hashlink",
"libsqlite3-sys",
"memchr",
"smallvec",
]
[[package]]
name = "rust-ini"
version = "0.13.0"

1
server/Cargo.toml

@ -16,3 +16,4 @@ fastrand = "1.5.0"
subbeat = "0.0.5"
config = "0.11.0"
openssl = { version = "=0.10.33", features = ["vendored"] }
rusqlite = "0.26.1"

10
server/src/api.rs

@ -1,5 +1,5 @@
use hastic::config::Config;
use hastic::services::{metric_service, user_service};
use hastic::services::{data_service, metric_service, user_service};
use warp::http::HeaderValue;
use warp::hyper::{Body, StatusCode};
use warp::{body, options, Rejection, Reply};
@ -22,18 +22,20 @@ pub struct API<'a> {
config: &'a Config,
user_service: Arc<RwLock<user_service::UserService>>,
metric_service: Arc<RwLock<metric_service::MetricService>>,
data_service: Arc<RwLock<data_service::DataService>>,
}
impl API<'_> {
pub fn new(config: &Config) -> API<'_> {
API {
pub fn new(config: &Config) -> anyhow::Result<API<'_>> {
Ok(API {
config: config,
user_service: Arc::new(RwLock::new(user_service::UserService::new())),
metric_service: Arc::new(RwLock::new(metric_service::MetricService::new(
&config.prom_url,
&config.query,
))),
}
data_service: Arc::new(RwLock::new(data_service::DataService::new()?)),
})
}
fn json<T: Serialize>(t: &T) -> Response<Body> {

43
server/src/api/segments.rs

@ -0,0 +1,43 @@
use hastic::services::user_service;
use warp::filters::method::post;
use warp::http::HeaderValue;
use warp::hyper::{Body, StatusCode};
use warp::{http::Response, Filter};
use warp::{Rejection, Reply};
use serde::Serialize;
use crate::api::{self, API};
use parking_lot::RwLock;
use std::sync::Arc;
async fn get_query(
p: HashMap<String, String>,
ms: Arc<RwLock<metric_service::MetricService>>,
) -> anyhow::Result<MetricResult> {
if !p.contains_key("from") {
return Err(anyhow::anyhow!("Missing attribute from"));
}
if !p.contains_key("to") {
return Err(anyhow::anyhow!("Missing attribute to"));
}
let from = p.get("from").unwrap().parse::<u64>()?;
let to = p.get("to").unwrap().parse::<u64>()?;
let prom = ms.read().get_prom();
drop(ms);
// Ok(prom.query(from, to, step).await?)
}
pub fn get_route(
user_service: Arc<RwLock<user_service::UserService>>,
) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
return warp::path!("api" / "segments")
.and(get())
.and(warp::query::<HashMap<String, String>>())
.and(warp::any().map(move || metric_service.clone()))
.and_then(query);
}

9
server/src/main.rs

@ -1,8 +1,13 @@
use anyhow;
mod api;
#[tokio::main]
async fn main() {
async fn main() -> anyhow::Result<()> {
let config = hastic::config::Config::new();
let api = api::API::new(&config);
let api = api::API::new(&config)?;
api.serve().await;
Ok(())
}

62
server/src/services/data_service.rs

@ -1 +1,61 @@
struct DataService {}
use rusqlite::{ Connection, params };
#[derive(Debug)]
pub struct Segment {
pub id: Option<u64>,
pub start: u64,
pub end: u64,
}
pub struct DataService {
connection: Connection
}
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
)",
[],
)?;
Ok(DataService { connection: conn })
}
pub fn insert_segment(&self, segment: &Segment) -> anyhow::Result<u64> {
// TODO: merge with other segments
self.connection.execute(
"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>> {
let mut stmt = self.connection.prepare(
"SELECT id, start, end FROM person WHERE ?1 < start AND end < ?2"
)?;
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();
Ok(res)
}
}

Loading…
Cancel
Save