Documentation
¶
Index ¶
Examples ¶
- NewReader
- NewReader (Compression)
- NewReader (Err)
- NewReader (ErrGzip)
- NewWriter
- NewWriter (BufErr)
- NewWriter (Compression)
- NewWriter (PthCheckErr)
- NewWriter (WithTmpFile)
- Reader.Close
- Reader.Close (AfterClose)
- Reader.Close (Gzip)
- Reader.Read
- Reader.Read (Gzip)
- Reader.ReadLine
- Reader.ReadLine (Gzip)
- Reader.Stats
- Writer (CopyAndClean)
- Writer (CopyAndCleanTmpFile)
- Writer (CopyAndCleanTmpFileErr)
- Writer (CopyAndCleanTmpFileToDev)
- Writer (CopyAndCleanToDev)
- Writer.Abort
- Writer.Abort (AfterClose)
- Writer.Close
- Writer.Close (AfterAbort)
- Writer.Write
- Writer.WriteLine
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Reader ¶
type Reader struct {
// contains filtered or unexported fields
}
func NewReader ¶
Example ¶
pth := "./test/test.txt"
createFile(pth)
r, err := NewReader(pth)
if r == nil {
return
}
sts := r.Stats()
fmt.Println(err) // <nil>
fmt.Println(sts.Path != "") // true
fmt.Println(sts.Size) // 20
fmt.Println(sts.Created != "") // true
fmt.Println(r.f != nil) // true
fmt.Println(r.rBuf != nil) // true
fmt.Println(r.rGzip == nil) // true
fmt.Println(r.rHshr != nil) // true
fmt.Println(r.closed) // false
// cleanup
os.Remove(pth)
os.Remove("./test")
Output: <nil> true 20 true true true true true false
Example (Compression) ¶
pth := "./test/test.gz"
createFile(pth)
r, err := NewReader(pth)
if r == nil {
return
}
sts := r.Stats()
fmt.Println(err) // <nil>
fmt.Println(sts.Path != "") // true
fmt.Println(sts.Size) // 20
fmt.Println(sts.Created != "") // true
fmt.Println(r.f != nil) // true
fmt.Println(r.rBuf != nil) // true
fmt.Println(r.rGzip != nil) // true
fmt.Println(r.rHshr != nil) // true
fmt.Println(r.closed) // false
// cleanup
os.Remove(pth)
os.Remove("./test")
Output: <nil> true 48 true true true true true false
Example (Err) ¶
pth := "./does/not/exist.txt"
r, err := NewReader(pth)
if err == nil {
return
}
notExists := os.IsNotExist(err)
fmt.Println(r) // <nil>
fmt.Println(notExists) // true
Output: <nil> true
Example (ErrGzip) ¶
oldPth := "./test/test.txt"
pth := "./test/test.gz"
createFile(oldPth)
os.Rename(oldPth, pth)
r, err := NewReader(pth)
if err == nil {
return
}
fmt.Println(r) // <nil>
fmt.Println(err) // gzip: invalid header
os.Remove(pth)
os.Remove("./test")
Output: <nil> gzip: invalid header
func (*Reader) Close ¶
Example ¶
pth := "./test/test.txt"
createFile(pth)
r, _ := NewReader(pth)
if r == nil {
return
}
r.ReadLine()
r.ReadLine()
err := r.Close()
fmt.Println(err) // <nil>
fmt.Println(r.sts.Checksum()) // 54f30d75cf7374c7e524a4530dbc93c2
fmt.Println(r.closed) // true
// cleanup
os.Remove(pth)
os.Remove("./test")
Output: <nil> 54f30d75cf7374c7e524a4530dbc93c2 true
Example (AfterClose) ¶
pth := "./test/test.txt"
createFile(pth)
r, _ := NewReader(pth)
if r == nil {
return
}
r.ReadLine()
r.ReadLine()
r.Close()
err := r.Close()
fmt.Println(err) // <nil>
fmt.Println(r.sts.Checksum()) // 54f30d75cf7374c7e524a4530dbc93c2
fmt.Println(r.closed) // true
// cleanup
os.Remove(pth)
os.Remove("./test")
Output: <nil> 54f30d75cf7374c7e524a4530dbc93c2 true
Example (Gzip) ¶
pth := "./test/test.gz"
createFile(pth)
r, _ := NewReader(pth)
if r == nil {
return
}
r.ReadLine()
r.ReadLine()
err := r.Close()
fmt.Println(err) // <nil>
fmt.Println(r.sts.Checksum()) // 42e649f9834028184ec21940d13a300f
fmt.Println(r.closed) // true
// cleanup
os.Remove(pth)
os.Remove("./test")
Output: <nil> 42e649f9834028184ec21940d13a300f true
func (*Reader) Read ¶
Example ¶
pth := "./test/test.txt"
createFile(pth)
r, _ := NewReader(pth)
if r == nil {
return
}
b1 := make([]byte, 20)
b2 := make([]byte, 20)
n1, err1 := r.Read(b1)
n2, err2 := r.Read(b2)
fmt.Print(string(b1)) // test line, test line
fmt.Println(n1) // 20
fmt.Println(err1) // <nil>
fmt.Println(n2) // 0
fmt.Println(err2) // EOF
fmt.Println(r.sts.ByteCnt) // 20
fmt.Println(r.sts.LineCnt) // 0
// cleanup
os.Remove(pth)
os.Remove("./test")
Output: test line test line 20 <nil> 0 EOF 20 0
Example (Gzip) ¶
pth := "./test/test.gz"
createFile(pth)
r, _ := NewReader(pth)
if r == nil {
return
}
b1 := make([]byte, 20)
b2 := make([]byte, 20)
n1, err1 := r.Read(b1)
n2, err2 := r.Read(b2)
fmt.Print(string(b1)) // test line, test line
fmt.Println(n1) // 20
fmt.Println(err1) // <nil>
fmt.Println(n2) // 0
fmt.Println(err2) // EOF
fmt.Println(r.sts.ByteCnt) // 20
fmt.Println(r.sts.LineCnt) // 0
// cleanup
os.Remove(pth)
os.Remove("./test")
Output: test line test line 20 <nil> 0 EOF 20 0
func (*Reader) ReadLine ¶
Example ¶
pth := "./test/test.txt"
createFile(pth)
r, _ := NewReader(pth)
if r == nil {
return
}
ln1, err1 := r.ReadLine()
ln2, err2 := r.ReadLine()
ln3, err3 := r.ReadLine()
fmt.Println(string(ln1)) // test line
fmt.Println(string(ln2)) // test line
fmt.Println(string(ln3)) //
fmt.Println(err1) // <nil>
fmt.Println(err2) // <nil>
fmt.Println(err3) // EOF
fmt.Println(r.sts.ByteCnt) // 20
fmt.Println(r.sts.LineCnt) // 2
// cleanup
os.Remove(pth)
os.Remove("./test")
Output: test line test line <nil> <nil> EOF 20 2
Example (Gzip) ¶
pth := "./test/test.gz"
createFile(pth)
r, _ := NewReader(pth)
if r == nil {
return
}
ln1, err1 := r.ReadLine()
ln2, err2 := r.ReadLine()
ln3, err3 := r.ReadLine()
fmt.Println(string(ln1)) // test line
fmt.Println(string(ln2)) // test line
fmt.Println(string(ln3)) //
fmt.Println(err1) // <nil>
fmt.Println(err2) // <nil>
fmt.Println(err3) // EOF
fmt.Println(r.sts.ByteCnt) // 20
fmt.Println(r.sts.LineCnt) // 2
// cleanup
os.Remove(pth)
os.Remove("./test")
Output: test line test line <nil> <nil> EOF 20 2
type Writer ¶
type Writer struct {
// contains filtered or unexported fields
}
Example (CopyAndClean) ¶
// memory buffer to file
w, _ := NewWriter("./test/test.txt", nil)
if w == nil {
return
}
w.WriteLine([]byte("test line"))
w.WriteLine([]byte("test line"))
n, err := w.copyAndClean()
// read file
f, _ := os.Open(w.sts.Path())
if f == nil {
return
}
b := make([]byte, 20)
rn, _ := f.Read(b)
// check actual size
fInfo, _ := os.Stat(w.sts.Path())
if fInfo == nil {
return
}
fmt.Println(n) // 20
fmt.Println(err) // <nil>
fmt.Print(string(b)) // test line, test line
fmt.Println(rn) // 20
fmt.Println(fInfo.Size()) // 20
// cleanup
os.Remove("./test")
Output: 20 <nil> test line test line 20 20
Example (CopyAndCleanTmpFile) ¶
// file buffer to file
opt := &buf.Options{UseFileBuf: true, FileBufDir: "./test/tmp"}
w, _ := NewWriter("./test/test.txt", opt)
if w == nil {
return
}
w.WriteLine([]byte("test line"))
w.WriteLine([]byte("test line"))
n, err := w.copyAndClean()
// read file
f, _ := os.Open(w.sts.Path())
if f == nil {
return
}
b := make([]byte, 20)
rn, _ := f.Read(b)
// check actual size
fInfo, _ := os.Stat(w.sts.Path())
if fInfo == nil {
return
}
// tmp file does not exist
_, tmpErr := os.Open(w.tmpPth)
if tmpErr == nil {
return
}
removed := strings.Contains(tmpErr.Error(), "no such file or directory")
fmt.Println(n) // 20
fmt.Println(err) // <nil>
fmt.Print(string(b)) // test line, test line
fmt.Println(rn) // 20
fmt.Println(fInfo.Size()) // 20
fmt.Println(removed) // true
// cleanup
os.Remove("./test/tmp")
os.Remove("./test/test.txt")
os.Remove("./test")
Output: 20 <nil> test line test line 20 20 true
Example (CopyAndCleanTmpFileErr) ¶
// file buffer to file
opt := &buf.Options{UseFileBuf: true, FileBufDir: "./test/tmp"}
w, _ := NewWriter("./test/test.txt", opt)
if w == nil {
return
}
w.WriteLine([]byte("test line"))
w.WriteLine([]byte("test line"))
w.sts.SetPath("/bad/file.txt")
n, err := w.copyAndClean()
if err == nil {
return
}
notCopied := strings.Contains(err.Error(), "no such")
// tmp file does not exist
_, tmpErr := os.Open(w.tmpPth)
if tmpErr == nil {
return
}
tmpRemoved := strings.Contains(tmpErr.Error(), "no such file or directory")
fmt.Println(n) // 0
fmt.Println(notCopied) // true
fmt.Println(tmpRemoved) // true
// cleanup
os.Remove("./test/tmp")
os.Remove("./test")
Output: 0 true true
Example (CopyAndCleanTmpFileToDev) ¶
// file buffer to device file
opt := &buf.Options{UseFileBuf: true, FileBufDir: "./test/tmp"}
w, _ := NewWriter("/dev/stdout", opt)
if w == nil {
return
}
w.WriteLine([]byte("test line"))
w.WriteLine([]byte("test line"))
n, err := w.copyAndClean() // test line, test line
// tmp file does not exist
_, tmpErr := os.Open(w.tmpPth)
if tmpErr == nil {
return
}
removed := strings.Contains(tmpErr.Error(), "no such file or directory")
fmt.Println(n) // 20
fmt.Println(err) // <nil>
fmt.Println(removed) // true
// cleanup
os.Remove("./test/tmp")
os.Remove("./test")
Output: test line test line 20 <nil> true
Example (CopyAndCleanToDev) ¶
// memory buffer to device file
w, _ := NewWriter("/dev/stdout", nil)
if w == nil {
return
}
w.WriteLine([]byte("test line"))
w.WriteLine([]byte("test line"))
n, err := w.copyAndClean() // test line, test line
fmt.Println(n) // 20
fmt.Println(err) // <nil>
Output: test line test line 20 <nil>
func NewWriter ¶
NewWriter will create a new local writer. - 'pth' is the full path (with filename) that will be written. If the final file extension is a supported compression format then the file will be compressed in that format. - 'append' indicates whether the write session will append the contents to an existing file or truncate and then write. The default is false which will truncate an existing file and then write. - 'lazy' set to 'true' will tell the writer to do a lazy write. This means that all write calls will write to memory first and then write to 'pth' when writing is complete with a final call to 'Close'. If Close is never called then the file will not be written.
When initializing a new writer, pth is checked for the correct write permissions. An error is returned if the writer will not have the correct permissions.
For lazy writing, the writer supports writing to memory or a temp file. The writer will use the temp file option if tmpDir and/or tmpPrefix is provided. The writer will remove a temp file with a call to Close.
Example ¶
w, err := NewWriter("./test/test.txt", nil)
if w == nil {
return
}
fmt.Println(strings.HasSuffix(w.sts.Path(), "/test/test.txt")) // true
fmt.Println(err) // <nil>
os.Remove("./test") // cleanup test dir
Output: true <nil>
Example (BufErr) ¶
opt := &buf.Options{UseFileBuf: true, FileBufDir: "/private/bad/tmp/dir"}
w, err := NewWriter("./test/test.txt", opt)
if err == nil {
return
}
hasDenied := strings.Contains(err.Error(), "permission denied")
fmt.Println(w) // <nil>
fmt.Println(hasDenied) // true
Output: <nil> true
Example (Compression) ¶
w, err := NewWriter("./test/test.gz", nil)
if w == nil {
return
}
fmt.Println(strings.HasSuffix(w.sts.Path(), "/test/test.gz")) // true
fmt.Println(w.tmpPth) // ''
fmt.Println(err) // <nil>
os.Remove("./test") // cleanup test dir
Output: true <nil>
Example (PthCheckErr) ¶
w, err := NewWriter("/private/test.txt", nil)
if err == nil {
return
}
hasDenied := strings.Contains(err.Error(), "permission denied")
fmt.Println(w) // <nil>
fmt.Println(hasDenied) // true
Output: <nil> true
Example (WithTmpFile) ¶
opt := &buf.Options{
UseFileBuf: true,
FileBufDir: "./test/tmp/",
FileBufPrefix: "prefix_",
}
w, err := NewWriter("./test/test.txt", opt)
if w == nil {
return
}
hasPath := strings.HasSuffix(w.sts.Path(), "/test/test.txt")
hasTmp := strings.Contains(w.tmpPth, "/test/tmp/prefix_")
fmt.Println(hasPath) // true
fmt.Println(hasTmp) // true
fmt.Println(err) // <nil>
os.Remove(w.tmpPth) // cleanup tmp file
os.Remove("./test/tmp") // cleanup tmp dir
os.Remove("./test") // cleanup test dir
Output: true true <nil>
func (*Writer) Abort ¶
Abort will: - clear and close buffer - prevent further writing
Example ¶
w, _ := NewWriter("./test/test.txt", nil)
if w == nil {
return
}
err := w.Abort()
fmt.Println(err) // <nil>
os.Remove("./test") // cleanup test dir
Output: <nil>
Example (AfterClose) ¶
w, _ := NewWriter("./test/test.txt", nil)
if w == nil {
return
}
w.WriteLine([]byte("test line"))
w.WriteLine([]byte("test line"))
w.Close()
err := w.Abort()
fmt.Println(err) // <nil>
// cleanup
os.Remove("./test")
Output: <nil>
func (*Writer) Close ¶
Close will: - calculate final checksum - set file size - set file created date - copy (mv) buffer to pth file - clear and close buffer - report any errors
Calling Abort after Close will do nothing. Writing after Close will not write and will not return a nil-error.
Example ¶
opt := &buf.Options{UseFileBuf: true, FileBufDir: "./test/tmp", FileBufPrefix: "prefix_"}
w, _ := NewWriter("./test/test.txt", opt)
if w == nil {
return
}
w.WriteLine([]byte("test line"))
w.WriteLine([]byte("test line"))
err := w.Close()
sts := w.Stats()
// check that tmp file was cleaned up
_, tmpErr := os.Open(w.tmpPth)
if tmpErr == nil {
return
}
removed := strings.Contains(tmpErr.Error(), "no such file or directory")
fmt.Println(err) // <nil>
fmt.Println(sts.Created != "") // true
fmt.Println(sts.Checksum) // 54f30d75cf7374c7e524a4530dbc93c2
fmt.Println(removed) // true
// cleanup
os.Remove("./test/tmp")
os.Remove("./test/test.txt")
os.Remove("./test")
Output: <nil> true 54f30d75cf7374c7e524a4530dbc93c2 true
Example (AfterAbort) ¶
w, _ := NewWriter("./test/test.txt", nil)
if w == nil {
return
}
w.WriteLine([]byte("test line"))
w.WriteLine([]byte("test line"))
w.Abort()
err := w.Close()
fmt.Println(err) // <nil>
// cleanup
os.Remove("./test")
Output: <nil>