1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
use super::session::OSession; use crate::common::protocol::messages::request::Query; use crate::common::types::value::{IntoOValue, OValue}; use crate::types::resultset::ResultSet; use crate::OrientResult; use std::collections::HashMap; pub struct Statement<'a> { session: &'a OSession, stm: String, params: HashMap<String, OValue>, language: String, page_size: i32, mode: i8, named: bool, } impl<'a> Statement<'a> { pub(crate) fn new(session: &'a OSession, stm: String) -> Statement<'a> { Statement { session, stm, params: HashMap::new(), named: true, mode: 1, language: String::from("sql"), page_size: 150, } } pub(crate) fn mode(mut self, mode: i8) -> Self { self.mode = mode; self } pub(crate) fn language(mut self, language: String) -> Self { self.language = language; self } pub fn positional(mut self, params: &[&IntoOValue]) -> Self { let mut p = HashMap::new(); for (i, elem) in params.iter().enumerate() { p.insert(i.to_string(), elem.into_ovalue()); } self.params = p; self.named = false; self } pub fn named(mut self, params: &[(&str, &IntoOValue)]) -> Self { self.params = params .iter() .map(|&(k, ref v)| (String::from(k), v.into_ovalue())) .collect(); self.named = true; self } pub fn page_size(mut self, page_size: i32) -> Self { self.page_size = page_size; self } pub fn run(self) -> OrientResult<impl ResultSet> { self.session.run(self.into()) } } impl<'a> From<Statement<'a>> for Query { fn from(x: Statement) -> Query { Query { session_id: x.session.session_id, token: x.session.token.clone(), query: x.stm, language: x.language, named: x.named, parameters: x.params, page_size: x.page_size, mode: x.mode, } } }