summaryrefslogtreecommitdiffstats
path: root/crate_db/src/schema.rs
blob: 0319f8d221ede195afba869ca9702303b0410f80 (plain)
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use crate::CrateDb;
use rusqlite::*;

impl CrateDb {
    pub(crate) fn db(url: &str) -> Result<Connection> {
        let conn = Connection::open(url)?;
        conn.execute_batch(r#"
            BEGIN;
            CREATE TABLE IF NOT EXISTS crates (
                id              INTEGER PRIMARY KEY,
                origin          TEXT NOT NULL UNIQUE,
                ranking         REAL,
                next_update     INTEGER,
                recent_downloads INTEGER NOT NULL
            );
            CREATE TABLE IF NOT EXISTS author_crates (
                github_id       INTEGER NOT NULL,
                crate_id        INTEGER NOT NULL,
                invited_by_github_id INTEGER,
                invited_at      TEXT
            );
            CREATE UNIQUE INDEX IF NOT EXISTS author_crates_idx ON author_crates(github_id, crate_id);
            CREATE TABLE IF NOT EXISTS keywords (
                id              INTEGER PRIMARY KEY,
                keyword         TEXT NOT NULL UNIQUE,
                visible         INTEGER NOT NULL
            );
            CREATE TABLE IF NOT EXISTS crate_keywords (
                crate_id        INTEGER NOT NULL,
                keyword_id      INTEGER NOT NULL,
                weight          REAL NOT NULL,
                explicit        INTEGER NOT NULL
            );

            CREATE TABLE IF NOT EXISTS crate_repos (
                crate_id        INTEGER NOT NULL UNIQUE,
                repo            TEXT NOT NULL
            );
            CREATE TABLE IF NOT EXISTS repo_crates (
                repo            TEXT NOT NULL,
                path            TEXT NOT NULL,
                crate_name      TEXT NOT NULL
            );
            CREATE UNIQUE INDEX IF NOT EXISTS repo_crates_idx on repo_crates(repo, path, crate_name);

            CREATE TABLE IF NOT EXISTS repo_changes (
                repo            TEXT NOT NULL,
                crate_name      TEXT NOT NULL,
                replacement     NULL,
                weight          REAL NOT NULL DEFAULT 1.0
            );
            CREATE UNIQUE INDEX IF NOT EXISTS repo_changes_idx on repo_changes(repo, crate_name, replacement);
            CREATE INDEX IF NOT EXISTS repo_changes_idx2 on repo_changes(crate_name);
            CREATE INDEX IF NOT EXISTS repo_changes_idx3 on repo_changes(replacement);

            CREATE TABLE IF NOT EXISTS crate_versions (
                crate_id        INTEGER NOT NULL,
                version         TEXT NOT NULL,
                created         INTEGER NOT NULL
            );
            CREATE UNIQUE INDEX IF NOT EXISTS crate_versions_idx on crate_versions(crate_id, version);

            CREATE TABLE IF NOT EXISTS crate_derived (
                crate_id        INTEGER NOT NULL UNIQUE,
                readme          TEXT,
                readme_format   TEXT,
                readme_base_url TEXT,
                readme_base_image_url TEXT,
                crate_compressed_size INTEGER NOT NULL,
                crate_decompressed_size INTEGER NOT NULL,
                capitalized_name TEXT NOT NULL,
                lib_file        TEXT,
                has_buildrs     INTEGER, -- bool
                is_nightly      INTEGER, -- bool
                is_yanked       INTEGER, -- bool
                has_code_of_conduct       INTEGER, -- bool
                manifest        BLOB NOT NULL,
                language_stats  BLOB NOT NULL
            );

            CREATE UNIQUE INDEX IF NOT EXISTS keywords_idx on crate_keywords(keyword_id, crate_id);
            CREATE INDEX IF NOT EXISTS keywords_ridx on crate_keywords(crate_id);
            CREATE TABLE IF NOT EXISTS categories (
                crate_id        INTEGER NOT NULL,
                slug            TEXT NOT NULL,
                rank_weight     REAL NOT NULL,
                relevance_weight REAL NOT NULL
            );
            CREATE UNIQUE INDEX IF NOT EXISTS categories_idx on categories(crate_id, slug);
            CREATE INDEX IF NOT EXISTS categories_slug_idx on categories(slug);
            COMMIT;"#)?;
        Ok(conn)
    }
}