Create comprehensive documentation for future Claude Code instances working in this repository, including: - Development commands for testing, building, and code quality - Core architecture overview of the SQL query builder system - Directory structure and component explanations - Testing patterns and conventions - Key dependencies and their purposes 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
104 lines
3.0 KiB
Go
104 lines
3.0 KiB
Go
package db
|
|
|
|
import (
|
|
"strings"
|
|
"sync"
|
|
|
|
"git.fsdpf.net/go/db/exp"
|
|
"git.fsdpf.net/go/db/internal/sb"
|
|
"git.fsdpf.net/go/db/sqlgen"
|
|
)
|
|
|
|
type (
|
|
SQLDialectOptions = sqlgen.SQLDialectOptions
|
|
// An adapter interface to be used by a Dataset to generate SQL for a specific dialect.
|
|
// See DefaultAdapter for a concrete implementation and examples.
|
|
SQLDialect interface {
|
|
Dialect() string
|
|
ToSelectSQL(b sb.SQLBuilder, clauses exp.SelectClauses)
|
|
ToUpdateSQL(b sb.SQLBuilder, clauses exp.UpdateClauses)
|
|
ToInsertSQL(b sb.SQLBuilder, clauses exp.InsertClauses)
|
|
ToDeleteSQL(b sb.SQLBuilder, clauses exp.DeleteClauses)
|
|
ToTruncateSQL(b sb.SQLBuilder, clauses exp.TruncateClauses)
|
|
}
|
|
// 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)
|
|
sqlDialect struct {
|
|
dialect string
|
|
dialectOptions *SQLDialectOptions
|
|
selectGen sqlgen.SelectSQLGenerator
|
|
updateGen sqlgen.UpdateSQLGenerator
|
|
insertGen sqlgen.InsertSQLGenerator
|
|
deleteGen sqlgen.DeleteSQLGenerator
|
|
truncateGen sqlgen.TruncateSQLGenerator
|
|
}
|
|
)
|
|
|
|
var (
|
|
dialects = make(map[string]SQLDialect)
|
|
DefaultDialectOptions = sqlgen.DefaultDialectOptions
|
|
dialectsMu sync.RWMutex
|
|
)
|
|
|
|
func init() {
|
|
RegisterDialect("default", DefaultDialectOptions())
|
|
}
|
|
|
|
func RegisterDialect(name string, do *SQLDialectOptions) {
|
|
dialectsMu.Lock()
|
|
defer dialectsMu.Unlock()
|
|
lowerName := strings.ToLower(name)
|
|
dialects[lowerName] = newDialect(lowerName, do)
|
|
}
|
|
|
|
func DeregisterDialect(name string) {
|
|
dialectsMu.Lock()
|
|
defer dialectsMu.Unlock()
|
|
delete(dialects, strings.ToLower(name))
|
|
}
|
|
|
|
func GetDialect(name string) SQLDialect {
|
|
name = strings.ToLower(name)
|
|
if d, ok := dialects[name]; ok {
|
|
return d
|
|
}
|
|
return newDialect("default", DefaultDialectOptions())
|
|
}
|
|
|
|
func newDialect(dialect string, do *SQLDialectOptions) SQLDialect {
|
|
return &sqlDialect{
|
|
dialect: dialect,
|
|
dialectOptions: do,
|
|
selectGen: sqlgen.NewSelectSQLGenerator(dialect, do),
|
|
updateGen: sqlgen.NewUpdateSQLGenerator(dialect, do),
|
|
insertGen: sqlgen.NewInsertSQLGenerator(dialect, do),
|
|
deleteGen: sqlgen.NewDeleteSQLGenerator(dialect, do),
|
|
truncateGen: sqlgen.NewTruncateSQLGenerator(dialect, do),
|
|
}
|
|
}
|
|
|
|
func (d *sqlDialect) Dialect() string {
|
|
return d.dialect
|
|
}
|
|
|
|
func (d *sqlDialect) ToSelectSQL(b sb.SQLBuilder, clauses exp.SelectClauses) {
|
|
d.selectGen.Generate(b, clauses)
|
|
}
|
|
|
|
func (d *sqlDialect) ToUpdateSQL(b sb.SQLBuilder, clauses exp.UpdateClauses) {
|
|
d.updateGen.Generate(b, clauses)
|
|
}
|
|
|
|
func (d *sqlDialect) ToInsertSQL(b sb.SQLBuilder, clauses exp.InsertClauses) {
|
|
d.insertGen.Generate(b, clauses)
|
|
}
|
|
|
|
func (d *sqlDialect) ToDeleteSQL(b sb.SQLBuilder, clauses exp.DeleteClauses) {
|
|
d.deleteGen.Generate(b, clauses)
|
|
}
|
|
|
|
func (d *sqlDialect) ToTruncateSQL(b sb.SQLBuilder, clauses exp.TruncateClauses) {
|
|
d.truncateGen.Generate(b, clauses)
|
|
}
|