opentalk_database/
query_helper.rs

1// SPDX-FileCopyrightText: OpenTalk GmbH <mail@opentalk.eu>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5use diesel::{backend::Backend, query_builder::*, result::QueryResult, RunQueryDsl};
6
7/// Database drop statement
8///
9/// This `struct` is created by [`drop_database`] function
10#[derive(Debug, Clone)]
11pub struct DropDatabaseStatement {
12    db_name: String,
13    if_exists: bool,
14}
15
16impl DropDatabaseStatement {
17    pub fn new(db_name: &str) -> Self {
18        DropDatabaseStatement {
19            db_name: db_name.to_owned(),
20            if_exists: false,
21        }
22    }
23
24    pub fn if_exists(self) -> Self {
25        DropDatabaseStatement {
26            if_exists: true,
27            ..self
28        }
29    }
30}
31
32impl<DB: Backend> QueryFragment<DB> for DropDatabaseStatement {
33    fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
34        out.push_sql("DROP DATABASE ");
35        if self.if_exists {
36            out.push_sql("IF EXISTS ");
37        }
38        out.push_identifier(&self.db_name)?;
39        Ok(())
40    }
41}
42
43impl<Conn> RunQueryDsl<Conn> for DropDatabaseStatement {}
44
45impl QueryId for DropDatabaseStatement {
46    type QueryId = ();
47
48    const HAS_STATIC_QUERY_ID: bool = false;
49}
50
51/// Database create statement
52///
53/// This `struct` is created by [`create_database`] function
54#[derive(Debug, Clone)]
55pub struct CreateDatabaseStatement {
56    db_name: String,
57}
58
59impl CreateDatabaseStatement {
60    pub fn new(db_name: &str) -> Self {
61        CreateDatabaseStatement {
62            db_name: db_name.to_owned(),
63        }
64    }
65}
66
67impl<DB: Backend> QueryFragment<DB> for CreateDatabaseStatement {
68    fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, DB>) -> QueryResult<()> {
69        out.push_sql("CREATE DATABASE ");
70        out.push_identifier(&self.db_name)?;
71        Ok(())
72    }
73}
74
75impl<Conn> RunQueryDsl<Conn> for CreateDatabaseStatement {}
76
77impl QueryId for CreateDatabaseStatement {
78    type QueryId = ();
79
80    const HAS_STATIC_QUERY_ID: bool = false;
81}
82
83/// Takes a database name and creates a diesel drop database statement struct
84pub fn drop_database(db_name: &str) -> DropDatabaseStatement {
85    DropDatabaseStatement::new(db_name)
86}
87
88/// Takes a database name and creates a diesel create database statement struct
89pub fn create_database(db_name: &str) -> CreateDatabaseStatement {
90    CreateDatabaseStatement::new(db_name)
91}