Skip to main content

nodedb_lite/query/meta_ops/
array.rs

1// SPDX-License-Identifier: Apache-2.0
2//! Array DDL meta-ops: AlterArray.
3
4use nodedb_types::result::QueryResult;
5use nodedb_types::value::Value;
6
7use crate::error::LiteError;
8use crate::query::engine::LiteQueryEngine;
9use crate::storage::engine::StorageEngine;
10
11/// `AlterArray` — update the bitemporal retention policy for an array.
12///
13/// The new `audit_retain_ms` is persisted to `Namespace::Meta` under the key
14/// `array_retain/<array_id>` so that subsequent compact calls can read it.
15pub async fn handle_alter_array<S: StorageEngine>(
16    engine: &LiteQueryEngine<S>,
17    array_id: &str,
18    audit_retain_ms: Option<Option<i64>>,
19    minimum_audit_retain_ms: Option<Option<u64>>,
20) -> Result<QueryResult, LiteError> {
21    use nodedb_types::Namespace;
22
23    // Persist the new audit_retain_ms if the field was set.
24    if let Some(new_retain) = audit_retain_ms {
25        let key = format!("array_retain/{array_id}");
26        match new_retain {
27            Some(ms) => {
28                engine
29                    .storage
30                    .put(Namespace::Meta, key.as_bytes(), &ms.to_le_bytes())
31                    .await?;
32            }
33            None => {
34                engine
35                    .storage
36                    .delete(Namespace::Meta, key.as_bytes())
37                    .await?;
38            }
39        }
40    }
41
42    // Persist the minimum_audit_retain_ms if the field was set.
43    if let Some(new_min) = minimum_audit_retain_ms {
44        let key = format!("array_min_retain/{array_id}");
45        match new_min {
46            Some(ms) => {
47                engine
48                    .storage
49                    .put(Namespace::Meta, key.as_bytes(), &ms.to_le_bytes())
50                    .await?;
51            }
52            None => {
53                engine
54                    .storage
55                    .delete(Namespace::Meta, key.as_bytes())
56                    .await?;
57            }
58        }
59    }
60
61    Ok(QueryResult {
62        columns: vec!["array_id".into()],
63        rows: vec![vec![Value::String(array_id.to_owned())]],
64        rows_affected: 1,
65        command: None,
66    })
67}