From 4fd4a8c7bcc407f36352207f3cef3f4cc7a647e0 Mon Sep 17 00:00:00 2001 From: johnnyshields <27655+johnnyshields@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:12:34 +0700 Subject: [PATCH] Add session escape functionality --- lib/mongo/client.rb | 2 +- lib/mongo/session.rb | 1 + lib/mongo/session/session_escapable.rb | 26 ++++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 lib/mongo/session/session_escapable.rb diff --git a/lib/mongo/client.rb b/lib/mongo/client.rb index 70f5768628..ff14b1ab96 100644 --- a/lib/mongo/client.rb +++ b/lib/mongo/client.rb @@ -1317,7 +1317,7 @@ def do_close # # @api private def get_session!(options = {}) - if options[:session] + if options[:session] && !Session.escaped? return options[:session].validate!(self) end diff --git a/lib/mongo/session.rb b/lib/mongo/session.rb index be9c1f2a42..c3a975fc20 100644 --- a/lib/mongo/session.rb +++ b/lib/mongo/session.rb @@ -17,6 +17,7 @@ require 'mongo/session/session_pool' require 'mongo/session/server_session' +require 'mongo/session/session_escapable' module Mongo diff --git a/lib/mongo/session/session_escapable.rb b/lib/mongo/session/session_escapable.rb new file mode 100644 index 0000000000..c42a6a815f --- /dev/null +++ b/lib/mongo/session/session_escapable.rb @@ -0,0 +1,26 @@ + +module Mongo + + class Session + + class << self + def escape + old_escaped = self.escaped? + self.escaped = true + yield + ensure + self.escaped = old_escaped + end + + def escaped? + !!Thread.current["[mongo]:session:escaped"] + end + + private + + def escaped=(value) + Thread.current["[mongo]:session:escaped"] = !!value + end + end + end +end