Module: CleverSequence::PostgresBackend

Defined in:
lib/demo_mode/clever_sequence/postgres_backend.rb

Defined Under Namespace

Modules: SequenceResult Classes: SequenceNotFoundError

Constant Summary collapse

SEQUENCE_PREFIX =
'cs_'

Class Method Summary collapse

Class Method Details

.nextval(klass, attribute, block) ⇒ Object



50
51
52
53
54
55
56
57
58
59
# File 'lib/demo_mode/clever_sequence/postgres_backend.rb', line 50

def nextval(klass, attribute, block)
  name = sequence_name(klass, attribute)
  log "[DemoMode] nextval called for #{klass.name}##{attribute} (sequence: #{name})"

  if sequence_exists?(name)
    nextval_from_sequence(name, klass, attribute, block)
  else
    nextval_without_sequence(name, klass, attribute, block)
  end
end

.reset!Object



29
30
31
# File 'lib/demo_mode/clever_sequence/postgres_backend.rb', line 29

def reset!
  Thread.current[:clever_sequence_cache] = {}
end

.sequence_cacheObject



70
71
72
# File 'lib/demo_mode/clever_sequence/postgres_backend.rb', line 70

def sequence_cache
  Thread.current[:clever_sequence_cache] ||= {}
end

.sequence_name(klass, attribute) ⇒ Object



61
62
63
64
65
66
67
68
# File 'lib/demo_mode/clever_sequence/postgres_backend.rb', line 61

def sequence_name(klass, attribute)
  table = klass.table_name.gsub(/[^a-z0-9_]/i, '_')
  attr = attribute.to_s.gsub(/[^a-z0-9_]/i, '_')
  # Handle PostgreSQL identifier limit:
  limit = (63 - SEQUENCE_PREFIX.length) / 2
  # Lowercase to avoid PostgreSQL case-sensitivity issues with unquoted identifiers
  "#{SEQUENCE_PREFIX}#{table[0, limit]}_#{attr[0, limit]}".downcase
end

.starting_value(klass, attribute, block) ⇒ Object



33
34
35
# File 'lib/demo_mode/clever_sequence/postgres_backend.rb', line 33

def starting_value(klass, attribute, block)
  calculate_sequence_value(klass, attribute, block)
end

.with_sequence_adjustment(last_values: {}) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/demo_mode/clever_sequence/postgres_backend.rb', line 37

def with_sequence_adjustment(last_values: {})
  previous = Thread.current[:clever_sequence_adjustment_enabled]
  previous_last_values = Thread.current[:clever_sequence_last_values]
  log "[DemoMode] Enabling sequence adjustment for retry"
  Thread.current[:clever_sequence_adjustment_enabled] = true
  Thread.current[:clever_sequence_last_values] = last_values
  yield
ensure
  Thread.current[:clever_sequence_adjustment_enabled] = previous
  Thread.current[:clever_sequence_last_values] = previous_last_values
  log "[DemoMode] Disabled sequence adjustment"
end