diff --git a/lib/en57/pg_repository.rb b/lib/en57/pg_repository.rb index 03b963a..83ec37f 100644 --- a/lib/en57/pg_repository.rb +++ b/lib/en57/pg_repository.rb @@ -33,10 +33,13 @@ module En57 ] = fail_if_events_match unless fail_if_events_match.empty? append_condition[:after] = after unless after.nil? - in_serializable_transaction do - @connection.exec_params( + with_serializable_transaction do |connection| + connection.exec_params( "SELECT append_events($1::event_with_tags[], $2::jsonb)", - [@array_encoder.encode(event_records), JSON.generate(append_condition)], + [ + @array_encoder.encode(event_records), + JSON.generate(append_condition), + ], ) end rescue PG::Error => e @@ -51,12 +54,12 @@ module En57 def read(query) criteria = query.encoded_criteria.map { |item| JSON.generate(item) } - @connection - .exec_params( + with_connection do |connection| + connection.exec_params( "SELECT id, type, data, meta, tags FROM read_events($1::jsonb[])", [@array_encoder.encode(criteria)], ) - .map do |row| + end.map do |row| Event.new( id: row.fetch("id"), type: row.fetch("type"), @@ -68,13 +71,19 @@ module En57 private - def in_serializable_transaction - @connection.exec("BEGIN ISOLATION LEVEL SERIALIZABLE") - yield - @connection.exec("COMMIT") - rescue StandardError - @connection.exec("ROLLBACK") - raise + def with_serializable_transaction + with_connection do |connection| + connection.exec("BEGIN ISOLATION LEVEL SERIALIZABLE") + yield connection + connection.exec("COMMIT") + rescue StandardError + connection.exec("ROLLBACK") + raise + end + end + + def with_connection + yield @connection end end end