reifydb_routine/procedure/set/
config.rs1use 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
14pub 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}