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



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

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



27
28
29
# File 'lib/demo_mode/clever_sequence/postgres_backend.rb', line 27

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

.sequence_cacheObject



68
69
70
# File 'lib/demo_mode/clever_sequence/postgres_backend.rb', line 68

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

.sequence_name(klass, attribute) ⇒ Object



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

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



31
32
33
# File 'lib/demo_mode/clever_sequence/postgres_backend.rb', line 31

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

.with_sequence_adjustment(last_values: {}) ⇒ Object



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

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