...

Source file src/github.com/doug-martin/goqu/v9/sqlgen/delete_sql_generator.go

Documentation: github.com/doug-martin/goqu/v9/sqlgen

     1  package sqlgen
     2  
     3  import (
     4  	"github.com/doug-martin/goqu/v9/exp"
     5  	"github.com/doug-martin/goqu/v9/internal/errors"
     6  	"github.com/doug-martin/goqu/v9/internal/sb"
     7  )
     8  
     9  type (
    10  	// An adapter interface to be used by a Dataset to generate SQL for a specific dialect.
    11  	// See DefaultAdapter for a concrete implementation and examples.
    12  	DeleteSQLGenerator interface {
    13  		Dialect() string
    14  		Generate(b sb.SQLBuilder, clauses exp.DeleteClauses)
    15  	}
    16  	// The default adapter. This class should be used when building a new adapter. When creating a new adapter you can
    17  	// either override methods, or more typically update default values.
    18  	// See (github.com/doug-martin/goqu/dialect/postgres)
    19  	deleteSQLGenerator struct {
    20  		CommonSQLGenerator
    21  	}
    22  )
    23  
    24  var ErrNoSourceForDelete = errors.New("no source found when generating delete sql")
    25  
    26  func NewDeleteSQLGenerator(dialect string, do *SQLDialectOptions) DeleteSQLGenerator {
    27  	return &deleteSQLGenerator{NewCommonSQLGenerator(dialect, do)}
    28  }
    29  
    30  func (dsg *deleteSQLGenerator) Generate(b sb.SQLBuilder, clauses exp.DeleteClauses) {
    31  	if !clauses.HasFrom() {
    32  		b.SetError(ErrNoSourceForDelete)
    33  		return
    34  	}
    35  	for _, f := range dsg.DialectOptions().DeleteSQLOrder {
    36  		if b.Error() != nil {
    37  			return
    38  		}
    39  		switch f {
    40  		case CommonTableSQLFragment:
    41  			dsg.ExpressionSQLGenerator().Generate(b, clauses.CommonTables())
    42  		case DeleteBeginSQLFragment:
    43  			dsg.DeleteBeginSQL(
    44  				b, exp.NewColumnListExpression(clauses.From()), !(clauses.HasLimit() || clauses.HasOrder()),
    45  			)
    46  		case FromSQLFragment:
    47  			dsg.FromSQL(b, exp.NewColumnListExpression(clauses.From()))
    48  		case WhereSQLFragment:
    49  			dsg.WhereSQL(b, clauses.Where())
    50  		case OrderSQLFragment:
    51  			if dsg.DialectOptions().SupportsOrderByOnDelete {
    52  				dsg.OrderSQL(b, clauses.Order())
    53  			}
    54  		case LimitSQLFragment:
    55  			if dsg.DialectOptions().SupportsLimitOnDelete {
    56  				dsg.LimitSQL(b, clauses.Limit())
    57  			}
    58  		case ReturningSQLFragment:
    59  			dsg.ReturningSQL(b, clauses.Returning())
    60  		default:
    61  			b.SetError(ErrNotSupportedFragment("DELETE", f))
    62  		}
    63  	}
    64  }
    65  
    66  // Adds the correct fragment to being an DELETE statement
    67  func (dsg *deleteSQLGenerator) DeleteBeginSQL(b sb.SQLBuilder, from exp.ColumnListExpression, multiTable bool) {
    68  	b.Write(dsg.DialectOptions().DeleteClause)
    69  	if multiTable && dsg.DialectOptions().SupportsDeleteTableHint {
    70  		dsg.SourcesSQL(b, from)
    71  	}
    72  }
    73  

View as plain text