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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
use widestring::{U16Str, U16String}; use crate::{ execute::execute_with_parameters, handles::StatementImpl, CursorImpl, Error, ParameterCollection, }; /// A preallocated SQL statement handle intended for sequential execution of different queries. See /// [`crate::Connection::preallocate`]. /// /// # Example /// /// ``` /// use odbc_api::{Connection, Error}; /// use std::io::{self, stdin, Read}; /// /// fn interactive(conn: &Connection) -> io::Result<()>{ /// let mut statement = conn.preallocate().unwrap(); /// let mut query = String::new(); /// stdin().read_line(&mut query)?; /// while !query.is_empty() { /// match statement.execute(&query, ()) { /// Err(e) => println!("{}", e), /// Ok(None) => println!("No results set generated."), /// Ok(Some(cursor)) => { /// // ...print cursor contents... /// }, /// } /// stdin().read_line(&mut query)?; /// } /// Ok(()) /// } /// ``` pub struct Preallocated<'open_connection> { statement: StatementImpl<'open_connection>, } impl<'o> Preallocated<'o> { pub(crate) fn new(statement: StatementImpl<'o>) -> Self { Self { statement } } /// Executes an sql statement using a wide string. See [`Self::execute`]. pub fn execute_utf16( &mut self, query: &U16Str, params: impl ParameterCollection, ) -> Result<Option<CursorImpl<'o, &mut StatementImpl<'o>>>, Error> { execute_with_parameters(move || Ok(&mut self.statement), Some(query), params) } /// Executes a statement. This is the fastest way to sequentially execute different SQL /// Statements. /// /// # Parameters /// /// * `query`: The text representation of the SQL statement. E.g. "SELECT * FROM my_table;". /// * `params`: `?` may be used as a placeholder in the statement text. You can use `()` to /// represent no parameters. Check the [`crate::parameter`] module level documentation for /// more information on how to pass parameters. /// /// # Return /// /// Returns `Some` if a cursor is created. If `None` is returned no cursor has been created ( /// e.g. the query came back empty). Note that an empty query may also create a cursor with zero /// rows. Since we want to reuse the statement handle a returned cursor will not take ownership /// of it and instead burrow it. /// /// # Example /// /// ``` /// use odbc_api::{Connection, Error}; /// use std::io::{self, stdin, Read}; /// /// fn interactive(conn: &Connection) -> io::Result<()>{ /// let mut statement = conn.preallocate().unwrap(); /// let mut query = String::new(); /// stdin().read_line(&mut query)?; /// while !query.is_empty() { /// match statement.execute(&query, ()) { /// Err(e) => println!("{}", e), /// Ok(None) => println!("No results set generated."), /// Ok(Some(cursor)) => { /// // ...print cursor contents... /// }, /// } /// stdin().read_line(&mut query)?; /// } /// Ok(()) /// } /// ``` pub fn execute( &mut self, query: &str, params: impl ParameterCollection, ) -> Result<Option<CursorImpl<'o, &mut StatementImpl<'o>>>, Error> { let query = U16String::from_str(query); self.execute_utf16(&query, params) } }