| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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
- }
|