From 943d92d0529fad5881e0df32eef0ff2c94ee803d Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Mon, 6 Dec 2021 23:55:31 +0100 Subject: [PATCH] fix: Enable computation of last known record and block based on `lastknownrecord` and `lastknownblock` even if last changes are updates --- cmd/stbak/cmd/archive.go | 11 +- cmd/stbak/cmd/delete.go | 2 +- cmd/stbak/cmd/move.go | 2 +- cmd/stbak/cmd/restore.go | 2 +- cmd/stbak/cmd/update.go | 5 +- db/sqlite/migrations/metadata/1637447083.sql | 4 + internal/converters/header.go | 40 +-- .../sqlite/migrations/metadata/migrations.go | 2 +- internal/db/sqlite/models/metadata/headers.go | 270 +++++++++--------- .../db/sqlite/models/metadata/headers_test.go | 2 +- internal/formatting/csv.go | 6 +- internal/persisters/metadata.go | 14 +- pkg/inventory/find.go | 2 +- pkg/inventory/list.go | 2 +- pkg/recovery/fetch.go | 2 +- pkg/recovery/index.go | 8 +- pkg/recovery/query.go | 4 +- 17 files changed, 203 insertions(+), 175 deletions(-) diff --git a/cmd/stbak/cmd/archive.go b/cmd/stbak/cmd/archive.go index e9f0c4d..c8cf60d 100644 --- a/cmd/stbak/cmd/archive.go +++ b/cmd/stbak/cmd/archive.go @@ -174,11 +174,16 @@ var archiveCmd = &cobra.Command{ viper.GetBool(overwriteFlag), func(hdr *tar.Header, i int) error { - if len(hdrs) <= i { + // Ignore the first header, which is the last header which we already indexed + if i == 0 { + return nil + } + + if len(hdrs) <= i-1 { return errMissingTarHeader } - *hdr = *hdrs[i] + *hdr = *hdrs[i-1] return nil }, @@ -372,7 +377,7 @@ func archive( first = false } - if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(-1, -1, hdr)); err != nil { + if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(-1, -1, -1, -1, hdr)); err != nil { return err } diff --git a/cmd/stbak/cmd/delete.go b/cmd/stbak/cmd/delete.go index 5e33ebb..f155162 100644 --- a/cmd/stbak/cmd/delete.go +++ b/cmd/stbak/cmd/delete.go @@ -153,7 +153,7 @@ func delete( dirty = true - if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(-1, -1, hdr)); err != nil { + if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(-1, -1, -1, -1, hdr)); err != nil { return err } } diff --git a/cmd/stbak/cmd/move.go b/cmd/stbak/cmd/move.go index 770b7f3..f1dc5ea 100644 --- a/cmd/stbak/cmd/move.go +++ b/cmd/stbak/cmd/move.go @@ -150,7 +150,7 @@ func move( dirty = true - if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(-1, -1, hdr)); err != nil { + if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(-1, -1, -1, -1, hdr)); err != nil { return err } } diff --git a/cmd/stbak/cmd/restore.go b/cmd/stbak/cmd/restore.go index 5fb12ec..7207862 100644 --- a/cmd/stbak/cmd/restore.go +++ b/cmd/stbak/cmd/restore.go @@ -112,7 +112,7 @@ var restoreCmd = &cobra.Command{ return err } - if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(dbhdr.Record, dbhdr.Block, hdr)); err != nil { + if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(dbhdr.Record, dbhdr.Lastknownrecord, dbhdr.Block, dbhdr.Lastknownblock, hdr)); err != nil { return err } diff --git a/cmd/stbak/cmd/update.go b/cmd/stbak/cmd/update.go index f1ad5c6..fab7c3e 100644 --- a/cmd/stbak/cmd/update.go +++ b/cmd/stbak/cmd/update.go @@ -120,6 +120,7 @@ var updateCmd = &cobra.Command{ false, func(hdr *tar.Header, i int) error { + // Ignore the first header, which is the last header which we already indexed if i == 0 { return nil } @@ -279,7 +280,7 @@ func update( if replacesContent { hdr.PAXRecords[pax.STFSRecordReplacesContent] = pax.STFSRecordReplacesContentTrue - if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(-1, -1, hdr)); err != nil { + if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(-1, -1, -1, -1, hdr)); err != nil { return err } @@ -353,7 +354,7 @@ func update( } else { hdr.Size = 0 // Don't try to seek after the record - if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(-1, -1, hdr)); err != nil { + if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(-1, -1, -1, -1, hdr)); err != nil { return err } diff --git a/db/sqlite/migrations/metadata/1637447083.sql b/db/sqlite/migrations/metadata/1637447083.sql index 6d150ea..6999494 100644 --- a/db/sqlite/migrations/metadata/1637447083.sql +++ b/db/sqlite/migrations/metadata/1637447083.sql @@ -2,8 +2,12 @@ create table headers ( -- Record of this header on the tape record integer not null, + -- Record of the last update header of this header on the tape + lastknownrecord integer not null, -- Block of this header in the record block integer not null, + -- Block of the last update header of this header in the record + lastknownblock integer not null, -- Typeflag is the type of header entry. -- The zero value is automatically promoted to either TypeReg or TypeDir -- depending on the presence of a trailing slash in Name. diff --git a/internal/converters/header.go b/internal/converters/header.go index d3401f2..38f7dd3 100644 --- a/internal/converters/header.go +++ b/internal/converters/header.go @@ -35,31 +35,33 @@ func DBHeaderToTarHeader(dbhdr *models.Header) (*tar.Header, error) { return hdr, nil } -func TarHeaderToDBHeader(record, block int64, tarhdr *tar.Header) (*models.Header, error) { +func TarHeaderToDBHeader(record, lastKnownRecord, block, lastKnownBlock int64, tarhdr *tar.Header) (*models.Header, error) { paxRecords, err := json.Marshal(tarhdr.PAXRecords) if err != nil { return nil, err } hdr := models.Header{ - Record: record, - Block: block, - Typeflag: int64(tarhdr.Typeflag), - Name: tarhdr.Name, - Linkname: tarhdr.Linkname, - Size: tarhdr.Size, - Mode: tarhdr.Mode, - UID: int64(tarhdr.Uid), - Gid: int64(tarhdr.Gid), - Uname: tarhdr.Uname, - Gname: tarhdr.Gname, - Modtime: tarhdr.ModTime, - Accesstime: tarhdr.AccessTime, - Changetime: tarhdr.ChangeTime, - Devmajor: tarhdr.Devmajor, - Devminor: tarhdr.Devminor, - Paxrecords: string(paxRecords), - Format: int64(tarhdr.Format), + Record: record, + Lastknownrecord: lastKnownRecord, + Block: block, + Lastknownblock: lastKnownBlock, + Typeflag: int64(tarhdr.Typeflag), + Name: tarhdr.Name, + Linkname: tarhdr.Linkname, + Size: tarhdr.Size, + Mode: tarhdr.Mode, + UID: int64(tarhdr.Uid), + Gid: int64(tarhdr.Gid), + Uname: tarhdr.Uname, + Gname: tarhdr.Gname, + Modtime: tarhdr.ModTime, + Accesstime: tarhdr.AccessTime, + Changetime: tarhdr.ChangeTime, + Devmajor: tarhdr.Devmajor, + Devminor: tarhdr.Devminor, + Paxrecords: string(paxRecords), + Format: int64(tarhdr.Format), } return &hdr, nil diff --git a/internal/db/sqlite/migrations/metadata/migrations.go b/internal/db/sqlite/migrations/metadata/migrations.go index 75a59f9..62409ed 100644 --- a/internal/db/sqlite/migrations/metadata/migrations.go +++ b/internal/db/sqlite/migrations/metadata/migrations.go @@ -25,7 +25,7 @@ func bindata_read(data []byte, name string) ([]byte, error) { return buf.Bytes(), nil } -var _db_sqlite_migrations_metadata_1637447083_sql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x56\xc1\x72\x1b\x37\x0c\x3d\xd7\x5f\x81\xc9\x25\xf6\x54\xab\x73\xa7\x99\x1e\xdc\xb8\x71\x3d\x63\x3b\x19\xd9\xaa\x73\xa5\x96\xd8\x5d\x56\x5c\x82\x05\xb9\x92\x37\x5f\xdf\x01\xb9\x54\x64\xa9\x52\xa7\xd3\x93\xa8\x25\xf0\x88\x07\x02\x0f\xac\x2a\xf8\xb1\x37\x2d\xab\x88\xb0\xf4\x17\x35\xa3\xac\xa2\x5a\x59\x84\x0e\x95\x46\x0e\x70\x79\x01\x00\x50\x55\xb0\xc0\x9a\x58\x03\x35\x10\x3b\x13\xa6\x7d\x20\x07\xb1\x13\x1f\x8f\xc9\x90\xb3\x95\x71\x11\x5b\x64\x70\x14\xc1\x0d\xd6\xce\x0a\xca\xaf\x96\xea\xf5\x21\x88\xc9\x20\xd9\x37\x59\xae\x92\xd9\x49\x94\xe7\xd1\x63\x63\x55\x0b\x26\xe4\xe3\x47\x8f\x02\x3a\xe1\xa1\x8b\x3c\xce\x77\xc6\x1d\xc2\x37\x64\x82\x8d\xb2\x03\x8a\x8b\x1a\x22\xf5\x2a\x9a\x5a\x59\x3b\x82\x67\xea\x29\xa2\x86\x48\x80\x26\x76\xc8\x09\x7f\x81\x2d\x50\x5e\xde\x18\x2e\x60\x1a\x3d\x3a\x6d\x5c\x5b\x98\x7b\xc6\x80\xae\x4e\xc7\x2b\x88\xac\x8c\x95\xdd\x60\x55\xe8\x84\xd8\xa3\xea\x31\x87\x12\x77\x41\x9f\xa2\x25\xb6\x82\xd3\x18\x8b\x99\x44\xda\x71\xf2\x39\xe2\x6b\xdc\x79\x80\x67\xd3\x2b\x1e\x61\x8d\xe3\xf7\xa4\x28\x6e\x31\x66\x6b\x6a\xc0\x1a\xb7\x86\xcb\x8d\xb2\x46\x43\x33\x11\xb9\x97\x6f\xd3\xfa\x69\xec\xc5\xe4\x2a\xb9\xcb\xea\xf8\x98\x1d\xf4\x3d\xb5\x92\xac\x1c\x58\x30\xdf\x50\x98\xad\xc6\x88\x21\x59\x4c\x5f\x4e\xb0\xfa\x82\xdc\x9b\x10\x0c\x39\x50\x4e\x43\x4f\x1a\x61\x65\x62\x76\x4d\xff\x4e\xba\x2e\x03\x32\xdc\xdd\x08\x1d\xda\x3a\xcc\xb7\x30\x98\x33\xf5\x75\xcb\x34\xf8\x23\x97\xf6\x9c\x4b\x3a\xa4\x64\x6d\xef\x98\x33\xf9\xc8\xa7\x1c\xfb\xb4\x67\x7c\xee\x9a\x54\x2f\x9f\x88\x7b\x15\xa5\x0a\x07\x17\x3c\xd6\xa6\x31\xa8\x67\xb2\xe5\xe0\x85\x4d\x44\x9e\xa7\x9f\xdf\x73\x29\x33\x0d\x4e\x07\x78\x20\xfd\x6c\x7a\x2c\x58\x91\x12\x96\x43\xc5\x18\x22\x04\xac\xc9\xe9\x94\x5d\xd3\x3a\x62\xcc\x5d\x71\x5d\xd7\x18\x82\xf8\xa5\xad\x8f\x9d\x72\x2d\xa6\xbf\x8d\x41\xab\x43\xe9\x90\x5d\x01\x11\x0c\xe1\x8d\x1b\xf1\x9e\xd7\x0c\x72\xbc\xe3\x3e\x0f\x15\xe0\xcb\xf5\x57\x31\xbc\x7d\x5c\xce\x0f\x90\xc2\xb0\xaa\xa6\xd8\x18\x03\xd9\x21\x1a\x72\x67\x60\x76\xfe\x0f\xa4\x4d\x63\x6a\x25\xf6\x10\x0b\xf1\x9e\xb4\xac\x41\x8b\x4a\x1d\xe5\x37\x87\x9d\xac\xe1\x92\xf1\xaf\xc1\x48\x1e\xa6\x86\xfe\x1e\x23\x84\xc1\x7b\xe2\x98\xeb\x5e\x25\xa7\x33\xa8\x99\xfe\x7f\x44\xad\x93\xd3\x19\xd4\x07\xf5\x27\x31\x68\xdc\x98\x1a\xc1\x0d\xfd\x0a\xf9\xb0\x55\x3f\x76\x8a\x4b\xab\x26\xd1\xcc\xd0\x1a\x37\x7d\x72\x3e\x59\xce\x0f\xc6\xfd\x0f\xec\xe4\x7c\xba\x95\xaf\xbf\xe6\x31\x10\x92\x8c\x42\xaf\xbc\x34\x80\xe4\x01\x5f\x23\x3a\x8d\xba\x68\x70\x16\xf3\xa3\x1a\x93\x66\xab\x34\x36\xc6\xa1\x2e\x36\x10\x3a\x1a\xac\x86\x4e\x6d\x50\x14\x2d\xe4\xf9\x80\xd0\x90\xb5\xb4\x15\x39\x6d\x88\xfb\x9f\x27\x8c\x1f\xfe\xf8\xed\xf1\xe6\xf3\x62\xbe\xc6\x71\x5b\xe6\x45\x55\xc1\x4b\x87\x8c\x90\xf7\x24\xba\x40\x3d\xa6\x16\x0d\x5e\xd5\x49\xb0\x94\xb5\x30\x78\x8f\x5c\xab\x80\xb3\xd4\x13\x13\x06\xf4\x6a\x2c\x38\x42\xba\x26\x17\xd5\x34\x95\xde\xff\xf2\x5e\x2e\x94\x55\x1d\x25\x93\x38\x6f\xe7\x33\x78\x77\xfb\xf9\xfe\xfa\xf1\x76\xee\xd7\xed\x7c\x83\x2c\xe2\xf6\xee\xea\xcd\xc4\x59\xe3\x98\x4e\xc8\x43\x67\x62\xb8\x92\x5a\x70\x15\xf6\x3e\x8e\xb0\x7c\xfe\x54\xfd\x04\x21\xb2\x71\xed\x51\x9e\x5e\x4e\xe8\x81\x09\x20\x53\x4b\x24\x43\xb2\x5e\x32\xa8\x91\xcd\x06\x35\x34\x4c\xbd\x44\x5d\x60\x28\xd5\x69\x6e\x77\x49\xc1\x84\x12\xd5\x3a\x4d\xae\x1a\x75\x9e\x5d\x9b\x5c\xcd\x8b\xfd\x4b\xf3\xea\xb5\xc0\xff\xb3\xa2\x4d\xbd\x5b\x54\x2c\x4c\x77\x96\x3e\x4e\x37\x18\x15\x4f\x05\x71\x24\x36\x32\xff\xe5\x9a\x30\xc2\x6a\x84\x45\x36\x7a\x94\x83\x94\x94\xd6\x0a\x43\xac\xb0\x69\x88\x23\xb4\x83\x74\xb6\x8a\x7b\x07\xec\x72\xfd\x64\x84\x80\x6c\x64\x08\xb0\x66\x85\x9c\x06\x3b\xa3\xd2\xa5\x0e\xc8\x55\x35\xf5\xde\x1a\xe5\x62\x1a\x63\x61\x47\xc3\x24\x35\xf6\x14\x82\x91\x87\x8f\x34\x49\x7a\x9c\x44\x92\xfb\xca\x24\x97\x6e\xed\x68\xeb\x0e\x49\xdc\x35\xfb\x9c\xdf\x6a\x3a\x6c\xff\xf5\x0a\x77\x72\x2e\x96\x26\x8a\x66\x4e\x49\x34\x1c\x62\x81\xbd\x9c\x0a\x91\x38\x3d\xb8\x1a\x58\x3e\x3d\x5f\x2f\xd2\xfd\xcf\x44\x7b\xae\x0a\x4c\xad\x7c\x7a\xba\x51\x03\xe8\x6a\x4a\xaf\x94\xc4\x64\x3a\xf8\x32\x60\xe1\x33\xd5\x6a\x09\xfc\xa0\xdf\x2f\xae\x3e\x5c\xec\xbf\x0d\x6f\x68\xeb\x2e\x34\x93\x7f\xfb\x36\xfc\xf0\x77\x00\x00\x00\xff\xff\x22\x0d\xa1\x4e\x40\x0a\x00\x00") +var _db_sqlite_migrations_metadata_1637447083_sql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x56\xcd\x72\x1b\x37\x0c\x3e\xd7\x4f\x81\xc9\x25\xf6\x54\xab\x73\xa7\x99\x1e\xdc\xb8\x71\x33\x63\x3b\x19\xd9\xaa\x73\xa5\x96\xd8\x5d\x56\x5c\x82\x05\xb9\x92\x37\x4f\xdf\x01\xb9\x54\x64\x2b\x92\xd3\xe9\x49\x2b\x12\xf8\x80\x0f\xc4\x5f\x55\xc1\xcf\xbd\x69\x59\x45\x84\xa5\x3f\xab\x19\xe5\x2b\xaa\x95\x45\xe8\x50\x69\xe4\x00\xe7\x67\x00\x00\x55\x05\x0b\xac\x89\x35\x50\x03\xb1\x33\x61\xba\x07\x72\x10\x3b\xd1\xf1\x98\x04\x39\x4b\x19\x17\xb1\x45\x06\x47\x11\xdc\x60\xed\xec\x7b\x28\x08\x56\x85\x08\x83\xd7\x62\xb6\x00\x9e\xc6\x17\x8d\xb5\xa3\xad\x7b\xcd\xd0\xef\x96\xea\xf5\x4b\x34\x93\xd1\xb2\x6e\x92\x5c\x25\xb1\x1f\x41\xf9\x11\x6f\x0f\xf1\x77\xfe\xbe\x62\xe8\x61\xf4\xd8\x58\xd5\x82\x09\x99\xf0\xe8\x51\xd0\x27\x60\x74\x91\xc7\xf9\x4e\xb8\x43\xf8\x8a\x4c\xb0\x51\x76\x40\x51\x51\x43\xa4\x5e\x45\x53\x2b\x6b\x47\xf0\x4c\x3d\x45\xd4\x10\x09\xd0\xc4\x0e\x39\xe1\x2f\xb0\x05\xca\x9f\x57\x86\x0b\x98\x46\x8f\x4e\x1b\xd7\x96\x58\x7b\xc6\x80\xae\x4e\xe6\x15\x44\x56\xc6\xca\x6d\xb0\x2a\x74\xc2\xf0\x4e\xf5\x98\x5d\x89\x3b\xa7\x8f\xd1\x12\x59\xc1\x69\x8c\xc5\x4c\x22\xdd\x38\x39\x8e\xf8\x14\x77\x1a\xe0\xd9\xf4\x8a\x47\x58\xe3\xf8\x2d\x28\x8a\x5b\x8c\x59\x9a\x1a\xb0\xc6\xad\xe1\x7c\xa3\xac\xd1\xd0\x4c\x44\x6e\xe4\x6c\xfa\xbe\x1f\x7b\x11\xb9\xc8\x81\x37\x6e\x7d\x68\x66\x07\x7d\x43\xad\x04\x2b\x3b\x16\xcc\x57\x14\x66\xab\x31\x62\x48\x12\xd3\xc9\x11\x56\x9f\x91\x7b\x13\x82\x21\x07\xca\x69\xe8\x49\x23\xac\x4c\xcc\xaa\xe9\xdf\x51\xd5\x65\x40\x86\x8f\x57\x42\x87\xb6\x0e\xf3\x2b\x0c\xe6\x44\x22\x5f\x33\x0d\xfe\x40\xa5\x3d\xa5\x92\x8c\x94\xa8\xed\x99\x39\x11\x8f\x6c\xe5\x50\xa7\x3d\xa1\xf3\x31\x97\xc5\x07\xe2\x5e\x45\xc9\xc2\xc1\x05\x8f\xb5\x69\x0c\xea\x99\x5c\x39\x78\x64\x13\x91\xe7\xe9\xe7\xcf\x9c\xca\x4c\x83\xd3\x01\x6e\x49\x3f\x98\x1e\x0b\x56\xa4\x84\xe5\x50\x31\x86\x08\x01\x6b\x72\x3a\x45\xd7\xb4\x8e\x18\x73\x55\x5c\xd6\x35\x86\x20\x7a\xe9\xea\x7d\xa7\x5c\x8b\xe9\x6f\x63\xd0\xea\x50\x2a\x64\x97\x40\x04\x43\x78\xa6\x46\xbc\xa7\x35\x83\xec\xef\xb8\xcf\x43\x05\xf8\x7c\xf9\x45\x04\xaf\xef\x96\xf3\x17\x48\x61\x58\x55\x93\x6f\x8c\x81\xec\x10\x0d\xb9\x13\x30\x3b\xfd\x5b\xd2\xa6\x31\xb5\x12\x79\x88\x85\x78\x4f\x5a\xbe\x21\xb5\x94\x83\xf8\x66\xb7\x93\x34\x9c\x33\xfe\x33\x18\x89\xc3\x54\xd0\xdf\x7c\x84\x30\x78\x4f\x1c\x73\xde\xab\xa4\x74\x02\x35\xd3\xff\x8f\xa8\x75\x52\x3a\x81\x7a\xab\xfe\x26\x06\x8d\x1b\x53\x23\xb8\xa1\x5f\x21\xbf\x2c\xd5\xf7\x9d\xe2\x52\xaa\xa9\xaf\x66\x68\x8d\x9b\x3e\x29\x1f\x4d\xe7\x5b\xe3\xfe\x07\x76\x52\x3e\x5e\xca\x97\x5f\xf2\x48\x0a\xa9\x8d\x42\xaf\xbc\x14\x80\xc4\x01\x9f\x22\x3a\x8d\xba\xf4\xe0\xdc\xd5\x0f\x72\x4c\x8a\xad\xd2\xd8\x18\x87\xba\xc8\x40\xe8\x68\xb0\x1a\x3a\xb5\x41\xe9\x68\xa1\x8c\x90\x86\xac\xa5\xad\xb4\xd3\x86\xb8\xff\x75\xc2\xf8\xe9\xaf\x3f\xee\xae\x3e\x2d\xe6\x6b\x1c\xb7\x65\x70\x54\x15\x3c\x76\xc8\x08\xf9\x4e\xbc\x0b\xd4\x63\x2a\xd1\xe0\x55\x9d\x1a\x96\xb2\x16\x06\xef\x91\x6b\x15\x70\x96\x6a\x62\xc2\x80\x5e\x8d\x05\x47\x48\xd7\xe4\xa2\x9a\xc6\xd3\xdb\xdf\xde\xca\x83\xb2\xaa\xa3\x44\x12\xe7\xed\x7c\x06\x6f\xae\x3f\xdd\x5c\xde\x5d\xcf\xfd\xba\x9d\x6f\x90\xa5\xb9\xbd\xb9\x78\x36\x71\xd6\x38\x26\x0b\x79\xe8\x4c\x0c\x57\x92\x0b\xae\xc2\xde\xc7\x11\x96\x0f\x1f\xaa\x5f\x20\x44\x36\xae\x3d\x88\xd3\xe3\x91\x7e\x60\x02\xc8\xd4\x92\x96\x21\x51\x2f\x11\xd4\xc8\x66\x83\x1a\x1a\xa6\x5e\xbc\x2e\x30\x94\xf2\x34\x97\xbb\x84\x60\x42\x89\x6a\x9d\x26\x57\x8d\x3a\xcf\xae\x4d\xce\xe6\xc5\xfe\xa3\x79\xf5\x54\xe0\xbf\xdf\xd1\xa6\xda\x2d\x5d\x2c\x4c\x6f\x96\x0e\xa7\x17\x8c\x8a\xa7\x84\x38\x68\x36\xb2\x08\xc8\x33\x61\x84\xd5\x08\x8b\x2c\x74\x27\x86\x94\xa4\xd6\x0a\x43\xac\xb0\x69\x88\x23\xb4\x83\x54\xb6\x8a\x7b\x06\x76\xb1\xbe\x37\x42\x40\x2e\x32\x04\x58\xb3\x42\x4e\x83\x9d\x51\xe9\x92\x07\xe4\xaa\x9a\x7a\x6f\x8d\x72\x31\x8d\xb1\xb0\xa3\x61\x52\x37\xf6\x14\x82\x91\x55\x4e\x8a\x24\x6d\x29\x91\xe4\xbd\x32\xc9\xa5\x4b\x6b\xc9\x4b\x12\x1f\x9b\x7d\xce\xcf\x7b\x3a\x6c\x5f\x7d\xc2\x5d\x3b\x17\x49\x13\xa5\x67\x4e\x41\x34\x1c\x62\x81\x3d\x9f\x12\x91\x78\xda\xa1\x96\xf7\x0f\x97\x8b\xf4\xfe\x33\xe9\x3d\x17\x05\xa6\x56\x3e\x2d\xa3\xd4\x00\xba\x9a\xd2\x96\x92\x98\x4c\x86\xcf\x03\x16\x3e\x53\xae\x16\xc7\x5f\xd4\xfb\xd9\xc5\xbb\xb3\xfd\x6d\xf7\x8a\xb6\xee\x4c\x33\xf9\xe7\xdb\xee\xbb\x7f\x03\x00\x00\xff\xff\x4b\x3a\xfd\xed\x12\x0b\x00\x00") func db_sqlite_migrations_metadata_1637447083_sql() ([]byte, error) { return bindata_read( diff --git a/internal/db/sqlite/models/metadata/headers.go b/internal/db/sqlite/models/metadata/headers.go index bc947c5..d203c29 100644 --- a/internal/db/sqlite/models/metadata/headers.go +++ b/internal/db/sqlite/models/metadata/headers.go @@ -22,107 +22,117 @@ import ( // Header is an object representing the database table. type Header struct { - Record int64 `boil:"record" json:"record" toml:"record" yaml:"record"` - Block int64 `boil:"block" json:"block" toml:"block" yaml:"block"` - Typeflag int64 `boil:"typeflag" json:"typeflag" toml:"typeflag" yaml:"typeflag"` - Name string `boil:"name" json:"name" toml:"name" yaml:"name"` - Linkname string `boil:"linkname" json:"linkname" toml:"linkname" yaml:"linkname"` - Size int64 `boil:"size" json:"size" toml:"size" yaml:"size"` - Mode int64 `boil:"mode" json:"mode" toml:"mode" yaml:"mode"` - UID int64 `boil:"uid" json:"uid" toml:"uid" yaml:"uid"` - Gid int64 `boil:"gid" json:"gid" toml:"gid" yaml:"gid"` - Uname string `boil:"uname" json:"uname" toml:"uname" yaml:"uname"` - Gname string `boil:"gname" json:"gname" toml:"gname" yaml:"gname"` - Modtime time.Time `boil:"modtime" json:"modtime" toml:"modtime" yaml:"modtime"` - Accesstime time.Time `boil:"accesstime" json:"accesstime" toml:"accesstime" yaml:"accesstime"` - Changetime time.Time `boil:"changetime" json:"changetime" toml:"changetime" yaml:"changetime"` - Devmajor int64 `boil:"devmajor" json:"devmajor" toml:"devmajor" yaml:"devmajor"` - Devminor int64 `boil:"devminor" json:"devminor" toml:"devminor" yaml:"devminor"` - Paxrecords string `boil:"paxrecords" json:"paxrecords" toml:"paxrecords" yaml:"paxrecords"` - Format int64 `boil:"format" json:"format" toml:"format" yaml:"format"` + Record int64 `boil:"record" json:"record" toml:"record" yaml:"record"` + Lastknownrecord int64 `boil:"lastknownrecord" json:"lastknownrecord" toml:"lastknownrecord" yaml:"lastknownrecord"` + Block int64 `boil:"block" json:"block" toml:"block" yaml:"block"` + Lastknownblock int64 `boil:"lastknownblock" json:"lastknownblock" toml:"lastknownblock" yaml:"lastknownblock"` + Typeflag int64 `boil:"typeflag" json:"typeflag" toml:"typeflag" yaml:"typeflag"` + Name string `boil:"name" json:"name" toml:"name" yaml:"name"` + Linkname string `boil:"linkname" json:"linkname" toml:"linkname" yaml:"linkname"` + Size int64 `boil:"size" json:"size" toml:"size" yaml:"size"` + Mode int64 `boil:"mode" json:"mode" toml:"mode" yaml:"mode"` + UID int64 `boil:"uid" json:"uid" toml:"uid" yaml:"uid"` + Gid int64 `boil:"gid" json:"gid" toml:"gid" yaml:"gid"` + Uname string `boil:"uname" json:"uname" toml:"uname" yaml:"uname"` + Gname string `boil:"gname" json:"gname" toml:"gname" yaml:"gname"` + Modtime time.Time `boil:"modtime" json:"modtime" toml:"modtime" yaml:"modtime"` + Accesstime time.Time `boil:"accesstime" json:"accesstime" toml:"accesstime" yaml:"accesstime"` + Changetime time.Time `boil:"changetime" json:"changetime" toml:"changetime" yaml:"changetime"` + Devmajor int64 `boil:"devmajor" json:"devmajor" toml:"devmajor" yaml:"devmajor"` + Devminor int64 `boil:"devminor" json:"devminor" toml:"devminor" yaml:"devminor"` + Paxrecords string `boil:"paxrecords" json:"paxrecords" toml:"paxrecords" yaml:"paxrecords"` + Format int64 `boil:"format" json:"format" toml:"format" yaml:"format"` R *headerR `boil:"-" json:"-" toml:"-" yaml:"-"` L headerL `boil:"-" json:"-" toml:"-" yaml:"-"` } var HeaderColumns = struct { - Record string - Block string - Typeflag string - Name string - Linkname string - Size string - Mode string - UID string - Gid string - Uname string - Gname string - Modtime string - Accesstime string - Changetime string - Devmajor string - Devminor string - Paxrecords string - Format string + Record string + Lastknownrecord string + Block string + Lastknownblock string + Typeflag string + Name string + Linkname string + Size string + Mode string + UID string + Gid string + Uname string + Gname string + Modtime string + Accesstime string + Changetime string + Devmajor string + Devminor string + Paxrecords string + Format string }{ - Record: "record", - Block: "block", - Typeflag: "typeflag", - Name: "name", - Linkname: "linkname", - Size: "size", - Mode: "mode", - UID: "uid", - Gid: "gid", - Uname: "uname", - Gname: "gname", - Modtime: "modtime", - Accesstime: "accesstime", - Changetime: "changetime", - Devmajor: "devmajor", - Devminor: "devminor", - Paxrecords: "paxrecords", - Format: "format", + Record: "record", + Lastknownrecord: "lastknownrecord", + Block: "block", + Lastknownblock: "lastknownblock", + Typeflag: "typeflag", + Name: "name", + Linkname: "linkname", + Size: "size", + Mode: "mode", + UID: "uid", + Gid: "gid", + Uname: "uname", + Gname: "gname", + Modtime: "modtime", + Accesstime: "accesstime", + Changetime: "changetime", + Devmajor: "devmajor", + Devminor: "devminor", + Paxrecords: "paxrecords", + Format: "format", } var HeaderTableColumns = struct { - Record string - Block string - Typeflag string - Name string - Linkname string - Size string - Mode string - UID string - Gid string - Uname string - Gname string - Modtime string - Accesstime string - Changetime string - Devmajor string - Devminor string - Paxrecords string - Format string + Record string + Lastknownrecord string + Block string + Lastknownblock string + Typeflag string + Name string + Linkname string + Size string + Mode string + UID string + Gid string + Uname string + Gname string + Modtime string + Accesstime string + Changetime string + Devmajor string + Devminor string + Paxrecords string + Format string }{ - Record: "headers.record", - Block: "headers.block", - Typeflag: "headers.typeflag", - Name: "headers.name", - Linkname: "headers.linkname", - Size: "headers.size", - Mode: "headers.mode", - UID: "headers.uid", - Gid: "headers.gid", - Uname: "headers.uname", - Gname: "headers.gname", - Modtime: "headers.modtime", - Accesstime: "headers.accesstime", - Changetime: "headers.changetime", - Devmajor: "headers.devmajor", - Devminor: "headers.devminor", - Paxrecords: "headers.paxrecords", - Format: "headers.format", + Record: "headers.record", + Lastknownrecord: "headers.lastknownrecord", + Block: "headers.block", + Lastknownblock: "headers.lastknownblock", + Typeflag: "headers.typeflag", + Name: "headers.name", + Linkname: "headers.linkname", + Size: "headers.size", + Mode: "headers.mode", + UID: "headers.uid", + Gid: "headers.gid", + Uname: "headers.uname", + Gname: "headers.gname", + Modtime: "headers.modtime", + Accesstime: "headers.accesstime", + Changetime: "headers.changetime", + Devmajor: "headers.devmajor", + Devminor: "headers.devminor", + Paxrecords: "headers.paxrecords", + Format: "headers.format", } // Generated where @@ -172,43 +182,47 @@ func (w whereHelpertime_Time) GTE(x time.Time) qm.QueryMod { } var HeaderWhere = struct { - Record whereHelperint64 - Block whereHelperint64 - Typeflag whereHelperint64 - Name whereHelperstring - Linkname whereHelperstring - Size whereHelperint64 - Mode whereHelperint64 - UID whereHelperint64 - Gid whereHelperint64 - Uname whereHelperstring - Gname whereHelperstring - Modtime whereHelpertime_Time - Accesstime whereHelpertime_Time - Changetime whereHelpertime_Time - Devmajor whereHelperint64 - Devminor whereHelperint64 - Paxrecords whereHelperstring - Format whereHelperint64 + Record whereHelperint64 + Lastknownrecord whereHelperint64 + Block whereHelperint64 + Lastknownblock whereHelperint64 + Typeflag whereHelperint64 + Name whereHelperstring + Linkname whereHelperstring + Size whereHelperint64 + Mode whereHelperint64 + UID whereHelperint64 + Gid whereHelperint64 + Uname whereHelperstring + Gname whereHelperstring + Modtime whereHelpertime_Time + Accesstime whereHelpertime_Time + Changetime whereHelpertime_Time + Devmajor whereHelperint64 + Devminor whereHelperint64 + Paxrecords whereHelperstring + Format whereHelperint64 }{ - Record: whereHelperint64{field: "\"headers\".\"record\""}, - Block: whereHelperint64{field: "\"headers\".\"block\""}, - Typeflag: whereHelperint64{field: "\"headers\".\"typeflag\""}, - Name: whereHelperstring{field: "\"headers\".\"name\""}, - Linkname: whereHelperstring{field: "\"headers\".\"linkname\""}, - Size: whereHelperint64{field: "\"headers\".\"size\""}, - Mode: whereHelperint64{field: "\"headers\".\"mode\""}, - UID: whereHelperint64{field: "\"headers\".\"uid\""}, - Gid: whereHelperint64{field: "\"headers\".\"gid\""}, - Uname: whereHelperstring{field: "\"headers\".\"uname\""}, - Gname: whereHelperstring{field: "\"headers\".\"gname\""}, - Modtime: whereHelpertime_Time{field: "\"headers\".\"modtime\""}, - Accesstime: whereHelpertime_Time{field: "\"headers\".\"accesstime\""}, - Changetime: whereHelpertime_Time{field: "\"headers\".\"changetime\""}, - Devmajor: whereHelperint64{field: "\"headers\".\"devmajor\""}, - Devminor: whereHelperint64{field: "\"headers\".\"devminor\""}, - Paxrecords: whereHelperstring{field: "\"headers\".\"paxrecords\""}, - Format: whereHelperint64{field: "\"headers\".\"format\""}, + Record: whereHelperint64{field: "\"headers\".\"record\""}, + Lastknownrecord: whereHelperint64{field: "\"headers\".\"lastknownrecord\""}, + Block: whereHelperint64{field: "\"headers\".\"block\""}, + Lastknownblock: whereHelperint64{field: "\"headers\".\"lastknownblock\""}, + Typeflag: whereHelperint64{field: "\"headers\".\"typeflag\""}, + Name: whereHelperstring{field: "\"headers\".\"name\""}, + Linkname: whereHelperstring{field: "\"headers\".\"linkname\""}, + Size: whereHelperint64{field: "\"headers\".\"size\""}, + Mode: whereHelperint64{field: "\"headers\".\"mode\""}, + UID: whereHelperint64{field: "\"headers\".\"uid\""}, + Gid: whereHelperint64{field: "\"headers\".\"gid\""}, + Uname: whereHelperstring{field: "\"headers\".\"uname\""}, + Gname: whereHelperstring{field: "\"headers\".\"gname\""}, + Modtime: whereHelpertime_Time{field: "\"headers\".\"modtime\""}, + Accesstime: whereHelpertime_Time{field: "\"headers\".\"accesstime\""}, + Changetime: whereHelpertime_Time{field: "\"headers\".\"changetime\""}, + Devmajor: whereHelperint64{field: "\"headers\".\"devmajor\""}, + Devminor: whereHelperint64{field: "\"headers\".\"devminor\""}, + Paxrecords: whereHelperstring{field: "\"headers\".\"paxrecords\""}, + Format: whereHelperint64{field: "\"headers\".\"format\""}, } // HeaderRels is where relationship names are stored. @@ -228,8 +242,8 @@ func (*headerR) NewStruct() *headerR { type headerL struct{} var ( - headerAllColumns = []string{"record", "block", "typeflag", "name", "linkname", "size", "mode", "uid", "gid", "uname", "gname", "modtime", "accesstime", "changetime", "devmajor", "devminor", "paxrecords", "format"} - headerColumnsWithoutDefault = []string{"record", "block", "typeflag", "name", "linkname", "size", "mode", "uid", "gid", "uname", "gname", "modtime", "accesstime", "changetime", "devmajor", "devminor", "paxrecords", "format"} + headerAllColumns = []string{"record", "lastknownrecord", "block", "lastknownblock", "typeflag", "name", "linkname", "size", "mode", "uid", "gid", "uname", "gname", "modtime", "accesstime", "changetime", "devmajor", "devminor", "paxrecords", "format"} + headerColumnsWithoutDefault = []string{"record", "lastknownrecord", "block", "lastknownblock", "typeflag", "name", "linkname", "size", "mode", "uid", "gid", "uname", "gname", "modtime", "accesstime", "changetime", "devmajor", "devminor", "paxrecords", "format"} headerColumnsWithDefault = []string{} headerPrimaryKeyColumns = []string{"name"} ) diff --git a/internal/db/sqlite/models/metadata/headers_test.go b/internal/db/sqlite/models/metadata/headers_test.go index a8b8eb2..d86ebfd 100644 --- a/internal/db/sqlite/models/metadata/headers_test.go +++ b/internal/db/sqlite/models/metadata/headers_test.go @@ -568,7 +568,7 @@ func testHeadersSelect(t *testing.T) { } var ( - headerDBTypes = map[string]string{`Record`: `INTEGER`, `Block`: `INTEGER`, `Typeflag`: `INTEGER`, `Name`: `TEXT`, `Linkname`: `TEXT`, `Size`: `INTEGER`, `Mode`: `INTEGER`, `UID`: `INTEGER`, `Gid`: `INTEGER`, `Uname`: `TEXT`, `Gname`: `TEXT`, `Modtime`: `DATE`, `Accesstime`: `DATE`, `Changetime`: `DATE`, `Devmajor`: `INTEGER`, `Devminor`: `INTEGER`, `Paxrecords`: `TEXT`, `Format`: `INTEGER`} + headerDBTypes = map[string]string{`Record`: `INTEGER`, `Lastknownrecord`: `INTEGER`, `Block`: `INTEGER`, `Lastknownblock`: `INTEGER`, `Typeflag`: `INTEGER`, `Name`: `TEXT`, `Linkname`: `TEXT`, `Size`: `INTEGER`, `Mode`: `INTEGER`, `UID`: `INTEGER`, `Gid`: `INTEGER`, `Uname`: `TEXT`, `Gname`: `TEXT`, `Modtime`: `DATE`, `Accesstime`: `DATE`, `Changetime`: `DATE`, `Devmajor`: `INTEGER`, `Devminor`: `INTEGER`, `Paxrecords`: `TEXT`, `Format`: `INTEGER`} _ = bytes.MinRead ) diff --git a/internal/formatting/csv.go b/internal/formatting/csv.go index 0efcf74..d9bad8a 100644 --- a/internal/formatting/csv.go +++ b/internal/formatting/csv.go @@ -10,7 +10,7 @@ import ( var ( TARHeaderCSV = []string{ - "record", "block", "typeflag", "name", "linkname", "size", "mode", "uid", "gid", "uname", "gname", "modtime", "accesstime", "changetime", "devmajor", "devminor", "paxrecords", "format", + "record", "lastknownrecord", "block", "lastknownblock", "typeflag", "name", "linkname", "size", "mode", "uid", "gid", "uname", "gname", "modtime", "accesstime", "changetime", "devmajor", "devminor", "paxrecords", "format", } ) @@ -20,8 +20,8 @@ func PrintCSV(input []string) error { return w.WriteAll([][]string{input}) } -func GetTARHeaderAsCSV(record, block int64, hdr *tar.Header) []string { +func GetTARHeaderAsCSV(record, lastKnownRecord, block, lastKnownBlock int64, hdr *tar.Header) []string { return []string{ - fmt.Sprintf("%v", record), fmt.Sprintf("%v", block), 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), + fmt.Sprintf("%v", record), fmt.Sprintf("%v", lastKnownRecord), fmt.Sprintf("%v", block), fmt.Sprintf("%v", 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), } } diff --git a/internal/persisters/metadata.go b/internal/persisters/metadata.go index 8ef5c06..f5979ba 100644 --- a/internal/persisters/metadata.go +++ b/internal/persisters/metadata.go @@ -147,7 +147,7 @@ func (p *MetadataPersister) GetHeaderDirectChildren(ctx context.Context, name st if err := queries.Raw( fmt.Sprintf( - `select %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, %v, + `select %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 from %v where %v like ? @@ -160,7 +160,9 @@ where %v like ? ) and not %v in ('', '.', '/', './')`, models.HeaderColumns.Record, + models.HeaderColumns.Lastknownrecord, models.HeaderColumns.Block, + models.HeaderColumns.Lastknownblock, models.HeaderColumns.Typeflag, models.HeaderColumns.Name, models.HeaderColumns.Linkname, @@ -237,10 +239,10 @@ func (p *MetadataPersister) GetLastIndexedRecordAndBlock(ctx context.Context, re if err := queries.Raw( fmt.Sprintf( `select %v, %v, ((%v*$1)+%v) as location from %v order by location desc limit 1`, - models.HeaderColumns.Record, - models.HeaderColumns.Block, - models.HeaderColumns.Record, - models.HeaderColumns.Block, + models.HeaderColumns.Lastknownrecord, + models.HeaderColumns.Lastknownblock, + models.HeaderColumns.Lastknownrecord, + models.HeaderColumns.Lastknownblock, models.TableNames.Headers, ), recordSize, @@ -252,5 +254,5 @@ func (p *MetadataPersister) GetLastIndexedRecordAndBlock(ctx context.Context, re return 0, 0, err } - return header.Record, header.Block, nil + return header.Lastknownrecord, header.Lastknownblock, nil } diff --git a/pkg/inventory/find.go b/pkg/inventory/find.go index a46eb40..08a0ae3 100644 --- a/pkg/inventory/find.go +++ b/pkg/inventory/find.go @@ -42,7 +42,7 @@ func Find( return []*tar.Header{}, err } - if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(dbhdr.Record, dbhdr.Block, hdr)); err != nil { + if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(dbhdr.Record, dbhdr.Lastknownrecord, dbhdr.Block, dbhdr.Lastknownblock, hdr)); err != nil { return []*tar.Header{}, err } diff --git a/pkg/inventory/list.go b/pkg/inventory/list.go index 3b624f2..76dfb4f 100644 --- a/pkg/inventory/list.go +++ b/pkg/inventory/list.go @@ -37,7 +37,7 @@ func List( return []*tar.Header{}, err } - if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(dbhdr.Record, dbhdr.Block, hdr)); err != nil { + if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(dbhdr.Record, dbhdr.Lastknownrecord, dbhdr.Block, dbhdr.Lastknownblock, hdr)); err != nil { return []*tar.Header{}, err } diff --git a/pkg/recovery/fetch.go b/pkg/recovery/fetch.go index 57e26ce..09446dd 100644 --- a/pkg/recovery/fetch.go +++ b/pkg/recovery/fetch.go @@ -77,7 +77,7 @@ func Fetch( return err } - if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(int64(record), int64(block), hdr)); err != nil { + if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(int64(record), -1, int64(block), -1, hdr)); err != nil { return err } } diff --git a/pkg/recovery/index.go b/pkg/recovery/index.go index 883b7a0..60ed69b 100644 --- a/pkg/recovery/index.go +++ b/pkg/recovery/index.go @@ -279,7 +279,7 @@ func indexHeader( hdr.Name = newName } - if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(record, block, hdr)); err != nil { + if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(record, -1, block, -1, hdr)); err != nil { return err } @@ -297,7 +297,7 @@ func indexHeader( switch stfsAction { case pax.STFSRecordActionCreate: - dbhdr, err := converters.TarHeaderToDBHeader(record, block, hdr) + dbhdr, err := converters.TarHeaderToDBHeader(record, record, block, block, hdr) if err != nil { return err } @@ -320,7 +320,7 @@ func indexHeader( var newHdr *models.Header if replacesContent, ok := hdr.PAXRecords[pax.STFSRecordReplacesContent]; ok && replacesContent == pax.STFSRecordReplacesContentTrue { // Content & metadata update; use the new record & block - h, err := converters.TarHeaderToDBHeader(record, block, hdr) + h, err := converters.TarHeaderToDBHeader(record, record, block, block, hdr) if err != nil { return err } @@ -333,7 +333,7 @@ func indexHeader( return err } - h, err := converters.TarHeaderToDBHeader(oldHdr.Record, oldHdr.Block, hdr) + h, err := converters.TarHeaderToDBHeader(oldHdr.Record, record, oldHdr.Block, block, hdr) if err != nil { return err } diff --git a/pkg/recovery/query.go b/pkg/recovery/query.go index 29a78e6..e47b23f 100644 --- a/pkg/recovery/query.go +++ b/pkg/recovery/query.go @@ -107,7 +107,7 @@ func Query( } } - if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(record, block, hdr)); err != nil { + if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(record, -1, block, -1, hdr)); err != nil { return []*tar.Header{}, err } @@ -196,7 +196,7 @@ func Query( } } - if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(record, block, hdr)); err != nil { + if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(record, -1, block, -1, hdr)); err != nil { return []*tar.Header{}, err }