-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilereader.go
94 lines (72 loc) · 2.48 KB
/
filereader.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package main
/**
- Phani Teja Kesha (KP38691)
- Seshagopalan Narasimhan (XP27536)
- Siddhant Goenka (VI91418)
- Vamshi Krishna Sai Nagabandi (SO03137)
*/
import "os"
/* Structure to save file information */
type fileInfo struct {
filename string
filesize uint64
start, end uint64
}
/* Method to update file information like file size, used to distribute load to workers */
func (freader *fileInfo) info() {
file, err := os.Open(freader.filename)
if check(err) {
freader.filesize = getFileSize(file)
logger.Infof("[%s] Filesize: %d bytes", freader.filename , freader.filesize)
file.Close()
}else {
logger.Alert("Unable to open file:", freader.filename)
logger.Critical("Closing application...")
panic("Need filesize to distribute load to workers")
}//end of file open check
}//end of method
/* Reads the file, based on start and end location specified in the structure */
func (freader *fileInfo) read() []byte {
file, err := os.Open(freader.filename)
if check(err) {
freader.filesize = getFileSize(file)
/* Double check seek endpoints */
/* No need of freader.start>=0 check, as its unsigned int */
if freader.start<freader.end && freader.end<=freader.filesize {
offset := int( freader.end - freader.start + 1 )
_, err := file.Seek( int64(freader.start), 0 )
if check(err) {
var data = make([]byte, offset)
logger.Debugf(" Reading %d bytes from %s ", offset, freader.filename )
file.Read(data);
return data
}else {
logger.Errorf("Unable to read file using seek values [%d,%d] ", freader.start, freader.end )
}
}else if freader.start==0 && freader.end==0 {
/* Only if start and end is not defined the values of both would be 0, implying read the whole file */
var data = make([]byte, freader.filesize)
logger.Debugf(" Reading whole file %s ", freader.filename )
file.Read(data)
return data
}else {
logger.Errorf("Invalid Seek options to read file [%d,%d] ", freader.start, freader.end )
}
file.Close()
}else {
logger.Error("Unable to open file: ", freader.filename)
panic("Error opening file...Exit initiated! ")
}//end of file open check
logger.Warningf("[%s] NO Bytes to return ", freader.filename )
return make([]byte, 0)
}//end of method
func getFileSize(file *os.File) uint64 {
stat, err := file.Stat()
if check(err) {
return uint64(stat.Size())
}else {
logger.Alert("Unable to get filesize")
logger.Critical("Closing application...")
panic("Need filesize to distribute load to workers")
}
}