quinta-feira, 28 de outubro de 2010

SQL MERGE no MySQL

Hoje finalmente me deparei com uma feature cuja solução direta era fazer um MERGE no MySQL.

Para minha surpresa o MySQL não suporte MERGE [1].

Como assim ? Este comando existe desde 2008 no padrão SQL:2008 e ainda não foi implementado.
Enfim, é o custo de não pagar por uma licença.

Pesquisando um pouco descobri outro comando para fazer o trabalho do MERGE.
O ponto negativo é que terei que usar um comando específico do MySQL.

Depois se quiser trocar de banco de dados terei que reescrever todas as queries.
Foda né ? Posteriormente qual o custo disso ?
Não compensa pagar logo a licença de um BD decente ?
Pode ser que o custo de adaptação posterior em termos de desenvolvimento, testes, homologação seja muito mais caro que pagar a licença do Oracle ou DB2.

Enfim, uma coisa para se pensar...

Mas voltando a solução do problema.
A primeira solução com que me deparei foi o REPLACE [3].
Mas lendo a documentação me deparei com a seguinte frase.

REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for aPRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.

Porque diabos ele faz um DELETE e depois um INSERT ao invés de fazer um simples UPDATE ?
Alguém pode me explicar isso ?

Isso inviabilizou o uso do REPLACE devido a restrições de chaves estrangeiras que todos conhecem. Não poderia apagar e escrever linhas referenciadas por outras tabelas.

Pesquisando com mais cuidado achei o salvado da pátria que é o

INSERT ... ON DUPLICATE KEY UPDATE [4]

Pois bem, ele resolve exatamente o que queria fazer com o MERGE.
O único problema é que isso é uma extensão do MySQL deixando a query fora do padrão.

Para referência segue um query com o KEY UPDATE

INSERT INTO USERS ( id, name, location)
VALUES
( 1, 'leonardo', 'mantena')
ON DUPLICATE KEY UPDATE
name = VALUES (name),
location = VALUES (location)


sexta-feira, 22 de outubro de 2010

Fazendo Post Get de um JSON com o curl



curl -d @create_user.json -H"Content-Type: application/json" -H"Aplication/json" http://teste.com:8080/rest/teste

Onde create_user.json é o arquivo local com o conteúdo JSON

Para fazer um GET faça:

curl -v -X GET -H"Accept: application/json" http://teste:9080/rest/teste

Sem mais...

segunda-feira, 18 de outubro de 2010

Como converter uma chave privada Linux PEM para o Putty PPK

Usuários Linux acostumados com o uso de certificados no formato PEM vão ter problemas ao utilizar o Putty no Windows.

Este guia vai ensinar como fazer a conversão para o formato apropriado do Putty.
Sei que a maioria não usa chaves privadas, mas quem usar o Amazon EC2 será obrigado a lidar com isso.

Todas as chaves privadas de acesso as máquinas virtuais do Amazon EC2 estão no formato PEM.
Para acessar do Windows usando o Putty por exemplo, estas devem ser convertidas para PPK.

Segue os passos:

1. Fazer o download do utilitário PuttyGen

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Link Direto: http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe

2. Executar o PuttyGen, clicar no menu em Conversions e depois Import Key.




2. Localizar o arquivo PEM a ser convertido




3. Clicar em Save Private Key



4. Confirmar e Salvar sem Passphrase. Clique em Yes


5. Escolher onde Salvar e o nome do arquivo PPK.




6. Configurar a chave em sua conexão no Putty












terça-feira, 5 de outubro de 2010

Habilitando Conexões Remotas no MySQL

Com a instalação default do MySQL não é possível conectar remotamente no banco de dados. Pela configuração default apenas localhost pode se conectar.

Neste cenário, ao tentar conectar remotamente no banco ele retorna o seguinte erro:

KHost '' is not allowed to connect to this MySQL serverConnect

Para permitir outros hosts basta fazer o seguinte:

1. Conectar no Banco

# mysql -uroot -p

mysql> grant all privileges on *.* to 'user'@'ip' identified by 'passwd';


Onde:
user: é o usuário que você que usar.
ip: a máquina remota que você quer permitir.
passwd: a senha do usuário

Por exemplo:

mysql> grant all privileges on *.* to 'root'@'192.168.2.60' identified by 'teste';

Para habilitar toda a rede classe C do exemplo basta usar o wildcard %
(ex 192.168.2.%)

O ultimo passo é fazer o flush da configuração:

mysql> flush privileges;

ScreenShot da operação



[]'s

Leonardo