Gérer l'upload de fichiers dans Postgres avec Sequel et Refile

Lors d’un récent projet, l’un des impératifs était de stocker les fichiers en base de données. Pas d’accès à S3 ou un autre type de stockage, tout en base de données.

Heureusement pour nous, Postgres propose la gestion des Large Objects.

Pour ce projet nous utilisions Sequel pour accéder à la base de données et Refile pour la gestion des uploads.

Il nous restait donc à brancher tout ce petit monde pour que ce système de stockage fonctionne.

La gem refile-postgres nous facilite la tâche car elle fournit un backend pour Refile qui fait exactement ce dont on a besoin.

Seul hic, le générateur d’initializer ne propose qu’une version pour ActiveRecord qui est la suivante :

require 'refile'

Refile.configure do |config|
  connection = lambda do |&blk|
    ActiveRecord::Base.connection_pool.with_connection do |con|
      blk.call(con.raw_connection)
    end
  end
  config.store = Refile::Postgres::Backend.new(connection)
end

On peut voir ici que le backend est initialisé en lui passant une lambda qui, lorsqu’elle est appelée, va prendre une connexion à la base de données dans le pool ActiveRecord.

La question est donc de savoir comment faire la même chose avec Sequel ?

Après un peu de recherche, la solution est assez proche :

Refile.configure do |config|
  connection = lambda do |&block|
    Sequel::Model.db.pool.hold do |raw_connection|
      block.call(raw_connection)
    end
  end

  config.cache = Refile::Postgres::Backend.new(connection)
  config.store = Refile::Postgres::Backend.new(connection)
end

La partie importante à retenir ici est le Sequel::Model.db.pool.hold qui nous fournit directement la connexion donc nous avons besoin.

Nous pouvons maintenant stocker nos fichiers dans Postgres sans problème !

Publié le 05 février 2016

Notre vision des choses vous correspond ? Vous avez envie de travailler avec nous ?