Como migrar suas Stored Procedures no ambiente de teste

11/06/07

Normalmente, evito utilizar Stored Procedures e Functions até onde posso, mas no Spesa, não foi possível, devido uma quantidade de consultas "avançadas" que são feitas. Se não as utilizasse, a repetição de código seria absurdamente grande e, por conseguinte, seria impossível de se fazer eventuais modificações. Como estou refatorando o código do Spesa e escrevendo testes para cada item do sistema, caí em um problema um pouco incômodo na hora da migração.

Não sei se você sabe, mas toda vez que você quer sincronizar o seu banco de testes com o de desenvolvimento, basta executar o comando rake db:test:prepare. O grande problema deste comando é que ele não leva em consideração os arquivos de migração, mas sim o arquivo schema.rb, que não adiciona queries executadas através do método execute. Para corrigir isto, basta executar o comando rake db:migrate RAILS_ENV="test".

Update: depois de fazer alguns testes, vi que as stored procedures continuavam a serem excluídas. O único jeito foi estender o ActiveRecord para ele fazer o dump das funções e salvá-las no arquivo schema.rb. Basta adicionar o código abaixo no arquivo environment.rb.

module ActiveRecord
  class SchemaDumper
    def dump(stream)
      header(stream)
      tables(stream)
      functions(stream)
      trailer(stream)
      stream
    end
 
    private
      def functions(stream)
        result = @connection.execute <<QUERY
        SELECT
          ROUTINE_NAME AS name
        FROM 
          INFORMATION_SCHEMA.ROUTINES 
        WHERE 
          ROUTINE_TYPE='FUNCTION' AND 
          ROUTINE_SCHEMA='#{@connection.current_database}'
QUERY
        result.each do |row|
          stream = function(row[0], stream)
        end
      end
 
      def function(name, stream)
        result = @connection.execute "SHOW CREATE FUNCTION #{name}"
        fields = result.fetch_hash
        func = fields['Create Function'].gsub(/CREATE DEFINER.*? FUNCTION/, "CREATE FUNCTION")
 
        stream.puts <<FUNCTION
execute <<QUERY
  #{func}
QUERY
 
FUNCTION
        stream
      end
  end
end

Podcast gravado pelo Eduardo Fiorezi

19/03/07

Ontem de noite bati um papo com o Eduardo Fiorezi, num podcast de 20 minutos.

Falamos sobre adsense, Spesa, Ruby/Rails e tableless/webstandards. Você pode baixar o MP3 aqui.

Balanço do Spesa no mês de fevereiro

03/03/07

O Spesa, lançado no início de fevereiro, foi além das minhas expectativas. Confira alguns números:

  • 861 contas criadas
  • 11208 visitas
  • 2749 acessos únicos
  • 4531 lançamentos
  • 904 agendamentos
  • 116 e-mails recebidos
  • 934.14 MB em tranferência de arquivos

Obrigado à todos que coloboraram com sugestões, críticas, links em blogs e palavras no GTalk.

No mês de março pretendo implementar algumas funcionalidades interessantes. Por isso fiquem ligados!