ostring_sqlx/
tab_userconf.rs1use anyhow::{anyhow, Result};
2use sqlx::sqlite::Sqlite;
3use sqlx::{query, query_as, query_scalar, Pool};
4
5#[derive(Debug, Clone, Default, sqlx::FromRow)]
6pub struct UconfOption {
7 pub user_id: Option<i32>,
8 pub conf_id: Option<i32>,
9 pub version: Option<String>,
10 pub content: Option<String>,
11}
12
13#[derive(Debug, Clone)]
14pub struct UconfQB {
15 pool: Pool<Sqlite>,
16 parm: UconfOption,
17}
18
19impl UconfQB {
20 pub fn new(pool: Pool<Sqlite>) -> Self {
21 UconfQB {
22 pool,
23 parm: UconfOption::default(),
24 }
25 }
26
27 pub fn set_parm(mut self, parm: UconfOption) -> Self {
28 self.parm = parm;
29 self
30 }
31
32 pub async fn init_table(self) -> Result<Self> {
33 query(
34 r#"CREATE TABLE IF NOT EXISTS user_confs (
35 user_id INTEGER NOT NULL,
36 conf_id INTEGER NOT NULL,
37 version TEXT NOT NULL,
38 content TEXT NOT NULL,
39 PRIMARY KEY (user_id, conf_id, version))
40 "#,
41 )
42 .execute(&self.pool.clone())
43 .await?;
44 Ok(self)
45 }
46
47 pub async fn get_all(&self) -> Result<Vec<UconfOption>> {
48 let parm = self.parm.clone();
49 parm.user_id.as_ref().ok_or(anyhow!("user_id is None"))?;
50 parm.conf_id.as_ref().ok_or(anyhow!("conf_id is None"))?;
51
52 let confs: Vec<UconfOption> =
53 query_as("SELECT * FROM user_confs WHERE user_id = ? AND conf_id = ?")
54 .bind(parm.user_id)
55 .bind(parm.conf_id)
56 .fetch_all(&self.pool.clone())
57 .await?;
58 return Ok(confs);
59 }
60
61 pub async fn read(&self) -> Result<Option<String>> {
62 let parm = self.parm.clone();
63 parm.user_id.as_ref().ok_or(anyhow!("user_id is None"))?;
64 parm.conf_id.as_ref().ok_or(anyhow!("conf_id is None"))?;
65 parm.version.as_ref().ok_or(anyhow!("version is None"))?;
66
67 let content = query_scalar(
68 "SELECT content FROM user_confs WHERE user_id = ? AND conf_id = ? AND version = ?",
69 )
70 .bind(parm.user_id)
71 .bind(parm.conf_id)
72 .bind(parm.version)
73 .fetch_optional(&self.pool.clone())
74 .await?;
75 return Ok(content);
76 }
77
78 pub async fn save(self) -> Result<Self> {
79 let parm = self.parm.clone();
80 parm.user_id.as_ref().ok_or(anyhow!("user_id is None"))?;
81 parm.conf_id.as_ref().ok_or(anyhow!("conf_id is None"))?;
82 parm.version.as_ref().ok_or(anyhow!("version is None"))?;
83 parm.content.as_ref().ok_or(anyhow!("content is None"))?;
84
85 let query_str = match self.read().await? {
86 Some(_) => "UPDATE user_confs SET content = $4 WHERE user_id = $1 AND conf_id = $2 AND version = $3",
87 None => "INSERT INTO user_confs (user_id, conf_id, version, content) VALUES ($1, $2, $3, $4)"
88 };
89 query(query_str)
90 .bind(parm.user_id)
91 .bind(parm.conf_id)
92 .bind(parm.version)
93 .bind(parm.content)
94 .execute(&self.pool.clone())
95 .await?;
96 return Ok(self);
97 }
98
99 pub async fn remove(self) -> Result<()> {
100 let parm = self.parm.clone();
101 parm.user_id.as_ref().ok_or(anyhow!("user_id is None"))?;
102 parm.conf_id.as_ref().ok_or(anyhow!("conf_id is None"))?;
103 parm.version.as_ref().ok_or(anyhow!("version is None"))?;
104 query("DELETE FROM user_confs WHERE user_id = ? AND conf_id = ? AND version = ?")
105 .bind(parm.user_id)
106 .bind(parm.conf_id)
107 .bind(parm.version)
108 .execute(&self.pool.clone())
109 .await?;
110 Ok(())
111 }
112}