gf/contrib/drivers/dm/dm_open.go
2024-01-30 20:03:58 +08:00

66 lines
1.8 KiB
Go

// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
package dm
import (
"database/sql"
"fmt"
"net/url"
"strings"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gcode"
"github.com/gogf/gf/v2/errors/gerror"
)
// Open creates and returns an underlying sql.DB object for pgsql.
func (d *Driver) Open(config *gdb.ConfigNode) (db *sql.DB, err error) {
var (
source string
underlyingDriverName = "dm"
)
if config.Name == "" {
return nil, fmt.Errorf(
`dm.Open failed for driver "%s" without DB Name`, underlyingDriverName,
)
}
// Data Source Name of DM8:
// dm://userName:password@ip:port/dbname
// dm://userName:password@DW/dbname?DW=(192.168.1.1:5236,192.168.1.2:5236)
var domain string
if config.Port != "" {
domain = fmt.Sprintf("%s:%s", config.Host, config.Port)
} else {
domain = config.Host
}
source = fmt.Sprintf(
"dm://%s:%s@%s/%s?charset=%s&schema=%s",
config.User, config.Pass, domain, config.Name, config.Charset, config.Name,
)
// Demo of timezone setting:
// &loc=Asia/Shanghai
if config.Timezone != "" {
if strings.Contains(config.Timezone, "/") {
config.Timezone = url.QueryEscape(config.Timezone)
}
source = fmt.Sprintf("%s&loc%s", source, config.Timezone)
}
if config.Extra != "" {
source = fmt.Sprintf("%s&%s", source, config.Extra)
}
if db, err = sql.Open(underlyingDriverName, source); err != nil {
err = gerror.WrapCodef(
gcode.CodeDbOperationError, err,
`dm.Open failed for driver "%s" by source "%s"`, underlyingDriverName, source,
)
return nil, err
}
return
}