Skip to content

Commit 461831d

Browse files
committed
Unexport borp.DbMap from db.WrappedMap
This was allowing some methods to pass through to the underlying borp.DbMap accidentally, without getting wrapped. Introduce accessors to get the underlying *borp.DbMap or *sql.DB when needed.
1 parent e390feb commit 461831d

File tree

3 files changed

+86
-35
lines changed

3 files changed

+86
-35
lines changed

db/map.go

Lines changed: 82 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"database/sql"
66
"errors"
77
"fmt"
8+
"reflect"
89
"regexp"
910

1011
"github.com/go-sql-driver/mysql"
@@ -60,106 +61,134 @@ func IsDuplicate(err error) bool {
6061
// WrappedMap wraps a *borp.DbMap such that its major functions wrap error
6162
// results in ErrDatabaseOp instances before returning them to the caller.
6263
type WrappedMap struct {
63-
*borp.DbMap
64+
dbMap *borp.DbMap
65+
}
66+
67+
func NewWrappedMap(dbMap *borp.DbMap) *WrappedMap {
68+
return &WrappedMap{dbMap: dbMap}
69+
}
70+
71+
func (m *WrappedMap) SQLDb() *sql.DB {
72+
return m.dbMap.Db
73+
}
74+
75+
func (m *WrappedMap) BorpDB() *borp.DbMap {
76+
return m.dbMap
77+
}
78+
79+
func (m *WrappedMap) TableFor(t reflect.Type, checkPK bool) (*borp.TableMap, error) {
80+
return m.dbMap.TableFor(t, checkPK)
6481
}
6582

6683
func (m *WrappedMap) Get(ctx context.Context, holder interface{}, keys ...interface{}) (interface{}, error) {
67-
return WrappedExecutor{SqlExecutor: m.DbMap}.Get(ctx, holder, keys...)
84+
return WrappedExecutor{sqlExecutor: m.dbMap}.Get(ctx, holder, keys...)
6885
}
6986

7087
func (m *WrappedMap) Insert(ctx context.Context, list ...interface{}) error {
71-
return WrappedExecutor{SqlExecutor: m.DbMap}.Insert(ctx, list...)
88+
return WrappedExecutor{sqlExecutor: m.dbMap}.Insert(ctx, list...)
7289
}
7390

7491
func (m *WrappedMap) Update(ctx context.Context, list ...interface{}) (int64, error) {
75-
return WrappedExecutor{SqlExecutor: m.DbMap}.Update(ctx, list...)
92+
return WrappedExecutor{sqlExecutor: m.dbMap}.Update(ctx, list...)
7693
}
7794

7895
func (m *WrappedMap) Delete(ctx context.Context, list ...interface{}) (int64, error) {
79-
return WrappedExecutor{SqlExecutor: m.DbMap}.Delete(ctx, list...)
96+
return WrappedExecutor{sqlExecutor: m.dbMap}.Delete(ctx, list...)
8097
}
8198

8299
func (m *WrappedMap) Select(ctx context.Context, holder interface{}, query string, args ...interface{}) ([]interface{}, error) {
83-
return WrappedExecutor{SqlExecutor: m.DbMap}.Select(ctx, holder, query, args...)
100+
return WrappedExecutor{sqlExecutor: m.dbMap}.Select(ctx, holder, query, args...)
84101
}
85102

86103
func (m *WrappedMap) SelectOne(ctx context.Context, holder interface{}, query string, args ...interface{}) error {
87-
return WrappedExecutor{SqlExecutor: m.DbMap}.SelectOne(ctx, holder, query, args...)
104+
return WrappedExecutor{sqlExecutor: m.dbMap}.SelectOne(ctx, holder, query, args...)
105+
}
106+
107+
func (m *WrappedMap) SelectNullInt(ctx context.Context, query string, args ...interface{}) (sql.NullInt64, error) {
108+
return WrappedExecutor{sqlExecutor: m.dbMap}.SelectNullInt(ctx, query, args...)
88109
}
89110

90111
func (m *WrappedMap) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) {
91-
return WrappedExecutor{SqlExecutor: m.DbMap}.QueryContext(ctx, query, args...)
112+
return WrappedExecutor{sqlExecutor: m.dbMap}.QueryContext(ctx, query, args...)
113+
}
114+
115+
func (m *WrappedMap) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row {
116+
return WrappedExecutor{sqlExecutor: m.dbMap}.QueryRowContext(ctx, query, args...)
117+
}
118+
119+
func (m *WrappedMap) SelectStr(ctx context.Context, query string, args ...interface{}) (string, error) {
120+
return WrappedExecutor{sqlExecutor: m.dbMap}.SelectStr(ctx, query, args...)
92121
}
93122

