Skip to main content

cfgd_core/state/
managed.rs

1use rusqlite::params;
2
3use super::StateStore;
4use super::types::ManagedResource;
5use crate::errors::Result;
6
7impl StateStore {
8    /// Upsert a managed resource record.
9    pub fn upsert_managed_resource(
10        &self,
11        resource_type: &str,
12        resource_id: &str,
13        source: &str,
14        hash: Option<&str>,
15        apply_id: Option<i64>,
16    ) -> Result<()> {
17        self.conn
18            .execute(
19                "INSERT INTO managed_resources (resource_type, resource_id, source, last_hash, last_applied)
20                 VALUES (?1, ?2, ?3, ?4, ?5)
21                 ON CONFLICT(resource_type, resource_id) DO UPDATE SET
22                    source = excluded.source,
23                    last_hash = excluded.last_hash,
24                    last_applied = excluded.last_applied",
25                params![resource_type, resource_id, source, hash, apply_id],
26            )
27            ?;
28        Ok(())
29    }
30
31    /// Check if a resource is tracked in managed_resources.
32    pub fn is_resource_managed(&self, resource_type: &str, resource_id: &str) -> Result<bool> {
33        let count: i64 = self.conn.query_row(
34            "SELECT COUNT(*) FROM managed_resources WHERE resource_type = ?1 AND resource_id = ?2",
35            params![resource_type, resource_id],
36            |row| row.get(0),
37        )?;
38        Ok(count > 0)
39    }
40
41    /// Get all managed resources.
42    pub fn managed_resources(&self) -> Result<Vec<ManagedResource>> {
43        let mut stmt = self
44            .conn
45            .prepare(
46                "SELECT resource_type, resource_id, source, last_hash, last_applied FROM managed_resources ORDER BY resource_type, resource_id",
47            )
48            ?;
49
50        let resources = stmt
51            .query_map([], |row| {
52                Ok(ManagedResource {
53                    resource_type: row.get(0)?,
54                    resource_id: row.get(1)?,
55                    source: row.get(2)?,
56                    last_hash: row.get(3)?,
57                    last_applied: row.get(4)?,
58                })
59            })?
60            .collect::<std::result::Result<Vec<_>, _>>()?;
61
62        Ok(resources)
63    }
64
65    /// Get managed resources from a specific source.
66    pub fn managed_resources_by_source(&self, source_name: &str) -> Result<Vec<ManagedResource>> {
67        let mut stmt = self.conn.prepare(
68            "SELECT resource_type, resource_id, source, last_hash, last_applied
69                 FROM managed_resources WHERE source = ?1 ORDER BY resource_type, resource_id",
70        )?;
71
72        let resources = stmt
73            .query_map(params![source_name], |row| {
74                Ok(ManagedResource {
75                    resource_type: row.get(0)?,
76                    resource_id: row.get(1)?,
77                    source: row.get(2)?,
78                    last_hash: row.get(3)?,
79                    last_applied: row.get(4)?,
80                })
81            })?
82            .collect::<std::result::Result<Vec<_>, _>>()?;
83
84        Ok(resources)
85    }
86}