@@ -22,15 +22,17 @@ var _ io.Writer = &SQLiteBlob{}
22
22
var _ io.Seeker = & SQLiteBlob {}
23
23
var _ io.Closer = & SQLiteBlob {}
24
24
25
- func blobTestData (dbname string , rowid int64 , blob []byte ) (* sql.DB , * SQLiteConn , error ) {
25
+ type driverConnCallback func (* testing.T , * SQLiteConn )
26
+
27
+ func blobTestData (t * testing.T , dbname string , rowid int64 , blob []byte , c driverConnCallback ) error {
26
28
db , err := sql .Open ("sqlite3" , "file:" + dbname + "?mode=memory&cache=shared" )
27
29
if err != nil {
28
- return nil , nil , err
30
+ return err
29
31
}
30
32
31
33
conn , err := db .Conn (context .Background ())
32
34
if err != nil {
33
- return nil , nil , err
35
+ return err
34
36
}
35
37
defer conn .Close ()
36
38
@@ -40,8 +42,9 @@ func blobTestData(dbname string, rowid int64, blob []byte) (*sql.DB, *SQLiteConn
40
42
return nil
41
43
})
42
44
if err != nil {
43
- return nil , nil , err
45
+ return err
44
46
}
47
+ defer driverConn .Close ()
45
48
46
49
query := `
47
50
CREATE TABLE data (
@@ -54,65 +57,67 @@ func blobTestData(dbname string, rowid int64, blob []byte) (*sql.DB, *SQLiteConn
54
57
55
58
_ , err = db .Exec (query , sql .Named ("rowid" , rowid ), sql .Named ("value" , blob ))
56
59
if err != nil {
57
- return nil , nil , err
60
+ return err
58
61
}
59
62
60
- return db , driverConn , nil
63
+ c (t , driverConn )
64
+
65
+ return nil
61
66
}
62
67
63
68
func TestBlobRead (t * testing.T ) {
64
69
rowid := int64 (6581 )
65
70
expected := []byte ("I ❤️ SQLite in \x00 \x01 \x02 …" )
66
71
67
- db , driverConn , err := blobTestData ("testblobread" , rowid , expected )
68
- if err != nil {
69
- t .Fatal ("Failed to get raw connection:" , err )
70
- }
71
- defer driverConn .Close ()
72
- defer db .Close ()
72
+ err := blobTestData (t , "testblobread" , rowid , expected , func (t * testing.T , driverConn * SQLiteConn ) {
73
73
74
- // Open blob
75
- blob , err := driverConn .Blob ("main" , "data" , "value" , rowid , 0 )
76
- if err != nil {
77
- t .Error ("failed" , err )
78
- }
79
- defer blob .Close ()
74
+ // Open blob
75
+ blob , err := driverConn .Blob ("main" , "data" , "value" , rowid , 0 )
76
+ if err != nil {
77
+ t .Error ("failed" , err )
78
+ }
79
+ defer blob .Close ()
80
80
81
- // Read blob incrementally
82
- middle := len (expected ) / 2
83
- first := expected [:middle ]
84
- second := expected [middle :]
81
+ // Read blob incrementally
82
+ middle := len (expected ) / 2
83
+ first := expected [:middle ]
84
+ second := expected [middle :]
85
85
86
- // Read part Ⅰ
87
- b1 := make ([]byte , len (first ))
88
- n1 , err := blob .Read (b1 )
86
+ // Read part Ⅰ
87
+ b1 := make ([]byte , len (first ))
88
+ n1 , err := blob .Read (b1 )
89
89
90
- if err != nil || n1 != len (b1 ) {
91
- t .Errorf ("Failed to read %d bytes" , n1 )
92
- }
90
+ if err != nil || n1 != len (b1 ) {
91
+ t .Errorf ("Failed to read %d bytes" , n1 )
92
+ }
93
93
94
- if bytes .Compare (first , b1 ) != 0 {
95
- t .Error ("Expected\n " , first , "got\n " , b1 )
96
- }
94
+ if bytes .Compare (first , b1 ) != 0 {
95
+ t .Error ("Expected\n " , first , "got\n " , b1 )
96
+ }
97
97
98
- // Read part Ⅱ
99
- b2 := make ([]byte , len (second ))
100
- n2 , err := blob .Read (b2 )
98
+ // Read part Ⅱ
99
+ b2 := make ([]byte , len (second ))
100
+ n2 , err := blob .Read (b2 )
101
101
102
- if err != nil || n2 != len (b2 ) {
103
- t .Errorf ("Failed to read %d bytes" , n2 )
104
- }
102
+ if err != nil || n2 != len (b2 ) {
103
+ t .Errorf ("Failed to read %d bytes" , n2 )
104
+ }
105
105
106
- if bytes .Compare (second , b2 ) != 0 {
107
- t .Error ("Expected\n " , second , "got\n " , b2 )
108
- }
106
+ if bytes .Compare (second , b2 ) != 0 {
107
+ t .Error ("Expected\n " , second , "got\n " , b2 )
108
+ }
109
+
110
+ // EOF
111
+ b3 := make ([]byte , 10 )
112
+ n3 , err := blob .Read (b3 )
109
113
110
- // EOF
111
- b3 := make ([]byte , 10 )
112
- n3 , err := blob .Read (b3 )
114
+ if err != io .EOF || n3 != 0 {
115
+ t .Error ("Expected EOF" , err )
116
+ }
117
+ })
113
118
114
- if err != io . EOF || n3 != 0 {
115
- t .Error ( "Expected EOF " , err )
119
+ if err != nil {
120
+ t .Fatal ( "Failed to get raw connection: " , err )
116
121
}
117
122
}
118
123
@@ -126,126 +131,127 @@ func TestBlobWrite(t *testing.T) {
126
131
127
132
// Allocate a zero blob
128
133
data := make ([]byte , len (expected ))
129
- db , driverConn , err := blobTestData ("testblobwrite" , rowid , data )
130
- if err != nil {
131
- t .Fatal ("Failed to get raw connection:" , err )
132
- }
133
- defer driverConn .Close ()
134
- defer db .Close ()
134
+ err := blobTestData (t , "testblobwrite" , rowid , data , func (t * testing.T , driverConn * SQLiteConn ) {
135
135
136
- // Open blob for read/write
137
- blob , err := driverConn .Blob ("main" , "data" , "value" , rowid , 1 )
138
- if err != nil {
139
- t .Error ("failed" , err )
140
- }
141
- defer blob .Close ()
136
+ // Open blob for read/write
137
+ blob , err := driverConn .Blob ("main" , "data" , "value" , rowid , 1 )
138
+ if err != nil {
139
+ t .Error ("failed" , err )
140
+ }
141
+ defer blob .Close ()
142
142
143
- // Write blob incrementally
144
- middle := len (expected ) / 2
145
- first := expected [:middle ]
146
- second := expected [middle :]
143
+ // Write blob incrementally
144
+ middle := len (expected ) / 2
145
+ first := expected [:middle ]
146
+ second := expected [middle :]
147
147
148
- // Write part Ⅰ
149
- n1 , err := blob .Write (first )
148
+ // Write part Ⅰ
149
+ n1 , err := blob .Write (first )
150
150
151
- if err != nil || n1 != len (first ) {
152
- t .Errorf ("Failed to write %d bytes" , n1 )
153
- }
151
+ if err != nil || n1 != len (first ) {
152
+ t .Errorf ("Failed to write %d bytes" , n1 )
153
+ }
154
154
155
- // Write part Ⅱ
156
- n2 , err := blob .Write (second )
155
+ // Write part Ⅱ
156
+ n2 , err := blob .Write (second )
157
157
158
- if err != nil || n2 != len (second ) {
159
- t .Errorf ("Failed to write %d bytes" , n2 )
160
- }
158
+ if err != nil || n2 != len (second ) {
159
+ t .Errorf ("Failed to write %d bytes" , n2 )
160
+ }
161
161
162
- // EOF
163
- b3 := make ([]byte , 10 )
164
- n3 , err := blob .Write (b3 )
162
+ // EOF
163
+ b3 := make ([]byte , 10 )
164
+ n3 , err := blob .Write (b3 )
165
165
166
- if err != io .EOF || n3 != 0 {
167
- t .Error ("Expected EOF" , err )
168
- }
166
+ if err != io .EOF || n3 != 0 {
167
+ t .Error ("Expected EOF" , err )
168
+ }
169
169
170
- // Verify written data
171
- _ , err = blob .Seek (0 , io .SeekStart )
172
- if err != nil {
173
- t .Fatal ("Failed to seek:" , err )
174
- }
170
+ // Verify written data
171
+ _ , err = blob .Seek (0 , io .SeekStart )
172
+ if err != nil {
173
+ t .Fatal ("Failed to seek:" , err )
174
+ }
175
175
176
- b4 := make ([]byte , len (expected ))
177
- n4 , err := blob .Read (b4 )
176
+ b4 := make ([]byte , len (expected ))
177
+ n4 , err := blob .Read (b4 )
178
178
179
- if err != nil || n4 != len (b4 ) {
180
- t .Errorf ("Failed to read %d bytes" , n4 )
181
- }
179
+ if err != nil || n4 != len (b4 ) {
180
+ t .Errorf ("Failed to read %d bytes" , n4 )
181
+ }
182
+
183
+ if bytes .Compare (expected , b4 ) != 0 {
184
+ t .Error ("Expected\n " , expected , "got\n " , b4 )
185
+ }
182
186
183
- if bytes .Compare (expected , b4 ) != 0 {
184
- t .Error ("Expected\n " , expected , "got\n " , b4 )
187
+ })
188
+ if err != nil {
189
+ t .Fatal ("Failed to get raw connection:" , err )
185
190
}
186
191
}
187
192
188
193
func TestBlobSeek (t * testing.T ) {
189
194
rowid := int64 (6510 )
190
195
data := make ([]byte , 1000 )
191
196
192
- db , driverConn , err := blobTestData ("testblobseek" , rowid , data )
193
- if err != nil {
194
- t .Fatal ("Failed to get raw connection:" , err )
195
- }
196
- defer driverConn .Close ()
197
- defer db .Close ()
198
-
199
- // Open blob
200
- blob , err := driverConn .Blob ("main" , "data" , "value" , rowid , 0 )
201
- if err != nil {
202
- t .Error ("failed" , err )
203
- }
204
- defer blob .Close ()
205
-
206
- // Test data
207
- begin := int64 (0 )
208
- middle := int64 (len (data ) / 2 )
209
- end := int64 (len (data ) - 1 )
210
- eof := int64 (len (data ))
211
-
212
- tests := []struct {
213
- offset int64
214
- whence int
215
- expected int64
216
- }{
217
- {offset : begin , whence : io .SeekStart , expected : begin },
218
- {offset : middle , whence : io .SeekStart , expected : middle },
219
- {offset : end , whence : io .SeekStart , expected : end },
220
- {offset : eof , whence : io .SeekStart , expected : eof },
221
-
222
- {offset : - 1 , whence : io .SeekCurrent , expected : middle - 1 },
223
- {offset : 0 , whence : io .SeekCurrent , expected : middle },
224
- {offset : 1 , whence : io .SeekCurrent , expected : middle + 1 },
225
- {offset : - middle , whence : io .SeekCurrent , expected : begin },
226
-
227
- {offset : - 2 , whence : io .SeekEnd , expected : end - 1 },
228
- {offset : - 1 , whence : io .SeekEnd , expected : end },
229
- {offset : 0 , whence : io .SeekEnd , expected : eof },
230
- {offset : 1 , whence : io .SeekEnd , expected : eof + 1 },
231
- {offset : - eof , whence : io .SeekEnd , expected : begin },
232
- }
197
+ err := blobTestData (t , "testblobseek" , rowid , data , func (t * testing.T , driverConn * SQLiteConn ) {
233
198
234
- for _ , tc := range tests {
235
- // Start in the middle
236
- _ , err := blob .Seek (middle , io .SeekStart )
199
+ // Open blob
200
+ blob , err := driverConn .Blob ("main" , "data" , "value" , rowid , 0 )
237
201
if err != nil {
238
- t .Fatal ( "Failed to seek: " , err )
202
+ t .Error ( "failed " , err )
239
203
}
240
-
241
- // Test
242
- got , err := blob .Seek (tc .offset , tc .whence )
243
- if err != nil {
244
- t .Fatal ("Failed to seek:" , err )
204
+ defer blob .Close ()
205
+
206
+ // Test data
207
+ begin := int64 (0 )
208
+ middle := int64 (len (data ) / 2 )
209
+ end := int64 (len (data ) - 1 )
210
+ eof := int64 (len (data ))
211
+
212
+ tests := []struct {
213
+ offset int64
214
+ whence int
215
+ expected int64
216
+ }{
217
+ {offset : begin , whence : io .SeekStart , expected : begin },
218
+ {offset : middle , whence : io .SeekStart , expected : middle },
219
+ {offset : end , whence : io .SeekStart , expected : end },
220
+ {offset : eof , whence : io .SeekStart , expected : eof },
221
+
222
+ {offset : - 1 , whence : io .SeekCurrent , expected : middle - 1 },
223
+ {offset : 0 , whence : io .SeekCurrent , expected : middle },
224
+ {offset : 1 , whence : io .SeekCurrent , expected : middle + 1 },
225
+ {offset : - middle , whence : io .SeekCurrent , expected : begin },
226
+
227
+ {offset : - 2 , whence : io .SeekEnd , expected : end - 1 },
228
+ {offset : - 1 , whence : io .SeekEnd , expected : end },
229
+ {offset : 0 , whence : io .SeekEnd , expected : eof },
230
+ {offset : 1 , whence : io .SeekEnd , expected : eof + 1 },
231
+ {offset : - eof , whence : io .SeekEnd , expected : begin },
245
232
}
246
233
247
- if tc .expected != got {
248
- t .Error ("For" , tc , "expected" , tc .expected , "got" , got )
234
+ for _ , tc := range tests {
235
+ // Start in the middle
236
+ _ , err := blob .Seek (middle , io .SeekStart )
237
+ if err != nil {
238
+ t .Fatal ("Failed to seek:" , err )
239
+ }
240
+
241
+ // Test
242
+ got , err := blob .Seek (tc .offset , tc .whence )
243
+ if err != nil {
244
+ t .Fatal ("Failed to seek:" , err )
245
+ }
246
+
247
+ if tc .expected != got {
248
+ t .Error ("For" , tc , "expected" , tc .expected , "got" , got )
249
+ }
249
250
}
251
+
252
+ })
253
+
254
+ if err != nil {
255
+ t .Fatal ("Failed to get raw connection:" , err )
250
256
}
251
257
}
0 commit comments