Add prepared_statements_cache in connection to opt-out

This commit is contained in:
Brian J. Cardiff 2023-11-02 22:20:25 -03:00
parent 9b52a65752
commit 7288baa3dd
2 changed files with 28 additions and 3 deletions

View file

@ -34,6 +34,24 @@ describe DB::Statement do
end end
end end
describe "prepared_statements_cache flag" do
it "should reuse prepared statements if true" do
with_dummy_connection("prepared_statements=true&prepared_statements_cache=true") do |cnn|
stmt1 = cnn.query("the query").statement
stmt2 = cnn.query("the query").statement
stmt1.object_id.should eq(stmt2.object_id)
end
end
it "should not reuse prepared statements if false" do
with_dummy_connection("prepared_statements=true&prepared_statements_cache=false") do |cnn|
stmt1 = cnn.query("the query").statement
stmt2 = cnn.query("the query").statement
stmt1.object_id.should_not eq(stmt2.object_id)
end
end
end
it "should initialize positional params in query" do it "should initialize positional params in query" do
with_dummy_connection do |cnn| with_dummy_connection do |cnn|
stmt = cnn.prepared("the query").as(DummyDriver::DummyStatement) stmt = cnn.prepared("the query").as(DummyDriver::DummyStatement)

View file

@ -25,10 +25,13 @@ module DB
record Options, record Options,
# Return whether the statements should be prepared by default # Return whether the statements should be prepared by default
prepared_statements : Bool = true do prepared_statements : Bool = true,
# Return whether the prepared statements should be cached or not
prepared_statements_cache : Bool = true do
def self.from_http_params(params : HTTP::Params, default = Options.new) def self.from_http_params(params : HTTP::Params, default = Options.new)
Options.new( Options.new(
prepared_statements: DB.fetch_bool(params, "prepared_statements", default.prepared_statements) prepared_statements: DB.fetch_bool(params, "prepared_statements", default.prepared_statements),
prepared_statements_cache: DB.fetch_bool(params, "prepared_statements_cache", default.prepared_statements)
) )
end end
end end
@ -49,7 +52,11 @@ module DB
# :nodoc: # :nodoc:
def fetch_or_build_prepared_statement(query) : Statement def fetch_or_build_prepared_statement(query) : Statement
@statements_cache.fetch(query) { build_prepared_statement(query) } if @options.prepared_statements_cache
@statements_cache.fetch(query) { build_prepared_statement(query) }
else
build_prepared_statement(query)
end
end end
# :nodoc: # :nodoc: