Skip to content

Commit 07cf607

Browse files
yahondaclaude
andcommitted
Extract PL/SQL boolean conversion helpers in ProcedureCall
The `value.nil? ? nil : (value ? 1 : 0)` and `value.nil? ? nil : value == 1` patterns and the `data_type: "NUMBER", data_precision: 1` metadata override were each repeated across `add_argument`, `record_assignment_sql_values_metadata`, `add_return_variable`, and `return_variable_value`. Collapse them into three private helpers and one frozen constant so the BOOLEAN-as-NUMBER(1) trick has a single point of change. No behavior change. `spec/plsql/procedure_spec.rb` is green (195 examples, 0 failures, 1 pre-existing pending). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 8802375 commit 07cf607

1 file changed

Lines changed: 22 additions & 8 deletions

File tree

lib/plsql/procedure_call.rb

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module PLSQL
22
class ProcedureCall # :nodoc:
3+
PLSQL_BOOLEAN_METADATA = { data_type: "NUMBER", data_precision: 1 }.freeze
4+
35
def initialize(procedure, args = [], options = {})
46
@procedure = procedure
57
@schema = @procedure.schema
@@ -237,8 +239,8 @@ def add_argument(argument, value, argument_metadata = nil)
237239
when "PL/SQL BOOLEAN"
238240
@declare_sql << "l_#{argument} BOOLEAN;\n"
239241
@assignment_sql << "l_#{argument} := (:#{argument} = 1);\n"
240-
@bind_values[argument] = value.nil? ? nil : (value ? 1 : 0)
241-
@bind_metadata[argument] = argument_metadata.merge(data_type: "NUMBER", data_precision: 1)
242+
@bind_values[argument] = ruby_value_to_plsql_boolean(value)
243+
@bind_metadata[argument] = plsql_boolean_metadata(argument_metadata)
242244
"l_#{argument}"
243245
when "UNDEFINED", "XMLTYPE", "OPAQUE/XMLTYPE"
244246
if argument_metadata[:type_name] == "XMLTYPE" || argument_metadata[:data_type] =~ /XMLTYPE/
@@ -352,8 +354,8 @@ def record_assignment_sql_values_metadata(argument, argument_metadata, record_va
352354
case metadata[:data_type]
353355
when "PL/SQL BOOLEAN"
354356
sql << "l_#{argument}.#{field} := (:#{bind_variable} = 1);\n"
355-
bind_values[bind_variable] = value.nil? ? nil : (value ? 1 : 0)
356-
bind_metadata[bind_variable] = metadata.merge(data_type: "NUMBER", data_precision: 1)
357+
bind_values[bind_variable] = ruby_value_to_plsql_boolean(value)
358+
bind_metadata[bind_variable] = plsql_boolean_metadata(metadata)
357359
else
358360
sql << "l_#{argument}.#{field} := :#{bind_variable};\n"
359361
bind_values[bind_variable] = value
@@ -384,7 +386,7 @@ def add_return_variable(argument, argument_metadata, is_return_value = false)
384386
case metadata[:data_type]
385387
when "PL/SQL BOOLEAN"
386388
@return_vars << bind_variable
387-
@return_vars_metadata[bind_variable] = metadata.merge(data_type: "NUMBER", data_precision: 1)
389+
@return_vars_metadata[bind_variable] = plsql_boolean_metadata(metadata)
388390
arg_field = "l_#{argument}.#{field}"
389391
@return_sql << ":#{bind_variable} := " << "CASE WHEN #{arg_field} = true THEN 1 " <<
390392
"WHEN #{arg_field} = false THEN 0 ELSE NULL END;\n"
@@ -411,7 +413,7 @@ def add_return_variable(argument, argument_metadata, is_return_value = false)
411413
# if output bind variable appears in several places
412414
bind_variable = :"o_#{argument}"
413415
@return_vars << bind_variable
414-
@return_vars_metadata[bind_variable] = argument_metadata.merge(data_type: "NUMBER", data_precision: 1)
416+
@return_vars_metadata[bind_variable] = plsql_boolean_metadata(argument_metadata)
415417
@return_sql << "IF l_#{argument} IS NULL THEN\no_#{argument} := NULL;\n" <<
416418
"ELSIF l_#{argument} THEN\no_#{argument} := 1;\nELSE\no_#{argument} := 0;\nEND IF;\n" <<
417419
":#{bind_variable} := o_#{argument};\n"
@@ -508,15 +510,15 @@ def return_variable_value(argument, argument_metadata)
508510
field_value = @cursor[":#{argument}_o#{metadata[:position]}"]
509511
case metadata[:data_type]
510512
when "PL/SQL BOOLEAN"
511-
return_value[field] = field_value.nil? ? nil : field_value == 1
513+
return_value[field] = plsql_boolean_to_ruby_value(field_value)
512514
else
513515
return_value[field] = field_value
514516
end
515517
end
516518
return_value
517519
when "PL/SQL BOOLEAN"
518520
numeric_value = @cursor[":o_#{argument}"]
519-
numeric_value.nil? ? nil : numeric_value == 1
521+
plsql_boolean_to_ruby_value(numeric_value)
520522
when "UNDEFINED", "XMLTYPE", "OPAQUE/XMLTYPE"
521523
if argument_metadata[:type_name] == "XMLTYPE" || argument_metadata[:data_type] =~ /XMLTYPE/
522524
@cursor[":o_#{argument}"]
@@ -622,5 +624,17 @@ def dbms_output_log
622624
end
623625
@dbms_output_stream.flush if @dbms_output_stream
624626
end
627+
628+
def ruby_value_to_plsql_boolean(value)
629+
value.nil? ? nil : (value ? 1 : 0)
630+
end
631+
632+
def plsql_boolean_to_ruby_value(numeric_value)
633+
numeric_value.nil? ? nil : numeric_value == 1
634+
end
635+
636+
def plsql_boolean_metadata(base_metadata)
637+
base_metadata.merge(PLSQL_BOOLEAN_METADATA)
638+
end
625639
end
626640
end

0 commit comments

Comments
 (0)