@@ -44,17 +44,13 @@ import (
44
44
"fmt"
45
45
"io"
46
46
"reflect"
47
- "slices"
48
47
"strconv"
49
48
"strings"
50
49
"sync"
51
- "sync/atomic"
52
50
"testing"
53
51
"time"
54
- )
55
-
56
- // fakeDriver is a fake database that implements Go's driver.Driver
57
- // (and driver.DriverContext for Sentry purposes) interface, just for testing.
52
+ ) // fakeDriver is a fake database that implements Go's driver.Driver
53
+ // interface, just for testing.
58
54
//
59
55
// It speaks a query language that's semantically similar to but
60
56
// syntactically different and simpler than SQL. The syntax is as
@@ -93,8 +89,6 @@ type fakeConnector struct {
93
89
closed bool
94
90
}
95
91
96
- var _ driver.Connector = & fakeConnector {}
97
-
98
92
func (c * fakeConnector ) Connect (context.Context ) (driver.Conn , error ) {
99
93
conn , err := fdriver .Open (c .name )
100
94
conn .(* fakeConn ).waiter = c .waiter
@@ -126,8 +120,6 @@ func (cc *fakeDriverCtx) OpenConnector(name string) (driver.Connector, error) {
126
120
type fakeDB struct {
127
121
name string
128
122
129
- useRawBytes atomic.Bool
130
-
131
123
mu sync.Mutex
132
124
tables map [string ]* table
133
125
badConn bool
@@ -155,7 +147,12 @@ type table struct {
155
147
}
156
148
157
149
func (t * table ) columnIndex (name string ) int {
158
- return slices .Index (t .colname , name )
150
+ for n , nname := range t .colname {
151
+ if name == nname {
152
+ return n
153
+ }
154
+ }
155
+ return - 1
159
156
}
160
157
161
158
type row struct {
@@ -243,6 +240,15 @@ type fakeStmt struct {
243
240
244
241
var fdriver driver.Driver = & fakeDriver {}
245
242
243
+ func contains (list []string , y string ) bool {
244
+ for _ , x := range list {
245
+ if x == y {
246
+ return true
247
+ }
248
+ }
249
+ return false
250
+ }
251
+
246
252
type Dummy struct {
247
253
driver.Driver
248
254
}
@@ -352,8 +358,10 @@ func (db *fakeDB) columnType(table, column string) (typ string, ok bool) {
352
358
if ! ok {
353
359
return
354
360
}
355
- if i := slices .Index (t .colname , column ); i != - 1 {
356
- return t .coltype [i ], true
361
+ for n , cname := range t .colname {
362
+ if cname == column {
363
+ return t .coltype [n ], true
364
+ }
357
365
}
358
366
return "" , false
359
367
}
@@ -519,7 +527,8 @@ func errf(msg string, args ...any) error {
519
527
520
528
// parts are table|selectCol1,selectCol2|whereCol=?,whereCol2=?
521
529
// (note that where columns must always contain ? marks,
522
- // just a limitation for fakedb)
530
+ //
531
+ // just a limitation for fakedb)
523
532
func (c * fakeConn ) prepareSelect (stmt * fakeStmt , parts []string ) (* fakeStmt , error ) {
524
533
if len (parts ) != 3 {
525
534
stmt .Close ()
@@ -651,7 +660,7 @@ func (c *fakeConn) PrepareContext(ctx context.Context, query string) (driver.Stm
651
660
}
652
661
653
662
if c .stickyBad || (hookPrepareBadConn != nil && hookPrepareBadConn ()) {
654
- return nil , fakeError {Message : "Prepare : Sticky Bad" , Wrapped : driver .ErrBadConn }
663
+ return nil , fakeError {Message : "Preapre : Sticky Bad" , Wrapped : driver .ErrBadConn }
655
664
}
656
665
657
666
c .touchMem ()
@@ -705,8 +714,6 @@ func (c *fakeConn) PrepareContext(ctx context.Context, query string) (driver.Stm
705
714
switch cmd {
706
715
case "WIPE" :
707
716
// Nothing
708
- case "USE_RAWBYTES" :
709
- c .db .useRawBytes .Store (true )
710
717
case "SELECT" :
711
718
stmt , err = c .prepareSelect (stmt , parts )
712
719
case "CREATE" :
@@ -810,9 +817,6 @@ func (s *fakeStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (d
810
817
case "WIPE" :
811
818
db .wipe ()
812
819
return driver .ResultNoRows , nil
813
- case "USE_RAWBYTES" :
814
- s .c .db .useRawBytes .Store (true )
815
- return driver .ResultNoRows , nil
816
820
case "CREATE" :
817
821
if err := db .createTable (s .table , s .colName , s .colType ); err != nil {
818
822
return nil , err
@@ -828,15 +832,6 @@ func (s *fakeStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (d
828
832
return nil , fmt .Errorf ("fakedb: unimplemented statement Exec command type of %q" , s .cmd )
829
833
}
830
834
831
- func valueFromPlaceholderName (args []driver.NamedValue , name string ) driver.Value {
832
- for i := range args {
833
- if args [i ].Name == name {
834
- return args [i ].Value
835
- }
836
- }
837
- return nil
838
- }
839
-
840
835
// When doInsert is true, add the row to the table.
841
836
// When doInsert is false do prep-work and error checking, but don't
842
837
// actually add the row to the table.
@@ -871,8 +866,11 @@ func (s *fakeStmt) execInsert(args []driver.NamedValue, doInsert bool) (driver.R
871
866
val = args [argPos ].Value
872
867
} else {
873
868
// Assign value from argument placeholder name.
874
- if v := valueFromPlaceholderName (args , strvalue [1 :]); v != nil {
875
- val = v
869
+ for _ , a := range args {
870
+ if a .Name == strvalue [1 :] {
871
+ val = a .Value
872
+ break
873
+ }
876
874
}
877
875
}
878
876
argPos ++
@@ -948,7 +946,6 @@ func (s *fakeStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (
948
946
txStatus = "transaction"
949
947
}
950
948
cursor := & rowsCursor {
951
- db : s .c .db ,
952
949
parentMem : s .c ,
953
950
posRow : - 1 ,
954
951
rows : [][]* row {
@@ -1008,8 +1005,12 @@ func (s *fakeStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (
1008
1005
if wcol .Placeholder == "?" {
1009
1006
argValue = args [wcol .Ordinal - 1 ].Value
1010
1007
} else {
1011
- if v := valueFromPlaceholderName (args , wcol .Placeholder [1 :]); v != nil {
1012
- argValue = v
1008
+ // Assign arg value from placeholder name.
1009
+ for _ , a := range args {
1010
+ if a .Name == wcol .Placeholder [1 :] {
1011
+ argValue = a .Value
1012
+ break
1013
+ }
1013
1014
}
1014
1015
}
1015
1016
if fmt .Sprintf ("%v" , tcol ) != fmt .Sprintf ("%v" , argValue ) {
@@ -1041,7 +1042,6 @@ func (s *fakeStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (
1041
1042
}
1042
1043
1043
1044
cursor := & rowsCursor {
1044
- db : s .c .db ,
1045
1045
parentMem : s .c ,
1046
1046
posRow : - 1 ,
1047
1047
rows : setMRows ,
@@ -1084,7 +1084,6 @@ func (tx *fakeTx) Rollback() error {
1084
1084
}
1085
1085
1086
1086
type rowsCursor struct {
1087
- db * fakeDB
1088
1087
parentMem memToucher
1089
1088
cols [][]string
1090
1089
colType [][]string
@@ -1107,9 +1106,6 @@ type rowsCursor struct {
1107
1106
// This is separate from the fakeConn.line to allow for drivers that
1108
1107
// can start multiple queries on the same transaction at the same time.
1109
1108
line int64
1110
-
1111
- // closeErr is returned when rowsCursor.Close
1112
- closeErr error
1113
1109
}
1114
1110
1115
1111
func (rc * rowsCursor ) touchMem () {
@@ -1121,7 +1117,7 @@ func (rc *rowsCursor) Close() error {
1121
1117
rc .touchMem ()
1122
1118
rc .parentMem .touchMem ()
1123
1119
rc .closed = true
1124
- return rc . closeErr
1120
+ return nil
1125
1121
}
1126
1122
1127
1123
func (rc * rowsCursor ) Columns () []string {
@@ -1159,7 +1155,7 @@ func (rc *rowsCursor) Next(dest []driver.Value) error {
1159
1155
// messing up conversions or doing them differently.
1160
1156
dest [i ] = v
1161
1157
1162
- if bs , ok := v .([]byte ); ok && ! rc . db . useRawBytes . Load () {
1158
+ if bs , ok := v .([]byte ); ok {
1163
1159
if rc .bytesClone == nil {
1164
1160
rc .bytesClone = make (map [* byte ][]byte )
1165
1161
}
0 commit comments