@@ -98,46 +98,44 @@ 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
-
103
101
switch whence {
104
102
case io .SeekStart :
105
- newIndex = offset
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
106
111
case io .SeekCurrent :
107
- newIndex += offset
108
- case io .SeekEnd :
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
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 )
121
118
}
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
119
+ dbr .index += offset
120
+ 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
+ }
129
130
}
130
-
131
- m , err := dbr .tmpFile .Write (trashBytes [:n ])
132
- if err != nil {
133
- return 0 , err
131
+ if dbr .index + offset < 0 {
132
+ return 0 , fmt .Errorf ("can not seek to before start of reader" )
134
133
}
135
-
136
- dbr .bytesRead += int64 ( m )
134
+ dbr . index += offset
135
+ return dbr .index , nil
137
136
}
138
137
139
- dbr .index = newIndex
140
- return newIndex , nil
138
+ return dbr .index , nil
141
139
}
142
140
143
141
// ReadAt reads len(p) bytes into p starting at offset off in the underlying input source.
0 commit comments