aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/database/sql/sql.go
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2013-05-21 14:58:08 -0700
committerBrad Fitzpatrick <bradfitz@golang.org>2013-05-21 14:58:08 -0700
commit0e10196982e81be38c46b77572837ccf90cb3366 (patch)
tree5015dd9d9c5610744857c1f18bdebeb07d648d0f /src/pkg/database/sql/sql.go
parent509a1173a33d4fd914409cd941470d440fd5eed3 (diff)
downloadgo-0e10196982e81be38c46b77572837ccf90cb3366.tar.xz
database/sql: remove extra RemoveDep call
This should have been removed in 45c12efb4635. Not a correctness issue, but unnecessary work. This CL also adds paranoia checks in removeDep so this doesn't happen again. Fixes #5502 R=adg CC=gobot, golang-dev, google https://golang.org/cl/9543043
Diffstat (limited to 'src/pkg/database/sql/sql.go')
-rw-r--r--src/pkg/database/sql/sql.go27
1 files changed, 16 insertions, 11 deletions
diff --git a/src/pkg/database/sql/sql.go b/src/pkg/database/sql/sql.go
index 968cb74752..ebb7f440e0 100644
--- a/src/pkg/database/sql/sql.go
+++ b/src/pkg/database/sql/sql.go
@@ -357,21 +357,27 @@ func (db *DB) removeDep(x finalCloser, dep interface{}) error {
func (db *DB) removeDepLocked(x finalCloser, dep interface{}) func() error {
//println(fmt.Sprintf("removeDep(%T %p, %T %p)", x, x, dep, dep))
- done := false
- xdep := db.dep[x]
- if xdep != nil {
- delete(xdep, dep)
- if len(xdep) == 0 {
- delete(db.dep, x)
- done = true
- }
+ xdep, ok := db.dep[x]
+ if !ok {
+ panic(fmt.Sprintf("unpaired removeDep: no deps for %T", x))
}
- if !done {
+ l0 := len(xdep)
+ delete(xdep, dep)
+
+ switch len(xdep) {
+ case l0:
+ // Nothing removed. Shouldn't happen.
+ panic(fmt.Sprintf("unpaired removeDep: no %T dep on %T", dep, x))
+ case 0:
+ // No more dependencies.
+ delete(db.dep, x)
+ return x.finalClose
+ default:
+ // Dependencies remain.
return func() error { return nil }
}
- return x.finalClose
}
// Open opens a database specified by its database driver name and a
@@ -1261,7 +1267,6 @@ func (s *Stmt) finalClose() error {
for _, v := range s.css {
s.db.noteUnusedDriverStatement(v.dc, v.si)
v.dc.removeOpenStmt(v.si)
- s.db.removeDep(v.dc, s)
}
s.css = nil
return nil