65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
package common
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"unsafe"
|
|
)
|
|
|
|
func LoadBucket(buf []byte) *InBucket {
|
|
return (*InBucket)(unsafe.Pointer(&buf[0]))
|
|
}
|
|
|
|
func LoadPage(buf []byte) *Page {
|
|
return (*Page)(unsafe.Pointer(&buf[0]))
|
|
}
|
|
|
|
func LoadPageMeta(buf []byte) *Meta {
|
|
return (*Meta)(unsafe.Pointer(&buf[PageHeaderSize]))
|
|
}
|
|
|
|
func CopyFile(srcPath, dstPath string) error {
|
|
// Ensure source file exists.
|
|
_, err := os.Stat(srcPath)
|
|
if os.IsNotExist(err) {
|
|
return fmt.Errorf("source file %q not found", srcPath)
|
|
} else if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Ensure output file not exist.
|
|
_, err = os.Stat(dstPath)
|
|
if err == nil {
|
|
return fmt.Errorf("output file %q already exists", dstPath)
|
|
} else if !os.IsNotExist(err) {
|
|
return err
|
|
}
|
|
|
|
srcDB, err := os.Open(srcPath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to open source file %q: %w", srcPath, err)
|
|
}
|
|
defer srcDB.Close()
|
|
dstDB, err := os.Create(dstPath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create output file %q: %w", dstPath, err)
|
|
}
|
|
defer dstDB.Close()
|
|
written, err := io.Copy(dstDB, srcDB)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to copy database file from %q to %q: %w", srcPath, dstPath, err)
|
|
}
|
|
|
|
srcFi, err := srcDB.Stat()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get source file info %q: %w", srcPath, err)
|
|
}
|
|
initialSize := srcFi.Size()
|
|
if initialSize != written {
|
|
return fmt.Errorf("the byte copied (%q: %d) isn't equal to the initial db size (%q: %d)", dstPath, written, srcPath, initialSize)
|
|
}
|
|
|
|
return nil
|
|
}
|