Skip to main content

reifydb_routine/procedure/set/
config.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_core::value::column::columns::Columns;
5use reifydb_transaction::transaction::Transaction;
6use reifydb_type::{
7	fragment::Fragment,
8	params::Params,
9	value::{Value, r#type::Type},
10};
11
12use crate::procedure::{Procedure, context::ProcedureContext, error::ProcedureError};
13
14/// Native procedure that sets a system configuration value.
15///
16/// Accepts 2 positional arguments: key (Utf8) and value (any).
17pub struct SetConfigProcedure;
18
19impl SetConfigProcedure {
20	pub fn new() -> Self {
21		Self
22	}
23}
24
25impl Procedure for SetConfigProcedure {
26	fn call(&self, ctx: &ProcedureContext, tx: &mut Transaction<'_>) -> Result<Columns, ProcedureError> {
27		let (key, value) = match ctx.params {
28			Params::Positional(args) if args.len() == 2 => (args[0].clone(), args[1].clone()),
29			Params::Positional(args) => {
30				return Err(ProcedureError::ArityMismatch {
31					procedure: Fragment::internal("system::config::set"),
32					expected: 2,
33					actual: args.len(),
34				});
35			}
36			_ => {
37				return Err(ProcedureError::ArityMismatch {
38					procedure: Fragment::internal("system::config::set"),
39					expected: 2,
40					actual: 0,
41				});
42			}
43		};
44
45		let key_str = match &key {
46			Value::Utf8(s) => s.as_str().to_string(),
47			_ => {
48				return Err(ProcedureError::InvalidArgumentType {
49					procedure: Fragment::internal("system::config::set"),
50					argument_index: 0,
51					expected: vec![Type::Utf8],
52					actual: key.get_type(),
53				});
54			}
55		};
56
57		let value_clone = value.clone();
58
59		match tx {
60			Transaction::Admin(admin) => ctx.catalog.set_config(admin, &key_str, value)?,
61			Transaction::Test(t) => ctx.catalog.set_config(t.inner, &key_str, value)?,
62			_ => {
63				return Err(ProcedureError::ExecutionFailed {
64					procedure: Fragment::internal("system::config::set"),
65					reason: "must run in an admin transaction".to_string(),
66				});
67			}
68		}
69
70		Ok(Columns::single_row([("key", Value::Utf8(key_str)), ("value", value_clone)]))
71	}
72}