class Syntropy::ConnectionPool

def checkin(db)

def checkin(db)
  @machine.push(@queue, db)
end

def checkout

def checkout
  if @queue.count == 0 && @count < @max_conn
    return create_db
  end
  @machine.shift(@queue)
end

def create_db

def create_db
  db = Extralite::Database.new(@fn, wal: true)
  setup_db(db)
  @count += 1
  db
end

def initialize(machine, fn, max_conn)

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 setup_db(db)

def setup_db(db)
  # setup WAL, sync
  # setup concurrency stuff
end

def with_db

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