From 9a34dc9fd7054f64bbf110bfdd28c30b7b145403 Mon Sep 17 00:00:00 2001 From: go-jet Date: Mon, 12 Aug 2019 12:27:33 +0200 Subject: [PATCH] Handle todos. --- generator/mysql/mysql_generator.go | 1 - internal/jet/clause.go | 25 +++++++++++++++++++++++++ mysql/insert_statement.go | 15 +++++++-------- mysql/insert_statement_test.go | 9 ++++----- postgres/insert_statement.go | 17 ++++++++--------- postgres/insert_statement_test.go | 9 ++++----- 6 files changed, 48 insertions(+), 28 deletions(-) diff --git a/generator/mysql/mysql_generator.go b/generator/mysql/mysql_generator.go index ccaf779..8924eb8 100644 --- a/generator/mysql/mysql_generator.go +++ b/generator/mysql/mysql_generator.go @@ -48,7 +48,6 @@ func Generate(destDir string, dbConn DBConnection) error { return nil } -// TODO reuse func openConnection(dbConn DBConnection) (*sql.DB, error) { var connString = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", dbConn.User, dbConn.Password, dbConn.Host, dbConn.Port, dbConn.DBName) db, err := sql.Open("mysql", connString) diff --git a/internal/jet/clause.go b/internal/jet/clause.go index c4a5469..b61df06 100644 --- a/internal/jet/clause.go +++ b/internal/jet/clause.go @@ -348,6 +348,31 @@ func (i *ClauseInsert) Serialize(statementType StatementType, out *SqlBuilder) e return nil } +type ClauseValuesQuery struct { + ClauseValues + ClauseQuery +} + +func (v *ClauseValuesQuery) Serialize(statementType StatementType, out *SqlBuilder) error { + if len(v.Rows) == 0 && v.Query == nil { + return errors.New("jet: no row values or query specified") + } + + if len(v.Rows) > 0 && v.Query != nil { + return errors.New("jet: only row values or query has to be specified") + } + + if err := v.ClauseValues.Serialize(statementType, out); err != nil { + return err + } + + if err := v.ClauseQuery.Serialize(statementType, out); err != nil { + return err + } + + return nil +} + type ClauseValues struct { Rows [][]Serializer } diff --git a/mysql/insert_statement.go b/mysql/insert_statement.go index 3232b52..a9020fe 100644 --- a/mysql/insert_statement.go +++ b/mysql/insert_statement.go @@ -19,7 +19,7 @@ type InsertStatement interface { func newInsertStatement(table Table, columns []jet.Column) InsertStatement { newInsert := &insertStatementImpl{} newInsert.StatementImpl = jet.NewStatementImpl(Dialect, jet.InsertStatementType, newInsert, - &newInsert.Insert, &newInsert.Values, &newInsert.Select) + &newInsert.Insert, &newInsert.ValuesQuery) newInsert.Insert.Table = table newInsert.Insert.Columns = columns @@ -30,27 +30,26 @@ func newInsertStatement(table Table, columns []jet.Column) InsertStatement { type insertStatementImpl struct { jet.StatementImpl - Insert jet.ClauseInsert - Values jet.ClauseValues - Select jet.ClauseQuery + Insert jet.ClauseInsert + ValuesQuery jet.ClauseValuesQuery } func (i *insertStatementImpl) VALUES(value interface{}, values ...interface{}) InsertStatement { - i.Values.Rows = append(i.Values.Rows, jet.UnwindRowFromValues(value, values)) + i.ValuesQuery.Rows = append(i.ValuesQuery.Rows, jet.UnwindRowFromValues(value, values)) return i } func (i *insertStatementImpl) MODEL(data interface{}) InsertStatement { - i.Values.Rows = append(i.Values.Rows, jet.UnwindRowFromModel(i.Insert.GetColumns(), data)) + i.ValuesQuery.Rows = append(i.ValuesQuery.Rows, jet.UnwindRowFromModel(i.Insert.GetColumns(), data)) return i } func (i *insertStatementImpl) MODELS(data interface{}) InsertStatement { - i.Values.Rows = append(i.Values.Rows, jet.UnwindRowsFromModels(i.Insert.GetColumns(), data)...) + i.ValuesQuery.Rows = append(i.ValuesQuery.Rows, jet.UnwindRowsFromModels(i.Insert.GetColumns(), data)...) return i } func (i *insertStatementImpl) QUERY(selectStatement SelectStatement) InsertStatement { - i.Select.Query = selectStatement + i.ValuesQuery.Query = selectStatement return i } diff --git a/mysql/insert_statement_test.go b/mysql/insert_statement_test.go index c65c1f9..91fdb8e 100644 --- a/mysql/insert_statement_test.go +++ b/mysql/insert_statement_test.go @@ -6,11 +6,10 @@ import ( "time" ) -// -//func TestInvalidInsert(t *testing.T) { -// assertStatementSqlErr(t, table1.INSERT(table1Col1), "jet: no row values or query specified") -// assertStatementSqlErr(t, table1.INSERT(nil).VALUES(1), "jet: nil column in columns list") -//} +func TestInvalidInsert(t *testing.T) { + assertStatementSqlErr(t, table1.INSERT(table1Col1), "jet: no row values or query specified") + assertStatementSqlErr(t, table1.INSERT(nil).VALUES(1), "jet: nil column in columns list") +} func TestInsertNilValue(t *testing.T) { assertStatementSql(t, table1.INSERT(table1Col1).VALUES(nil), ` diff --git a/postgres/insert_statement.go b/postgres/insert_statement.go index b570998..72cc461 100644 --- a/postgres/insert_statement.go +++ b/postgres/insert_statement.go @@ -22,7 +22,7 @@ type InsertStatement interface { func newInsertStatement(table WritableTable, columns []jet.Column) InsertStatement { newInsert := &insertStatementImpl{} newInsert.StatementImpl = jet.NewStatementImpl(Dialect, jet.InsertStatementType, newInsert, - &newInsert.Insert, &newInsert.Values, &newInsert.Select, &newInsert.Returning) + &newInsert.Insert, &newInsert.ValuesQuery, &newInsert.Returning) newInsert.Insert.Table = table newInsert.Insert.Columns = columns @@ -33,24 +33,23 @@ func newInsertStatement(table WritableTable, columns []jet.Column) InsertStateme type insertStatementImpl struct { jet.StatementImpl - Insert jet.ClauseInsert - Values jet.ClauseValues - Select jet.ClauseQuery - Returning ClauseReturning + Insert jet.ClauseInsert + ValuesQuery jet.ClauseValuesQuery + Returning ClauseReturning } func (i *insertStatementImpl) VALUES(value interface{}, values ...interface{}) InsertStatement { - i.Values.Rows = append(i.Values.Rows, jet.UnwindRowFromValues(value, values)) + i.ValuesQuery.Rows = append(i.ValuesQuery.Rows, jet.UnwindRowFromValues(value, values)) return i } func (i *insertStatementImpl) MODEL(data interface{}) InsertStatement { - i.Values.Rows = append(i.Values.Rows, jet.UnwindRowFromModel(i.Insert.GetColumns(), data)) + i.ValuesQuery.Rows = append(i.ValuesQuery.Rows, jet.UnwindRowFromModel(i.Insert.GetColumns(), data)) return i } func (i *insertStatementImpl) MODELS(data interface{}) InsertStatement { - i.Values.Rows = append(i.Values.Rows, jet.UnwindRowsFromModels(i.Insert.GetColumns(), data)...) + i.ValuesQuery.Rows = append(i.ValuesQuery.Rows, jet.UnwindRowsFromModels(i.Insert.GetColumns(), data)...) return i } @@ -60,6 +59,6 @@ func (i *insertStatementImpl) RETURNING(projections ...jet.Projection) InsertSta } func (i *insertStatementImpl) QUERY(selectStatement SelectStatement) InsertStatement { - i.Select.Query = selectStatement + i.ValuesQuery.Query = selectStatement return i } diff --git a/postgres/insert_statement_test.go b/postgres/insert_statement_test.go index 6426ab3..c64d96c 100644 --- a/postgres/insert_statement_test.go +++ b/postgres/insert_statement_test.go @@ -6,11 +6,10 @@ import ( "time" ) -//TODO: -//func TestInvalidInsert(t *testing.T) { -// assertStatementErr(t, table1.INSERT(table1Col1), "jet: no row values or query specified") -// assertStatementErr(t, table1.INSERT(nil).VALUES(1), "jet: nil column in columns list") -//} +func TestInvalidInsert(t *testing.T) { + assertStatementSqlErr(t, table1.INSERT(table1Col1), "jet: no row values or query specified") + assertStatementSqlErr(t, table1.INSERT(nil).VALUES(1), "jet: nil column in columns list") +} func TestInsertNilValue(t *testing.T) { assertStatementSql(t, table1.INSERT(table1Col1).VALUES(nil), `