fix: Enable computation of last known record and block based on lastknownrecord and lastknownblock even if last changes are updates

This commit is contained in:
Felix Pojtinger
2021-12-06 23:55:31 +01:00
parent 7abca5f164
commit 15382ffcfd
17 changed files with 203 additions and 175 deletions

View File

@@ -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
}

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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.

View File

@@ -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

View File

@@ -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(

View File

@@ -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"}
)

View File

@@ -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
)

View File

@@ -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),
}
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}
}

View File

@@ -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
}

View File

@@ -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
}