mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-02 23:40:24 +08:00
72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package oracle
|
||
|
||
import (
|
||
"database/sql"
|
||
"fmt"
|
||
"mayfly-go/internal/db/dbm/dbi"
|
||
"strings"
|
||
|
||
go_ora "github.com/sijms/go-ora/v2"
|
||
)
|
||
|
||
func init() {
|
||
dbi.Register(dbi.DbTypeOracle, new(OraMeta))
|
||
}
|
||
|
||
type OraMeta struct {
|
||
}
|
||
|
||
func (md *OraMeta) GetSqlDb(d *dbi.DbInfo) (*sql.DB, error) {
|
||
driverName := "oracle"
|
||
|
||
err := d.IfUseSshTunnelChangeIpPort()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
// 参数参考 https://github.com/sijms/go-ora?tab=readme-ov-file#other-connection-options
|
||
urlOptions := make(map[string]string)
|
||
|
||
db := d.Database
|
||
schema := ""
|
||
if db != "" {
|
||
// oracle database可以使用db/schema表示,方便连接指定schema, 若不存在schema则使用默认schema
|
||
ss := strings.Split(db, "/")
|
||
if len(ss) > 1 {
|
||
// user=hr&defaultSchema=hr
|
||
schema = ss[1]
|
||
}
|
||
}
|
||
// 解析参数
|
||
if d.Params != "" {
|
||
paramArr := strings.Split(d.Params, "&")
|
||
for _, param := range paramArr {
|
||
ps := strings.Split(param, "=")
|
||
if len(ps) > 1 {
|
||
if ps[0] == "clientCharset" {
|
||
urlOptions["client charset"] = ps[1]
|
||
} else {
|
||
urlOptions[ps[0]] = ps[1]
|
||
}
|
||
}
|
||
}
|
||
}
|
||
urlOptions["TIMEOUT"] = "1000"
|
||
connStr := go_ora.BuildUrl(d.Host, d.Port, d.Sid, d.Username, d.Password, urlOptions)
|
||
conn, err := sql.Open(driverName, connStr)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
// 目前没找到如何连接的时候就获取schema的方法,只能连接后再设置
|
||
if schema != "" {
|
||
_, err := conn.Exec(fmt.Sprintf("ALTER SESSION SET CURRENT_SCHEMA=%s", schema))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
}
|
||
return conn, err
|
||
}
|
||
|
||
func (md *OraMeta) GetDialect(conn *dbi.DbConn) dbi.Dialect {
|
||
return &OracleDialect{conn}
|
||
}
|