use adk_action::{DatabaseNodeConfig, DatabaseType};
use crate::error::{GraphError, Result};
use crate::node::{NodeContext, NodeOutput};
pub async fn execute_database(
config: &DatabaseNodeConfig,
_ctx: &NodeContext,
) -> Result<NodeOutput> {
let node_id = &config.standard.id;
let db_type = &config.connection.database_type;
validate_connection(config, node_id)?;
match db_type {
DatabaseType::Postgresql | DatabaseType::Mysql | DatabaseType::Sqlite => {
execute_sql_placeholder(config, node_id)
}
DatabaseType::Mongodb => execute_mongo_placeholder(config, node_id),
DatabaseType::Redis => execute_redis_placeholder(config, node_id),
}
}
fn validate_connection(config: &DatabaseNodeConfig, node_id: &str) -> Result<()> {
let conn = &config.connection;
if conn.connection_string.is_none() && conn.credential_ref.is_none() {
return Err(GraphError::NodeExecutionFailed {
node: node_id.to_string(),
message: "database node requires either a 'connection_string' or 'credential_ref' \
in the connection configuration"
.to_string(),
});
}
match conn.database_type {
DatabaseType::Postgresql | DatabaseType::Mysql | DatabaseType::Sqlite => {
if config.sql.is_none() {
return Err(GraphError::NodeExecutionFailed {
node: node_id.to_string(),
message: format!(
"database node with type '{:?}' requires an 'sql' configuration block",
conn.database_type
),
});
}
}
DatabaseType::Mongodb => {
if config.mongo.is_none() {
return Err(GraphError::NodeExecutionFailed {
node: node_id.to_string(),
message: "database node with type 'mongodb' requires a 'mongo' \
configuration block"
.to_string(),
});
}
}
DatabaseType::Redis => {
if config.redis.is_none() {
return Err(GraphError::NodeExecutionFailed {
node: node_id.to_string(),
message: "database node with type 'redis' requires a 'redis' \
configuration block"
.to_string(),
});
}
}
}
Ok(())
}
fn execute_sql_placeholder(config: &DatabaseNodeConfig, node_id: &str) -> Result<NodeOutput> {
let db_type = &config.connection.database_type;
let sql = config.sql.as_ref().expect("validated above");
tracing::debug!(
node = %node_id,
db_type = ?db_type,
operation = %sql.operation,
query_len = sql.query.len(),
"SQL database node validated (placeholder)"
);
Err(GraphError::NodeExecutionFailed {
node: node_id.to_string(),
message: format!(
"database action nodes are not implemented: no {db_type:?} driver is integrated, \
in any feature configuration; run the query from a function node instead"
),
})
}
fn execute_mongo_placeholder(config: &DatabaseNodeConfig, node_id: &str) -> Result<NodeOutput> {
let mongo = config.mongo.as_ref().expect("validated above");
tracing::debug!(
node = %node_id,
collection = %mongo.collection,
operation = %mongo.operation,
"MongoDB node validated (placeholder)"
);
Err(GraphError::NodeExecutionFailed {
node: node_id.to_string(),
message: "database action nodes are not implemented: no MongoDB driver is integrated, \
in any feature configuration; run the operation from a function node instead"
.to_string(),
})
}
fn execute_redis_placeholder(config: &DatabaseNodeConfig, node_id: &str) -> Result<NodeOutput> {
let redis = config.redis.as_ref().expect("validated above");
tracing::debug!(
node = %node_id,
command = %redis.command,
key = %redis.key,
"Redis node validated (placeholder)"
);
Err(GraphError::NodeExecutionFailed {
node: node_id.to_string(),
message: "database action nodes are not implemented: no Redis client is integrated, \
in any feature configuration; run the command from a function node instead"
.to_string(),
})
}