94123
func (m *WrappedMap) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) {
95-
return WrappedExecutor{SqlExecutor: m.DbMap}.ExecContext(ctx, query, args...)
124+
return WrappedExecutor{sqlExecutor: m.dbMap}.ExecContext(ctx, query, args...)
96125
}
97126

98127
func (m *WrappedMap) BeginTx(ctx context.Context) (Transaction, error) {
99-
tx, err := m.DbMap.BeginTx(ctx)
128+
tx, err := m.dbMap.BeginTx(ctx)
100129
if err != nil {
101130
return tx, ErrDatabaseOp{
102131
Op: "begin transaction",
103132
Err: err,
104133
}
105134
}
106135
return WrappedTransaction{
107-
Transaction: tx,
136+
transaction: tx,
108137
}, err
109138
}
110139

111140
// WrappedTransaction wraps a *borp.Transaction such that its major functions
112141
// wrap error results in ErrDatabaseOp instances before returning them to the
113142
// caller.
114143
type WrappedTransaction struct {
115-
*borp.Transaction
144+
transaction *borp.Transaction
116145
}
117146

118147
func (tx WrappedTransaction) Commit() error {
119-
return tx.Transaction.Commit()
148+
return tx.transaction.Commit()
120149
}
121150

122151
func (tx WrappedTransaction) Rollback() error {
123-
return tx.Transaction.Rollback()
152+
return tx.transaction.Rollback()
124153
}
125154

126155
func (tx WrappedTransaction) Get(ctx context.Context, holder interface{}, keys ...interface{}) (interface{}, error) {
127-
return (WrappedExecutor{SqlExecutor: tx.Transaction}).Get(ctx, holder, keys...)
156+
return (WrappedExecutor{sqlExecutor: tx.transaction}).Get(ctx, holder, keys...)
128157
}
129158

130159
func (tx WrappedTransaction) Insert(ctx context.Context, list ...interface{}) error {
131-
return (WrappedExecutor{SqlExecutor: tx.Transaction}).Insert(ctx, list...)
160+
return (WrappedExecutor{sqlExecutor: tx.transaction}).Insert(ctx, list...)
132161
}
133162

134163
func (tx WrappedTransaction) Update(ctx context.Context, list ...interface{}) (int64, error) {
135-
return (WrappedExecutor{SqlExecutor: tx.Transaction}).Update(ctx, list...)
164+
return (WrappedExecutor{sqlExecutor: tx.transaction}).Update(ctx, list...)
136165
}
137166

138167
func (tx WrappedTransaction) Delete(ctx context.Context, list ...interface{}) (int64, error) {
139-
return (WrappedExecutor{SqlExecutor: tx.Transaction}).Delete(ctx, list...)
168+
return (WrappedExecutor{sqlExecutor: tx.transaction}).Delete(ctx, list...)
140169
}
141170

142171
func (tx WrappedTransaction) Select(ctx context.Context, holder interface{}, query string, args ...interface{}) ([]interface{}, error) {
143-
return (WrappedExecutor{SqlExecutor: tx.Transaction}).Select(ctx, holder, query, args...)
172+
return (WrappedExecutor{sqlExecutor: tx.transaction}).Select(ctx, holder, query, args...)
144173
}
145174

