not working adding sql options
This commit is contained in:
@@ -52,6 +52,15 @@ pub fn execute_script(
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// SQL query registration
|
||||||
|
vm.register_fn("steel_query_sql", {
|
||||||
|
let ctx = context.clone();
|
||||||
|
move |query: String| {
|
||||||
|
ctx.steel_query_sql(&query)
|
||||||
|
.map_err(|e| e.to_string())
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Execute script and process results
|
// Execute script and process results
|
||||||
let results = vm.compile_and_run_raw_program(script)
|
let results = vm.compile_and_run_raw_program(script)
|
||||||
.map_err(|e| ExecutionError::RuntimeError(e.to_string()))?;
|
.map_err(|e| ExecutionError::RuntimeError(e.to_string()))?;
|
||||||
|
|||||||
@@ -91,4 +91,40 @@ impl SteelContext {
|
|||||||
Err(SteelVal::StringV("Expected comma-separated string".into()))
|
Err(SteelVal::StringV("Expected comma-separated string".into()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn steel_query_sql(&self, query: &str) -> Result<SteelVal, SteelVal> {
|
||||||
|
// Validate query is read-only
|
||||||
|
if !is_read_only_query(query) {
|
||||||
|
return Err(SteelVal::StringV(
|
||||||
|
"Only SELECT queries are allowed".into()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let pool = self.db_pool.clone();
|
||||||
|
let result = tokio::runtime::Runtime::new().unwrap().block_on(async {
|
||||||
|
// Execute and get first column of all rows as strings
|
||||||
|
let rows = sqlx::query(query)
|
||||||
|
.fetch_all(&*pool)
|
||||||
|
.await
|
||||||
|
.map_err(|e| SteelVal::StringV(e.to_string().into()))?;
|
||||||
|
|
||||||
|
let mut results = Vec::new();
|
||||||
|
for row in rows {
|
||||||
|
let val: String = row.try_get(0)
|
||||||
|
.map_err(|e| SteelVal::StringV(e.to_string().into()))?;
|
||||||
|
results.push(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(results.join(","))
|
||||||
|
});
|
||||||
|
|
||||||
|
result.map(|s| SteelVal::StringV(s.into()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_read_only_query(query: &str) -> bool {
|
||||||
|
let query = query.trim_start().to_uppercase();
|
||||||
|
query.starts_with("SELECT") ||
|
||||||
|
query.starts_with("SHOW") ||
|
||||||
|
query.starts_with("EXPLAIN")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user