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

Gerenciador MySQL para Linux

26/03/07

Quem usa/usou Windows e tinha que mexer com banco de dados MySQL provavelmente usou o MySQL-Front, descontinuado por pressão da própria MySQL. Hoje, uma alternativa é o SQLyog.

A verdade é que sempre quis um programa assim para Linux. Aquele gerenciador — MySQL Administrator — criado pela MySQL é horrível. Tudo muito complicado de fazer. E não é que procurando por algum outro gerenciador, encontrei o Emma?

Atalhos semelhantes ao falecido MySQL-Front, interface simples de usar, ou seja, exatamente do jeito que eu queria! No Ubuntu, basta rodar o comando abaixo para instalá-lo:

$~ sudo aptitude install emma

Não sei te dizer em qual repositório este pacote está localizado, então, se você não encontrá-lo lembre-se de habilitar os repositórios universe e multiverse.

Migrando de ISO-8859-1 para UTF-8 no Rails

13/03/07

O Spesa foi criado usando a codificação ISO-8859-1, principalmente pelo fato de achar que o Ruby fazia UTF-8 "nas coxas". Como houve uma preocupação muito maior com o lançamento do Rails 1.2, através do mixin "Chars" — embora seja feito no framework e não na linguagem — e estou migrando meu projeto para esta nova versão, resolvi mudar a codificação de ISO para UTF-8.

Migrar o banco de dados foi bem simples, já que o PHPMyAdmin, quando exporta as informações, automaticamente converte para UTF-8. A única coisa que é preciso fazer, é importar os dados também pelo PHPMyAdmin (não consegui fazer direto pelo shell do MySQL).

Outra coisa que você tem que fazer é converter todos os arquivos — classes, templates e controllers — para UTF-8. Mas cuidado: não salve com o BOM. Se você salvar, o Ruby acusará erros de compilação.

Não se esqueça de atualizar seu código caso use funções que manuseiam strings. Veja um exemplo abaixo:

#retornará 15
puts 'João Silvério'.length
 
#retornará 13
puts 'João Silvério'.chars.length

Daqui para frente, vamos fazer nossos aplicativos com UTF-8. Capisce?