2
0

Add guards against usage of busy connection

This commit is contained in:
Jack Christensen
2015-09-16 10:22:16 -05:00
parent 51407590eb
commit 86837e5576
4 changed files with 101 additions and 20 deletions
+26 -14
View File
@@ -39,20 +39,21 @@ func (r *Row) Scan(dest ...interface{}) (err error) {
// the *Conn can be used again. Rows are closed by explicitly calling Close(),
// calling Next() until it returns false, or when a fatal error occurs.
type Rows struct {
pool *ConnPool
conn *Conn
mr *msgReader
fields []FieldDescription
vr ValueReader
rowCount int
columnIdx int
err error
closed bool
startTime time.Time
sql string
args []interface{}
logger Logger
logLevel int
pool *ConnPool
conn *Conn
mr *msgReader
fields []FieldDescription
vr ValueReader
rowCount int
columnIdx int
err error
closed bool
startTime time.Time
sql string
args []interface{}
logger Logger
logLevel int
unlockConn bool
}
func (rows *Rows) FieldDescriptions() []FieldDescription {
@@ -64,6 +65,11 @@ func (rows *Rows) close() {
return
}
if rows.unlockConn {
rows.conn.unlock()
rows.unlockConn = false
}
if rows.pool != nil {
rows.pool.Release(rows.conn)
rows.pool = nil
@@ -421,6 +427,12 @@ func (c *Conn) Query(sql string, args ...interface{}) (*Rows, error) {
c.lastActivityTime = time.Now()
rows := &Rows{conn: c, startTime: c.lastActivityTime, sql: sql, args: args, logger: c.logger, logLevel: c.logLevel}
if err := c.lock(); err != nil {
rows.abort(err)
return rows, err
}
rows.unlockConn = true
ps, ok := c.preparedStatements[sql]
if !ok {
var err error