1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use anyhow::{Result, anyhow};
use postgres::Client;
use semver::Version;

pub fn setup(client: &mut Client, version: &str) -> Result<()> {
  let mut t = client.transaction()?;
  t.execute("
  CREATE TABLE IF NOT EXISTS salmo_meta (
    id int PRIMARY KEY,
    version text
  )", &[])?;
  let r = t.query_one("
  INSERT INTO salmo_meta (id, version)
  VALUES (0, $1)
  ON CONFLICT (id) DO UPDATE
    SET version = EXCLUDED.version -- don't actually update, just return rows
  RETURNING version", &[&version])?;
  let db_version: &str = r.get(0);
  if Version::parse(db_version)? > Version::parse(version)? {
    return Err(anyhow!("database is managed using a later version of salmo. This version: {}, db version: {}", version, db_version))
  }

  t.execute("CREATE TABLE IF NOT EXISTS salmo_executed_migrations (
    id TEXT PRIMARY KEY,
    committed_index integer
  )", &[])?;

  t.execute("CREATE TABLE IF NOT EXISTS salmo_tried_migrations (
    id TEXT PRIMARY KEY,
    hash TEXT,
    tried_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
  )", &[])?;

  t.commit()?;
  Ok(())
}