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())),
}
}