diff --git a/internal/sqladapter/database.go b/internal/sqladapter/database.go index 0d4ec96b8546e03b2daa62730ca092c23e00ec11..27cf5b3f7d190da140091e817ca72416e7bf4ef4 100644 --- a/internal/sqladapter/database.go +++ b/internal/sqladapter/database.go @@ -180,15 +180,21 @@ func (d *database) Close() error { d.sessMu.Unlock() }() if d.sess != nil { - if d.Transaction() != nil && !d.Transaction().Committed() { - d.Transaction().Rollback() + if cleaner, ok := d.PartialDatabase.(HasCleanUp); ok { + cleaner.CleanUp() } d.cachedCollections.Clear() d.cachedStatements.Clear() // Closes prepared statements as well. - if cleaner, ok := d.PartialDatabase.(HasCleanUp); ok { - cleaner.CleanUp() + + tx := d.Transaction() + if tx == nil { + // Not within a transaction. + return d.sess.Close() + } + + if !tx.Committed() { + tx.Rollback() } - return d.sess.Close() } return nil } diff --git a/mysql/database.go b/mysql/database.go index c660f14d199f693538678e6404558eb28a78ab95..8263e40cba12122916ffc1240fff4e6b29e801d4 100644 --- a/mysql/database.go +++ b/mysql/database.go @@ -133,10 +133,15 @@ func (d *database) clone() (*database, error) { return nil, err } - if err := clone.open(); err != nil { + clone.BaseDatabase = sqladapter.NewBaseDatabase(clone) + + b, err := sqlbuilder.WithSession(clone.BaseDatabase, template) + if err != nil { return nil, err } + clone.Builder = b + clone.BaseDatabase.BindSession(d.BaseDatabase.Session()) return clone, nil } diff --git a/postgresql/database.go b/postgresql/database.go index 0933942e6785d5ca0388c92d8ecd608fc5772181..d7807d99b3e70762d2915ad6a4bf282ce04d8f0a 100644 --- a/postgresql/database.go +++ b/postgresql/database.go @@ -132,10 +132,15 @@ func (d *database) clone() (*database, error) { return nil, err } - if err := clone.open(); err != nil { + clone.BaseDatabase = sqladapter.NewBaseDatabase(clone) + + b, err := sqlbuilder.WithSession(clone.BaseDatabase, template) + if err != nil { return nil, err } + clone.Builder = b + clone.BaseDatabase.BindSession(d.BaseDatabase.Session()) return clone, nil }