mirror of
https://github.com/thunderbrewhq/binana.git
synced 2026-03-22 22:00:13 +00:00
80 lines
1.4 KiB
Go
80 lines
1.4 KiB
Go
package dbutil
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
|
|
"github.com/parquet-go/parquet-go"
|
|
)
|
|
|
|
type Writer[T any] struct {
|
|
write func([]T) (err error)
|
|
close func() (err error)
|
|
}
|
|
|
|
func (writer *Writer[T]) WriteEntries(entries []T) (err error) {
|
|
err = writer.write(entries)
|
|
return
|
|
}
|
|
|
|
func (writer *Writer[T]) Close() (err error) {
|
|
err = writer.close()
|
|
return
|
|
}
|
|
|
|
func Open[T any](name string, format DatabaseFormat) (writer *Writer[T], err error) {
|
|
writer = new(Writer[T])
|
|
var (
|
|
file *os.File
|
|
output io.Writer
|
|
)
|
|
if name == "" {
|
|
output = os.Stdout
|
|
} else {
|
|
file, err = os.Create(name)
|
|
if err != nil {
|
|
return
|
|
}
|
|
output = file
|
|
}
|
|
switch format {
|
|
|
|
case DatabaseJSON:
|
|
encoder := json.NewEncoder(output)
|
|
writer.write = func(entries []T) (err error) {
|
|
for _, entry := range entries {
|
|
if err = encoder.Encode(&entry); err != nil {
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
writer.close = func() (err error) {
|
|
if file != nil {
|
|
err = file.Close()
|
|
}
|
|
return
|
|
}
|
|
case DatabaseParquet:
|
|
generic_writer := parquet.NewGenericWriter[T](output)
|
|
writer.write = func(entries []T) (err error) {
|
|
_, err = generic_writer.Write(entries)
|
|
return
|
|
}
|
|
writer.close = func() (err error) {
|
|
if err = generic_writer.Close(); err != nil {
|
|
return
|
|
}
|
|
if file != nil {
|
|
err = file.Close()
|
|
}
|
|
|
|
return
|
|
}
|
|
default:
|
|
err = fmt.Errorf("%w: %d", ErrUnknownDatabaseFormat, format)
|
|
}
|
|
return
|
|
}
|