Skip to content

Commit cd28430

Browse files
committed
fix: better error handling, avoiding panics
1 parent 0b48c04 commit cd28430

3 files changed

Lines changed: 16 additions & 8 deletions

File tree

sqlshield-py/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use pyo3::prelude::*;
1+
use pyo3::{exceptions::PyValueError, prelude::*};
22

33
extern crate sqlshield as sqlshield_rs;
44

@@ -38,7 +38,7 @@ fn validate_files(dir: String, schema_file_path: String) -> PyResult<Vec<PySqlVa
3838

3939
#[pyfunction]
4040
fn validate_query(query: String, schema: String) -> PyResult<Vec<String>> {
41-
Ok(sqlshield_rs::validate_query(query, schema))
41+
sqlshield_rs::validate_query(query, schema).map_err(|err| PyValueError::new_err(err))
4242
}
4343

4444
/// A Python module implemented in Rust.

sqlshield/src/lib.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,20 @@ use regex::Regex;
99
use validation::{validate_queries_in_code, validate_statements_with_schema, SqlValidationError};
1010
use walkdir::WalkDir;
1111

12-
pub fn validate_query(query: String, schema: String) -> Vec<String> {
12+
pub fn validate_query(query: String, schema: String) -> Result<Vec<String>, String> {
1313
let dialect = sqlparser::dialect::GenericDialect {};
1414

15-
let statements = sqlparser::parser::Parser::parse_sql(&dialect, &query).unwrap();
15+
let statements = match sqlparser::parser::Parser::parse_sql(&dialect, &query) {
16+
Ok(statements) => statements,
17+
Err(err) => return Err(err.to_string()),
18+
};
1619

17-
let loaded_schema = schema::load_schema(&schema.into_bytes(), "sql").unwrap();
20+
let loaded_schema = match schema::load_schema(&schema.into_bytes(), "sql") {
21+
Ok(loaded_schema) => loaded_schema,
22+
Err(err) => return Err(err),
23+
};
1824

19-
validate_statements_with_schema(&statements, &loaded_schema)
25+
Ok(validate_statements_with_schema(&statements, &loaded_schema))
2026
}
2127

2228
pub fn validate_files(dir: &PathBuf, schema_file_path: &PathBuf) -> Vec<SqlValidationError> {

sqlshield/src/schema/sql.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ pub fn load_schema(schema: &[u8]) -> Result<super::TablesAndColumns, String> {
55
let schema_str = String::from_utf8_lossy(schema);
66

77
let dialect = GenericDialect {};
8-
let statements =
9-
Parser::parse_sql(&dialect, schema_str.as_ref()).expect("Could not parse schema file");
8+
let statements = match Parser::parse_sql(&dialect, schema_str.as_ref()) {
9+
Ok(statements) => statements,
10+
Err(err) => return Err(format!("Could not parse schema file: {err}")),
11+
};
1012

1113
let mut tables: HashMap<String, HashSet<String>> = HashMap::new();
1214
for statement in statements {

0 commit comments

Comments
 (0)