cooklang_sync_client/
registry.rs

1use diesel::dsl::{max, sql};
2use diesel::prelude::*;
3use diesel::{insert_into, update};
4
5use log::trace;
6
7use crate::connection::Connection;
8use crate::models::*;
9use crate::schema::*;
10
11type Result<T, E = diesel::result::Error> = std::result::Result<T, E>;
12
13pub fn create(conn: &mut Connection, forms: &Vec<CreateForm>) -> Result<usize> {
14    trace!("inserting {:?}", forms);
15
16    insert_into(file_records::table).values(forms).execute(conn)
17}
18
19pub fn update_jid(conn: &mut Connection, record: &FileRecord, jid: i32) -> Result<usize> {
20    trace!("update_jid {:?}: {:?}", jid, record);
21
22    update(file_records::table)
23        .filter(file_records::id.eq(record.id))
24        .set(file_records::jid.eq(jid))
25        .execute(conn)
26}
27
28pub fn delete(conn: &mut Connection, forms: &Vec<DeleteForm>) -> Result<usize> {
29    trace!("marking as deleted {:?}", forms);
30
31    insert_into(file_records::table).values(forms).execute(conn)
32}
33
34pub fn non_deleted(conn: &mut Connection, namespace_id: i32) -> Result<Vec<FileRecord>> {
35    trace!("non_deleted");
36
37    // Consider only latest record for the same path.
38    let subquery = file_records::table
39        .filter(file_records::namespace_id.eq(namespace_id))
40        .group_by(file_records::path)
41        .select(max(file_records::id))
42        .into_boxed()
43        .select(sql::<diesel::sql_types::Integer>("max(id)"));
44
45    file_records::table
46        .filter(file_records::deleted.eq(false))
47        .filter(file_records::id.eq_any(subquery))
48        .select(FileRecord::as_select())
49        .order(file_records::id.asc())
50        .load::<FileRecord>(conn)
51}
52
53/// Files that don't have jid
54/// These should be send to remote
55pub fn updated_locally(conn: &mut Connection, namespace_id: i32) -> Result<Vec<FileRecord>> {
56    trace!("updated_locally");
57
58    // Need to ignore records which come after record with jid
59    // for the same path
60    let subquery = file_records::table
61        .filter(file_records::namespace_id.eq(namespace_id))
62        .group_by(file_records::path)
63        .select(max(file_records::id))
64        .into_boxed()
65        .select(sql::<diesel::sql_types::Integer>("max(id)"));
66
67    let query = file_records::table
68        .select(FileRecord::as_select())
69        .filter(file_records::jid.is_null())
70        .filter(file_records::id.eq_any(subquery))
71        .order(file_records::id.asc());
72
73    query.load::<FileRecord>(conn)
74}
75
76pub fn latest_jid(conn: &mut Connection, namespace_id: i32) -> Result<i32> {
77    trace!("latest_jid");
78
79    let r = file_records::table
80        .filter(file_records::jid.is_not_null())
81        .filter(file_records::namespace_id.eq(namespace_id))
82        .select(FileRecord::as_select())
83        .order(file_records::jid.desc())
84        .first::<FileRecord>(conn);
85
86    match r {
87        Ok(r) => Ok(r.jid.unwrap_or(0)),
88        Err(e) => Err(e),
89    }
90}