ostring_sqlx/
tab_userconf.rs

1use 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}