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