146175
func (tx WrappedTransaction) SelectOne(ctx context.Context, holder interface{}, query string, args ...interface{}) error {
147-
return (WrappedExecutor{SqlExecutor: tx.Transaction}).SelectOne(ctx, holder, query, args...)
176+
return (WrappedExecutor{sqlExecutor: tx.transaction}).SelectOne(ctx, holder, query, args...)
148177
}
149178

150179
func (tx WrappedTransaction) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) {
151-
return (WrappedExecutor{SqlExecutor: tx.Transaction}).QueryContext(ctx, query, args...)
180+
return (WrappedExecutor{sqlExecutor: tx.transaction}).QueryContext(ctx, query, args...)
152181
}
153182

154183
func (tx WrappedTransaction) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) {
155-
return (WrappedExecutor{SqlExecutor: tx.Transaction}).ExecContext(ctx, query, args...)
184+
return (WrappedExecutor{sqlExecutor: tx.transaction}).ExecContext(ctx, query, args...)
156185
}
157186

158187
// WrappedExecutor wraps a borp.SqlExecutor such that its major functions
159188
// wrap error results in ErrDatabaseOp instances before returning them to the
160189
// caller.
161190
type WrappedExecutor struct {
162-
borp.SqlExecutor
191+
sqlExecutor borp.SqlExecutor
163192
}
164193

165194
func errForOp(operation string, err error, list []interface{}) ErrDatabaseOp {
@@ -196,55 +225,77 @@ func errForQuery(query, operation string, err error, list []interface{}) ErrData
196225
}
197226

198227
func (we WrappedExecutor) Get(ctx context.Context, holder interface{}, keys ...interface{}) (interface{}, error) {
199-
res, err := we.SqlExecutor.Get(ctx, holder, keys...)
228+
res, err := we.sqlExecutor.Get(ctx, holder, keys...)
200229
if err != nil {
201230
return res, errForOp("get", err, []interface{}{holder})
202231
}
203232
return res, err
204233
}
205234

206235
func (we WrappedExecutor) Insert(ctx context.Context, list ...interface{}) error {
207-
err := we.SqlExecutor.Insert(ctx, list...)
236+
err := we.sqlExecutor.Insert(ctx, list...)
208237
if err != nil {
209238
return errForOp("insert", err, list)
210239
}
211240
return nil
212241
}
213242

214243
func (we WrappedExecutor) Update(ctx context.Context, list ...interface{}) (int64, error) {
215-
updatedRows, err := we.SqlExecutor.Update(ctx, list...)
244+
updatedRows, err := we.sqlExecutor.Update(ctx, list...)
216245
if err != nil {
217246
return updatedRows, errForOp("update", err, list)
218247
}
219248
return updatedRows, err
220249
}
221250

222251
func (we WrappedExecutor) Delete(ctx context.Context, list ...interface{}) (int64, error) {
223-
deletedRows, err := we.SqlExecutor.Delete(ctx, list...)
252+
deletedRows, err := we.sqlExecutor.Delete(ctx, list...)
224253
if err != nil {
225254
return deletedRows, errForOp("delete", err, list)
226255
}
227256
return deletedRows, err
228257
}
229258

230259
func (we WrappedExecutor) Select(ctx context.Context, holder interface{}, query string, args ...interface{}) ([]interface{}, error) {
231-
result, err := we.SqlExecutor.Select(ctx, holder, query, args...)
260+
result, err := we.sqlExecutor.Select(ctx, holder, query, args...)
232261
if err != nil {
233262
return result, errForQuery(query, "select", err, []interface{}{holder})
234263
}
235264
return result, err
236265
}
237266

238267
func (we WrappedExecutor) SelectOne(ctx context.Context, holder interface{}, query string, args ...interface{}) error {
239-
err := we.SqlExecutor.SelectOne(ctx, holder, query, args...)
268+
err := we.sqlExecutor.SelectOne(ctx, holder, query, args...)
240269
if err != nil {
241270
return errForQuery(query, "select one", err, []interface{}{holder})
242271
}
243272
return nil
244273
}
245274

