...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package file
21
22 import (
23 "io"
24
25 "github.com/apache/arrow/go/v15/parquet"
26 "golang.org/x/exp/mmap"
27 "golang.org/x/xerrors"
28 )
29
30 func mmapOpen(filename string) (parquet.ReaderAtSeeker, error) {
31 rdr, err := mmap.Open(filename)
32 if err != nil {
33 return nil, err
34 }
35 return &mmapAdapter{rdr, 0}, nil
36 }
37
38
39 type mmapAdapter struct {
40 *mmap.ReaderAt
41
42 pos int64
43 }
44
45 func (m *mmapAdapter) Close() error {
46 return m.ReaderAt.Close()
47 }
48
49 func (m *mmapAdapter) ReadAt(p []byte, off int64) (int, error) {
50 return m.ReaderAt.ReadAt(p, off)
51 }
52
53 func (m *mmapAdapter) Read(p []byte) (n int, err error) {
54 n, err = m.ReaderAt.ReadAt(p, m.pos)
55 m.pos += int64(n)
56 return
57 }
58
59 func (m *mmapAdapter) Seek(offset int64, whence int) (int64, error) {
60 newPos, offs := int64(0), offset
61 switch whence {
62 case io.SeekStart:
63 newPos = offs
64 case io.SeekCurrent:
65 newPos = m.pos + offs
66 case io.SeekEnd:
67 newPos = int64(m.ReaderAt.Len()) + offs
68 }
69 if newPos < 0 {
70 return 0, xerrors.New("negative result pos")
71 }
72 if newPos > int64(m.ReaderAt.Len()) {
73 return 0, xerrors.New("new position exceeds size of file")
74 }
75 m.pos = newPos
76 return newPos, nil
77 }
78
View as plain text