commit
baab3a25c7
@ -0,0 +1,12 @@
|
|||||||
|
[package]
|
||||||
|
name = "migration"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "migration"
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
sea-orm-migration = "0.8.3"
|
@ -0,0 +1,37 @@
|
|||||||
|
# Running Migrator CLI
|
||||||
|
|
||||||
|
- Apply all pending migrations
|
||||||
|
```sh
|
||||||
|
cargo run
|
||||||
|
```
|
||||||
|
```sh
|
||||||
|
cargo run -- up
|
||||||
|
```
|
||||||
|
- Apply first 10 pending migrations
|
||||||
|
```sh
|
||||||
|
cargo run -- up -n 10
|
||||||
|
```
|
||||||
|
- Rollback last applied migrations
|
||||||
|
```sh
|
||||||
|
cargo run -- down
|
||||||
|
```
|
||||||
|
- Rollback last 10 applied migrations
|
||||||
|
```sh
|
||||||
|
cargo run -- down -n 10
|
||||||
|
```
|
||||||
|
- Drop all tables from the database, then reapply all migrations
|
||||||
|
```sh
|
||||||
|
cargo run -- fresh
|
||||||
|
```
|
||||||
|
- Rollback all applied migrations, then reapply all migrations
|
||||||
|
```sh
|
||||||
|
cargo run -- refresh
|
||||||
|
```
|
||||||
|
- Rollback all applied migrations
|
||||||
|
```sh
|
||||||
|
cargo run -- reset
|
||||||
|
```
|
||||||
|
- Check the status of all migrations
|
||||||
|
```sh
|
||||||
|
cargo run -- status
|
||||||
|
```
|
@ -0,0 +1,13 @@
|
|||||||
|
pub use sea_orm_migration::prelude::*;
|
||||||
|
|
||||||
|
mod m20220101_000001_create_table;
|
||||||
|
mod utils;
|
||||||
|
|
||||||
|
pub struct Migrator;
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl MigratorTrait for Migrator {
|
||||||
|
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
|
||||||
|
vec![Box::new(m20220101_000001_create_table::Migration)]
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,490 @@
|
|||||||
|
use crate::drop_tables;
|
||||||
|
use sea_orm_migration::prelude::*;
|
||||||
|
|
||||||
|
pub struct Migration;
|
||||||
|
|
||||||
|
impl MigrationName for Migration {
|
||||||
|
fn name(&self) -> &str {
|
||||||
|
"m20220101_000001_create_table"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl MigrationTrait for Migration {
|
||||||
|
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||||
|
manager.create_table(create_content_descriptors()).await?;
|
||||||
|
manager.create_table(create_files()).await?;
|
||||||
|
manager.create_table(create_file_metadata()).await?;
|
||||||
|
manager.create_table(create_namespaces()).await?;
|
||||||
|
manager.create_table(create_tags()).await?;
|
||||||
|
manager.create_table(create_cd_tag_mappings()).await?;
|
||||||
|
manager.create_table(create_sources()).await?;
|
||||||
|
manager.create_table(create_cd_sources_mappings()).await?;
|
||||||
|
manager.create_table(create_sorting_presets()).await?;
|
||||||
|
manager.create_table(create_sort_keys()).await?;
|
||||||
|
manager.create_table(create_sorting_preset_key()).await?;
|
||||||
|
manager.create_table(create_job_states()).await?;
|
||||||
|
|
||||||
|
manager
|
||||||
|
.create_index(
|
||||||
|
Index::create()
|
||||||
|
.name("index_files_cd_id")
|
||||||
|
.table(Files::Table)
|
||||||
|
.col(Files::CdId)
|
||||||
|
.to_owned(),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
manager
|
||||||
|
.create_index(
|
||||||
|
Index::create()
|
||||||
|
.name("index_tags_name")
|
||||||
|
.table(Tags::Table)
|
||||||
|
.col(Tags::Name)
|
||||||
|
.full_text()
|
||||||
|
.to_owned(),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
manager
|
||||||
|
.create_index(
|
||||||
|
Index::create()
|
||||||
|
.name("index_cd_tag_mappings_tag_id")
|
||||||
|
.table(CdTagMappings::Table)
|
||||||
|
.col(CdTagMappings::TagId)
|
||||||
|
.to_owned(),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||||
|
drop_tables!(
|
||||||
|
manager,
|
||||||
|
ContentDescriptors::Table,
|
||||||
|
Files::Table,
|
||||||
|
FileMetadata::Table,
|
||||||
|
Namespaces::Table,
|
||||||
|
Tags::Table,
|
||||||
|
CdTagMappings::Table,
|
||||||
|
Sources::Table,
|
||||||
|
CdSourceMappings::Table,
|
||||||
|
SortingPresets::Table,
|
||||||
|
SortKeys::Table,
|
||||||
|
SortingPresetKeys::Table,
|
||||||
|
JobStates::Table
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_file_metadata() -> TableCreateStatement {
|
||||||
|
Table::create()
|
||||||
|
.if_not_exists()
|
||||||
|
.table(FileMetadata::Table)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(FileMetadata::FileId)
|
||||||
|
.big_integer()
|
||||||
|
.not_null()
|
||||||
|
.primary_key(),
|
||||||
|
)
|
||||||
|
.col(ColumnDef::new(FileMetadata::Size).integer().not_null())
|
||||||
|
.col(ColumnDef::new(FileMetadata::Name).string_len(128))
|
||||||
|
.col(ColumnDef::new(FileMetadata::Comment).string_len(1024))
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(FileMetadata::ImportTime)
|
||||||
|
.date_time()
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(FileMetadata::CreationTime)
|
||||||
|
.date_time()
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(FileMetadata::ChangeTime)
|
||||||
|
.date_time()
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.foreign_key(
|
||||||
|
ForeignKey::create()
|
||||||
|
.from(FileMetadata::Table, FileMetadata::FileId)
|
||||||
|
.to(Files::Table, Files::Id)
|
||||||
|
.on_delete(ForeignKeyAction::Cascade),
|
||||||
|
)
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_files() -> TableCreateStatement {
|
||||||
|
Table::create()
|
||||||
|
.if_not_exists()
|
||||||
|
.table(Files::Table)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(Files::Id)
|
||||||
|
.big_integer()
|
||||||
|
.primary_key()
|
||||||
|
.auto_increment(),
|
||||||
|
)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(Files::Status)
|
||||||
|
.integer()
|
||||||
|
.default(10)
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.col(ColumnDef::new(Files::CdId).big_integer().not_null())
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(Files::MimeType)
|
||||||
|
.string_len(128)
|
||||||
|
.default("application/octet-stream")
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.foreign_key(
|
||||||
|
ForeignKey::create()
|
||||||
|
.from(Files::Table, Files::CdId)
|
||||||
|
.to(ContentDescriptors::Table, ContentDescriptors::Id)
|
||||||
|
.on_delete(ForeignKeyAction::Cascade),
|
||||||
|
)
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_content_descriptors() -> TableCreateStatement {
|
||||||
|
Table::create()
|
||||||
|
.if_not_exists()
|
||||||
|
.table(ContentDescriptors::Table)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(ContentDescriptors::Id)
|
||||||
|
.big_integer()
|
||||||
|
.primary_key()
|
||||||
|
.auto_increment(),
|
||||||
|
)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(ContentDescriptors::Descriptor)
|
||||||
|
.binary()
|
||||||
|
.unique_key(),
|
||||||
|
)
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_tags() -> TableCreateStatement {
|
||||||
|
Table::create()
|
||||||
|
.if_not_exists()
|
||||||
|
.table(Tags::Table)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(Tags::Id)
|
||||||
|
.integer()
|
||||||
|
.primary_key()
|
||||||
|
.auto_increment(),
|
||||||
|
)
|
||||||
|
.col(ColumnDef::new(Tags::NamespaceId).big_integer())
|
||||||
|
.col(ColumnDef::new(Tags::Name).string_len(128).not_null())
|
||||||
|
.foreign_key(
|
||||||
|
ForeignKey::create()
|
||||||
|
.from(Tags::Table, Tags::NamespaceId)
|
||||||
|
.to(Namespaces::Table, Namespaces::Id),
|
||||||
|
)
|
||||||
|
.index(
|
||||||
|
Index::create()
|
||||||
|
.unique()
|
||||||
|
.table(Tags::Table)
|
||||||
|
.col(Tags::NamespaceId)
|
||||||
|
.col(Tags::Name),
|
||||||
|
)
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_cd_tag_mappings() -> TableCreateStatement {
|
||||||
|
Table::create()
|
||||||
|
.if_not_exists()
|
||||||
|
.table(CdTagMappings::Table)
|
||||||
|
.col(ColumnDef::new(CdTagMappings::CdId).big_integer().not_null())
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(CdTagMappings::TagId)
|
||||||
|
.big_integer()
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.primary_key(
|
||||||
|
Index::create()
|
||||||
|
.table(CdTagMappings::TagId)
|
||||||
|
.col(CdTagMappings::CdId)
|
||||||
|
.col(CdTagMappings::TagId),
|
||||||
|
)
|
||||||
|
.foreign_key(
|
||||||
|
ForeignKey::create()
|
||||||
|
.from(CdTagMappings::Table, CdTagMappings::CdId)
|
||||||
|
.to(ContentDescriptors::Table, ContentDescriptors::Id)
|
||||||
|
.on_delete(ForeignKeyAction::Cascade),
|
||||||
|
)
|
||||||
|
.foreign_key(
|
||||||
|
ForeignKey::create()
|
||||||
|
.from(CdTagMappings::Table, CdTagMappings::TagId)
|
||||||
|
.to(Tags::Table, Tags::Id)
|
||||||
|
.on_delete(ForeignKeyAction::Cascade),
|
||||||
|
)
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_namespaces() -> TableCreateStatement {
|
||||||
|
Table::create()
|
||||||
|
.if_not_exists()
|
||||||
|
.table(Namespaces::Table)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(Namespaces::Id)
|
||||||
|
.big_integer()
|
||||||
|
.primary_key()
|
||||||
|
.auto_increment(),
|
||||||
|
)
|
||||||
|
.col(ColumnDef::new(Namespaces::Name).string_len(128).not_null())
|
||||||
|
.index(
|
||||||
|
Index::create()
|
||||||
|
.unique()
|
||||||
|
.table(Namespaces::Table)
|
||||||
|
.col(Namespaces::Name)
|
||||||
|
.full_text(),
|
||||||
|
)
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_sources() -> TableCreateStatement {
|
||||||
|
Table::create()
|
||||||
|
.if_not_exists()
|
||||||
|
.table(Sources::Table)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(Sources::Id)
|
||||||
|
.big_integer()
|
||||||
|
.primary_key()
|
||||||
|
.auto_increment(),
|
||||||
|
)
|
||||||
|
.col(ColumnDef::new(Sources::Url).string_len(512).not_null())
|
||||||
|
.index(
|
||||||
|
Index::create()
|
||||||
|
.unique()
|
||||||
|
.table(Sources::Table)
|
||||||
|
.col(Sources::Url)
|
||||||
|
.full_text(),
|
||||||
|
)
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_cd_sources_mappings() -> TableCreateStatement {
|
||||||
|
Table::create()
|
||||||
|
.if_not_exists()
|
||||||
|
.table(CdSourceMappings::Table)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(CdSourceMappings::CdId)
|
||||||
|
.big_integer()
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(CdSourceMappings::SourceId)
|
||||||
|
.big_integer()
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.foreign_key(
|
||||||
|
ForeignKey::create()
|
||||||
|
.from(CdSourceMappings::Table, CdSourceMappings::CdId)
|
||||||
|
.to(ContentDescriptors::Table, ContentDescriptors::Id)
|
||||||
|
.on_delete(ForeignKeyAction::Cascade),
|
||||||
|
)
|
||||||
|
.foreign_key(
|
||||||
|
ForeignKey::create()
|
||||||
|
.from(CdSourceMappings::Table, CdSourceMappings::SourceId)
|
||||||
|
.to(Sources::Table, Sources::Id)
|
||||||
|
.on_delete(ForeignKeyAction::Cascade),
|
||||||
|
)
|
||||||
|
.primary_key(
|
||||||
|
Index::create()
|
||||||
|
.table(CdSourceMappings::Table)
|
||||||
|
.col(CdSourceMappings::CdId)
|
||||||
|
.col(CdSourceMappings::SourceId)
|
||||||
|
.full_text(),
|
||||||
|
)
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_sorting_presets() -> TableCreateStatement {
|
||||||
|
Table::create()
|
||||||
|
.if_not_exists()
|
||||||
|
.table(SortingPresets::Table)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(SortingPresets::Id)
|
||||||
|
.big_integer()
|
||||||
|
.primary_key()
|
||||||
|
.auto_increment(),
|
||||||
|
)
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_sort_keys() -> TableCreateStatement {
|
||||||
|
Table::create()
|
||||||
|
.if_not_exists()
|
||||||
|
.table(SortKeys::Table)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(SortKeys::Id)
|
||||||
|
.big_integer()
|
||||||
|
.primary_key()
|
||||||
|
.auto_increment(),
|
||||||
|
)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(SortKeys::KeyType)
|
||||||
|
.integer()
|
||||||
|
.not_null()
|
||||||
|
.default(0),
|
||||||
|
)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(SortKeys::Ascending)
|
||||||
|
.boolean()
|
||||||
|
.not_null()
|
||||||
|
.default(false),
|
||||||
|
)
|
||||||
|
.col(ColumnDef::new(SortKeys::Value).string_len(128))
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_sorting_preset_key() -> TableCreateStatement {
|
||||||
|
Table::create()
|
||||||
|
.if_not_exists()
|
||||||
|
.table(SortingPresetKeys::Table)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(SortingPresetKeys::PresetId)
|
||||||
|
.big_integer()
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(SortingPresetKeys::KeyId)
|
||||||
|
.big_integer()
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(SortingPresetKeys::KeyIndex)
|
||||||
|
.integer()
|
||||||
|
.default(0)
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.primary_key(
|
||||||
|
Index::create()
|
||||||
|
.table(SortingPresetKeys::Table)
|
||||||
|
.col(SortingPresetKeys::PresetId)
|
||||||
|
.col(SortingPresetKeys::KeyId),
|
||||||
|
)
|
||||||
|
.foreign_key(
|
||||||
|
ForeignKey::create()
|
||||||
|
.from(SortingPresetKeys::Table, SortingPresetKeys::PresetId)
|
||||||
|
.to(SortingPresets::Table, SortingPresets::Id)
|
||||||
|
.on_delete(ForeignKeyAction::Cascade),
|
||||||
|
)
|
||||||
|
.foreign_key(
|
||||||
|
ForeignKey::create()
|
||||||
|
.from(SortingPresetKeys::Table, SortingPresetKeys::KeyId)
|
||||||
|
.to(SortKeys::Table, SortKeys::Id)
|
||||||
|
.on_delete(ForeignKeyAction::Cascade),
|
||||||
|
)
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_job_states() -> TableCreateStatement {
|
||||||
|
Table::create()
|
||||||
|
.if_not_exists()
|
||||||
|
.table(JobStates::Table)
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(JobStates::JobType)
|
||||||
|
.integer()
|
||||||
|
.primary_key()
|
||||||
|
.not_null(),
|
||||||
|
)
|
||||||
|
.col(ColumnDef::new(JobStates::Value).binary())
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum FileMetadata {
|
||||||
|
Table,
|
||||||
|
FileId,
|
||||||
|
Size,
|
||||||
|
Name,
|
||||||
|
Comment,
|
||||||
|
ImportTime,
|
||||||
|
CreationTime,
|
||||||
|
ChangeTime,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum Files {
|
||||||
|
Table,
|
||||||
|
Id,
|
||||||
|
Status,
|
||||||
|
CdId,
|
||||||
|
MimeType,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum ContentDescriptors {
|
||||||
|
Table,
|
||||||
|
Id,
|
||||||
|
Descriptor,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum Tags {
|
||||||
|
Table,
|
||||||
|
Id,
|
||||||
|
NamespaceId,
|
||||||
|
Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum CdTagMappings {
|
||||||
|
Table,
|
||||||
|
CdId,
|
||||||
|
TagId,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum Namespaces {
|
||||||
|
Table,
|
||||||
|
Id,
|
||||||
|
Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum Sources {
|
||||||
|
Table,
|
||||||
|
Id,
|
||||||
|
Url,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum CdSourceMappings {
|
||||||
|
Table,
|
||||||
|
CdId,
|
||||||
|
SourceId,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum SortingPresets {
|
||||||
|
Table,
|
||||||
|
Id,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum SortKeys {
|
||||||
|
Table,
|
||||||
|
Id,
|
||||||
|
KeyType,
|
||||||
|
Ascending,
|
||||||
|
Value,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum SortingPresetKeys {
|
||||||
|
Table,
|
||||||
|
PresetId,
|
||||||
|
KeyId,
|
||||||
|
KeyIndex,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Iden)]
|
||||||
|
enum JobStates {
|
||||||
|
Table,
|
||||||
|
JobType,
|
||||||
|
Value,
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
use migration::Migrator;
|
||||||
|
use sea_orm_migration::prelude::*;
|
||||||
|
|
||||||
|
#[async_std::main]
|
||||||
|
async fn main() {
|
||||||
|
cli::run_cli(Migrator).await;
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
#[macro_export]
|
||||||
|
macro_rules! drop_tables {
|
||||||
|
($man:expr, $($tbl:expr),*) => {
|
||||||
|
use sea_orm_migration::prelude::*;
|
||||||
|
$(
|
||||||
|
$man.drop_table(TableDropStatement::new().table($tbl).to_owned()).await?;
|
||||||
|
)*
|
||||||
|
}
|
||||||
|
}
|
@ -1,81 +0,0 @@
|
|||||||
CREATE TABLE storage_locations
|
|
||||||
(
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
name VARCHAR(128) UNIQUE NOT NULL,
|
|
||||||
path VARCHAR(255) NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE hashes
|
|
||||||
(
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
value TEXT NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX hashes_value_index ON hashes (value);
|
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE files
|
|
||||||
(
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
type INTEGER NOT NULL DEFAULT 0,
|
|
||||||
name VARCHAR(128),
|
|
||||||
comment VARCHAR(1024),
|
|
||||||
storage_id INTEGER NOT NULL,
|
|
||||||
hash_id INTEGER NOT NULL,
|
|
||||||
import_time DATETIME NOT NULL,
|
|
||||||
creation_time DATETIME NOT NULL,
|
|
||||||
change_time DATETIME NOT NULL,
|
|
||||||
FOREIGN KEY (storage_id) REFERENCES storage_locations (id),
|
|
||||||
FOREIGN KEY (hash_id) REFERENCES hashes (id)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE namespaces
|
|
||||||
(
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
name VARCHAR(128) UNIQUE NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX namespaces_name_index ON namespaces (name);
|
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE tags
|
|
||||||
(
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
namespace_id INTEGER,
|
|
||||||
name VARCHAR(128) UNIQUE NOT NULL,
|
|
||||||
FOREIGN KEY (namespace_id) REFERENCES namespaces (id)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX tag_name_index ON tags (name);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE sources
|
|
||||||
(
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
url VARCHAR(512) NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX sources_value_index ON sources (url);
|
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE hash_tag_mappings
|
|
||||||
(
|
|
||||||
hash_id INTEGER NOT NULL,
|
|
||||||
tag_id INTEGER NOT NULL,
|
|
||||||
PRIMARY KEY (hash_id, tag_id),
|
|
||||||
FOREIGN KEY (hash_id) REFERENCES hashes (id),
|
|
||||||
FOREIGN KEY (tag_id) REFERENCES tags (id)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE hash_source_mappings
|
|
||||||
(
|
|
||||||
hash_id INTEGER NOT NULL,
|
|
||||||
source_id INTEGER NOT NULL,
|
|
||||||
PRIMARY KEY (hash_id, source_id),
|
|
||||||
FOREIGN KEY (hash_id) REFERENCES hashes (id),
|
|
||||||
FOREIGN KEY (source_id) REFERENCES sources (id)
|
|
||||||
)
|
|
@ -1 +0,0 @@
|
|||||||
ALTER TABLE files RENAME COLUMN type TO file_type;
|
|
@ -1,3 +0,0 @@
|
|||||||
-- Add migration script here
|
|
||||||
ALTER TABLE files
|
|
||||||
ADD COLUMN mime_type VARCHAR(128);
|
|
@ -1,14 +0,0 @@
|
|||||||
-- Add migration script here
|
|
||||||
CREATE TABLE thumbnails (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
hash_id INTEGER UNIQUE NOT NULL,
|
|
||||||
storage_id INTEGER NOT NULL,
|
|
||||||
file_id INTEGER NOT NULL,
|
|
||||||
height INTEGER NOT NULL,
|
|
||||||
width INTEGER NOT NULL,
|
|
||||||
FOREIGN KEY (hash_id) REFERENCES hashes (id),
|
|
||||||
FOREIGN KEY (storage_id) REFERENCES storage_locations (id),
|
|
||||||
FOREIGN KEY (file_id) REFERENCES files (id)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX thumbnail_file_resolution ON thumbnails (file_id, height, width);
|
|
@ -1,3 +0,0 @@
|
|||||||
-- Add migration script here
|
|
||||||
ALTER TABLE thumbnails
|
|
||||||
ADD COLUMN mime VARCHAR(128);
|
|
@ -1,8 +0,0 @@
|
|||||||
-- Add migration script here
|
|
||||||
DELETE FROM thumbnails WHERE file_id NOT IN (SELECT MIN(files.id) FROM files GROUP BY hash_id);
|
|
||||||
DELETE FROM files WHERE ROWID NOT IN (SELECT MIN(ROWID) FROM files GROUP BY hash_id);
|
|
||||||
DELETE FROM thumbnails WHERE hash_id NOT IN (SELECT MIN(hashes.id) FROM hashes GROUP BY value);
|
|
||||||
DELETE FROM files WHERE hash_id NOT IN (SELECT MIN(hashes.id) FROM hashes GROUP BY value);
|
|
||||||
DELETE FROM hashes WHERE ROWID NOT IN (SELECT MIN(ROWID) FROM hashes GROUP BY value);
|
|
||||||
CREATE UNIQUE INDEX hash_value_index ON hashes (value);
|
|
||||||
CREATE UNIQUE INDEX file_hash_id ON files (hash_id);
|
|
@ -1,33 +0,0 @@
|
|||||||
-- Add migration script here
|
|
||||||
PRAGMA foreign_keys=off;
|
|
||||||
|
|
||||||
ALTER TABLE tags RENAME TO _tags_old;
|
|
||||||
CREATE TABLE tags
|
|
||||||
(
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
namespace_id INTEGER,
|
|
||||||
name VARCHAR(128),
|
|
||||||
FOREIGN KEY (namespace_id) REFERENCES namespaces (id)
|
|
||||||
);
|
|
||||||
CREATE UNIQUE INDEX tag_namespace_name_index ON tags (namespace_id, name);
|
|
||||||
|
|
||||||
INSERT INTO tags SELECT * FROM _tags_old;
|
|
||||||
|
|
||||||
DROP TABLE _tags_old;
|
|
||||||
|
|
||||||
ALTER TABLE hash_tag_mappings RENAME TO _hash_tag_mappings_old;
|
|
||||||
CREATE TABLE hash_tag_mappings
|
|
||||||
(
|
|
||||||
hash_id INTEGER NOT NULL,
|
|
||||||
tag_id INTEGER NOT NULL,
|
|
||||||
PRIMARY KEY (hash_id, tag_id),
|
|
||||||
FOREIGN KEY (hash_id) REFERENCES hashes (id),
|
|
||||||
FOREIGN KEY (tag_id) REFERENCES tags (id)
|
|
||||||
);
|
|
||||||
CREATE UNIQUE INDEX hash_tag_mappings_hash_tag ON hash_tag_mappings (hash_id, tag_id);
|
|
||||||
|
|
||||||
INSERT INTO hash_tag_mappings SELECT * FROM _hash_tag_mappings_old;
|
|
||||||
|
|
||||||
DROP TABLE _hash_tag_mappings_old;
|
|
||||||
|
|
||||||
PRAGMA foreign_keys=on;
|
|
@ -1,3 +0,0 @@
|
|||||||
-- Add migration script here
|
|
||||||
CREATE INDEX index_hash_tag_mappings_tag_id ON hash_tag_mappings (tag_id);
|
|
||||||
CREATE INDEX index_tag_name ON tags (name);
|
|
@ -1,2 +0,0 @@
|
|||||||
-- Add migration script here
|
|
||||||
DROP TABLE thumbnails;
|
|
@ -1,3 +0,0 @@
|
|||||||
-- Add migration script here
|
|
||||||
ALTER TABLE files
|
|
||||||
ADD COLUMN size INTEGER;
|
|
@ -1,107 +0,0 @@
|
|||||||
-- Add migration script here
|
|
||||||
PRAGMA foreign_keys= off;
|
|
||||||
|
|
||||||
-- create backup files table
|
|
||||||
ALTER TABLE files
|
|
||||||
RENAME TO _files_old;
|
|
||||||
|
|
||||||
-- create backup hashes table
|
|
||||||
ALTER TABLE hashes
|
|
||||||
RENAME TO _hashes_old;
|
|
||||||
|
|
||||||
-- create backup hash_tag_mappings table
|
|
||||||
ALTER TABLE hash_tag_mappings
|
|
||||||
RENAME TO _hash_tag_mappings_old;
|
|
||||||
|
|
||||||
-- create backup hash_source_mappings table
|
|
||||||
ALTER TABLE hash_source_mappings
|
|
||||||
RENAME TO _hash_source_mappings_old;
|
|
||||||
|
|
||||||
-- create content id table
|
|
||||||
CREATE TABLE content_descriptors
|
|
||||||
(
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
descriptor BLOB NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX content_descriptor_values ON content_descriptors (descriptor);
|
|
||||||
|
|
||||||
-- create content-id tag mappings table
|
|
||||||
CREATE TABLE cd_tag_mappings
|
|
||||||
(
|
|
||||||
cd_id INTEGER NOT NULL REFERENCES content_descriptors (id),
|
|
||||||
tag_id INTEGER NOT NULL REFERENCES tags (id),
|
|
||||||
PRIMARY KEY (cd_id, tag_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX content_descriptor_tag_mapping_unique ON cd_tag_mappings (cd_id, tag_id);
|
|
||||||
CREATE INDEX content_descriptor_tag_mapping_tag ON cd_tag_mappings (tag_id);
|
|
||||||
|
|
||||||
-- create content-id source mappings table
|
|
||||||
CREATE TABLE cd_source_mappings
|
|
||||||
(
|
|
||||||
cd_id INTEGER NOT NULL REFERENCES content_descriptors (id),
|
|
||||||
source_id INTEGER NOT NULL REFERENCES sources (id),
|
|
||||||
PRIMARY KEY (cd_id, source_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX content_descriptor_source_mapping_unique ON cd_source_mappings (cd_id, source_id);
|
|
||||||
|
|
||||||
-- create new files table
|
|
||||||
CREATE TABLE files
|
|
||||||
(
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
status INTEGER NOT NULL DEFAULT 10,
|
|
||||||
storage_id INTEGER NOT NULL REFERENCES storage_locations (id),
|
|
||||||
cd_id INTEGER NOT NULL REFERENCES content_descriptors (id),
|
|
||||||
mime_type VARCHAR(128) NOT NULL DEFAULT 'application/octet-stream'
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX files_contend_descriptor ON files (cd_id);
|
|
||||||
|
|
||||||
-- create metadata table
|
|
||||||
CREATE TABLE file_metadata
|
|
||||||
(
|
|
||||||
file_id INTEGER PRIMARY KEY REFERENCES files (id),
|
|
||||||
size INTEGER NOT NULL,
|
|
||||||
name VARCHAR(128),
|
|
||||||
comment VARCHAR(1024),
|
|
||||||
import_time DATETIME NOT NULL,
|
|
||||||
creation_time DATETIME NOT NULL,
|
|
||||||
change_time DATETIME NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX file_metadata_file_id_unique ON file_metadata (file_id);
|
|
||||||
|
|
||||||
-- add content identifiers from hashes table
|
|
||||||
INSERT INTO content_descriptors
|
|
||||||
SELECT id, value
|
|
||||||
FROM _hashes_old;
|
|
||||||
|
|
||||||
-- add files from files table
|
|
||||||
INSERT INTO files (id, storage_id, cd_id, mime_type)
|
|
||||||
SELECT id, storage_id, hash_id AS content_id, mime_type
|
|
||||||
FROM _files_old;
|
|
||||||
|
|
||||||
-- add metadata from files table
|
|
||||||
INSERT INTO file_metadata
|
|
||||||
SELECT id AS file_id, size, name, comment, import_time, creation_time, change_time
|
|
||||||
FROM _files_old;
|
|
||||||
|
|
||||||
-- add content tag mappings
|
|
||||||
INSERT INTO cd_tag_mappings
|
|
||||||
SELECT hash_id AS content_id, tag_id
|
|
||||||
FROM _hash_tag_mappings_old;
|
|
||||||
|
|
||||||
-- add content id source mappings
|
|
||||||
INSERT INTO cd_source_mappings
|
|
||||||
SELECT hash_id AS content_id, source_id
|
|
||||||
FROM _hash_source_mappings_old;
|
|
||||||
|
|
||||||
-- drop all old tables
|
|
||||||
DROP TABLE _hash_source_mappings_old;
|
|
||||||
DROP TABLE _hash_tag_mappings_old;
|
|
||||||
DROP TABLE _files_old;
|
|
||||||
DROP TABLE _hashes_old;
|
|
||||||
|
|
||||||
pragma foreign_keys= on;
|
|
@ -1,50 +0,0 @@
|
|||||||
-- Add migration script here
|
|
||||||
PRAGMA foreign_keys= off;
|
|
||||||
|
|
||||||
-- rename old files table
|
|
||||||
ALTER TABLE files
|
|
||||||
RENAME TO _files_old;
|
|
||||||
-- rename metadata value (because of foreign key constraints)
|
|
||||||
ALTER TABLE file_metadata
|
|
||||||
RENAME TO _file_metadata_old;
|
|
||||||
|
|
||||||
-- create new files table
|
|
||||||
CREATE TABLE files
|
|
||||||
(
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
status INTEGER NOT NULL DEFAULT 10,
|
|
||||||
cd_id INTEGER NOT NULL REFERENCES content_descriptors (id),
|
|
||||||
mime_type VARCHAR(128) NOT NULL DEFAULT 'application/octet-stream'
|
|
||||||
);
|
|
||||||
-- add data from files table
|
|
||||||
INSERT INTO files
|
|
||||||
SELECT id, status, cd_id, mime_type
|
|
||||||
FROM _files_old;
|
|
||||||
|
|
||||||
-- create metadata table
|
|
||||||
CREATE TABLE file_metadata
|
|
||||||
(
|
|
||||||
file_id INTEGER PRIMARY KEY REFERENCES files (id),
|
|
||||||
size INTEGER NOT NULL,
|
|
||||||
name VARCHAR(128),
|
|
||||||
comment VARCHAR(1024),
|
|
||||||
import_time DATETIME NOT NULL,
|
|
||||||
creation_time DATETIME NOT NULL,
|
|
||||||
change_time DATETIME NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
-- add back the old values
|
|
||||||
INSERT INTO file_metadata
|
|
||||||
SELECT *
|
|
||||||
FROM _file_metadata_old;
|
|
||||||
|
|
||||||
-- drop old tables
|
|
||||||
DROP TABLE _file_metadata_old;
|
|
||||||
DROP TABLE _files_old;
|
|
||||||
DROP TABLE storage_locations;
|
|
||||||
|
|
||||||
-- create indices on new tables
|
|
||||||
CREATE UNIQUE INDEX file_metadata_file_id_unique ON file_metadata (file_id);
|
|
||||||
CREATE INDEX files_content_descriptor ON files (cd_id);
|
|
||||||
|
|
||||||
PRAGMA foreign_keys= on;
|
|
@ -1,20 +0,0 @@
|
|||||||
-- Add migration script here
|
|
||||||
CREATE TABLE sorting_presets (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE sort_keys (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
key_type INTEGER NOT NULL DEFAULT 0,
|
|
||||||
ascending INTEGER NOT NULL CHECK (ascending IN (0, 1)),
|
|
||||||
value VARCHAR(128)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE sorting_preset_keys (
|
|
||||||
preset_id INTEGER REFERENCES sorting_presets (id) ON DELETE CASCADE,
|
|
||||||
key_id INTEGER REFERENCES sort_keys (id),
|
|
||||||
key_index INTEGER NOT NULL DEFAULT 0,
|
|
||||||
PRIMARY KEY (preset_id, key_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX sorting_preset_index ON sorting_preset_keys (preset_id);
|
|
@ -1,17 +0,0 @@
|
|||||||
PRAGMA foreign_keys= off;
|
|
||||||
ALTER TABLE sorting_preset_keys
|
|
||||||
RENAME TO _sorting_preset_keys_old;
|
|
||||||
|
|
||||||
CREATE TABLE sorting_preset_keys
|
|
||||||
(
|
|
||||||
preset_id INTEGER REFERENCES sorting_presets (id) ON DELETE CASCADE,
|
|
||||||
key_id INTEGER REFERENCES sort_keys (id),
|
|
||||||
key_index INTEGER NOT NULL DEFAULT 0,
|
|
||||||
PRIMARY KEY (preset_id, key_id, key_index)
|
|
||||||
);
|
|
||||||
|
|
||||||
INSERT INTO sorting_preset_keys SELECT * FROM _sorting_preset_keys_old;
|
|
||||||
|
|
||||||
DROP TABLE _sorting_preset_keys_old;
|
|
||||||
|
|
||||||
PRAGMA foreign_keys= on;
|
|
@ -1,5 +0,0 @@
|
|||||||
CREATE TABLE job_states (
|
|
||||||
job_type INTEGER NOT NULL,
|
|
||||||
value BLOB,
|
|
||||||
PRIMARY KEY (job_type)
|
|
||||||
);
|
|
Loading…
Reference in New Issue