diff --git a/cmd/stfs/cmd/serve_ftp.go b/cmd/stfs/cmd/serve_ftp.go index f44cadd..5def0d4 100644 --- a/cmd/stfs/cmd/serve_ftp.go +++ b/cmd/stfs/cmd/serve_ftp.go @@ -10,7 +10,6 @@ import ( ftpserver "github.com/fclairamb/ftpserverlib" "github.com/pojntfx/stfs/internal/check" - models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/internal/encryption" "github.com/pojntfx/stfs/internal/ftp" "github.com/pojntfx/stfs/internal/keys" @@ -213,7 +212,7 @@ var serveFTPCmd = &cobra.Command{ }, true, // FTP needs read permission for `STOR` command even if O_WRONLY is set - func(hdr *models.Header) { + func(hdr *config.Header) { jsonLogger.Trace("Header transform", hdr) }, jsonLogger, @@ -252,7 +251,7 @@ var serveFTPCmd = &cobra.Command{ return signature.VerifyHeader(hdr, isRegular, viper.GetString(signatureFlag), signatureRecipient) }, - func(hdr *models.Header) { + func(hdr *config.Header) { jsonLogger.Debug("Header read", hdr) }, ) diff --git a/cmd/stfs/cmd/serve_http.go b/cmd/stfs/cmd/serve_http.go index 283cb5f..3526ddc 100644 --- a/cmd/stfs/cmd/serve_http.go +++ b/cmd/stfs/cmd/serve_http.go @@ -8,7 +8,6 @@ import ( "time" "github.com/pojntfx/stfs/internal/check" - models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/internal/handlers" "github.com/pojntfx/stfs/internal/keys" "github.com/pojntfx/stfs/internal/logging" @@ -132,7 +131,7 @@ var serveHTTPCmd = &cobra.Command{ nil, // We never write false, // We never write - func(hdr *models.Header) { + func(hdr *config.Header) { jsonLogger.Trace("Header transform", hdr) }, jsonLogger, diff --git a/internal/converters/header.go b/internal/converters/header.go index 0879aa8..3f72aef 100644 --- a/internal/converters/header.go +++ b/internal/converters/header.go @@ -5,8 +5,61 @@ import ( "encoding/json" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" + "github.com/pojntfx/stfs/pkg/config" ) +func ConfigHeaderToDBHeader(confighdr *config.Header) *models.Header { + return &models.Header{ + Record: confighdr.Record, + Lastknownrecord: confighdr.Lastknownrecord, + Block: confighdr.Block, + Lastknownblock: confighdr.Lastknownblock, + Typeflag: confighdr.Typeflag, + Name: confighdr.Name, + Linkname: confighdr.Linkname, + Size: confighdr.Size, + Mode: confighdr.Mode, + UID: confighdr.UID, + Gid: confighdr.Gid, + Uname: confighdr.Uname, + Gname: confighdr.Gname, + Modtime: confighdr.Modtime, + Accesstime: confighdr.Accesstime, + Changetime: confighdr.Changetime, + Devmajor: confighdr.Devmajor, + Devminor: confighdr.Devminor, + Paxrecords: confighdr.Paxrecords, + Format: confighdr.Format, + Deleted: confighdr.Deleted, + } +} + +func DBHeaderToConfigHeader(dbhdr *models.Header) *config.Header { + return &config.Header{ + Record: dbhdr.Record, + Lastknownrecord: dbhdr.Lastknownrecord, + Block: dbhdr.Block, + Lastknownblock: dbhdr.Lastknownblock, + Typeflag: dbhdr.Typeflag, + Name: dbhdr.Name, + Linkname: dbhdr.Linkname, + Size: dbhdr.Size, + Mode: dbhdr.Mode, + UID: dbhdr.UID, + Gid: dbhdr.Gid, + Uname: dbhdr.Uname, + Gname: dbhdr.Gname, + Modtime: dbhdr.Modtime, + Accesstime: dbhdr.Accesstime, + Changetime: dbhdr.Changetime, + Devmajor: dbhdr.Devmajor, + Devminor: dbhdr.Devminor, + Paxrecords: dbhdr.Paxrecords, + Format: dbhdr.Format, + Deleted: dbhdr.Deleted, + } +} + func DBHeaderToTarHeader(dbhdr *models.Header) (*tar.Header, error) { paxRecords := map[string]string{} if err := json.Unmarshal([]byte(dbhdr.Paxrecords), &paxRecords); err != nil { diff --git a/internal/fs/file.go b/internal/fs/file.go index cde9ae7..4b10b0d 100644 --- a/internal/fs/file.go +++ b/internal/fs/file.go @@ -9,7 +9,6 @@ import ( "os" "sync" - models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/internal/ioext" "github.com/pojntfx/stfs/pkg/cache" "github.com/pojntfx/stfs/pkg/config" @@ -53,7 +52,7 @@ type File struct { writeBuf cache.WriteCache cleanWriteBuf func() error - onHeader func(hdr *models.Header) + onHeader func(hdr *config.Header) log logging.StructuredLogger } @@ -74,7 +73,7 @@ func NewFile( name string, info os.FileInfo, - onHeader func(hdr *models.Header), + onHeader func(hdr *config.Header), log logging.StructuredLogger, ) *File { return &File{ diff --git a/internal/logging/csv.go b/internal/logging/csv.go index 8b14993..2f098e6 100644 --- a/internal/logging/csv.go +++ b/internal/logging/csv.go @@ -6,7 +6,6 @@ import ( "os" "time" - models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/pkg/config" ) @@ -17,7 +16,7 @@ var ( tarHeaderEventCSV = append([]string{"type", "indexed"}, tarHeaderCSV...) ) -func headerToCSV(hdr *models.Header) []string { +func headerToCSV(hdr *config.Header) []string { return []string{ fmt.Sprintf("%v", hdr.Record), fmt.Sprintf("%v", hdr.Lastknownrecord), fmt.Sprintf("%v", hdr.Block), fmt.Sprintf("%v", hdr.Lastknownblock), fmt.Sprintf("%v", hdr.Typeflag), hdr.Name, hdr.Linkname, fmt.Sprintf("%v", hdr.Size), fmt.Sprintf("%v", hdr.Mode), fmt.Sprintf("%v", hdr.UID), fmt.Sprintf("%v", hdr.Gid), fmt.Sprintf("%v", hdr.Uname), fmt.Sprintf("%v", hdr.Gname), hdr.Modtime.Format(time.RFC3339), hdr.Accesstime.Format(time.RFC3339), hdr.Changetime.Format(time.RFC3339), fmt.Sprintf("%v", hdr.Devmajor), fmt.Sprintf("%v", hdr.Devminor), fmt.Sprintf("%v", hdr.Paxrecords), fmt.Sprintf("%v", hdr.Format), } @@ -35,7 +34,7 @@ func NewCSVLogger() *CSVLogger { return &CSVLogger{} } -func (l *CSVLogger) PrintHeader(hdr *models.Header) { +func (l *CSVLogger) PrintHeader(hdr *config.Header) { w := csv.NewWriter(os.Stdout) if l.n <= 0 { diff --git a/pkg/config/config.go b/pkg/config/config.go index 7583bf2..d8a9a20 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -5,8 +5,7 @@ import ( "io" "io/fs" "os" - - models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" + "time" ) type DriveReaderConfig struct { @@ -35,16 +34,40 @@ type BackendConfig struct { CloseDrive func() error } +type Header struct { + Record int64 + Lastknownrecord int64 + Block int64 + Lastknownblock int64 + Deleted int64 + Typeflag int64 + Name string + Linkname string + Size int64 + Mode int64 + UID int64 + Gid int64 + Uname string + Gname string + Modtime time.Time + Accesstime time.Time + Changetime time.Time + Devmajor int64 + Devminor int64 + Paxrecords string + Format int64 +} + type MetadataPersister interface { - UpsertHeader(ctx context.Context, dbhdr *models.Header) error - UpdateHeaderMetadata(ctx context.Context, dbhdr *models.Header) error + UpsertHeader(ctx context.Context, dbhdr *Header) error + UpdateHeaderMetadata(ctx context.Context, dbhdr *Header) error MoveHeader(ctx context.Context, oldName string, newName string, lastknownrecord, lastknownblock int64) error - GetHeaders(ctx context.Context) (models.HeaderSlice, error) - GetHeader(ctx context.Context, name string) (*models.Header, error) - GetHeaderChildren(ctx context.Context, name string) (models.HeaderSlice, error) + GetHeaders(ctx context.Context) ([]*Header, error) + GetHeader(ctx context.Context, name string) (*Header, error) + GetHeaderChildren(ctx context.Context, name string) ([]*Header, error) GetRootPath(ctx context.Context) (string, error) - GetHeaderDirectChildren(ctx context.Context, name string, limit int) (models.HeaderSlice, error) - DeleteHeader(ctx context.Context, name string, lastknownrecord, lastknownblock int64) (*models.Header, error) + GetHeaderDirectChildren(ctx context.Context, name string, limit int) ([]*Header, error) + DeleteHeader(ctx context.Context, name string, lastknownrecord, lastknownblock int64) (*Header, error) GetLastIndexedRecordAndBlock(ctx context.Context, recordSize int) (int64, int64, error) PurgeAllHeaders(ctx context.Context) error } diff --git a/pkg/config/events.go b/pkg/config/events.go index 0bfe146..e2550e5 100644 --- a/pkg/config/events.go +++ b/pkg/config/events.go @@ -1,9 +1,7 @@ package config -import models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" - type HeaderEvent struct { Type string Indexed bool - Header *models.Header + Header *Header } diff --git a/pkg/fs/filesystem.go b/pkg/fs/filesystem.go index 18fea8f..78edf37 100644 --- a/pkg/fs/filesystem.go +++ b/pkg/fs/filesystem.go @@ -12,7 +12,6 @@ import ( "sync" "time" - models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" ifs "github.com/pojntfx/stfs/internal/fs" "github.com/pojntfx/stfs/pkg/cache" "github.com/pojntfx/stfs/pkg/config" @@ -34,7 +33,7 @@ type STFS struct { ioLock sync.Mutex - onHeader func(hdr *models.Header) + onHeader func(hdr *config.Header) log logging.StructuredLogger } @@ -48,7 +47,7 @@ func NewSTFS( getFileBuffer func() (cache.WriteCache, func() error, error), ignorePermissionFlags bool, - onHeader func(hdr *models.Header), + onHeader func(hdr *config.Header), log logging.StructuredLogger, ) *STFS { return &STFS{ diff --git a/pkg/inventory/find.go b/pkg/inventory/find.go index 6b4bf67..ebfaea7 100644 --- a/pkg/inventory/find.go +++ b/pkg/inventory/find.go @@ -6,7 +6,6 @@ import ( "regexp" "github.com/pojntfx/stfs/internal/converters" - models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/pkg/config" ) @@ -15,7 +14,7 @@ func Find( expression string, - onHeader func(hdr *models.Header), + onHeader func(hdr *config.Header), ) ([]*tar.Header, error) { dbHdrs, err := metadata.Metadata.GetHeaders(context.Background()) if err != nil { @@ -25,7 +24,7 @@ func Find( headers := []*tar.Header{} for _, dbhdr := range dbHdrs { if regexp.MustCompile(expression).Match([]byte(dbhdr.Name)) { - hdr, err := converters.DBHeaderToTarHeader(dbhdr) + hdr, err := converters.DBHeaderToTarHeader(converters.ConfigHeaderToDBHeader(dbhdr)) if err != nil { return []*tar.Header{}, err } diff --git a/pkg/inventory/list.go b/pkg/inventory/list.go index 5f6b279..860fa00 100644 --- a/pkg/inventory/list.go +++ b/pkg/inventory/list.go @@ -5,7 +5,6 @@ import ( "context" "github.com/pojntfx/stfs/internal/converters" - models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/pkg/config" ) @@ -15,7 +14,7 @@ func List( name string, limit int, - onHeader func(hdr *models.Header), + onHeader func(hdr *config.Header), ) ([]*tar.Header, error) { dbHdrs, err := metadata.Metadata.GetHeaderDirectChildren(context.Background(), name, limit) if err != nil { @@ -24,7 +23,7 @@ func List( headers := []*tar.Header{} for _, dbhdr := range dbHdrs { - hdr, err := converters.DBHeaderToTarHeader(dbhdr) + hdr, err := converters.DBHeaderToTarHeader(converters.ConfigHeaderToDBHeader(dbhdr)) if err != nil { return []*tar.Header{}, err } diff --git a/pkg/inventory/stat.go b/pkg/inventory/stat.go index 97973ec..1cf8f61 100644 --- a/pkg/inventory/stat.go +++ b/pkg/inventory/stat.go @@ -8,7 +8,6 @@ import ( "strings" "github.com/pojntfx/stfs/internal/converters" - models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/pkg/config" ) @@ -17,7 +16,7 @@ func Stat( name string, - onHeader func(hdr *models.Header), + onHeader func(hdr *config.Header), ) (*tar.Header, error) { name = filepath.ToSlash(name) @@ -33,7 +32,7 @@ func Stat( } } - hdr, err := converters.DBHeaderToTarHeader(dbhdr) + hdr, err := converters.DBHeaderToTarHeader(converters.ConfigHeaderToDBHeader(dbhdr)) if err != nil { return nil, err } diff --git a/pkg/operations/archive.go b/pkg/operations/archive.go index 061dfb7..24cfef2 100644 --- a/pkg/operations/archive.go +++ b/pkg/operations/archive.go @@ -10,7 +10,6 @@ import ( "github.com/pojntfx/stfs/internal/compression" "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/ioext" "github.com/pojntfx/stfs/internal/mtio" @@ -163,7 +162,7 @@ func (o *Operations) Archive( o.onHeader(&config.HeaderEvent{ Type: config.HeaderEventTypeArchive, Indexed: false, - Header: dbhdr, + Header: converters.DBHeaderToConfigHeader(dbhdr), }) } @@ -294,7 +293,7 @@ func (o *Operations) Archive( return nil // We sign above, no need to verify }, - func(hdr *models.Header) { + func(hdr *config.Header) { o.onHeader(&config.HeaderEvent{ Type: config.HeaderEventTypeArchive, Indexed: true, diff --git a/pkg/operations/delete.go b/pkg/operations/delete.go index 390e498..d91ed24 100644 --- a/pkg/operations/delete.go +++ b/pkg/operations/delete.go @@ -6,7 +6,6 @@ import ( "path/filepath" "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/records" "github.com/pojntfx/stfs/internal/signature" @@ -37,7 +36,7 @@ func (o *Operations) Delete(name string) error { return err } - headersToDelete := []*models.Header{} + headersToDelete := []*config.Header{} dbhdr, err := o.metadata.Metadata.GetHeader(context.Background(), name) if err != nil { return err @@ -57,7 +56,7 @@ func (o *Operations) Delete(name string) error { // Append deletion hdrs to the tape or tar file hdrs := []tar.Header{} for _, dbhdr := range headersToDelete { - hdr, err := converters.DBHeaderToTarHeader(dbhdr) + hdr, err := converters.DBHeaderToTarHeader(converters.ConfigHeaderToDBHeader(dbhdr)) if err != nil { return err } @@ -77,7 +76,7 @@ func (o *Operations) Delete(name string) error { o.onHeader(&config.HeaderEvent{ Type: config.HeaderEventTypeDelete, Indexed: false, - Header: dbhdr, + Header: converters.DBHeaderToConfigHeader(dbhdr), }) } @@ -142,7 +141,7 @@ func (o *Operations) Delete(name string) error { return nil // We sign above, no need to verify }, - func(hdr *models.Header) { + func(hdr *config.Header) { o.onHeader(&config.HeaderEvent{ Type: config.HeaderEventTypeDelete, Indexed: true, diff --git a/pkg/operations/move.go b/pkg/operations/move.go index 35ca76e..e850a6a 100644 --- a/pkg/operations/move.go +++ b/pkg/operations/move.go @@ -8,7 +8,6 @@ import ( "strings" "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/records" "github.com/pojntfx/stfs/internal/signature" @@ -44,7 +43,7 @@ func (o *Operations) Move(from string, to string) error { return err } - headersToMove := []*models.Header{} + headersToMove := []*config.Header{} dbhdr, err := o.metadata.Metadata.GetHeader(context.Background(), from) if err != nil { return err @@ -74,7 +73,7 @@ func (o *Operations) Move(from string, to string) error { // Append move headers to the tape or tar file hdrs := []tar.Header{} for _, dbhdr := range headersToMove { - hdr, err := converters.DBHeaderToTarHeader(dbhdr) + hdr, err := converters.DBHeaderToTarHeader(converters.ConfigHeaderToDBHeader(dbhdr)) if err != nil { return err } @@ -96,7 +95,7 @@ func (o *Operations) Move(from string, to string) error { o.onHeader(&config.HeaderEvent{ Type: config.HeaderEventTypeMove, Indexed: false, - Header: dbhdr, + Header: converters.DBHeaderToConfigHeader(dbhdr), }) } @@ -161,7 +160,7 @@ func (o *Operations) Move(from string, to string) error { return nil // We sign above, no need to verify }, - func(hdr *models.Header) { + func(hdr *config.Header) { o.onHeader(&config.HeaderEvent{ Type: config.HeaderEventTypeMove, Indexed: true, diff --git a/pkg/operations/restore.go b/pkg/operations/restore.go index 0326b18..a716e16 100644 --- a/pkg/operations/restore.go +++ b/pkg/operations/restore.go @@ -10,7 +10,6 @@ import ( "path/filepath" "strings" - models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/pkg/config" "github.com/pojntfx/stfs/pkg/recovery" ) @@ -28,7 +27,7 @@ func (o *Operations) Restore( o.diskOperationLock.Lock() defer o.diskOperationLock.Unlock() - headersToRestore := []*models.Header{} + headersToRestore := []*config.Header{} src := strings.TrimSuffix(from, "/") dbhdr, err := o.metadata.Metadata.GetHeader(context.Background(), src) if err != nil { diff --git a/pkg/operations/update.go b/pkg/operations/update.go index f961f3f..5f8dece 100644 --- a/pkg/operations/update.go +++ b/pkg/operations/update.go @@ -9,7 +9,6 @@ import ( "github.com/pojntfx/stfs/internal/compression" "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/ioext" "github.com/pojntfx/stfs/internal/mtio" @@ -163,7 +162,7 @@ func (o *Operations) Update( o.onHeader(&config.HeaderEvent{ Type: config.HeaderEventTypeUpdate, Indexed: false, - Header: dbhdr, + Header: converters.DBHeaderToConfigHeader(dbhdr), }) } @@ -253,7 +252,7 @@ func (o *Operations) Update( o.onHeader(&config.HeaderEvent{ Type: config.HeaderEventTypeUpdate, Indexed: false, - Header: dbhdr, + Header: converters.DBHeaderToConfigHeader(dbhdr), }) } @@ -322,7 +321,7 @@ func (o *Operations) Update( return nil // We sign above, no need to verify }, - func(hdr *models.Header) { + func(hdr *config.Header) { o.onHeader(&config.HeaderEvent{ Type: config.HeaderEventTypeUpdate, Indexed: true, diff --git a/pkg/persisters/metadata.go b/pkg/persisters/metadata.go index 8128105..6aaeb0a 100644 --- a/pkg/persisters/metadata.go +++ b/pkg/persisters/metadata.go @@ -11,6 +11,7 @@ import ( "path/filepath" "strings" + "github.com/pojntfx/stfs/internal/converters" "github.com/pojntfx/stfs/internal/db/sqlite/migrations/metadata" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/internal/pathext" @@ -43,8 +44,8 @@ func NewMetadataPersister(dbPath string) *MetadataPersister { } } -func (p *MetadataPersister) UpsertHeader(ctx context.Context, dbhdr *models.Header) error { - hdr := *dbhdr +func (p *MetadataPersister) UpsertHeader(ctx context.Context, dbhdr *config.Header) error { + hdr := converters.ConfigHeaderToDBHeader(dbhdr) if _, err := models.FindHeader(ctx, p.DB, hdr.Name, models.HeaderColumns.Name); err != nil { if err == sql.ErrNoRows { @@ -70,11 +71,13 @@ func (p *MetadataPersister) UpsertHeader(ctx context.Context, dbhdr *models.Head return nil } -func (p *MetadataPersister) UpdateHeaderMetadata(ctx context.Context, dbhdr *models.Header) error { - if _, err := dbhdr.Update(ctx, p.DB, boil.Infer()); err != nil { +func (p *MetadataPersister) UpdateHeaderMetadata(ctx context.Context, dbhdr *config.Header) error { + idbhdr := converters.ConfigHeaderToDBHeader(dbhdr) + + if _, err := idbhdr.Update(ctx, p.DB, boil.Infer()); err != nil { if err == sql.ErrNoRows { - hdr := *dbhdr - hdr.Name = p.withRelativeRoot(ctx, dbhdr.Name) + hdr := *idbhdr + hdr.Name = p.withRelativeRoot(ctx, idbhdr.Name) if _, err := hdr.Update(ctx, p.DB, boil.Infer()); err != nil { return err @@ -134,13 +137,23 @@ func (p *MetadataPersister) MoveHeader(ctx context.Context, oldName string, newN return nil } -func (p *MetadataPersister) GetHeaders(ctx context.Context) (models.HeaderSlice, error) { - return models.Headers( +func (p *MetadataPersister) GetHeaders(ctx context.Context) ([]*config.Header, error) { + dbhdrs, err := models.Headers( qm.Where(models.HeaderColumns.Deleted+" != 1"), ).All(ctx, p.DB) + if err != nil { + return []*config.Header{}, err + } + + hdrs := []*config.Header{} + for _, dbhdr := range dbhdrs { + hdrs = append(hdrs, converters.DBHeaderToConfigHeader(dbhdr)) + } + + return hdrs, nil } -func (p *MetadataPersister) GetHeader(ctx context.Context, name string) (*models.Header, error) { +func (p *MetadataPersister) GetHeader(ctx context.Context, name string) (*config.Header, error) { hdr, err := models.Headers( qm.Where(models.HeaderColumns.Name+" = ?", name), qm.Where(models.HeaderColumns.Deleted+" != 1"), @@ -159,10 +172,10 @@ func (p *MetadataPersister) GetHeader(ctx context.Context, name string) (*models } } - return hdr, nil + return converters.DBHeaderToConfigHeader(hdr), nil } -func (p *MetadataPersister) GetHeaderChildren(ctx context.Context, name string) (models.HeaderSlice, error) { +func (p *MetadataPersister) GetHeaderChildren(ctx context.Context, name string) ([]*config.Header, error) { headers, err := models.Headers( qm.Where(models.HeaderColumns.Name+" like ?", strings.TrimSuffix(name, "/")+"/%"), // Prevent double trailing slashes qm.Where(models.HeaderColumns.Deleted+" != 1"), @@ -181,11 +194,11 @@ func (p *MetadataPersister) GetHeaderChildren(ctx context.Context, name string) } } - outhdrs := models.HeaderSlice{} + outhdrs := []*config.Header{} for _, hdr := range headers { prefix := strings.TrimSuffix(hdr.Name, "/") if name != prefix && name != prefix+"/" { - outhdrs = append(outhdrs, hdr) + outhdrs = append(outhdrs, converters.DBHeaderToConfigHeader(hdr)) } } @@ -214,10 +227,10 @@ func (p *MetadataPersister) GetRootPath(ctx context.Context) (string, error) { return root.Name, nil } -func (p *MetadataPersister) GetHeaderDirectChildren(ctx context.Context, name string, limit int) (models.HeaderSlice, error) { +func (p *MetadataPersister) GetHeaderDirectChildren(ctx context.Context, name string, limit int) ([]*config.Header, error) { prefix := strings.TrimSuffix(name, "/") + "/" rootDepth := 0 - headers := models.HeaderSlice{} + headers := []*config.Header{} // Root node if pathext.IsRoot(name) { @@ -243,7 +256,7 @@ func (p *MetadataPersister) GetHeaderDirectChildren(ctx context.Context, name st rootDepth = int(depth.Depth) } - getHeaders := func(prefix string) (models.HeaderSlice, error) { + getHeaders := func(prefix string) ([]*config.Header, error) { query := fmt.Sprintf( `select %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, length(replace(%v, ?, '')) - length(replace(replace(%v, ?, ''), '/', '')) as depth @@ -336,7 +349,7 @@ where %v like ? } } - outhdrs := models.HeaderSlice{} + outhdrs := []*config.Header{} for _, hdr := range headers { prefix := strings.TrimSuffix(hdr.Name, "/") if name != prefix && name != prefix+"/" { @@ -351,7 +364,7 @@ where %v like ? return outhdrs[:limit-1], nil } -func (p *MetadataPersister) DeleteHeader(ctx context.Context, name string, lastknownrecord, lastknownblock int64) (*models.Header, error) { +func (p *MetadataPersister) DeleteHeader(ctx context.Context, name string, lastknownrecord, lastknownblock int64) (*config.Header, error) { hdr, err := models.FindHeader(ctx, p.DB, name) if err != nil { if err == sql.ErrNoRows { @@ -376,7 +389,7 @@ func (p *MetadataPersister) DeleteHeader(ctx context.Context, name string, lastk return nil, err } - return hdr, nil + return converters.DBHeaderToConfigHeader(hdr), nil } func (p *MetadataPersister) GetLastIndexedRecordAndBlock(ctx context.Context, recordSize int) (int64, int64, error) { diff --git a/pkg/recovery/fetch.go b/pkg/recovery/fetch.go index 73ee477..69fa29d 100644 --- a/pkg/recovery/fetch.go +++ b/pkg/recovery/fetch.go @@ -10,7 +10,6 @@ import ( "github.com/pojntfx/stfs/internal/compression" "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/mtio" "github.com/pojntfx/stfs/internal/records" @@ -33,7 +32,7 @@ func Fetch( to string, preview bool, - onHeader func(hdr *models.Header), + onHeader func(hdr *config.Header), ) error { to = filepath.ToSlash(to) @@ -79,7 +78,7 @@ func Fetch( return err } - onHeader(dbhdr) + onHeader(converters.DBHeaderToConfigHeader(dbhdr)) } if !preview { diff --git a/pkg/recovery/index.go b/pkg/recovery/index.go index 4c747bf..50ba113 100644 --- a/pkg/recovery/index.go +++ b/pkg/recovery/index.go @@ -41,7 +41,7 @@ func Index( isRegular bool, ) error, - onHeader func(hdr *models.Header), + onHeader func(hdr *config.Header), ) error { if overwrite { if err := metadata.Metadata.PurgeAllHeaders(context.Background()); err != nil { @@ -239,7 +239,7 @@ func indexHeader( metadataPersister config.MetadataPersister, compressionFormat string, encryptionFormat string, - onHeader func(hdr *models.Header), + onHeader func(hdr *config.Header), ) error { uncompressedSize, ok := hdr.PAXRecords[records.STFSRecordUncompressedSize] if ok { @@ -265,7 +265,7 @@ func indexHeader( return err } - onHeader(dbhdr) + onHeader(converters.DBHeaderToConfigHeader(dbhdr)) } stfsVersion, ok := hdr.PAXRecords[records.STFSRecordVersion] @@ -287,7 +287,7 @@ func indexHeader( return err } - if err := metadataPersister.UpsertHeader(context.Background(), dbhdr); err != nil { + if err := metadataPersister.UpsertHeader(context.Background(), converters.DBHeaderToConfigHeader(dbhdr)); err != nil { return err } case records.STFSRecordActionDelete: @@ -312,7 +312,7 @@ func indexHeader( newHdr = h - if err := metadataPersister.UpdateHeaderMetadata(context.Background(), newHdr); err != nil { + if err := metadataPersister.UpdateHeaderMetadata(context.Background(), converters.DBHeaderToConfigHeader(newHdr)); err != nil { return err } } else { @@ -326,7 +326,7 @@ func indexHeader( newHdr = h - if err := metadataPersister.UpdateHeaderMetadata(context.Background(), newHdr); err != nil { + if err := metadataPersister.UpdateHeaderMetadata(context.Background(), converters.DBHeaderToConfigHeader(newHdr)); err != nil { return err } } diff --git a/pkg/recovery/query.go b/pkg/recovery/query.go index dd15ba6..13588e9 100644 --- a/pkg/recovery/query.go +++ b/pkg/recovery/query.go @@ -8,7 +8,6 @@ import ( "math" "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/ioext" "github.com/pojntfx/stfs/internal/mtio" @@ -25,7 +24,7 @@ func Query( record int, block int, - onHeader func(hdr *models.Header), + onHeader func(hdr *config.Header), ) ([]*tar.Header, error) { headers := []*tar.Header{} @@ -103,7 +102,7 @@ func Query( return []*tar.Header{}, err } - onHeader(dbhdr) + onHeader(converters.DBHeaderToConfigHeader(dbhdr)) } headers = append(headers, hdr) @@ -191,7 +190,7 @@ func Query( return []*tar.Header{}, err } - onHeader(dbhdr) + onHeader(converters.DBHeaderToConfigHeader(dbhdr)) } headers = append(headers, hdr)