| 172 | func (fr *FileReader) Close() error { return nil } |
| 173 | |
| 174 | func (fr *FileReader) ReadAt(p []byte, offset int64) (n int, err error) { |
| 175 | if offset < 0 { |
| 176 | return 0, errors.New("schema/filereader: negative offset") |
| 177 | } |
| 178 | if offset >= fr.Size() { |
| 179 | return 0, io.EOF |
| 180 | } |
| 181 | want := len(p) |
| 182 | for len(p) > 0 && err == nil { |
| 183 | rc, err := fr.readerForOffset(context.TODO(), offset) |
| 184 | if err != nil { |
| 185 | return n, err |
| 186 | } |
| 187 | var n1 int |
| 188 | n1, err = io.ReadFull(rc, p) |
| 189 | rc.Close() |
| 190 | if err == io.EOF || err == io.ErrUnexpectedEOF { |
| 191 | err = nil |
| 192 | } |
| 193 | if n1 == 0 { |
| 194 | break |
| 195 | } |
| 196 | p = p[n1:] |
| 197 | offset += int64(n1) |
| 198 | n += n1 |
| 199 | } |
| 200 | if n < want && err == nil { |
| 201 | err = io.ErrUnexpectedEOF |
| 202 | } |
| 203 | return n, err |
| 204 | } |
| 205 | |
| 206 | // ForeachChunk calls fn for each chunk of fr, in order. |
| 207 | // |