aboutsummaryrefslogblamecommitdiffstats
path: root/lib/arel/sessions/session.rb
blob: 8b72fd1fe69d69193dc580b01355f659f0867a0a (plain) (tree)
1
2
3
4
5
6
7
8

                   
           
                   
                 


                                     





                           

                                                         

                 
                                                            





                            
               
                        
                                             


                      
                                             
                                                              
                    


                        
                                             


                        
                                             


                

     
require 'singleton'

module Arel
  class Session    
    class << self
      attr_accessor :instance
      alias_method :manufacture, :new
      
      def start
        if @started
          yield
        else
          begin
            @started = true
            @instance = manufacture
            metaclass.send :alias_method, :new, :instance
            yield
          ensure
            metaclass.send :alias_method, :new, :manufacture
            @started = false
          end
        end
      end
    end
    
    module CRUD
      def create(insert)
        insert.call(insert.engine.connection)
      end
      
      def read(select)
        (@read ||= Hash.new do |hash, select|
          hash[select] = select.call(select.engine.connection)
        end)[select]
      end
      
      def update(update)
        update.call(update.engine.connection)
      end
      
      def delete(delete)
        delete.call(delete.engine.connection)
      end
    end
    include CRUD
  end
end