mirror of
https://gitee.com/johng/gf.git
synced 2024-11-29 18:57:44 +08:00
66 lines
1.8 KiB
Go
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
|
|
}
|