iridium_core 0.1.12

SQL Server-compatible Rust engine core for Iridium SQL
Documentation
use std::collections::{HashMap, HashSet};
use std::sync::Arc;

use parking_lot::Mutex;

use super::context::{ExecutionContext, FrameState, RowContext, SessionMetadata, SessionStateRefs, Variables};
use super::cte::CteStorage;

pub(crate) fn from_session<'a, C, S>(
    session: &'a mut super::session::SessionRuntime<C, S>,
    session_id: super::locks::SessionId,
    dirty_buffer: Option<Arc<Mutex<super::dirty_buffer::DirtyBuffer>>>,
) -> ExecutionContext<'a> {
    ExecutionContext {
        session: SessionStateRefs {
            variables: &mut session.variables,
            last_identity: &mut session.identities.last_identity,
            identity_stack: &mut session.identities.scope_stack,
            temp_map: &mut session.tables.temp_map,
            var_map: &mut session.tables.var_map,
            var_counter: &mut session.tables.var_counter,
            random_state: &mut session.random_state,
            cursors: &mut session.cursors.map,
            fetch_status: &mut session.cursors.fetch_status,
            next_cursor_handle: &mut session.cursors.next_cursor_handle,
            handle_map: &mut session.cursors.handle_map,
            print_output: &mut session.diagnostics.print_output,
            bulk_load: &mut session.bulk_load,
            context_info: &mut session.context_info,
            session_context: &mut session.session_context,
            dirty_buffer,
            identity_insert: HashSet::new(),
        },
        metadata: SessionMetadata {
            id: session_id,
            database: Some(session.current_database.clone()),
            original_database: session.original_database.clone(),
            user: session.user.clone(),
            app_name: session.app_name.clone(),
            host_name: session.host_name.clone(),
            ansi_nulls: session.options.ansi_nulls,
            datefirst: session.options.datefirst,
        },
        options: session.options.clone(),
        frame: FrameState {
            depth: 0,
            loop_depth: 0,
            trancount: 0,
            xact_state: 0,
            trigger_depth: 0,
            module_stack: vec![],
            scope_vars: vec![vec![]],
            table_vars: vec![HashMap::new()],
            readonly_table_vars: vec![HashSet::new()],
            skip_instead_of: false,
            last_error: None,
        },
        row: RowContext {
            outer_stack: vec![],
            apply_stack: vec![],
            current_group: None,
            window_context: None,
            ctes: CteStorage::new(),
        },
        subquery_cache: Arc::new(Mutex::new(HashMap::new())),
    }
}

#[allow(clippy::too_many_arguments)]
pub(crate) fn legacy_new<'a>(
    variables: &'a mut Variables,
    bulk_load: &'a mut super::session::BulkLoadState,
    session_last_identity: &'a mut Option<i64>,
    scope_identity_stack: &'a mut Vec<Option<i64>>,
    temp_table_map: &'a mut HashMap<String, String>,
    session_table_var_map: &'a mut HashMap<String, String>,
    table_var_counter: &'a mut u64,
    ansi_nulls: bool,
    datefirst: i32,
    random_state: &'a mut u64,
    cursors: &'a mut HashMap<String, super::model::Cursor>,
    fetch_status: &'a mut i32,
    next_cursor_handle: &'a mut i32,
    handle_map: &'a mut HashMap<i32, String>,
    print_output: &'a mut Vec<String>,
    context_info: &'a mut Vec<u8>,
    session_context: &'a mut HashMap<String, (crate::types::Value, bool)>,
    dirty_buffer: Option<Arc<Mutex<super::dirty_buffer::DirtyBuffer>>>,
    session_id: super::locks::SessionId,
    session_current_database: String,
    session_original_database: String,
    user: Option<String>,
    app_name: Option<String>,
    host_name: Option<String>,
) -> ExecutionContext<'a> {
    ExecutionContext {
        session: SessionStateRefs {
            variables,
            last_identity: session_last_identity,
            identity_stack: scope_identity_stack,
            temp_map: temp_table_map,
            var_map: session_table_var_map,
            var_counter: table_var_counter,
            random_state,
            cursors,
            fetch_status,
            next_cursor_handle,
            handle_map,
            print_output,
            bulk_load,
            context_info,
            session_context,
            dirty_buffer,
            identity_insert: HashSet::new(),
        },
        metadata: SessionMetadata {
            id: session_id,
            database: Some(session_current_database),
            original_database: session_original_database,
            user,
            app_name,
            host_name,
            ansi_nulls,
            datefirst,
        },
        options: super::tooling::SessionOptions::default(),
        frame: FrameState {
            depth: 0,
            loop_depth: 0,
            trancount: 0,
            xact_state: 0,
            trigger_depth: 0,
            module_stack: vec![],
            scope_vars: vec![vec![]],
            table_vars: vec![HashMap::new()],
            readonly_table_vars: vec![HashSet::new()],
            skip_instead_of: false,
            last_error: None,
        },
        row: RowContext {
            outer_stack: vec![],
            apply_stack: vec![],
            current_group: None,
            window_context: None,
            ctes: CteStorage::new(),
        },
        subquery_cache: Arc::new(Mutex::new(HashMap::new())),
    }
}