Skip to content

Commit 14e76d6

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 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 14e76d6

1 file changed

Lines changed: 20 additions & 8 deletions

File tree

lib/plsql/procedure_call.rb

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,8 @@ def add_argument(argument, value, argument_metadata = nil)
237237
when "PL/SQL BOOLEAN"
238238
@declare_sql << "l_#{argument} BOOLEAN;\n"
239239
@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)
240+
@bind_values[argument] = ruby_value_to_plsql_boolean(value)
241+
@bind_metadata[argument] = plsql_boolean_metadata(argument_metadata)
242242
"l_#{argument}"
243243
when "UNDEFINED", "XMLTYPE", "OPAQUE/XMLTYPE"
244244
if argument_metadata[:type_name] == "XMLTYPE" || argument_metadata[:data_type] =~ /XMLTYPE/
@@ -352,8 +352,8 @@ def record_assignment_sql_values_metadata(argument, argument_metadata, record_va
352352
case metadata[:data_type]
353353
when "PL/SQL BOOLEAN"
354354
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)
355+
bind_values[bind_variable] = ruby_value_to_plsql_boolean(value)
356+
bind_metadata[bind_variable] = plsql_boolean_metadata(metadata)
357357
else
358358
sql << "l_#{argument}.#{field} := :#{bind_variable};\n"
359359
bind_values[bind_variable] = value
@@ -384,7 +384,7 @@ def add_return_variable(argument, argument_metadata, is_return_value = false)
384384
case metadata[:data_type]
385385
when "PL/SQL BOOLEAN"
386386
@return_vars << bind_variable
387-
@return_vars_metadata[bind_variable] = metadata.merge(data_type: "NUMBER", data_precision: 1)
387+
@return_vars_metadata[bind_variable] = plsql_boolean_metadata(metadata)
388388
arg_field = "l_#{argument}.#{field}"
389389
@return_sql << ":#{bind_variable} := " << "CASE WHEN #{arg_field} = true THEN 1 " <<
390390
"WHEN #{arg_field} = false THEN 0 ELSE NULL END;\n"
@@ -411,7 +411,7 @@ def add_return_variable(argument, argument_metadata, is_return_value = false)
411411
# if output bind variable appears in several places
412412
bind_variable = :"o_#{argument}"
413413
@return_vars << bind_variable
414-
@return_vars_metadata[bind_variable] = argument_metadata.merge(data_type: "NUMBER", data_precision: 1)
414+
@return_vars_metadata[bind_variable] = plsql_boolean_metadata(argument_metadata)
415415
@return_sql << "IF l_#{argument} IS NULL THEN\no_#{argument} := NULL;\n" <<
416416
"ELSIF l_#{argument} THEN\no_#{argument} := 1;\nELSE\no_#{argument} := 0;\nEND IF;\n" <<
417417
":#{bind_variable} := o_#{argument};\n"
@@ -508,15 +508,15 @@ def return_variable_value(argument, argument_metadata)
508508
field_value = @cursor[":#{argument}_o#{metadata[:position]}"]
509509
case metadata[:data_type]
510510
when "PL/SQL BOOLEAN"
511-
return_value[field] = field_value.nil? ? nil : field_value == 1
511+
return_value[field] = plsql_boolean_to_ruby_value(field_value)
512512
else
513513
return_value[field] = field_value
514514
end
515515
end
516516
return_value
517517
when "PL/SQL BOOLEAN"
518518
numeric_value = @cursor[":o_#{argument}"]
519-
numeric_value.nil? ? nil : numeric_value == 1
519+
plsql_boolean_to_ruby_value(numeric_value)
520520
when "UNDEFINED", "XMLTYPE", "OPAQUE/XMLTYPE"
521521
if argument_metadata[:type_name] == "XMLTYPE" || argument_metadata[:data_type] =~ /XMLTYPE/
522522
@cursor[":o_#{argument}"]
@@ -622,5 +622,17 @@ def dbms_output_log
622622
end
623623
@dbms_output_stream.flush if @dbms_output_stream
624624
end
625+
626+
def ruby_value_to_plsql_boolean(value)
627+
value.nil? ? nil : (value ? 1 : 0)
628+
end
629+
630+
def plsql_boolean_to_ruby_value(numeric_value)
631+
numeric_value.nil? ? nil : numeric_value == 1
632+
end
633+
634+
def plsql_boolean_metadata(base_metadata)
635+
base_metadata.merge(data_type: "NUMBER", data_precision: 1)
636+
end
625637
end
626638
end

0 commit comments

Comments
 (0)