Skip to content

Commit d5e4619

Browse files
committed
refactor: make common function
1 parent 200b210 commit d5e4619

File tree

3 files changed

+41
-34
lines changed

3 files changed

+41
-34
lines changed

common/src/db/create.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use sea_orm::{ConnectionTrait, DbErr};
2+
use sea_orm_migration::SchemaManager;
3+
use sea_query::{IntoIden, extension::postgres::Type};
4+
5+
/// create a type, if it not already exists
6+
///
7+
/// This is required as Postgres doesn't support `CREATE TYPE IF NOT EXISTS`
8+
pub async fn create_enum_if_not_exists<T, I>(
9+
manager: &SchemaManager<'_>,
10+
name: impl IntoIden + Clone,
11+
values: I,
12+
) -> Result<(), DbErr>
13+
where
14+
T: IntoIden,
15+
I: IntoIterator<Item = T>,
16+
{
17+
let builder = manager.get_connection().get_database_backend();
18+
let r#type = name.clone().into_iden();
19+
let stmt = builder.build(Type::create().as_enum(name).values(values));
20+
let stmt = format!(
21+
r#"
22+
DO $$
23+
BEGIN
24+
IF NOT EXISTS (
25+
SELECT 1 FROM pg_type WHERE typname = '{name}'
26+
) THEN
27+
{stmt};
28+
END IF;
29+
END$$;
30+
"#,
31+
name = r#type.to_string()
32+
);
33+
34+
manager.get_connection().execute_unprepared(&stmt).await?;
35+
36+
Ok(())
37+
}

common/src/db/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ pub mod limiter;
33
pub mod multi_model;
44
pub mod query;
55

6+
mod create;
67
mod func;
8+
9+
pub use create::*;
710
pub use func::*;
811

912
use anyhow::Context;

migration/src/m0002010_add_advisory_scores.rs

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::{
55
use sea_orm::sea_query::extension::postgres::*;
66
use sea_orm_migration::prelude::*;
77
use strum::VariantNames;
8+
use trustify_common::db::create_enum_if_not_exists;
89
use trustify_module_ingestor::{
910
graph::cvss::ScoreCreator,
1011
service::advisory::{csaf, cve, osv},
@@ -13,40 +14,6 @@ use trustify_module_ingestor::{
1314
#[derive(DeriveMigrationName)]
1415
pub struct Migration;
1516

16-
/// create a type, if it not already exists
17-
///
18-
/// This is required as Postgres doesn't support `CREATE TYPE IF NOT EXISTS`
19-
pub async fn create_enum_if_not_exists<T, I>(
20-
manager: &SchemaManager<'_>,
21-
name: impl IntoIden + Clone,
22-
values: I,
23-
) -> Result<(), DbErr>
24-
where
25-
T: IntoIden,
26-
I: IntoIterator<Item = T>,
27-
{
28-
let builder = manager.get_connection().get_database_backend();
29-
let r#type = name.clone().into_iden();
30-
let stmt = builder.build(Type::create().as_enum(name).values(values));
31-
let stmt = format!(
32-
r#"
33-
DO $$
34-
BEGIN
35-
IF NOT EXISTS (
36-
SELECT 1 FROM pg_type WHERE typname = '{name}'
37-
) THEN
38-
{stmt};
39-
END IF;
40-
END$$;
41-
"#,
42-
name = r#type.to_string()
43-
);
44-
45-
manager.get_connection().execute_unprepared(&stmt).await?;
46-
47-
Ok(())
48-
}
49-
5017
#[async_trait::async_trait]
5118
impl MigrationTraitWithData for Migration {
5219
async fn up(&self, manager: &SchemaDataManager) -> Result<(), DbErr> {

0 commit comments

Comments
 (0)