diff options
Diffstat (limited to 'src/db.rs')
-rw-r--r-- | src/db.rs | 30 |
1 files changed, 30 insertions, 0 deletions
@@ -137,6 +137,16 @@ pub fn get_strava_token( Ok(token) } +pub fn update_strava_token( + conn: &PgConnection, + token: &models::StravaToken) -> Result<(), Error> { + use crate::schema::strava_tokens; + diesel::update(strava_tokens::table).set(token) + .execute(conn)?; + Ok(()) +} + + pub fn insert_task(conn: &PgConnection, task: &models::NewTask) -> Result<i64, Error> { use crate::schema::tasks; let id = diesel::insert_into(tasks::table) @@ -192,6 +202,25 @@ pub fn take_task( }) } +pub fn find_missing_data(conn: &PgConnection, username: &str, data_type: models::DataType, ids: &[i64]) + -> Result<Vec<i64>, Error> { + use diesel::pg::expression::dsl::any; + use crate::schema::raw_data; + use std::collections::HashSet; + + let present: HashSet<i64> = raw_data::table + .select(raw_data::id) + .filter(raw_data::username.eq(username) + .and(raw_data::data_type.eq(data_type)) + .and(raw_data::id.eq(any(ids)))) + .get_results::<i64>(conn)? + .into_iter().collect(); + + let ids: HashSet<i64> = ids.iter().map(|v| *v).collect(); + let missing = ids.difference(&present); + Ok(missing.map(|v| *v).collect()) +} + pub fn insert_data(conn: &PgConnection, data: &models::RawData) -> Result<usize, Error> { use crate::schema::raw_data; let rows = diesel::insert_into(raw_data::table) @@ -253,6 +282,7 @@ pub fn get_entries( .eq(username) .and(entries::entry_type.eq(entry_type)), ) + .order(entries::timestamp.desc()) .get_results::<models::Entry>(conn)?; Ok(r) } |