// putConn adds a connection to the db's free pool. // err is optionally the last error that occurred on this connection. func (db *DB) putConn(c driver.Conn, err error) { if err == driver.ErrBadConn { // Don't reuse bad connections. return } db.mu.Lock() if putConnHook != nil { putConnHook(db, c) } if n := len(db.freeConn); !db.closed && n < db.maxIdleConns() { db.freeConn = append(db.freeConn, c) db.mu.Unlock() return } // TODO: check to see if we need this Conn for any prepared // statements which are still active? db.mu.Unlock() c.Close() }
// putConn adds a connection to the db's free pool. // err is optionally the last error that occurred on this connection. func (db *DB) putConn(c driver.Conn, err error) { db.mu.Lock() if !db.outConn[c] { if debugGetPut { fmt.Printf("putConn(%v) DUPLICATE was: %s\n\nPREVIOUS was: %s", c, stack(), db.lastPut[c]) } panic("sql: connection returned that was never out") } if debugGetPut { db.lastPut[c] = stack() } delete(db.outConn, c) if fns, ok := db.onConnPut[c]; ok { for _, fn := range fns { fn() } delete(db.onConnPut, c) } if err == driver.ErrBadConn { // Don't reuse bad connections. db.mu.Unlock() return } if putConnHook != nil { putConnHook(db, c) } if n := len(db.freeConn); !db.closed && n < db.maxIdleConns() { db.freeConn = append(db.freeConn, c) db.mu.Unlock() return } // TODO: check to see if we need this Conn for any prepared // statements which are still active? db.mu.Unlock() c.Close() }
func (p *Proxy) Open(name string) (driver.Conn, error) { var err error var ctx interface{} var conn driver.Conn if h := p.Hooks.PostOpen; h != nil { // Setup PostOpen. This needs to be a closure like this // or otherwise changes to the `ctx` and `conn` parameters // within this Open() method does not get applied at the // time defer is fired defer func() { h(ctx, conn) }() } if h := p.Hooks.PreOpen; h != nil { if ctx, err = h(name); err != nil { return nil, err } } conn, err = p.Driver.Open(name) if err != nil { return nil, err } conn = &Conn{ Conn: conn, Proxy: p, } if hook := p.Hooks.Open; hook != nil { if err = hook(ctx, conn); err != nil { conn.Close() return nil, err } } return conn, nil }
func (db *DB) closeConn(c driver.Conn) { // TODO: check to see if we need this Conn for any prepared statements // that are active. c.Close() }