- Changed blob table to use ID (UUID) as primary key instead of hash - Blob records are now created at packing start, enabling immediate chunk associations - Implemented streaming chunking to process large files without memory exhaustion - Fixed blob manifest generation to include all referenced blobs - Updated all foreign key references from blob_hash to blob_id - Added progress reporting and improved error handling - Enforced encryption requirement for all blob packing - Updated tests to use test encryption keys - Added Cyrillic transliteration to README
95 lines
2.3 KiB
Go
95 lines
2.3 KiB
Go
package database
|
|
|
|
import "time"
|
|
|
|
// File represents a file record in the database
|
|
type File struct {
|
|
Path string
|
|
MTime time.Time
|
|
CTime time.Time
|
|
Size int64
|
|
Mode uint32
|
|
UID uint32
|
|
GID uint32
|
|
LinkTarget string // empty for regular files, target path for symlinks
|
|
}
|
|
|
|
// IsSymlink returns true if this file is a symbolic link
|
|
func (f *File) IsSymlink() bool {
|
|
return f.LinkTarget != ""
|
|
}
|
|
|
|
// FileChunk represents the mapping between files and chunks
|
|
type FileChunk struct {
|
|
Path string
|
|
Idx int
|
|
ChunkHash string
|
|
}
|
|
|
|
// Chunk represents a chunk record in the database
|
|
type Chunk struct {
|
|
ChunkHash string
|
|
SHA256 string
|
|
Size int64
|
|
}
|
|
|
|
// Blob represents a blob record in the database
|
|
type Blob struct {
|
|
ID string
|
|
Hash string // Can be empty until blob is finalized
|
|
CreatedTS time.Time
|
|
FinishedTS *time.Time // nil if not yet finalized
|
|
UncompressedSize int64
|
|
CompressedSize int64
|
|
UploadedTS *time.Time // nil if not yet uploaded
|
|
}
|
|
|
|
// BlobChunk represents the mapping between blobs and chunks
|
|
type BlobChunk struct {
|
|
BlobID string
|
|
ChunkHash string
|
|
Offset int64
|
|
Length int64
|
|
}
|
|
|
|
// ChunkFile represents the reverse mapping of chunks to files
|
|
type ChunkFile struct {
|
|
ChunkHash string
|
|
FilePath string
|
|
FileOffset int64
|
|
Length int64
|
|
}
|
|
|
|
// Snapshot represents a snapshot record in the database
|
|
type Snapshot struct {
|
|
ID string
|
|
Hostname string
|
|
VaultikVersion string
|
|
StartedAt time.Time
|
|
CompletedAt *time.Time // nil if still in progress
|
|
FileCount int64
|
|
ChunkCount int64
|
|
BlobCount int64
|
|
TotalSize int64 // Total size of all referenced files
|
|
BlobSize int64 // Total size of all referenced blobs (compressed and encrypted)
|
|
CompressionRatio float64 // Compression ratio (BlobSize / TotalSize)
|
|
}
|
|
|
|
// IsComplete returns true if the snapshot has completed
|
|
func (s *Snapshot) IsComplete() bool {
|
|
return s.CompletedAt != nil
|
|
}
|
|
|
|
// SnapshotFile represents the mapping between snapshots and files
|
|
type SnapshotFile struct {
|
|
SnapshotID string
|
|
FilePath string
|
|
}
|
|
|
|
// SnapshotBlob represents the mapping between snapshots and blobs
|
|
type SnapshotBlob struct {
|
|
SnapshotID string
|
|
BlobID string
|
|
BlobHash string // Denormalized for easier manifest generation
|
|
}
|