github.com/goravel/framework@v1.13.9/database/db/dsn.go (about)

     1  package db
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/goravel/framework/contracts/config"
     7  	databasecontract "github.com/goravel/framework/contracts/database"
     8  )
     9  
    10  type Dsn interface {
    11  	Mysql(config databasecontract.Config) string
    12  	Postgresql(config databasecontract.Config) string
    13  	Sqlite(config databasecontract.Config) string
    14  	Sqlserver(config databasecontract.Config) string
    15  }
    16  
    17  type DsnImpl struct {
    18  	config     config.Config
    19  	connection string
    20  }
    21  
    22  func NewDsnImpl(config config.Config, connection string) *DsnImpl {
    23  	return &DsnImpl{
    24  		config:     config,
    25  		connection: connection,
    26  	}
    27  }
    28  
    29  func (d *DsnImpl) Mysql(config databasecontract.Config) string {
    30  	host := config.Host
    31  	if host == "" {
    32  		return ""
    33  	}
    34  
    35  	charset := d.config.GetString("database.connections." + d.connection + ".charset")
    36  	loc := d.config.GetString("database.connections." + d.connection + ".loc")
    37  
    38  	return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=%t&loc=%s&multiStatements=true",
    39  		config.Username, config.Password, host, config.Port, config.Database, charset, true, loc)
    40  }
    41  
    42  func (d *DsnImpl) Postgresql(config databasecontract.Config) string {
    43  	host := config.Host
    44  	if host == "" {
    45  		return ""
    46  	}
    47  
    48  	sslmode := d.config.GetString("database.connections." + d.connection + ".sslmode")
    49  	timezone := d.config.GetString("database.connections." + d.connection + ".timezone")
    50  
    51  	return fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=%s&timezone=%s",
    52  		config.Username, config.Password, host, config.Port, config.Database, sslmode, timezone)
    53  }
    54  
    55  func (d *DsnImpl) Sqlite(config databasecontract.Config) string {
    56  	return fmt.Sprintf("%s?multi_stmts=true", config.Database)
    57  }
    58  
    59  func (d *DsnImpl) Sqlserver(config databasecontract.Config) string {
    60  	host := config.Host
    61  	if host == "" {
    62  		return ""
    63  	}
    64  
    65  	charset := d.config.GetString("database.connections." + d.connection + ".charset")
    66  
    67  	return fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s&charset=%s&MultipleActiveResultSets=true",
    68  		config.Username, config.Password, host, config.Port, config.Database, charset)
    69  }