Skip to content

Commit

Permalink
Corrige a estratégia de obtenção do ID
Browse files Browse the repository at this point in the history
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] lib/pq#24
  • Loading branch information
rafaeljusto committed Sep 20, 2016
1 parent b780b1b commit 3b12f79
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 13 deletions.
10 changes: 3 additions & 7 deletions núcleo/atirador/frequência_dao.go
Expand Up @@ -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,
Expand All @@ -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)
}

Expand Down Expand Up @@ -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
Expand Down
12 changes: 6 additions & 6 deletions núcleo/atirador/frequência_dao_test.go
Expand Up @@ -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)`
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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)`
Expand All @@ -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)`
Expand Down

0 comments on commit 3b12f79

Please sign in to comment.