@@ -98,44 +98,46 @@ func (dbr *DiskBufferReader) Reset() error {
98
98
99
99
// Seek sets the offset for the next Read or Write to offset.
100
100
func (dbr * DiskBufferReader ) Seek (offset int64 , whence int ) (int64 , error ) {
101
+ newIndex := dbr .index
102
+
101
103
switch whence {
102
104
case io .SeekStart :
103
- switch {
104
- case offset < 0 :
105
- return 0 , fmt .Errorf ("can not seek to before start of reader" )
106
- case offset > dbr .bytesRead :
107
- trashBytes := make ([]byte , offset - dbr .bytesRead )
108
- dbr .Read (trashBytes )
109
- }
110
- dbr .index = offset
105
+ newIndex = offset
111
106
case io .SeekCurrent :
112
- switch {
113
- case dbr .index + offset < 0 :
114
- return 0 , fmt .Errorf ("can not seek to before start of reader" )
115
- case offset > 0 :
116
- trashBytes := make ([]byte , offset )
117
- dbr .Read (trashBytes )
118
- }
119
- dbr .index += offset
107
+ newIndex += offset
120
108
case io .SeekEnd :
121
- trashBytes := make ([]byte , 1024 )
122
- for {
123
- _ , err := dbr .Read (trashBytes )
124
- if err != nil {
125
- if errors .Is (err , io .EOF ) {
126
- break
127
- }
128
- return dbr .index , err
129
- }
109
+ newIndex = dbr .bytesRead + offset
110
+ }
111
+
112
+ if newIndex < 0 {
113
+ return 0 , fmt .Errorf ("can not seek to before start of reader" )
114
+ }
115
+
116
+ // If seeking past the bytes read and recording is on, fill the gap by reading the necessary bytes.
117
+ if newIndex > dbr .bytesRead && dbr .recording {
118
+ _ , err := dbr .tmpFile .Seek (0 , io .SeekEnd )
119
+ if err != nil {
120
+ return 0 , err
130
121
}
131
- if dbr .index + offset < 0 {
132
- return 0 , fmt .Errorf ("can not seek to before start of reader" )
122
+
123
+ bytesToRead := int (newIndex - dbr .bytesRead )
124
+ trashBytes := make ([]byte , bytesToRead )
125
+
126
+ n , err := dbr .reader .Read (trashBytes )
127
+ if err != nil && ! errors .Is (err , io .EOF ) {
128
+ return 0 , err
129
+ }
130
+
131
+ m , err := dbr .tmpFile .Write (trashBytes [:n ])
132
+ if err != nil {
133
+ return 0 , err
133
134
}
134
- dbr . index += offset
135
- return dbr .index , nil
135
+
136
+ dbr .bytesRead += int64 ( m )
136
137
}
137
138
138
- return dbr .index , nil
139
+ dbr .index = newIndex
140
+ return newIndex , nil
139
141
}
140
142
141
143
// ReadAt reads len(p) bytes into p starting at offset off in the underlying input source.
0 commit comments