package database import ( "database/sql" "github.com/gogf/gf/database/gdb" "github.com/gogf/gf/errors/gcode" "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/text/gregex" "github.com/gogf/gf/util/gconv" gora "github.com/sijms/go-ora/v2" ) type OracleDriver struct { *gdb.DriverOracle } var ( // customDriverName is my driver name, which is used for registering. customDriverName = "oracle" ) func init() { // It here registers my custom driver in package initialization function "init". // You can later use this type in the database configuration. if err := gdb.Register(customDriverName, &OracleDriver{}); err != nil { panic(err) } } // New creates and returns a database object for oracle. // It implements the interface of gdb.Driver for extra database driver installation. func (d *OracleDriver) New(core *gdb.Core, node *gdb.ConfigNode) (gdb.DB, error) { return &OracleDriver{ &gdb.DriverOracle{ Core: core, }, }, nil } // Open creates and returns an underlying sql.DB object for oracle. func (d *OracleDriver) Open(config *gdb.ConfigNode) (db *sql.DB, err error) { var ( source string underlyingDriverName = "oracle" ) options := map[string]string{ "CONNECTION TIMEOUT": "60", "PREFETCH_ROWS": "25", } if config.Debug { options["TRACE FILE"] = "oracle_trace.log" } // [username:[password]@]host[:port][/service_name][?param1=value1&...¶mN=valueN] if config.Link != "" { // ============================================================================ // Deprecated from v2.2.0. // ============================================================================ source = config.Link // Custom changing the schema in runtime. if config.Name != "" { source, _ = gregex.ReplaceString(`@(.+?)/([\w\.\-]+)+`, "@$1/"+config.Name, source) } } else { source = gora.BuildUrl( config.Host, gconv.Int(config.Port), config.Name, config.User, config.Pass, options, ) } if db, err = sql.Open(underlyingDriverName, source); err != nil { err = gerror.WrapCodef( gcode.CodeDbOperationError, err, `sql.Open failed for driver "%s" by source "%s"`, underlyingDriverName, source, ) return nil, err } return }