github.com/goravel/framework@v1.13.9/database/gorm/dialector.go (about)

     1  package gorm
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/glebarez/sqlite"
     7  	"github.com/google/wire"
     8  	"gorm.io/driver/mysql"
     9  	"gorm.io/driver/postgres"
    10  	"gorm.io/driver/sqlserver"
    11  	"gorm.io/gorm"
    12  
    13  	"github.com/goravel/framework/contracts/config"
    14  	databasecontract "github.com/goravel/framework/contracts/database"
    15  	"github.com/goravel/framework/contracts/database/orm"
    16  	"github.com/goravel/framework/database/db"
    17  )
    18  
    19  var DialectorSet = wire.NewSet(NewDialectorImpl, wire.Bind(new(Dialector), new(*DialectorImpl)))
    20  var _ Dialector = &DialectorImpl{}
    21  
    22  type Dialector interface {
    23  	Make(configs []databasecontract.Config) ([]gorm.Dialector, error)
    24  }
    25  
    26  type DialectorImpl struct {
    27  	config     config.Config
    28  	connection string
    29  	dsn        db.Dsn
    30  }
    31  
    32  func NewDialectorImpl(config config.Config, connection string) *DialectorImpl {
    33  	return &DialectorImpl{
    34  		config:     config,
    35  		connection: connection,
    36  		dsn:        db.NewDsnImpl(config, connection),
    37  	}
    38  }
    39  
    40  func (d *DialectorImpl) Make(configs []databasecontract.Config) ([]gorm.Dialector, error) {
    41  	driver := d.config.GetString(fmt.Sprintf("database.connections.%s.driver", d.connection))
    42  
    43  	var dialectors []gorm.Dialector
    44  	for _, item := range configs {
    45  		var dialector gorm.Dialector
    46  		var err error
    47  		switch orm.Driver(driver) {
    48  		case orm.DriverMysql:
    49  			dialector = d.mysql(item)
    50  		case orm.DriverPostgresql:
    51  			dialector = d.postgresql(item)
    52  		case orm.DriverSqlite:
    53  			dialector = d.sqlite(item)
    54  		case orm.DriverSqlserver:
    55  			dialector = d.sqlserver(item)
    56  		default:
    57  			err = fmt.Errorf("err database driver: %s, only support mysql, postgresql, sqlite and sqlserver", driver)
    58  		}
    59  
    60  		if err != nil {
    61  			return nil, err
    62  		}
    63  
    64  		dialectors = append(dialectors, dialector)
    65  	}
    66  
    67  	return dialectors, nil
    68  }
    69  
    70  func (d *DialectorImpl) mysql(config databasecontract.Config) gorm.Dialector {
    71  	dsn := d.dsn.Mysql(config)
    72  	if dsn == "" {
    73  		return nil
    74  	}
    75  
    76  	return mysql.New(mysql.Config{
    77  		DSN: dsn,
    78  	})
    79  }
    80  
    81  func (d *DialectorImpl) postgresql(config databasecontract.Config) gorm.Dialector {
    82  	dsn := d.dsn.Postgresql(config)
    83  	if dsn == "" {
    84  		return nil
    85  	}
    86  
    87  	return postgres.New(postgres.Config{
    88  		DSN: dsn,
    89  	})
    90  }
    91  
    92  func (d *DialectorImpl) sqlite(config databasecontract.Config) gorm.Dialector {
    93  	dsn := d.dsn.Sqlite(config)
    94  	if dsn == "" {
    95  		return nil
    96  	}
    97  
    98  	return sqlite.Open(dsn)
    99  }
   100  
   101  func (d *DialectorImpl) sqlserver(config databasecontract.Config) gorm.Dialector {
   102  	dsn := d.dsn.Sqlserver(config)
   103  	if dsn == "" {
   104  		return nil
   105  	}
   106  
   107  	return sqlserver.New(sqlserver.Config{
   108  		DSN: dsn,
   109  	})
   110  }