mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-11-15 08:54:01 +00:00
4ba6221e04
* stuff * stuff including batch_upsert function * stuff * do things * stuff * different timestamps * stuff * Revert changes to comment.rs * Update comment.rs * Update comment.rs * Update post_view.rs * Update utils.rs * Update up.sql * Update up.sql * Update down.sql * Update up.sql * Update main.rs * use anyhow macro * Create down.sql * Create up.sql * Create replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update utils.rs * Update .woodpecker.yml * Update sql_format_check.sh * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Create dump_schema.sh * Update start_dev_db.sh * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * Update replaceable_schema.sql * stuff * Update replaceable_schema.sql * Update .pg_format * fmt * stuff * stuff (#21) * Update replaceable_schema.sql * Update up.sql * Update replaceable_schema.sql * fmt * update cargo.lock * stuff * Update replaceable_schema.sql * Remove truncate trigger because truncate is already restricted by foreign keys * Update replaceable_schema.sql * fix some things * Update replaceable_schema.sql * Update replaceable_schema.sql * Update .woodpecker.yml * stuff * fix TG_OP * Psql env vars * try to fix combine_transition_tables parse error * Revert "try to fix combine_transition_tables parse error" This reverts commit75d00a4626
. * refactor combine_transition_tables * try to fix create_triggers * fix some things * try to fix combined_transition_tables * fix sql errors * update comment count in post trigger * fmt * Revert "fmt" This reverts commita5bcd0834b
. * Revert "update comment count in post trigger" This reverts commit0066a4b42b
. * fix everything * Update replaceable_schema.sql * actually fix everything * refactor create_triggers * fix * add semicolons * add is_counted function and fix incorrect bool operator in update_comment_count_from_post * refactor comment trigger * refactor post trigger * fix * Delete crates/db_schema/src/utils/series.rs * subscribers_local * edit migrations * move migrations * remove utils::series module declaration * fix everything * stuff * Move sql to schema_setup dir * utils.sql * delete .pg_format * Update .woodpecker.yml * Update sql_format_check.sh * Update .woodpecker.yml * Merge remote-tracking branch 'upstream/main' into bliss * fmt * Create main.rs * Update lib.rs * Update main.rs * Update .woodpecker.yml * Update main.rs * Update Cargo.toml * Update .woodpecker.yml * Update .woodpecker.yml * Update triggers.sql * YAY * Update mod.rs * Update Cargo.toml * a * Update Cargo.toml * Update Cargo.toml * Delete crates/db_schema/src/main.rs * Update Cargo.toml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update utils.sql * Update utils.sql * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update down.sql * Update up.sql * Update triggers.sql * Update .woodpecker.yml * Update .woodpecker.yml * Update triggers.sql * Update down.sql * Update .woodpecker.yml * Update Cargo.toml * Update .woodpecker.yml * Update Cargo.toml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update .woodpecker.yml * Update mod.rs * Update Cargo.toml * Update mod.rs * make dump_schema.sh executable * fix dump_schema.sh * defer * diff dumps * fmt * Update utils.sql * Update .woodpecker.yml * use correct version for pg_dump * Update .woodpecker.yml * Update .woodpecker.yml * change migration date * atomic site_aggregates insert * temporarily repeat tests in CI * drop r schema in CI migration check * show ReceivedActivity::create error * move check_diesel_migration CI step * Update .woodpecker.yml * Update scheduled_tasks.rs * Update scheduled_tasks.rs * update cargo.lock * move sql files * move rank functions * filter post_aggregates update * fmt * cargo fmt * replace post_id with id * update cargo.lock * avoid locking rows that need no change in up.sql * only run replaceable_schema if migrations were run * debug ci test failure * make replaceable_schema work in CI * Update .woodpecker.yml * remove println * Use migration revert and git checkout * Update schema_setup.rs * Fix * Update schema_setup.rs * Update schema_setup.rs * Update .woodpecker.yml --------- Co-authored-by: Nutomic <me@nutomic.com> Co-authored-by: Dessalines <dessalines@users.noreply.github.com>
64 lines
3 KiB
Rust
64 lines
3 KiB
Rust
use anyhow::Context;
|
|
use diesel::{connection::SimpleConnection, Connection, PgConnection};
|
|
use diesel_migrations::{EmbeddedMigrations, MigrationHarness};
|
|
use lemmy_utils::error::LemmyError;
|
|
use tracing::info;
|
|
|
|
const MIGRATIONS: EmbeddedMigrations = embed_migrations!();
|
|
|
|
/// This SQL code sets up the `r` schema, which contains things that can be safely dropped and replaced
|
|
/// instead of being changed using migrations. It may not create or modify things outside of the `r` schema
|
|
/// (indicated by `r.` before the name), unless a comment says otherwise.
|
|
///
|
|
/// Currently, this code is only run after the server starts and there's at least 1 pending migration
|
|
/// to run. This means every time you change something here, you must also create a migration (a blank
|
|
/// up.sql file works fine). This behavior will be removed when we implement a better way to avoid
|
|
/// useless schema updates and locks.
|
|
///
|
|
/// If you add something that depends on something (such as a table) created in a new migration, then down.sql
|
|
/// must use `CASCADE` when dropping it. This doesn't need to be fixed in old migrations because the
|
|
/// "replaceable-schema" migration runs `DROP SCHEMA IF EXISTS r CASCADE` in down.sql.
|
|
const REPLACEABLE_SCHEMA: &[&str] = &[
|
|
"DROP SCHEMA IF EXISTS r CASCADE;",
|
|
"CREATE SCHEMA r;",
|
|
include_str!("../replaceable_schema/utils.sql"),
|
|
include_str!("../replaceable_schema/triggers.sql"),
|
|
];
|
|
|
|
pub fn run(db_url: &str) -> Result<(), LemmyError> {
|
|
// Migrations don't support async connection
|
|
let mut conn = PgConnection::establish(db_url).with_context(|| "Error connecting to database")?;
|
|
|
|
// Run all pending migrations except for the newest one, then run the newest one in the same transaction
|
|
// as `REPLACEABLE_SCHEMA`. This code will be becone less hacky when the conditional setup of things in
|
|
// `REPLACEABLE_SCHEMA` is done without using the number of pending migrations.
|
|
info!("Running Database migrations (This may take a long time)...");
|
|
let migrations = conn
|
|
.pending_migrations(MIGRATIONS)
|
|
.map_err(|e| anyhow::anyhow!("Couldn't determine pending migrations: {e}"))?;
|
|
for migration in migrations.iter().rev().skip(1).rev() {
|
|
conn
|
|
.run_migration(migration)
|
|
.map_err(|e| anyhow::anyhow!("Couldn't run DB Migrations: {e}"))?;
|
|
}
|
|
conn.transaction::<_, LemmyError, _>(|conn| {
|
|
if let Some(migration) = migrations.last() {
|
|
// Migration is run with a savepoint since there's already a transaction
|
|
conn
|
|
.run_migration(migration)
|
|
.map_err(|e| anyhow::anyhow!("Couldn't run DB Migrations: {e}"))?;
|
|
} else if !cfg!(debug_assertions) {
|
|
// In production, skip running `REPLACEABLE_SCHEMA` to avoid locking things in the schema. In
|
|
// CI, always run it because `diesel migration` commands would otherwise prevent it.
|
|
return Ok(());
|
|
}
|
|
conn
|
|
.batch_execute(&REPLACEABLE_SCHEMA.join("\n"))
|
|
.context("Couldn't run SQL files in crates/db_schema/replaceable_schema")?;
|
|
|
|
Ok(())
|
|
})?;
|
|
info!("Database migrations complete.");
|
|
|
|
Ok(())
|
|
}
|