MCPcopy Create free account
hub / github.com/erans/pgsqlite / execute_with_params

Method execute_with_params

src/session/db_handler.rs:473–595  ·  view source on GitHub ↗

Execute with bound parameters

(
        &self,
        query: &str,
        params: &[Option<Vec<u8>>],
        session_id: &Uuid
    )

Source from the content-addressed store, hash-verified

471
472 /// Execute with bound parameters
473 pub async fn execute_with_params(
474 &self,
475 query: &str,
476 params: &[Option<Vec<u8>>],
477 session_id: &Uuid
478 ) -> Result<DbResponse, PgSqliteError> {
479 // Validate SQL security first
480 self.validate_sql_security(query)?;
481 debug!("execute_with_params called with query: {}", query);
482 debug!("execute_with_params params count: {}", params.len());
483 let result = self.connection_manager.execute_with_session(session_id, |conn| {
484 // Process query with fast path optimization
485 let processed_query = process_query(query, conn, &self.schema_cache)?;
486 debug!("Processed query: {}", processed_query);
487
488 let mut stmt = conn.prepare(&processed_query)?;
489
490 // Convert params to rusqlite values
491 // For now, be more aggressive about converting to text since most PostgreSQL
492 // parameters in text mode should be text-compatible
493 let values: Vec<rusqlite::types::Value> = params.iter()
494 .map(|p| match p {
495 Some(data) => {
496 match String::from_utf8(data.clone()) {
497 Ok(s) => {
498 // Parameter converted to text
499 rusqlite::types::Value::Text(s)
500 },
501 Err(_e) => {
502 // For psycopg3 in text mode, all parameters should be UTF-8 text
503 // If UTF-8 conversion fails, try to recover by using lossy conversion
504 // UTF-8 conversion failed, trying lossy
505 let lossy_string = String::from_utf8_lossy(data);
506 if !lossy_string.is_empty() {
507 // Lossy conversion successful
508 rusqlite::types::Value::Text(lossy_string.into_owned())
509 } else {
510 // Storing as blob
511 rusqlite::types::Value::Blob(data.clone())
512 }
513 },
514 }
515 }
516 None => {
517 // Null parameter
518 rusqlite::types::Value::Null
519 },
520 })
521 .collect();
522
523 let query_type = QueryTypeDetector::detect_query_type(query);
524
525 let result = match query_type {
526 QueryType::Select => {
527 let column_count = stmt.column_count();
528 let mut columns = Vec::with_capacity(column_count);
529 for i in 0..column_count {
530 columns.push(sanitize_column_name(stmt.column_name(i)?).to_string());

Calls 9

sanitize_column_nameFunction · 0.85
validate_sql_securityMethod · 0.80
process_queryFunction · 0.50
execute_with_sessionMethod · 0.45
cloneMethod · 0.45
is_emptyMethod · 0.45
getMethod · 0.45
executeMethod · 0.45

Tested by 2