blob: 040c000c5be11a4d130893b45277b085b0651ebe [file] [log] [blame]
package utils
/*
* This file contains structs and functions related to interacting with files
* and directories, both locally and remotely over SSH.
*/
import (
"fmt"
"io"
"io/ioutil"
"os"
"github.com/cloudberrydb/gp-common-go-libs/gplog"
)
/*
* Generic file/directory manipulation functions
*/
func MustPrintf(file io.Writer, s string, v ...interface{}) uint64 {
bytesWritten, err := fmt.Fprintf(file, s, v...)
if err != nil {
gplog.Fatal(err, "Unable to write to file")
}
return uint64(bytesWritten)
}
func MustPrintln(file io.Writer, v ...interface{}) uint64 {
bytesWritten, err := fmt.Fprintln(file, v...)
if err != nil {
gplog.Fatal(err, "Unable to write to file")
}
return uint64(bytesWritten)
}
/*
* Structs and functions for file readers/writers that track bytes read/written
*/
type FileWithByteCount struct {
Filename string
Writer io.Writer
File *os.File
ByteCount uint64
}
func NewFileWithByteCount(writer io.Writer) *FileWithByteCount {
return &FileWithByteCount{"", writer, nil, 0}
}
func NewFileWithByteCountFromFile(filename string) *FileWithByteCount {
file, err := OpenFileForWrite(filename)
gplog.FatalOnError(err)
return &FileWithByteCount{filename, file, file, 0}
}
func (file *FileWithByteCount) Close() {
if file.File != nil {
err := file.File.Sync()
gplog.FatalOnError(err)
err = file.File.Close()
gplog.FatalOnError(err)
if file.Filename != "" {
err := os.Chmod(file.Filename, 0444)
gplog.FatalOnError(err)
}
}
}
func (file *FileWithByteCount) MustPrintln(v ...interface{}) {
bytesWritten, err := fmt.Fprintln(file.Writer, v...)
gplog.FatalOnError(err, "Unable to write to file")
file.ByteCount += uint64(bytesWritten)
}
func (file *FileWithByteCount) MustPrintf(s string, v ...interface{}) {
bytesWritten, err := fmt.Fprintf(file.Writer, s, v...)
gplog.FatalOnError(err, "Unable to write to file")
file.ByteCount += uint64(bytesWritten)
}
func (file *FileWithByteCount) MustPrint(s string) {
bytesWritten, err := fmt.Fprint(file.Writer, s)
gplog.FatalOnError(err, "Unable to write to file")
file.ByteCount += uint64(bytesWritten)
}
func CopyFile(src, dest string) error {
info, err := os.Stat(src)
if err == nil {
var content []byte
content, err = ioutil.ReadFile(src)
if err != nil {
gplog.Error(fmt.Sprintf("Error: %v, encountered when reading file: %s", err, src))
return err
}
return ioutil.WriteFile(dest, content, info.Mode())
}
gplog.Error(fmt.Sprintf("Error: %v, encountered when trying to stat file: %s", err, src))
return err
}