@@ -98,46 +98,44 @@ func (dbr *DiskBufferReader) Reset() error {
9898
9999// Seek sets the offset for the next Read or Write to offset.
100100func (dbr * DiskBufferReader ) Seek (offset int64 , whence int ) (int64 , error ) {
101- newIndex := dbr .index
102-
103101 switch whence {
104102 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
106111 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 )
121118 }
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+ }
129130 }
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" )
134133 }
135-
136- dbr .bytesRead += int64 ( m )
134+ dbr . index += offset
135+ return dbr .index , nil
137136 }
138137
139- dbr .index = newIndex
140- return newIndex , nil
138+ return dbr .index , nil
141139}
142140
143141// ReadAt reads len(p) bytes into p starting at offset off in the underlying input source.
0 commit comments