275+
func (we WrappedExecutor) SelectNullInt(ctx context.Context, query string, args ...interface{}) (sql.NullInt64, error) {
276+
rows, err := we.sqlExecutor.SelectNullInt(ctx, query, args...)
277+
if err != nil {
278+
return sql.NullInt64{}, errForQuery(query, "select", err, nil)
279+
}
280+
return rows, nil
281+
}
282+
283+
func (we WrappedExecutor) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row {
284+
// Note: we can't do error wrapping here because the error is passed via the `*sql.Row`
285+
// object, and we can't produce a `*sql.Row` object with a custom error because it is unexported.
286+
return we.sqlExecutor.QueryRowContext(ctx, query, args...)
287+
}
288+
289+
func (we WrappedExecutor) SelectStr(ctx context.Context, query string, args ...interface{}) (string, error) {
290+
str, err := we.sqlExecutor.SelectStr(ctx, query, args...)
291+
if err != nil {
292+
return "", errForQuery(query, "select", err, nil)
293+
}
294+
return str, nil
295+
}
296+
246297
func (we WrappedExecutor) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) {
247-
rows, err := we.SqlExecutor.QueryContext(ctx, query, args...)
298+
rows, err := we.sqlExecutor.QueryContext(ctx, query, args...)
248299
if err != nil {
249300
return nil, errForQuery(query, "select", err, nil)
250301
}
@@ -288,7 +339,7 @@ func tableFromQuery(query string) string {
288339
}
289340

290341
func (we WrappedExecutor) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) {
291-
res, err := we.SqlExecutor.ExecContext(ctx, query, args...)
342+
res, err := we.sqlExecutor.ExecContext(ctx, query, args...)
292343
if err != nil {
293344
return res, errForQuery(query, "exec", err, args)
294345
}

db/map_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ func testDbMap(t *testing.T) *WrappedMap {
240240
// NOTE(@cpu): We avoid giving a sa.BoulderTypeConverter to the DbMap field to
241241
// avoid the cyclic dep. We don't need to convert any types in the db tests.
242242
dbMap := &borp.DbMap{Db: dbConn, Dialect: dialect, TypeConverter: nil}
243-
return &WrappedMap{DbMap: dbMap}
243+
return &WrappedMap{dbMap: dbMap}
244244
}
245245

246246
func TestWrappedMap(t *testing.T) {

sa/database.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func InitWrappedDb(config cmd.DBConfig, scope prometheus.Registerer, logger blog
8282
}
8383

8484
if scope != nil {
85-
err = initDBMetrics(dbMap.Db, scope, settings, addr, user)
85+
err = initDBMetrics(dbMap.SQLDb(), scope, settings, addr, user)
8686
if err != nil {
8787
return nil, fmt.Errorf("while initializing metrics: %w", err)
8888
}
@@ -170,7 +170,7 @@ func newDbMapFromMySQLConfig(config *mysql.Config, settings DbSettings) (*boulde
170170
dbmap := &borp.DbMap{Db: db, Dialect: dialect, TypeConverter: BoulderTypeConverter{}}
171171

172172
initTables(dbmap)
173-
return &boulderDB.WrappedMap{DbMap: dbmap}, nil
173+
return boulderDB.NewWrappedMap(dbmap), nil
174174
}
175175

176176
// adjustMySQLConfig sets certain flags that we want on every connection.
@@ -241,7 +241,7 @@ func adjustMySQLConfig(conf *mysql.Config) error {
241241

242242
// SetSQLDebug enables borp SQL-level Debugging
243243
func SetSQLDebug(dbMap *boulderDB.WrappedMap, log blog.Logger) {
244-
dbMap.TraceOn("SQL: ", &SQLLogger{log})
244+
dbMap.BorpDB().TraceOn("SQL: ", &SQLLogger{log})
245245
}
246246

247247
// SQLLogger adapts the Boulder Logger to a format borp can use.

0 commit comments

Comments
 (0)