cooklang_sync_client/
registry.rs1use 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 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
53pub fn updated_locally(conn: &mut Connection, namespace_id: i32) -> Result<Vec<FileRecord>> {
56 trace!("updated_locally");
57
58 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}