fork github.com/doug-martin

This commit is contained in:
2025-03-22 23:02:05 +08:00
commit f14642a736
131 changed files with 34555 additions and 0 deletions
+72
View File
@@ -0,0 +1,72 @@
package sqlgen
import (
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
)
type (
// An adapter interface to be used by a Dataset to generate SQL for a specific dialect.
// See DefaultAdapter for a concrete implementation and examples.
DeleteSQLGenerator interface {
Dialect() string
Generate(b sb.SQLBuilder, clauses exp.DeleteClauses)
}
// The default adapter. This class should be used when building a new adapter. When creating a new adapter you can
// either override methods, or more typically update default values.
// See (github.com/doug-martin/goqu/dialect/postgres)
deleteSQLGenerator struct {
CommonSQLGenerator
}
)
var ErrNoSourceForDelete = errors.New("no source found when generating delete sql")
func NewDeleteSQLGenerator(dialect string, do *SQLDialectOptions) DeleteSQLGenerator {
return &deleteSQLGenerator{NewCommonSQLGenerator(dialect, do)}
}
func (dsg *deleteSQLGenerator) Generate(b sb.SQLBuilder, clauses exp.DeleteClauses) {
if !clauses.HasFrom() {
b.SetError(ErrNoSourceForDelete)
return
}
for _, f := range dsg.DialectOptions().DeleteSQLOrder {
if b.Error() != nil {
return
}
switch f {
case CommonTableSQLFragment:
dsg.ExpressionSQLGenerator().Generate(b, clauses.CommonTables())
case DeleteBeginSQLFragment:
dsg.DeleteBeginSQL(
b, exp.NewColumnListExpression(clauses.From()), !(clauses.HasLimit() || clauses.HasOrder()),
)
case FromSQLFragment:
dsg.FromSQL(b, exp.NewColumnListExpression(clauses.From()))
case WhereSQLFragment:
dsg.WhereSQL(b, clauses.Where())
case OrderSQLFragment:
if dsg.DialectOptions().SupportsOrderByOnDelete {
dsg.OrderSQL(b, clauses.Order())
}
case LimitSQLFragment:
if dsg.DialectOptions().SupportsLimitOnDelete {
dsg.LimitSQL(b, clauses.Limit())
}
case ReturningSQLFragment:
dsg.ReturningSQL(b, clauses.Returning())
default:
b.SetError(ErrNotSupportedFragment("DELETE", f))
}
}
}
// Adds the correct fragment to being an DELETE statement
func (dsg *deleteSQLGenerator) DeleteBeginSQL(b sb.SQLBuilder, from exp.ColumnListExpression, multiTable bool) {
b.Write(dsg.DialectOptions().DeleteClause)
if multiTable && dsg.DialectOptions().SupportsDeleteTableHint {
dsg.SourcesSQL(b, from)
}
}