Skip to content

Commit

Permalink
feat(psl): Validation error when shadowDatabaseUrl is identical to ur…
Browse files Browse the repository at this point in the history
…l or directUrl (#4831)

* feat(psl): Validation error when shadowDatabaseUrl is identical to url or directUrl
* validation error when shadowUrl identical to either url or directUrl
* improve error message for when shadowUrl same as url or directUrl

Closes #16628
  • Loading branch information
pranayat committed May 2, 2024
1 parent 612a7f7 commit 0ec3a6f
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 2 deletions.
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"
//  | 

0 comments on commit 0ec3a6f

Please sign in to comment.