Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(psl): Validation error when shadowDatabaseUrl is identical to url or directUrl #4831

Merged
merged 5 commits into from May 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 7 additions & 2 deletions psl/diagnostics/src/error.rs
Expand Up @@ -332,8 +332,13 @@ impl DatamodelError {
Self::new(format!("Datasource provider not known: \"{provider}\"."), span)
}

pub fn new_shadow_database_is_same_as_main_url_error(source_name: String, span: Span) -> DatamodelError {
let msg = format!("shadowDatabaseUrl is the same as url for datasource \"{source_name}\". Please specify a different database as shadow database.");
pub fn new_shadow_database_is_same_as_main_url_error(source_name: &str, span: Span) -> DatamodelError {
let msg = format!("shadowDatabaseUrl is the same as url for datasource \"{source_name}\". Please specify a different database as shadow database to avoid data loss.");
Self::new(msg, span)
}

pub fn new_shadow_database_is_same_as_direct_url_error(source_name: &str, span: Span) -> DatamodelError {
let msg = format!("shadowDatabaseUrl is the same as directUrl for datasource \"{source_name}\". Please specify a different database as shadow database to avoid data loss.");
Self::new(msg, span)
}

Expand Down
18 changes: 18 additions & 0 deletions psl/psl-core/src/validate/datasource_loader.rs
Expand Up @@ -163,6 +163,24 @@ fn lift_datasource(
None => (None, None),
};

if let Some((shadow_url, _)) = &shadow_database_url {
if let (Some(direct_url), Some(direct_url_span)) = (&direct_url, direct_url_span) {
if shadow_url == direct_url {
diagnostics.push_error(DatamodelError::new_shadow_database_is_same_as_direct_url_error(
source_name,
direct_url_span,
));
}
}

if shadow_url == &url {
diagnostics.push_error(DatamodelError::new_shadow_database_is_same_as_main_url_error(
source_name,
url_span,
));
}
}

preview_features_guardrail(&mut args, diagnostics);

let documentation = ast_source.documentation().map(String::from);
Expand Down
@@ -0,0 +1,19 @@
datasource testds {
provider = "mysql"
url = "mysql://testurl"
directUrl = "mysql://testurl"
shadowDatabaseUrl = "mysql://testurl"
}

// error: shadowDatabaseUrl is the same as directUrl for datasource "testds". Please specify a different database as shadow database to avoid data loss.
// --> schema.prisma:4
//  | 
//  3 |  url = "mysql://testurl"
//  4 |  directUrl = "mysql://testurl"
//  | 
// error: shadowDatabaseUrl is the same as url for datasource "testds". Please specify a different database as shadow database to avoid data loss.
// --> schema.prisma:3
//  | 
//  2 |  provider = "mysql"
//  3 |  url = "mysql://testurl"
//  | 
12 changes: 12 additions & 0 deletions psl/psl/tests/validation/datasource/url_same_as_shadow.prisma
@@ -0,0 +1,12 @@
datasource testds {
provider = "mysql"
url = "mysql://testurl"
shadowDatabaseUrl = "mysql://testurl"
}

// error: shadowDatabaseUrl is the same as url for datasource "testds". Please specify a different database as shadow database to avoid data loss.
// --> schema.prisma:3
//  | 
//  2 |  provider = "mysql"
//  3 |  url = "mysql://testurl"
//  |