1use cyfs_base::*;
2
3use async_trait::async_trait;
4use int_enum::IntEnum;
5
6#[derive(Debug, Clone)]
7pub struct FileDirRef {
8 pub dir_id: DirId,
9 pub inner_path: String,
10}
11
12#[derive(Debug)]
13pub struct FileCacheData {
14 pub hash: String,
15
16 pub file_id: FileId,
17
18 pub length: u64,
19
20 pub flags: u32,
21
22 pub owner: Option<ObjectId>,
23
24 pub quick_hash: Option<Vec<String>>,
26
27 pub dirs: Option<Vec<FileDirRef>>,
29}
30
31pub struct InsertFileRequest {
32 pub file_id: FileId,
33
34 pub file: File,
36
37 pub flags: u32,
38
39 pub quick_hash: Option<Vec<String>>,
41
42 pub dirs: Option<Vec<FileDirRef>>,
44}
45
46pub struct RemoveFileRequest {
47 pub file_id: FileId,
48}
49
50pub struct FileAddQuickhashRequest {
52 pub hash: String,
53
54 pub quick_hash: Vec<String>,
57}
58
59pub struct FileUpdateQuickhashRequest {
60 pub hash: String,
61
62 pub add_list: Vec<String>,
65 pub remove_list: Vec<String>,
66}
67
68pub const NDC_FILE_REQUEST_FLAG_QUICK_HASN: u32 = 0x01 << 1;
70pub const NDC_FILE_REQUEST_FLAG_REF_DIRS: u32 = 0x01 << 2;
71
72pub struct GetFileByHashRequest {
73 pub hash: String,
74
75 pub flags: u32,
76}
77
78pub struct GetFileByFileIdRequest {
79 pub file_id: FileId,
80
81 pub flags: u32,
82}
83
84pub struct GetFileByQuickHashRequest {
85 pub quick_hash: String,
86 pub length: u64,
87 pub flags: u32,
88}
89
90pub struct GetFileByChunkRequest {
91 pub chunk_id: ChunkId,
92 pub flags: u32,
93}
94
95pub struct GetDirByFileRequest {
96 pub file_id: FileId,
97 pub flags: u32,
98}
99
100#[repr(u8)]
103#[derive(Debug, Clone, Copy, Eq, PartialEq, IntEnum)]
104pub enum ChunkObjectRelation {
105 Unknown = 0,
106 FileBody = 1,
107 DirMeta = 2,
108}
109
110impl Into<u8> for ChunkObjectRelation {
111 fn into(self) -> u8 {
112 unsafe { std::mem::transmute(self as u8) }
113 }
114}
115
116impl From<u8> for ChunkObjectRelation {
117 fn from(code: u8) -> Self {
118 match ChunkObjectRelation::from_int(code) {
119 Ok(code) => code,
120 Err(e) => {
121 error!("unknown ChunkObjectRelation code: {} {}", code, e);
122 ChunkObjectRelation::Unknown
123 }
124 }
125 }
126}
127
128#[derive(Debug, Clone)]
130pub struct ChunkObjectRef {
131 pub object_id: ObjectId,
132 pub relation: ChunkObjectRelation,
133}
134
135pub struct InsertChunkRequest {
137 pub chunk_id: ChunkId,
138
139 pub state: ChunkState,
140
141 pub ref_objects: Option<Vec<ChunkObjectRef>>,
143
144 pub trans_sessions: Option<Vec<String>>,
146
147 pub flags: u32,
148}
149
150pub struct RemoveChunkRequest {
151 pub chunk_id: ChunkId,
152}
153
154pub const NDC_CHUNK_REQUEST_FLAG_TRANS_SESSIONS: u32 = 0x01 << 1;
156pub const NDC_CHUNK_REQUEST_FLAG_REF_OBJECTS: u32 = 0x01 << 2;
157
158pub struct GetChunkRequest {
159 pub chunk_id: ChunkId,
160 pub flags: u32,
161}
162
163pub struct ExistsChunkRequest {
164 pub chunk_list: Vec<ChunkId>,
165 pub states: Vec<ChunkState>,
166}
167
168pub struct ChunkCacheData {
169 pub chunk_id: ChunkId,
170
171 pub state: ChunkState,
172 pub flags: u32,
173
174 pub insert_time: u64,
175 pub update_time: u64,
176 pub last_access_time: u64,
177
178 pub trans_sessions: Option<Vec<String>>,
179 pub ref_objects: Option<Vec<ChunkObjectRef>>,
180}
181
182pub struct UpdateChunkStateRequest {
183 pub chunk_id: ChunkId,
184
185 pub current_state: Option<ChunkState>,
187
188 pub state: ChunkState,
189}
190
191pub struct UpdateChunkTransSessionRequest {
192 pub chunk_id: ChunkId,
193
194 pub add_list: Vec<String>,
195 pub remove_list: Vec<String>,
196}
197
198pub struct UpdateChunkRefsRequest {
199 pub chunk_id: ChunkId,
200
201 pub add_list: Vec<ChunkObjectRef>,
202 pub remove_list: Vec<ChunkObjectRef>,
203}
204
205pub struct GetChunkTransSessionsRequest {
206 pub chunk_id: ChunkId,
207}
208
209pub struct GetChunkTransSessionsResponse {
210 pub chunk_id: ChunkId,
211 pub trans_sessions: Option<Vec<String>>,
212}
213
214pub struct GetChunkRefObjectsRequest {
215 pub chunk_id: ChunkId,
216 pub relation: Option<ChunkObjectRelation>,
217}
218
219pub struct GetChunkRefObjectsResponse {
220 pub chunk_id: ChunkId,
221 pub ref_objects: Option<ChunkObjectRef>,
222}
223
224#[derive(Clone, Debug)]
225pub struct SelectChunkFilter {
226 pub state: Option<ChunkState>,
227}
228
229#[derive(Debug, Clone)]
230pub struct SelectChunkOption {
231 pub page_size: usize,
233
234 pub page_index: usize,
236}
237
238impl Default for SelectChunkOption {
239 fn default() -> Self {
240 Self {
241 page_size: 256,
242 page_index: 0,
243 }
244 }
245}
246
247#[derive(Clone, Debug)]
248pub struct SelectChunkRequest {
249 pub filter: SelectChunkFilter,
251
252 pub opt: SelectChunkOption,
254}
255
256#[derive(Debug)]
257pub struct SelectChunkData {
258 pub chunk_id: ChunkId,
259}
260
261#[derive(Debug)]
262pub struct SelectChunkResponse {
263 pub list: Vec<SelectChunkData>,
264}
265
266#[derive(Debug, Clone)]
267pub struct NamedDataCacheStat {
268 pub count: u64,
270
271 pub storage_size: u64,
272}
273
274#[async_trait]
275pub trait NamedDataCache: Sync + Send + 'static {
276 fn clone(&self) -> Box<dyn NamedDataCache>;
277
278 async fn insert_file(&self, req: &InsertFileRequest) -> BuckyResult<()>;
280 async fn remove_file(&self, req: &RemoveFileRequest) -> BuckyResult<usize>;
281
282 async fn file_update_quick_hash(&self, req: &FileUpdateQuickhashRequest) -> BuckyResult<()>;
283
284 async fn get_file_by_hash(
285 &self,
286 req: &GetFileByHashRequest,
287 ) -> BuckyResult<Option<FileCacheData>>;
288 async fn get_file_by_file_id(
289 &self,
290 req: &GetFileByFileIdRequest,
291 ) -> BuckyResult<Option<FileCacheData>>;
292 async fn get_files_by_quick_hash(
293 &self,
294 req: &GetFileByQuickHashRequest,
295 ) -> BuckyResult<Vec<FileCacheData>>;
296 async fn get_files_by_chunk(
297 &self,
298 req: &GetFileByChunkRequest,
299 ) -> BuckyResult<Vec<FileCacheData>>;
300 async fn get_dirs_by_file(&self, req: &GetDirByFileRequest) -> BuckyResult<Vec<FileDirRef>>;
301
302 async fn insert_chunk(&self, req: &InsertChunkRequest) -> BuckyResult<()>;
304 async fn remove_chunk(&self, req: &RemoveChunkRequest) -> BuckyResult<usize>;
305
306 async fn update_chunk_state(&self, req: &UpdateChunkStateRequest) -> BuckyResult<ChunkState>;
307 async fn update_chunk_ref_objects(&self, req: &UpdateChunkRefsRequest) -> BuckyResult<()>;
309
310 async fn exists_chunks(&self, req: &ExistsChunkRequest) -> BuckyResult<Vec<bool>>;
311
312 async fn get_chunk(&self, req: &GetChunkRequest) -> BuckyResult<Option<ChunkCacheData>>;
313 async fn get_chunks(
314 &self,
315 req: &Vec<GetChunkRequest>,
316 ) -> BuckyResult<Vec<Option<ChunkCacheData>>>;
317 async fn get_chunk_ref_objects(
319 &self,
320 req: &GetChunkRefObjectsRequest,
321 ) -> BuckyResult<Vec<ChunkObjectRef>>;
322
323 async fn select_chunk(&self, req: &SelectChunkRequest) -> BuckyResult<SelectChunkResponse>;
325 async fn stat(&self) -> BuckyResult<NamedDataCacheStat>;
326}
327
328use std::sync::Arc;
329
330pub type NamedDataCacheRef = Arc<Box<dyn NamedDataCache>>;