lib/syntropy/connection_pool.rb
# frozen_string_literal: true require 'extralite' module Syntropy class ConnectionPool attr_reader :count def initialize(machine, fn, max_conn) @machine = machine @fn = fn @count = 0 @max_conn = max_conn @queue = UM::Queue.new @key = :"db_#{fn}" end def with_db if (db = Thread.current[@key]) @machine.snooze return yield(db) end db = checkout begin Thread.current[@key] = db yield(db) ensure Thread.current[@key] = nil checkin(db) end end private def checkout if @queue.count == 0 && @count < @max_conn return create_db end @machine.shift(@queue) end def checkin(db) @machine.push(@queue, db) end def create_db db = Extralite::Database.new(@fn, wal: true) setup_db(db) @count += 1 db end def setup_db(db) # setup WAL, sync # setup concurrency stuff end end end