1use crate::error::Result;
4use crate::traits::{ExecuteResult, FromRow, Pool, ToValue};
5use crate::value::Value;
6
7#[derive(Debug, Clone)]
22pub struct Query<'q> {
23 sql: &'q str,
24 params: Vec<Value>,
25}
26
27impl<'q> Query<'q> {
28 pub fn new(sql: &'q str) -> Self {
30 Self {
31 sql,
32 params: Vec::new(),
33 }
34 }
35
36 pub fn bind<T: ToValue>(mut self, value: T) -> Self {
40 self.params.push(value.to_value());
41 self
42 }
43
44 pub fn bind_all<T: ToValue>(mut self, values: &[T]) -> Self {
48 for value in values {
49 self.params.push(value.to_value());
50 }
51 self
52 }
53
54 pub fn sql(&self) -> &str {
56 self.sql
57 }
58
59 pub fn params(&self) -> &[Value] {
61 &self.params
62 }
63
64 pub fn into_params(self) -> Vec<Value> {
66 self.params
67 }
68
69 pub async fn execute<P: Pool>(self, pool: &P) -> Result<ExecuteResult> {
71 pool.execute(self.sql, self.params).await
72 }
73
74 pub async fn fetch_all<T: FromRow + Send, P: Pool>(self, pool: &P) -> Result<Vec<T>> {
76 pool.fetch_all(self.sql, self.params).await
77 }
78
79 pub async fn fetch_optional<T: FromRow + Send, P: Pool>(self, pool: &P) -> Result<Option<T>> {
81 pool.fetch_optional(self.sql, self.params).await
82 }
83
84 pub async fn fetch_one<T: FromRow + Send, P: Pool>(self, pool: &P) -> Result<T> {
86 pool.fetch_one(self.sql, self.params).await
87 }
88
89 pub async fn fetch_scalar<T: crate::FromValue + Send, P: Pool>(self, pool: &P) -> Result<T> {
91 pool.fetch_scalar(self.sql, self.params).await
92 }
93}
94
95#[derive(Debug, Clone)]
99pub struct DynamicQuery {
100 sql: String,
101 params: Vec<Value>,
102}
103
104impl DynamicQuery {
105 pub fn new(sql: impl Into<String>) -> Self {
107 Self {
108 sql: sql.into(),
109 params: Vec::new(),
110 }
111 }
112
113 pub fn bind<T: ToValue>(mut self, value: T) -> Self {
115 self.params.push(value.to_value());
116 self
117 }
118
119 pub fn bind_all<T: ToValue>(mut self, values: &[T]) -> Self {
121 for value in values {
122 self.params.push(value.to_value());
123 }
124 self
125 }
126
127 pub fn sql(&self) -> &str {
129 &self.sql
130 }
131
132 pub fn params(&self) -> &[Value] {
134 &self.params
135 }
136
137 pub async fn execute<P: Pool>(self, pool: &P) -> Result<ExecuteResult> {
139 pool.execute(&self.sql, self.params).await
140 }
141
142 pub async fn fetch_all<T: FromRow + Send, P: Pool>(self, pool: &P) -> Result<Vec<T>> {
144 pool.fetch_all(&self.sql, self.params).await
145 }
146
147 pub async fn fetch_optional<T: FromRow + Send, P: Pool>(self, pool: &P) -> Result<Option<T>> {
149 pool.fetch_optional(&self.sql, self.params).await
150 }
151
152 pub async fn fetch_one<T: FromRow + Send, P: Pool>(self, pool: &P) -> Result<T> {
154 pool.fetch_one(&self.sql, self.params).await
155 }
156
157 pub async fn fetch_scalar<T: crate::FromValue + Send, P: Pool>(self, pool: &P) -> Result<T> {
159 pool.fetch_scalar(&self.sql, self.params).await
160 }
161}