From 3b12f79773d2a367dc6e70d0fe180858ab330655 Mon Sep 17 00:00:00 2001 From: Rafael Dantas Justo Date: Tue, 20 Sep 2016 08:45:11 -0300 Subject: [PATCH] =?UTF-8?q?Corrige=20a=20estrat=C3=A9gia=20de=20obten?= =?UTF-8?q?=C3=A7=C3=A3o=20do=20ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A biblioteca de PostgreSQL utilizada não tem suporte ao Result.LastInsertId() [1], portanto vamos utilizar a sintaxe RETURNING conforme recomendado pela própria comunidade [2]. [1] https://golang.org/pkg/database/sql/#Result [2] https://github.com/lib/pq/issues/24 --- "n\303\272cleo/atirador/frequ\303\252ncia_dao.go" | 10 +++------- .../atirador/frequ\303\252ncia_dao_test.go" | 12 ++++++------ 2 files changed, 9 insertions(+), 13 deletions(-) diff --git "a/n\303\272cleo/atirador/frequ\303\252ncia_dao.go" "b/n\303\272cleo/atirador/frequ\303\252ncia_dao.go" index bf0a1f7..3d080fd 100644 --- "a/n\303\272cleo/atirador/frequ\303\252ncia_dao.go" +++ "b/n\303\272cleo/atirador/frequ\303\252ncia_dao.go" @@ -31,7 +31,7 @@ func (f frequênciaDAOImpl) criar(frequência *frequência) error { frequência.DataCriação = time.Now().UTC() frequência.revisão = 0 - resultado, err := f.sqlogger.Exec(frequênciaCriaçãoComando, + resultado := f.sqlogger.QueryRow(frequênciaCriaçãoComando, frequência.Controle, frequência.CR, frequência.Calibre, @@ -45,11 +45,7 @@ func (f frequênciaDAOImpl) criar(frequência *frequência) error { frequência.revisão, ) - if err != nil { - return erros.Novo(err) - } - - if frequência.ID, err = resultado.LastInsertId(); err != nil { + if err := resultado.Scan(&frequência.ID); err != nil { return erros.Novo(err) } @@ -137,7 +133,7 @@ var ( "revisao", } frequênciaCriaçãoCamposTexto = strings.Join(frequênciaCriaçãoCampos, ", ") - frequênciaCriaçãoComando = fmt.Sprintf(`INSERT INTO %s (%s) VALUES (DEFAULT, %s)`, + frequênciaCriaçãoComando = fmt.Sprintf(`INSERT INTO %s (%s) VALUES (DEFAULT, %s) RETURNING id`, frequênciaTabela, frequênciaCriaçãoCamposTexto, bd.MarcadoresPSQL(len(frequênciaCriaçãoCampos)-1)) frequênciaAtualizaçãoComando = fmt.Sprintf(`UPDATE %s SET diff --git "a/n\303\272cleo/atirador/frequ\303\252ncia_dao_test.go" "b/n\303\272cleo/atirador/frequ\303\252ncia_dao_test.go" index a4320e4..3bc0703 100644 --- "a/n\303\272cleo/atirador/frequ\303\252ncia_dao_test.go" +++ "b/n\303\272cleo/atirador/frequ\303\252ncia_dao_test.go" @@ -32,7 +32,7 @@ func TestFrequênciaDAOImpl_criar(t *testing.T) { { descrição: "deve criar corretamente a frequência", simulação: func() { - testdb.StubExec(frequênciaCriaçãoComando, testdb.NewResult(1, nil, 1, nil)) + testdb.StubQuery(frequênciaCriaçãoComando, testdb.RowsFromSlice([]string{"id"}, [][]driver.Value{{1}})) testdb.StubExec(frequênciaLogCriaçãoComando, testdb.NewResult(1, nil, 1, nil)) logCriaçãoComando := `INSERT INTO log (id, data_criacao, endereco_remoto) VALUES (DEFAULT, $1, $2)` @@ -72,7 +72,7 @@ func TestFrequênciaDAOImpl_criar(t *testing.T) { { descrição: "deve detectar um erro ao criar a frequência", simulação: func() { - testdb.StubExecError(frequênciaCriaçãoComando, fmt.Errorf("erro de execução")) + testdb.StubQueryError(frequênciaCriaçãoComando, fmt.Errorf("erro de execução")) }, frequência: &frequência{ Controle: 98765, @@ -91,7 +91,7 @@ func TestFrequênciaDAOImpl_criar(t *testing.T) { { descrição: "deve detectar um erro ao obter a identificação da frequência", simulação: func() { - testdb.StubExec(frequênciaCriaçãoComando, testdb.NewResult(0, fmt.Errorf("erro com o ID"), 1, nil)) + testdb.StubQuery(frequênciaCriaçãoComando, testdb.RowsFromSlice([]string{"id"}, [][]driver.Value{{"xxx"}})) }, frequência: &frequência{ Controle: 98765, @@ -105,12 +105,12 @@ func TestFrequênciaDAOImpl_criar(t *testing.T) { DataTérmino: data.Add(-10 * time.Minute), revisão: 2, // revisão sempre inicia com zero }, - erroEsperado: errors.Errorf("erro com o ID"), + erroEsperado: errors.Errorf(`sql: Scan error on column index 0: converting driver.Value type string ("xxx") to a int64: invalid syntax`), }, { descrição: "deve detectar um erro ao gerar uma identificação de log", simulação: func() { - testdb.StubExec(frequênciaCriaçãoComando, testdb.NewResult(1, nil, 1, nil)) + testdb.StubQuery(frequênciaCriaçãoComando, testdb.RowsFromSlice([]string{"id"}, [][]driver.Value{{1}})) testdb.StubExec(frequênciaLogCriaçãoComando, testdb.NewResult(1, nil, 1, nil)) logCriaçãoComando := `INSERT INTO log (id, data_criacao, endereco_remoto) VALUES (DEFAULT, $1, $2)` @@ -133,7 +133,7 @@ func TestFrequênciaDAOImpl_criar(t *testing.T) { { descrição: "deve detectar um erro ao gerar uma entrada de log", simulação: func() { - testdb.StubExec(frequênciaCriaçãoComando, testdb.NewResult(1, nil, 1, nil)) + testdb.StubQuery(frequênciaCriaçãoComando, testdb.RowsFromSlice([]string{"id"}, [][]driver.Value{{1}})) testdb.StubExecError(frequênciaLogCriaçãoComando, fmt.Errorf("erro na criação do log")) logCriaçãoComando := `INSERT INTO log (id, data_criacao, endereco_remoto) VALUES (DEFAULT, $1, $2)`