disklayer_sqlite/
resolver.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Resource resolver for sqlite-backed disk layers.
5
6use super::SqliteDiskLayer;
7use crate::FormatOnAttachSqliteDiskLayer;
8use crate::auto_cache::AutoCacheSqliteDiskLayer;
9use disk_backend_resources::layer::SqliteAutoCacheDiskLayerHandle;
10use disk_backend_resources::layer::SqliteDiskLayerFormatParams;
11use disk_backend_resources::layer::SqliteDiskLayerHandle;
12use disk_layered::resolve::ResolveDiskLayerParameters;
13use disk_layered::resolve::ResolvedDiskLayer;
14use vm_resource::ResolveResource;
15use vm_resource::declare_static_resolver;
16use vm_resource::kind::DiskLayerHandleKind;
17
18/// Resolver for a [`SqliteDiskLayerHandle`].
19pub struct SqliteDiskLayerResolver;
20
21declare_static_resolver!(
22    SqliteDiskLayerResolver,
23    (DiskLayerHandleKind, SqliteDiskLayerHandle),
24    (DiskLayerHandleKind, SqliteAutoCacheDiskLayerHandle)
25);
26
27impl ResolveResource<DiskLayerHandleKind, SqliteDiskLayerHandle> for SqliteDiskLayerResolver {
28    type Output = ResolvedDiskLayer;
29    type Error = anyhow::Error;
30
31    fn resolve(
32        &self,
33        rsrc: SqliteDiskLayerHandle,
34        input: ResolveDiskLayerParameters<'_>,
35    ) -> Result<Self::Output, Self::Error> {
36        let SqliteDiskLayerHandle {
37            dbhd_path,
38            format_dbhd,
39        } = rsrc;
40
41        let layer = if let Some(SqliteDiskLayerFormatParams {
42            logically_read_only,
43            len,
44        }) = format_dbhd
45        {
46            ResolvedDiskLayer::new(FormatOnAttachSqliteDiskLayer::new(
47                dbhd_path.into(),
48                input.read_only,
49                crate::IncompleteFormatParams {
50                    logically_read_only,
51                    len,
52                },
53            ))
54        } else {
55            ResolvedDiskLayer::new(SqliteDiskLayer::new(
56                dbhd_path.as_ref(),
57                input.read_only,
58                None,
59            )?)
60        };
61
62        Ok(layer)
63    }
64}
65
66impl ResolveResource<DiskLayerHandleKind, SqliteAutoCacheDiskLayerHandle>
67    for SqliteDiskLayerResolver
68{
69    type Output = ResolvedDiskLayer;
70    type Error = anyhow::Error;
71
72    fn resolve(
73        &self,
74        rsrc: SqliteAutoCacheDiskLayerHandle,
75        input: ResolveDiskLayerParameters<'_>,
76    ) -> Result<Self::Output, Self::Error> {
77        Ok(ResolvedDiskLayer::new(AutoCacheSqliteDiskLayer::new(
78            rsrc.cache_path.into(),
79            rsrc.cache_key,
80            input.read_only,
81        )))
82    }
83}