(
executor: E,
query: &str,
bindings: Vec<Value<'_>>,
)
| 192 | } |
| 193 | |
| 194 | fn execute_query<'a, E>( |
| 195 | executor: E, |
| 196 | query: &str, |
| 197 | bindings: Vec<Value<'_>>, |
| 198 | ) -> Result<Vec<sqlx::postgres::PgRow>, VmError> |
| 199 | where |
| 200 | E: sqlx::Executor<'a, Database = sqlx::Postgres>, |
| 201 | { |
| 202 | Handle::current() |
| 203 | .block_on(async { |
| 204 | let mut query_builder = sqlx::query(query); |
| 205 | |
| 206 | // Bind parameters |
| 207 | for value in bindings { |
| 208 | match value { |
| 209 | Value::Number(n) => { |
| 210 | query_builder = query_builder.bind(n); |
| 211 | } |
| 212 | Value::String(s) => { |
| 213 | let s_str = s.to_str().unwrap(); |
| 214 | // Try to parse special types from string |
| 215 | if let Ok(uuid) = sqlx::types::Uuid::parse_str(s_str) { |
| 216 | query_builder = query_builder.bind(uuid); |
| 217 | } else if let Ok(date) = |
| 218 | sqlx::types::chrono::NaiveDate::parse_from_str(s_str, "%Y-%m-%d") |
| 219 | { |
| 220 | query_builder = query_builder.bind(date); |
| 221 | } else if let Ok(datetime) = |
| 222 | sqlx::types::chrono::NaiveDateTime::parse_from_str( |
| 223 | s_str, |
| 224 | "%Y-%m-%dT%H:%M:%S", |
| 225 | ) |
| 226 | { |
| 227 | query_builder = query_builder.bind(datetime); |
| 228 | } else { |
| 229 | query_builder = query_builder.bind(s_str); |
| 230 | } |
| 231 | } |
| 232 | Value::Boolean(b) => { |
| 233 | query_builder = query_builder.bind(b); |
| 234 | } |
| 235 | Value::Nil => { |
| 236 | query_builder = query_builder.bind(Option::<String>::None); |
| 237 | } |
| 238 | Value::List(arr) => { |
| 239 | let arr = &arr.borrow().data; |
| 240 | if let Some(first) = arr.first() { |
| 241 | match first { |
| 242 | Value::Number(_) => { |
| 243 | let nums: Vec<f64> = arr |
| 244 | .iter() |
| 245 | .filter_map(|v| match v { |
| 246 | Value::Number(n) => Some(*n), |
| 247 | _ => None, |
| 248 | }) |
| 249 | .collect(); |
| 250 | query_builder = query_builder.bind(nums); |
| 251 | } |
no test coverage detected