...
This commit is contained in:
19
lib/hero/herofs/fs.v
Normal file
19
lib/hero/herofs/fs.v
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
module herofs
|
||||||
|
|
||||||
|
import time
|
||||||
|
import crypto.blake3
|
||||||
|
import json
|
||||||
|
|
||||||
|
// Fs represents a filesystem, is the top level container for files and directories and symlinks, blobs are used over filesystems
|
||||||
|
@[heap]
|
||||||
|
pub struct Fs {
|
||||||
|
pub mut:
|
||||||
|
name string
|
||||||
|
group_id u32 // Associated group for permissions
|
||||||
|
root_dir_id u32 // ID of root directory
|
||||||
|
quota_bytes u64 // Storage quota in bytes
|
||||||
|
used_bytes u64 // Current usage in bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// We only keep the root directory ID here, other directories can be found by querying parent_id in FsDir
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
module heromodels
|
module herofs
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import crypto.blake3
|
import crypto.blake3
|
||||||
@@ -7,17 +7,17 @@ import crypto.blake3
|
|||||||
@[heap]
|
@[heap]
|
||||||
pub struct FsBlob {
|
pub struct FsBlob {
|
||||||
pub mut:
|
pub mut:
|
||||||
id string // blake192 hash of content
|
hash string // blake192 hash of content
|
||||||
data []u8 // Binary data (max 1MB)
|
data []u8 // Binary data (max 1MB)
|
||||||
size_bytes int // Size in bytes
|
size_bytes int // Size in bytes
|
||||||
created_at i64
|
created_at i64
|
||||||
mime_type string
|
mime_type string //TODO: is there not more formal way how to store mime types? enum? or list is too long?
|
||||||
encoding string // e.g., "gzip", "none"
|
encoding string //TODO: make enum
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (mut b FsBlob) calculate_id() {
|
pub fn (mut b FsBlob) calculate_hash() {
|
||||||
hash := blake3.sum256(b.data)
|
hash := blake3.sum256(b.data)
|
||||||
b.id = hash.hex()[..48] // blake192 = first 192 bits = 48 hex chars
|
b.hash = hash.hex()[..48] // blake192 = first 192 bits = 48 hex chars
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_fs_blob(data []u8) !FsBlob {
|
pub fn new_fs_blob(data []u8) !FsBlob {
|
||||||
@@ -39,3 +39,5 @@ pub fn (b FsBlob) verify_integrity() bool {
|
|||||||
hash := blake3.sum256(b.data)
|
hash := blake3.sum256(b.data)
|
||||||
return hash.hex()[..48] == b.id
|
return hash.hex()[..48] == b.id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: we will need other hset so we can go back from hash to id (which is u32)
|
||||||
16
lib/hero/herofs/fs_dir.v
Normal file
16
lib/hero/herofs/fs_dir.v
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
module herofs
|
||||||
|
|
||||||
|
import time
|
||||||
|
import crypto.blake3
|
||||||
|
import json
|
||||||
|
|
||||||
|
// FsDir represents a directory in a filesystem
|
||||||
|
@[heap]
|
||||||
|
pub struct FsDir {
|
||||||
|
pub mut:
|
||||||
|
name string
|
||||||
|
fs_id u32 // Associated filesystem
|
||||||
|
parent_id u32 // Parent directory ID (empty for root)
|
||||||
|
}
|
||||||
|
|
||||||
|
//we only keep the parents, not the children, as children can be found by doing a query on parent_id, we will need some smart hsets to make this fast enough and efficient
|
||||||
21
lib/hero/herofs/fs_file.v
Normal file
21
lib/hero/herofs/fs_file.v
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
module herofs
|
||||||
|
|
||||||
|
import time
|
||||||
|
import crypto.blake3
|
||||||
|
import json
|
||||||
|
|
||||||
|
// FsFile represents a file in a filesystem
|
||||||
|
@[heap]
|
||||||
|
pub struct FsFile {
|
||||||
|
pub mut:
|
||||||
|
name string
|
||||||
|
fs_id string // Associated filesystem
|
||||||
|
directories []u32 // Directory IDs where this file exists, means file can be part of multiple directories (like hard links in Linux)
|
||||||
|
blobs []u32 // Blake192 IDs of file content blobs (we reference them with u32 IDs for efficiency)
|
||||||
|
size_bytes u64
|
||||||
|
mime_type string // e.g., "image/png"
|
||||||
|
checksum string // e.g., SHA256 checksum of the file
|
||||||
|
accessed_at i64
|
||||||
|
metadata map[string]string // Custom metadata
|
||||||
|
}
|
||||||
|
|
||||||
22
lib/hero/herofs/fs_symlink.v
Normal file
22
lib/hero/herofs/fs_symlink.v
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
module herofs
|
||||||
|
|
||||||
|
import time
|
||||||
|
import crypto.blake3
|
||||||
|
import json
|
||||||
|
|
||||||
|
// FsSymlink represents a symbolic link in a filesystem
|
||||||
|
@[heap]
|
||||||
|
pub struct FsSymlink {
|
||||||
|
pub mut:
|
||||||
|
name string
|
||||||
|
fs_id u32 // Associated filesystem
|
||||||
|
parent_id u32 // Parent directory ID
|
||||||
|
target_id u32 // ID of target file or directory
|
||||||
|
target_type SymlinkTargetType
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum SymlinkTargetType {
|
||||||
|
file
|
||||||
|
directory
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
module heromodels
|
|
||||||
|
|
||||||
import time
|
|
||||||
import crypto.blake3
|
|
||||||
import json
|
|
||||||
|
|
||||||
// Fs represents a filesystem namespace
|
|
||||||
@[heap]
|
|
||||||
pub struct Fs {
|
|
||||||
pub mut:
|
|
||||||
id string // blake192 hash
|
|
||||||
name string
|
|
||||||
description string
|
|
||||||
group_id string // Associated group for permissions
|
|
||||||
root_dir_id string // ID of root directory
|
|
||||||
created_at i64
|
|
||||||
updated_at i64
|
|
||||||
quota_bytes i64 // Storage quota in bytes
|
|
||||||
used_bytes i64 // Current usage in bytes
|
|
||||||
tags []string
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (mut f Fs) calculate_id() {
|
|
||||||
content := json.encode(FsContent{
|
|
||||||
name: f.name
|
|
||||||
description: f.description
|
|
||||||
group_id: f.group_id
|
|
||||||
quota_bytes: f.quota_bytes
|
|
||||||
tags: f.tags
|
|
||||||
})
|
|
||||||
hash := blake3.sum256(content.bytes())
|
|
||||||
f.id = hash.hex()[..48]
|
|
||||||
}
|
|
||||||
|
|
||||||
struct FsContent {
|
|
||||||
name string
|
|
||||||
description string
|
|
||||||
group_id string
|
|
||||||
quota_bytes i64
|
|
||||||
tags []string
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_fs(name string, group_id string) Fs {
|
|
||||||
mut fs := Fs{
|
|
||||||
name: name
|
|
||||||
group_id: group_id
|
|
||||||
created_at: time.now().unix()
|
|
||||||
updated_at: time.now().unix()
|
|
||||||
}
|
|
||||||
fs.calculate_id()
|
|
||||||
return fs
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
module heromodels
|
|
||||||
|
|
||||||
import time
|
|
||||||
import crypto.blake3
|
|
||||||
import json
|
|
||||||
|
|
||||||
// FsDir represents a directory in a filesystem
|
|
||||||
@[heap]
|
|
||||||
pub struct FsDir {
|
|
||||||
pub mut:
|
|
||||||
id string // blake192 hash
|
|
||||||
name string
|
|
||||||
fs_id string // Associated filesystem
|
|
||||||
parent_id string // Parent directory ID (empty for root)
|
|
||||||
group_id string // Associated group for permissions
|
|
||||||
children []string // Child directory and file IDs
|
|
||||||
created_at i64
|
|
||||||
updated_at i64
|
|
||||||
tags []string
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (mut d FsDir) calculate_id() {
|
|
||||||
content := json.encode(DirContent{
|
|
||||||
name: d.name
|
|
||||||
fs_id: d.fs_id
|
|
||||||
parent_id: d.parent_id
|
|
||||||
group_id: d.group_id
|
|
||||||
tags: d.tags
|
|
||||||
})
|
|
||||||
hash := blake3.sum256(content.bytes())
|
|
||||||
d.id = hash.hex()[..48]
|
|
||||||
}
|
|
||||||
|
|
||||||
struct DirContent {
|
|
||||||
name string
|
|
||||||
fs_id string
|
|
||||||
parent_id string
|
|
||||||
group_id string
|
|
||||||
tags []string
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_fs_dir(name string, fs_id string, parent_id string, group_id string) FsDir {
|
|
||||||
mut dir := FsDir{
|
|
||||||
name: name
|
|
||||||
fs_id: fs_id
|
|
||||||
parent_id: parent_id
|
|
||||||
group_id: group_id
|
|
||||||
created_at: time.now().unix()
|
|
||||||
updated_at: time.now().unix()
|
|
||||||
}
|
|
||||||
dir.calculate_id()
|
|
||||||
return dir
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
module heromodels
|
|
||||||
|
|
||||||
import time
|
|
||||||
import crypto.blake3
|
|
||||||
import json
|
|
||||||
|
|
||||||
// FsFile represents a file in a filesystem
|
|
||||||
@[heap]
|
|
||||||
pub struct FsFile {
|
|
||||||
pub mut:
|
|
||||||
id string // blake192 hash
|
|
||||||
name string
|
|
||||||
fs_id string // Associated filesystem
|
|
||||||
directories []string // Directory IDs where this file exists
|
|
||||||
blobs []string // Blake192 IDs of file content blobs
|
|
||||||
size_bytes i64 // Total file size
|
|
||||||
mime_type string
|
|
||||||
checksum string // Overall file checksum
|
|
||||||
created_at i64
|
|
||||||
updated_at i64
|
|
||||||
accessed_at i64
|
|
||||||
tags []string
|
|
||||||
metadata map[string]string // Custom metadata
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (mut f FsFile) calculate_id() {
|
|
||||||
content := json.encode(FileContent{
|
|
||||||
name: f.name
|
|
||||||
fs_id: f.fs_id
|
|
||||||
directories: f.directories
|
|
||||||
blobs: f.blobs
|
|
||||||
size_bytes: f.size_bytes
|
|
||||||
mime_type: f.mime_type
|
|
||||||
checksum: f.checksum
|
|
||||||
tags: f.tags
|
|
||||||
metadata: f.metadata
|
|
||||||
})
|
|
||||||
hash := blake3.sum256(content.bytes())
|
|
||||||
f.id = hash.hex()[..48]
|
|
||||||
}
|
|
||||||
|
|
||||||
struct FileContent {
|
|
||||||
name string
|
|
||||||
fs_id string
|
|
||||||
directories []string
|
|
||||||
blobs []string
|
|
||||||
size_bytes i64
|
|
||||||
mime_type string
|
|
||||||
checksum string
|
|
||||||
tags []string
|
|
||||||
metadata map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_fs_file(name string, fs_id string, directories []string) FsFile {
|
|
||||||
mut file := FsFile{
|
|
||||||
name: name
|
|
||||||
fs_id: fs_id
|
|
||||||
directories: directories
|
|
||||||
created_at: time.now().unix()
|
|
||||||
updated_at: time.now().unix()
|
|
||||||
accessed_at: time.now().unix()
|
|
||||||
}
|
|
||||||
file.calculate_id()
|
|
||||||
return file
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
module heromodels
|
|
||||||
|
|
||||||
import time
|
|
||||||
import crypto.blake3
|
|
||||||
import json
|
|
||||||
|
|
||||||
// FsSymlink represents a symbolic link in a filesystem
|
|
||||||
@[heap]
|
|
||||||
pub struct FsSymlink {
|
|
||||||
pub mut:
|
|
||||||
id string // blake192 hash
|
|
||||||
name string
|
|
||||||
fs_id string // Associated filesystem
|
|
||||||
parent_id string // Parent directory ID
|
|
||||||
target_id string // ID of target file or directory
|
|
||||||
target_type SymlinkTargetType
|
|
||||||
created_at i64
|
|
||||||
updated_at i64
|
|
||||||
tags []string
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum SymlinkTargetType {
|
|
||||||
file
|
|
||||||
directory
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (mut s FsSymlink) calculate_id() {
|
|
||||||
content := json.encode(SymlinkContent{
|
|
||||||
name: s.name
|
|
||||||
fs_id: s.fs_id
|
|
||||||
parent_id: s.parent_id
|
|
||||||
target_id: s.target_id
|
|
||||||
target_type: s.target_type
|
|
||||||
tags: s.tags
|
|
||||||
})
|
|
||||||
hash := blake3.sum256(content.bytes())
|
|
||||||
s.id = hash.hex()[..48]
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SymlinkContent {
|
|
||||||
name string
|
|
||||||
fs_id string
|
|
||||||
parent_id string
|
|
||||||
target_id string
|
|
||||||
target_type SymlinkTargetType
|
|
||||||
tags []string
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new_fs_symlink(name string, fs_id string, parent_id string, target_id string, target_type SymlinkTargetType) FsSymlink {
|
|
||||||
mut symlink := FsSymlink{
|
|
||||||
name: name
|
|
||||||
fs_id: fs_id
|
|
||||||
parent_id: parent_id
|
|
||||||
target_id: target_id
|
|
||||||
target_type: target_type
|
|
||||||
created_at: time.now().unix()
|
|
||||||
updated_at: time.now().unix()
|
|
||||||
}
|
|
||||||
symlink.calculate_id()
|
|
||||||
return symlink
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user