sijms / go-ora

Pure go oracle client
MIT License
786 stars 174 forks source link

Oracle Connector v2 Dialer inject panic #434

Closed quanqqqqq closed 11 months ago

quanqqqqq commented 1 year ago

i want to inject dialer through this code,but OracleDriver will panic,because cusTyp is nil

func main() {
    dialer := func(ctx context.Context, network, addr string) (net.Conn, error) {
        conn, err := net.DialTimeout(network, addr, 10*time.Second)
        if err != nil {
            return nil, err
        }
        return conn, nil
    }

    dri := oracle.OracleDriver{}
    oraConn, _ := dri.OpenConnector("")
    _, _ = oraConn.Connect(ctx)
    conn := sql.OpenDB(oraConn)
    db, _ := gorm.Open((gormoracle.New(gormoracle.Config{
        Conn: conn,
    }))

}

can fix by this code? then I can init with NewOracleDriver()

func init() {
    sql.Register("oracle", NewOracleDriver())
}

func NewOracleDriver() *OracleDriver {
    return &OracleDriver{cusTyp: map[string]customType{}}
}
vtolstov commented 1 year ago

I think that we need

var ( oracleDriver = &OracleDriver{cusTyp: map[string]customType{}} )

func init() { sql.Register("oracle", oracleDriver) }

func GetDefaultDriver() *OracleDriver { return oracleDriver }

sijms commented 1 year ago

ok I will fix in next release and inform you

quanqqqqq commented 12 months ago

@sijms hello, what's time fix this issue?

sijms commented 11 months ago

sorry I was so busy last week I will release today or tomorrow

sijms commented 11 months ago

v2.7.18 add 2 function NewDriver and NewConnector. (also update readme file)

so you can do as follow:

  // New connector will create new driver (not use default driver)
  // so you can connect to multiple database each one has its own driver
  connector, err := go_ora.NewConnector(connStr)
  if err != nil {
    log.Fatal(err)
  }

  // set custom dialer
  connector.Dialer(newDialer)

  // Get a database handle.
  db = sql.OpenDB(connector)