mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-27 00:55:17 +00:00
66 lines
1.5 KiB
Go
66 lines
1.5 KiB
Go
// Copyright 2023 The LevelDB-Go and Pebble Authors. All rights reserved. Use
|
|
// of this source code is governed by a BSD-style license that can be found in
|
|
// the LICENSE file.
|
|
|
|
package objstorageprovider
|
|
|
|
import (
|
|
"bufio"
|
|
|
|
"github.com/cockroachdb/pebble/objstorage"
|
|
"github.com/cockroachdb/pebble/vfs"
|
|
)
|
|
|
|
// NewFileWritable returns a Writable that uses a file as underlying storage.
|
|
func NewFileWritable(file vfs.File) objstorage.Writable {
|
|
return newFileBufferedWritable(file)
|
|
}
|
|
|
|
type fileBufferedWritable struct {
|
|
file vfs.File
|
|
bw *bufio.Writer
|
|
}
|
|
|
|
var _ objstorage.Writable = (*fileBufferedWritable)(nil)
|
|
|
|
func newFileBufferedWritable(file vfs.File) *fileBufferedWritable {
|
|
return &fileBufferedWritable{
|
|
file: file,
|
|
bw: bufio.NewWriter(file),
|
|
}
|
|
}
|
|
|
|
// Write is part of the objstorage.Writable interface.
|
|
func (w *fileBufferedWritable) Write(p []byte) error {
|
|
// Ignoring the length written since bufio.Writer.Write is guaranteed to
|
|
// return an error if the length written is < len(p).
|
|
_, err := w.bw.Write(p)
|
|
return err
|
|
}
|
|
|
|
// Finish is part of the objstorage.Writable interface.
|
|
func (w *fileBufferedWritable) Finish() error {
|
|
err := w.bw.Flush()
|
|
if err == nil {
|
|
err = w.file.Sync()
|
|
}
|
|
err = firstError(err, w.file.Close())
|
|
w.bw = nil
|
|
w.file = nil
|
|
return err
|
|
}
|
|
|
|
// Abort is part of the objstorage.Writable interface.
|
|
func (w *fileBufferedWritable) Abort() {
|
|
_ = w.file.Close()
|
|
w.bw = nil
|
|
w.file = nil
|
|
}
|
|
|
|
func firstError(err0, err1 error) error {
|
|
if err0 != nil {
|
|
return err0
|
|
}
|
|
return err1
|
|
}
|