diff --git a/cmd/stbak/cmd/archive.go b/cmd/stbak/cmd/archive.go index 15c9089..f3d6bf3 100644 --- a/cmd/stbak/cmd/archive.go +++ b/cmd/stbak/cmd/archive.go @@ -6,6 +6,7 @@ import ( "github.com/pojntfx/stfs/internal/compression" "github.com/pojntfx/stfs/internal/keys" "github.com/pojntfx/stfs/internal/logging" + "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" "github.com/pojntfx/stfs/pkg/operations" "github.com/pojntfx/stfs/pkg/tape" @@ -69,6 +70,11 @@ var archiveCmd = &cobra.Command{ viper.GetBool(overwriteFlag), ) + metadataPersister := persisters.NewMetadataPersister(viper.GetString(metadataFlag)) + if err := metadataPersister.Open(); err != nil { + return err + } + ops := operations.NewOperations( tm.GetWriter, tm.Close, @@ -78,12 +84,11 @@ var archiveCmd = &cobra.Command{ tm.GetDrive, tm.Close, + + metadataPersister, ) if _, err := ops.Archive( - config.MetadataConfig{ - Metadata: viper.GetString(metadataFlag), - }, config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), diff --git a/cmd/stbak/cmd/delete.go b/cmd/stbak/cmd/delete.go index dec0e35..3f614a9 100644 --- a/cmd/stbak/cmd/delete.go +++ b/cmd/stbak/cmd/delete.go @@ -3,6 +3,7 @@ package cmd import ( "github.com/pojntfx/stfs/internal/keys" "github.com/pojntfx/stfs/internal/logging" + "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" "github.com/pojntfx/stfs/pkg/operations" "github.com/pojntfx/stfs/pkg/tape" @@ -56,6 +57,11 @@ var deleteCmd = &cobra.Command{ false, ) + metadataPersister := persisters.NewMetadataPersister(viper.GetString(metadataFlag)) + if err := metadataPersister.Open(); err != nil { + return err + } + ops := operations.NewOperations( tm.GetWriter, tm.Close, @@ -65,12 +71,11 @@ var deleteCmd = &cobra.Command{ tm.GetDrive, tm.Close, + + metadataPersister, ) return ops.Delete( - config.MetadataConfig{ - Metadata: viper.GetString(metadataFlag), - }, config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), diff --git a/cmd/stbak/cmd/find.go b/cmd/stbak/cmd/find.go index 712bcb9..d0dc833 100644 --- a/cmd/stbak/cmd/find.go +++ b/cmd/stbak/cmd/find.go @@ -2,6 +2,7 @@ package cmd import ( "github.com/pojntfx/stfs/internal/logging" + "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" "github.com/pojntfx/stfs/pkg/inventory" "github.com/spf13/cobra" @@ -21,9 +22,14 @@ var findCmd = &cobra.Command{ return err } + metadataPersister := persisters.NewMetadataPersister(viper.GetString(metadataFlag)) + if err := metadataPersister.Open(); err != nil { + return err + } + if _, err := inventory.Find( config.MetadataConfig{ - Metadata: viper.GetString(metadataFlag), + Metadata: metadataPersister, }, viper.GetString(expressionFlag), diff --git a/cmd/stbak/cmd/list.go b/cmd/stbak/cmd/list.go index 1354c67..7059c71 100644 --- a/cmd/stbak/cmd/list.go +++ b/cmd/stbak/cmd/list.go @@ -2,6 +2,7 @@ package cmd import ( "github.com/pojntfx/stfs/internal/logging" + "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" "github.com/pojntfx/stfs/pkg/inventory" "github.com/spf13/cobra" @@ -17,9 +18,14 @@ var listCmd = &cobra.Command{ return err } + metadataPersister := persisters.NewMetadataPersister(viper.GetString(metadataFlag)) + if err := metadataPersister.Open(); err != nil { + return err + } + if _, err := inventory.List( config.MetadataConfig{ - Metadata: viper.GetString(metadataFlag), + Metadata: metadataPersister, }, viper.GetString(nameFlag), diff --git a/cmd/stbak/cmd/move.go b/cmd/stbak/cmd/move.go index 90b6930..0062df6 100644 --- a/cmd/stbak/cmd/move.go +++ b/cmd/stbak/cmd/move.go @@ -3,6 +3,7 @@ package cmd import ( "github.com/pojntfx/stfs/internal/keys" "github.com/pojntfx/stfs/internal/logging" + "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" "github.com/pojntfx/stfs/pkg/operations" "github.com/pojntfx/stfs/pkg/tape" @@ -52,6 +53,11 @@ var moveCmd = &cobra.Command{ false, ) + metadataPersister := persisters.NewMetadataPersister(viper.GetString(metadataFlag)) + if err := metadataPersister.Open(); err != nil { + return err + } + ops := operations.NewOperations( tm.GetWriter, tm.Close, @@ -61,12 +67,11 @@ var moveCmd = &cobra.Command{ tm.GetDrive, tm.Close, + + metadataPersister, ) return ops.Move( - config.MetadataConfig{ - Metadata: viper.GetString(metadataFlag), - }, config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), diff --git a/cmd/stbak/cmd/recovery_index.go b/cmd/stbak/cmd/recovery_index.go index 0ab17e7..cc393d2 100644 --- a/cmd/stbak/cmd/recovery_index.go +++ b/cmd/stbak/cmd/recovery_index.go @@ -6,6 +6,7 @@ import ( "github.com/pojntfx/stfs/internal/encryption" "github.com/pojntfx/stfs/internal/keys" "github.com/pojntfx/stfs/internal/logging" + "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/internal/signature" "github.com/pojntfx/stfs/pkg/config" "github.com/pojntfx/stfs/pkg/recovery" @@ -57,6 +58,11 @@ var recoveryIndexCmd = &cobra.Command{ } defer reader.Close() + metadataPersister := persisters.NewMetadataPersister(viper.GetString(metadataFlag)) + if err := metadataPersister.Open(); err != nil { + return err + } + return recovery.Index( config.DriveReaderConfig{ Drive: reader, @@ -67,7 +73,7 @@ var recoveryIndexCmd = &cobra.Command{ DriveIsRegular: readerIsRegular, }, config.MetadataConfig{ - Metadata: viper.GetString(metadataFlag), + Metadata: metadataPersister, }, config.PipeConfig{ Compression: viper.GetString(compressionFlag), diff --git a/cmd/stbak/cmd/restore.go b/cmd/stbak/cmd/restore.go index ae0d262..37ed5a7 100644 --- a/cmd/stbak/cmd/restore.go +++ b/cmd/stbak/cmd/restore.go @@ -3,6 +3,7 @@ package cmd import ( "github.com/pojntfx/stfs/internal/keys" "github.com/pojntfx/stfs/internal/logging" + "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" "github.com/pojntfx/stfs/pkg/operations" "github.com/pojntfx/stfs/pkg/tape" @@ -56,6 +57,11 @@ var restoreCmd = &cobra.Command{ false, ) + metadataPersister := persisters.NewMetadataPersister(viper.GetString(metadataFlag)) + if err := metadataPersister.Open(); err != nil { + return err + } + ops := operations.NewOperations( tm.GetWriter, tm.Close, @@ -65,12 +71,11 @@ var restoreCmd = &cobra.Command{ tm.GetDrive, tm.Close, + + metadataPersister, ) return ops.Restore( - config.MetadataConfig{ - Metadata: viper.GetString(metadataFlag), - }, config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), diff --git a/cmd/stbak/cmd/update.go b/cmd/stbak/cmd/update.go index c94dfe1..795e998 100644 --- a/cmd/stbak/cmd/update.go +++ b/cmd/stbak/cmd/update.go @@ -6,6 +6,7 @@ import ( "github.com/pojntfx/stfs/internal/compression" "github.com/pojntfx/stfs/internal/keys" "github.com/pojntfx/stfs/internal/logging" + "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" "github.com/pojntfx/stfs/pkg/operations" "github.com/pojntfx/stfs/pkg/tape" @@ -59,6 +60,11 @@ var updateCmd = &cobra.Command{ false, ) + metadataPersister := persisters.NewMetadataPersister(viper.GetString(metadataFlag)) + if err := metadataPersister.Open(); err != nil { + return err + } + ops := operations.NewOperations( tm.GetWriter, tm.Close, @@ -68,12 +74,11 @@ var updateCmd = &cobra.Command{ tm.GetDrive, tm.Close, + + metadataPersister, ) if _, err := ops.Update( - config.MetadataConfig{ - Metadata: viper.GetString(metadataFlag), - }, config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), diff --git a/pkg/config/config.go b/pkg/config/config.go index 756ecb1..53762a6 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -3,6 +3,8 @@ package config import ( "io" "os" + + "github.com/pojntfx/stfs/internal/persisters" ) type DriveReaderConfig struct { @@ -21,7 +23,7 @@ type DriveConfig struct { } type MetadataConfig struct { - Metadata string + Metadata *persisters.MetadataPersister } type PipeConfig struct { diff --git a/pkg/inventory/find.go b/pkg/inventory/find.go index 148649b..6b4bf67 100644 --- a/pkg/inventory/find.go +++ b/pkg/inventory/find.go @@ -7,23 +7,17 @@ import ( "github.com/pojntfx/stfs/internal/converters" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" - "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" ) func Find( - state config.MetadataConfig, + metadata config.MetadataConfig, expression string, onHeader func(hdr *models.Header), ) ([]*tar.Header, error) { - metadataPersister := persisters.NewMetadataPersister(state.Metadata) - if err := metadataPersister.Open(); err != nil { - return []*tar.Header{}, err - } - - dbHdrs, err := metadataPersister.GetHeaders(context.Background()) + dbHdrs, err := metadata.Metadata.GetHeaders(context.Background()) if err != nil { return []*tar.Header{}, err } diff --git a/pkg/inventory/list.go b/pkg/inventory/list.go index 412ba89..627f9ef 100644 --- a/pkg/inventory/list.go +++ b/pkg/inventory/list.go @@ -6,23 +6,17 @@ import ( "github.com/pojntfx/stfs/internal/converters" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" - "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" ) func List( - state config.MetadataConfig, + metadata config.MetadataConfig, name string, onHeader func(hdr *models.Header), ) ([]*tar.Header, error) { - metadataPersister := persisters.NewMetadataPersister(state.Metadata) - if err := metadataPersister.Open(); err != nil { - return []*tar.Header{}, err - } - - dbHdrs, err := metadataPersister.GetHeaderDirectChildren(context.Background(), name) + dbHdrs, err := metadata.Metadata.GetHeaderDirectChildren(context.Background(), name) if err != nil { return []*tar.Header{}, err } diff --git a/pkg/operations/archive.go b/pkg/operations/archive.go index 2507da6..3e5f9a4 100644 --- a/pkg/operations/archive.go +++ b/pkg/operations/archive.go @@ -17,7 +17,6 @@ import ( "github.com/pojntfx/stfs/internal/encryption" "github.com/pojntfx/stfs/internal/ioext" "github.com/pojntfx/stfs/internal/mtio" - "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/internal/records" "github.com/pojntfx/stfs/internal/signature" "github.com/pojntfx/stfs/internal/statext" @@ -32,7 +31,6 @@ var ( ) func (o *Operations) Archive( - metadata config.MetadataConfig, pipes config.PipeConfig, crypto config.CryptoConfig, @@ -57,15 +55,10 @@ func (o *Operations) Archive( return []*tar.Header{}, err } - metadataPersister := persisters.NewMetadataPersister(metadata.Metadata) - if err := metadataPersister.Open(); err != nil { - return []*tar.Header{}, err - } - lastIndexedRecord := int64(0) lastIndexedBlock := int64(0) if !overwrite { - lastIndexedRecord, lastIndexedBlock, err = metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), recordSize) + lastIndexedRecord, lastIndexedBlock, err = o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), recordSize) if err != nil { return []*tar.Header{}, err } @@ -292,7 +285,9 @@ func (o *Operations) Archive( return hdrs, recovery.Index( reader, drive, - metadata, + config.MetadataConfig{ + Metadata: o.metadataPersister, + }, pipes, crypto, diff --git a/pkg/operations/delete.go b/pkg/operations/delete.go index 52d6ff9..b489b1c 100644 --- a/pkg/operations/delete.go +++ b/pkg/operations/delete.go @@ -7,7 +7,6 @@ import ( "github.com/pojntfx/stfs/internal/converters" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/internal/encryption" - "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/internal/records" "github.com/pojntfx/stfs/internal/signature" "github.com/pojntfx/stfs/internal/tarext" @@ -16,7 +15,6 @@ import ( ) func (o *Operations) Delete( - metadata config.MetadataConfig, pipes config.PipeConfig, crypto config.CryptoConfig, @@ -39,18 +37,13 @@ func (o *Operations) Delete( return err } - metadataPersister := persisters.NewMetadataPersister(metadata.Metadata) - if err := metadataPersister.Open(); err != nil { - return err - } - - lastIndexedRecord, lastIndexedBlock, err := metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), recordSize) + lastIndexedRecord, lastIndexedBlock, err := o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), recordSize) if err != nil { return err } headersToDelete := []*models.Header{} - dbhdr, err := metadataPersister.GetHeader(context.Background(), name) + dbhdr, err := o.metadataPersister.GetHeader(context.Background(), name) if err != nil { return err } @@ -58,7 +51,7 @@ func (o *Operations) Delete( // If the header refers to a directory, get it's children if dbhdr.Typeflag == tar.TypeDir { - dbhdrs, err := metadataPersister.GetHeaderChildren(context.Background(), name) + dbhdrs, err := o.metadataPersister.GetHeaderChildren(context.Background(), name) if err != nil { return err } @@ -127,7 +120,9 @@ func (o *Operations) Delete( return recovery.Index( reader, drive, - metadata, + config.MetadataConfig{ + Metadata: o.metadataPersister, + }, pipes, crypto, diff --git a/pkg/operations/move.go b/pkg/operations/move.go index 7d5c79d..ca86300 100644 --- a/pkg/operations/move.go +++ b/pkg/operations/move.go @@ -8,7 +8,6 @@ import ( "github.com/pojntfx/stfs/internal/converters" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/internal/encryption" - "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/internal/records" "github.com/pojntfx/stfs/internal/signature" "github.com/pojntfx/stfs/internal/tarext" @@ -17,7 +16,6 @@ import ( ) func (o *Operations) Move( - metadata config.MetadataConfig, pipes config.PipeConfig, crypto config.CryptoConfig, @@ -41,18 +39,13 @@ func (o *Operations) Move( return err } - metadataPersister := persisters.NewMetadataPersister(metadata.Metadata) - if err := metadataPersister.Open(); err != nil { - return err - } - - lastIndexedRecord, lastIndexedBlock, err := metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), recordSize) + lastIndexedRecord, lastIndexedBlock, err := o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), recordSize) if err != nil { return err } headersToMove := []*models.Header{} - dbhdr, err := metadataPersister.GetHeader(context.Background(), from) + dbhdr, err := o.metadataPersister.GetHeader(context.Background(), from) if err != nil { return err } @@ -60,7 +53,7 @@ func (o *Operations) Move( // If the header refers to a directory, get it's children if dbhdr.Typeflag == tar.TypeDir { - dbhdrs, err := metadataPersister.GetHeaderChildren(context.Background(), from) + dbhdrs, err := o.metadataPersister.GetHeaderChildren(context.Background(), from) if err != nil { return err } @@ -131,7 +124,9 @@ func (o *Operations) Move( return recovery.Index( reader, drive, - metadata, + config.MetadataConfig{ + Metadata: o.metadataPersister, + }, pipes, crypto, diff --git a/pkg/operations/operations.go b/pkg/operations/operations.go index e2dd9d7..39769f6 100644 --- a/pkg/operations/operations.go +++ b/pkg/operations/operations.go @@ -3,6 +3,7 @@ package operations import ( "sync" + "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" ) @@ -16,6 +17,8 @@ type Operations struct { getDrive func() (config.DriveConfig, error) closeDrive func() error + metadataPersister *persisters.MetadataPersister + diskOperationLock sync.Mutex } @@ -28,6 +31,8 @@ func NewOperations( getDrive func() (config.DriveConfig, error), closeDrive func() error, + + metadataPersister *persisters.MetadataPersister, ) *Operations { return &Operations{ getWriter: getWriter, @@ -38,5 +43,7 @@ func NewOperations( getDrive: getDrive, closeDrive: closeDrive, + + metadataPersister: metadataPersister, } } diff --git a/pkg/operations/restore.go b/pkg/operations/restore.go index 44e6be2..6113e4f 100644 --- a/pkg/operations/restore.go +++ b/pkg/operations/restore.go @@ -9,13 +9,11 @@ import ( "strings" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" - "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" "github.com/pojntfx/stfs/pkg/recovery" ) func (o *Operations) Restore( - metadata config.MetadataConfig, pipes config.PipeConfig, crypto config.CryptoConfig, @@ -29,19 +27,14 @@ func (o *Operations) Restore( o.diskOperationLock.Lock() defer o.diskOperationLock.Unlock() - metadataPersister := persisters.NewMetadataPersister(metadata.Metadata) - if err := metadataPersister.Open(); err != nil { - return err - } - headersToRestore := []*models.Header{} src := strings.TrimSuffix(from, "/") - dbhdr, err := metadataPersister.GetHeader(context.Background(), src) + dbhdr, err := o.metadataPersister.GetHeader(context.Background(), src) if err != nil { if err == sql.ErrNoRows { src = src + "/" - dbhdr, err = metadataPersister.GetHeader(context.Background(), src) + dbhdr, err = o.metadataPersister.GetHeader(context.Background(), src) if err != nil { return err } @@ -53,7 +46,7 @@ func (o *Operations) Restore( // If the header refers to a directory, get it's children if dbhdr.Typeflag == tar.TypeDir { - dbhdrs, err := metadataPersister.GetHeaderChildren(context.Background(), src) + dbhdrs, err := o.metadataPersister.GetHeaderChildren(context.Background(), src) if err != nil { return err } diff --git a/pkg/operations/update.go b/pkg/operations/update.go index cf96f79..e0a8d73 100644 --- a/pkg/operations/update.go +++ b/pkg/operations/update.go @@ -15,7 +15,6 @@ import ( "github.com/pojntfx/stfs/internal/encryption" "github.com/pojntfx/stfs/internal/ioext" "github.com/pojntfx/stfs/internal/mtio" - "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/internal/records" "github.com/pojntfx/stfs/internal/signature" "github.com/pojntfx/stfs/internal/statext" @@ -26,7 +25,6 @@ import ( ) func (o *Operations) Update( - metadata config.MetadataConfig, pipes config.PipeConfig, crypto config.CryptoConfig, @@ -51,12 +49,7 @@ func (o *Operations) Update( return []*tar.Header{}, err } - metadataPersister := persisters.NewMetadataPersister(metadata.Metadata) - if err := metadataPersister.Open(); err != nil { - return []*tar.Header{}, err - } - - lastIndexedRecord, lastIndexedBlock, err := metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), recordSize) + lastIndexedRecord, lastIndexedBlock, err := o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), recordSize) if err != nil { return []*tar.Header{}, err } @@ -307,7 +300,9 @@ func (o *Operations) Update( return hdrs, recovery.Index( reader, drive, - metadata, + config.MetadataConfig{ + Metadata: o.metadataPersister, + }, pipes, crypto,