Module: PgSqlTriggers::DeferralChecksum

Defined in:
lib/pg_sql_triggers/deferral_checksum.rb

Overview

Normalizes deferrable / initially metadata for checksum calculation so Registry::Manager, TriggerRegistry#calculate_checksum, and PgSqlTriggers::Drift::Detector stay aligned with PostgreSQL’s pg_trigger flags.

Class Method Summary collapse

Class Method Details

.parts(constraint_trigger:, deferrable:, initially:) ⇒ Array<String>

Returns always three elements: constraint flag, deferrable mode, initially mode.

Returns:

  • (Array<String>)

    always three elements: constraint flag, deferrable mode, initially mode



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/pg_sql_triggers/deferral_checksum.rb', line 11

def parts(constraint_trigger:, deferrable:, initially:)
  constraint = ActiveModel::Type::Boolean.new.cast(constraint_trigger)
  return ["0", "", ""] unless constraint

  deferrable_sym =
    if deferrable.nil? || deferrable.to_s.strip.empty?
      nil
    else
      deferrable.to_sym
    end

  deferrable_key = deferrable_sym == :deferrable ? "deferrable" : "not_deferrable"

  initially_key = if deferrable_key == "deferrable"
                    case initially&.to_sym
                    when :deferred then "deferred"
                    else "immediate"
                    end
                  else
                    ""
                  end

  ["1", deferrable_key, initially_key]
end

.parts_from_db(db_trigger) ⇒ Array<String>

Returns three elements matching parts.

Parameters:

Returns:

  • (Array<String>)

    three elements matching parts



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/pg_sql_triggers/deferral_checksum.rb', line 38

def parts_from_db(db_trigger)
  constraint = db_trigger["tgconstraint"].to_i.nonzero?
  return ["0", "", ""] unless constraint

  deferrable = ActiveModel::Type::Boolean.new.cast(db_trigger["tgdeferrable"])
  deferrable_key = deferrable ? "deferrable" : "not_deferrable"

  initially_key = if deferrable
                    ActiveModel::Type::Boolean.new.cast(db_trigger["tginitdeferred"]) ? "deferred" : "immediate"
                  else
                    ""
                  end

  ["1", deferrable_key, initially_key]
end