MCPcopy
hub / github.com/go-sql-driver/mysql / handleInFileRequest

Method handleInFileRequest

infile.go:96–181  ·  view source on GitHub ↗

16KB is small enough for disk readahead and large enough for TCP

(name string)

Source from the content-addressed store, hash-verified

94const defaultPacketSize = 16 * 1024 // 16KB is small enough for disk readahead and large enough for TCP
95
96func (mc *okHandler) handleInFileRequest(name string) (err error) {
97 var rdr io.Reader
98 packetSize := min(mc.maxWriteSize, defaultPacketSize)
99
100 if idx := strings.Index(name, "Reader::"); idx == 0 || (idx > 0 && name[idx-1] == '/') { // io.Reader
101 // The server might return an an absolute path. See issue #355.
102 name = name[idx+8:]
103
104 readerRegisterLock.RLock()
105 handler, inMap := readerRegister[name]
106 readerRegisterLock.RUnlock()
107
108 if inMap {
109 rdr = handler()
110 if rdr != nil {
111 if cl, ok := rdr.(io.Closer); ok {
112 defer deferredClose(&err, cl)
113 }
114 } else {
115 err = fmt.Errorf("reader '%s' is <nil>", name)
116 }
117 } else {
118 err = fmt.Errorf("reader '%s' is not registered", name)
119 }
120 } else { // File
121 name = strings.Trim(name, `"`)
122 fileRegisterLock.RLock()
123 _, exists := fileRegister[name]
124 fileRegisterLock.RUnlock()
125 if mc.cfg.AllowAllFiles || exists {
126 var file *os.File
127 var fi os.FileInfo
128
129 if file, err = os.Open(name); err == nil {
130 defer deferredClose(&err, file)
131
132 // get file size
133 if fi, err = file.Stat(); err == nil {
134 rdr = file
135 if fileSize := int(fi.Size()); fileSize < packetSize {
136 packetSize = fileSize
137 }
138 }
139 }
140 } else {
141 err = fmt.Errorf("local file '%s' is not registered", name)
142 }
143 }
144
145 // send content packets
146 var data []byte
147
148 // if packetSize == 0, the Reader contains no data
149 if err == nil && packetSize > 0 {
150 data = make([]byte, 4+packetSize)
151 var n int
152 for err == nil {
153 n, err = rdr.Read(data[4:])

Callers 1

Calls 8

connMethod · 0.95
readResultOKMethod · 0.95
deferredCloseFunction · 0.85
OpenMethod · 0.80
writePacketMethod · 0.80
syncSequenceMethod · 0.80
readPacketMethod · 0.80
ReadMethod · 0.45

Tested by

no test coverage detected