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(())
}