use sea_orm_migration::prelude::*;
use tracing::debug;
use crate::sea_orm::ActiveValue::Set;
use crate::sea_orm::{ActiveModelTrait, EntityTrait};
#[derive(DeriveMigrationName)]
pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
if !manager
.has_column("cratesio_crate", "total_downloads")
.await?
{
manager
.alter_table(
Table::alter()
.table(CratesIoIden::Table)
.add_column_if_not_exists(
ColumnDef::new(CratesIoIden::TotalDownloads)
.big_integer()
.not_null()
.default(0),
)
.to_owned(),
)
.await?;
}
manager
.create_table(
Table::create()
.table(CratesIoMetaIden::Table)
.if_not_exists()
.col(
ColumnDef::new(CratesIoMetaIden::Id)
.big_integer()
.not_null()
.primary_key()
.auto_increment(),
)
.col(ColumnDef::new(CratesIoMetaIden::Version).text().not_null())
.col(
ColumnDef::new(CratesIoMetaIden::Downloads)
.big_integer()
.not_null()
.default(0),
)
.col(
ColumnDef::new(CratesIoMetaIden::CratesIoFk)
.big_integer()
.not_null(),
)
.foreign_key(
ForeignKey::create()
.name("cratesio_fk")
.from(CratesIoMetaIden::Table, CratesIoMetaIden::CratesIoFk)
.to(CratesIoIden::Table, CratesIoIden::Id)
.on_delete(ForeignKeyAction::Cascade)
.on_update(ForeignKeyAction::NoAction),
)
.to_owned(),
)
.await?;
fill_new_columns(manager.get_connection()).await
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_table(Table::drop().table(CratesIoMetaIden::Table).to_owned())
.await?;
manager
.alter_table(
Table::alter()
.table(CratesIoIden::Table)
.drop_column(CratesIoIden::TotalDownloads)
.to_owned(),
)
.await
}
}
async fn fill_new_columns(db: &SchemaManagerConnection<'_>) -> Result<(), DbErr> {
use crate::m20220101_000008_create_table_entities::{cratesio_index, cratesio_meta};
let cached_versions = cratesio_index::Entity::find()
.all(db)
.await?
.into_iter()
.collect::<Vec<_>>();
for cached_version in cached_versions {
let crate_id = cached_version.crates_io_fk;
let version = cached_version.vers;
let meta = cratesio_meta::ActiveModel {
id: Default::default(),
version: Set(version),
downloads: Default::default(),
crates_io_fk: Set(crate_id),
};
cratesio_meta::Entity::insert(meta).exec(db).await?;
}
Ok(())
}
#[derive(Iden)]
pub enum CratesIoIden {
#[iden = "cratesio_crate"]
Table,
Id,
TotalDownloads,
}
#[derive(Iden)]
pub enum CratesIoMetaIden {
#[iden = "cratesio_meta"]
Table,
Id,
Version,
Downloads,
CratesIoFk,
}