Merge pull request 'Integrated Diesel into project' (#11) from diesel-setup into develop
	
		
			
	
		
	
	
		
			
				
	
				continuous-integration/drone the build was successful
				
					Details
				
			
		
	
				
					
				
			
				
	
				continuous-integration/drone the build was successful
				
					Details
				
			
		
	Reviewed-on: https://git.roosens.me/Chewing_Bever/hilde/pulls/11initial-db-schema
						commit
						02fe8d2de7
					
				| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
# This file is solely used by Diesel
 | 
			
		||||
DATABASE_URL=postgres://hilde:hilde@localhost/hilde
 | 
			
		||||
| 
						 | 
				
			
			@ -186,6 +186,7 @@ dependencies = [
 | 
			
		|||
 "byteorder",
 | 
			
		||||
 "diesel_derives",
 | 
			
		||||
 "pq-sys",
 | 
			
		||||
 "r2d2",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -199,6 +200,16 @@ dependencies = [
 | 
			
		|||
 "syn",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "diesel_migrations"
 | 
			
		||||
version = "1.4.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "bf3cde8413353dc7f5d72fa8ce0b99a560a359d2c5ef1e5817ca731cd9008f4c"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "migrations_internals",
 | 
			
		||||
 "migrations_macros",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "discard"
 | 
			
		||||
version = "1.0.4"
 | 
			
		||||
| 
						 | 
				
			
			@ -222,9 +233,9 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "figment"
 | 
			
		||||
version = "0.10.5"
 | 
			
		||||
version = "0.10.6"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "0ca029e813a72b7526d28273d25f3e4a2f365d1b7a1018a6f93ec9053a119763"
 | 
			
		||||
checksum = "790b4292c72618abbab50f787a477014fe15634f96291de45672ce46afe122df"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "atomic",
 | 
			
		||||
 "pear",
 | 
			
		||||
| 
						 | 
				
			
			@ -391,9 +402,9 @@ checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "hermit-abi"
 | 
			
		||||
version = "0.1.18"
 | 
			
		||||
version = "0.1.19"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"
 | 
			
		||||
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "libc",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -403,7 +414,9 @@ name = "hilde"
 | 
			
		|||
version = "0.1.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "diesel",
 | 
			
		||||
 "diesel_migrations",
 | 
			
		||||
 "rocket",
 | 
			
		||||
 "rocket_sync_db_pools",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
| 
						 | 
				
			
			@ -545,6 +558,27 @@ version = "2.4.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "migrations_internals"
 | 
			
		||||
version = "1.4.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "2b4fc84e4af020b837029e017966f86a1c2d5e83e64b589963d5047525995860"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "diesel",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "migrations_macros"
 | 
			
		||||
version = "1.4.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "9753f12909fd8d923f75ae5c3258cae1ed3c8ec052e1b38c93c21a6d157f789c"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "migrations_internals",
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "mime"
 | 
			
		||||
version = "0.3.16"
 | 
			
		||||
| 
						 | 
				
			
			@ -675,9 +709,9 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "pin-project-lite"
 | 
			
		||||
version = "0.2.6"
 | 
			
		||||
version = "0.2.7"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905"
 | 
			
		||||
checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "pin-utils"
 | 
			
		||||
| 
						 | 
				
			
			@ -743,6 +777,17 @@ dependencies = [
 | 
			
		|||
 "proc-macro2",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "r2d2"
 | 
			
		||||
version = "0.8.9"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "545c5bc2b880973c9c10e4067418407a0ccaa3091781d1671d46eb35107cb26f"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "log",
 | 
			
		||||
 "parking_lot",
 | 
			
		||||
 "scheduled-thread-pool",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "rand"
 | 
			
		||||
version = "0.8.4"
 | 
			
		||||
| 
						 | 
				
			
			@ -785,9 +830,9 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "redox_syscall"
 | 
			
		||||
version = "0.2.8"
 | 
			
		||||
version = "0.2.9"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc"
 | 
			
		||||
checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bitflags",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -903,6 +948,30 @@ dependencies = [
 | 
			
		|||
 "uncased",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "rocket_sync_db_pools"
 | 
			
		||||
version = "0.1.0-rc.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "38cfdfebd552d075c368e641c88a5cd6ce1c58c5c710548aeb777abb48830f4b"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "diesel",
 | 
			
		||||
 "r2d2",
 | 
			
		||||
 "rocket",
 | 
			
		||||
 "rocket_sync_db_pools_codegen",
 | 
			
		||||
 "serde",
 | 
			
		||||
 "tokio",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "rocket_sync_db_pools_codegen"
 | 
			
		||||
version = "0.1.0-rc.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "5267808c094db5366e1d8925aaf9f2ce05ff9b3bd92cb18c7040a1fe219c2e25"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "devise",
 | 
			
		||||
 "quote",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "rustc_version"
 | 
			
		||||
version = "0.2.3"
 | 
			
		||||
| 
						 | 
				
			
			@ -924,6 +993,15 @@ version = "1.0.5"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "scheduled-thread-pool"
 | 
			
		||||
version = "0.2.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "dc6f74fd1204073fa02d5d5d68bec8021be4c38690b61264b2fdb48083d0e7d7"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "parking_lot",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "scoped-tls"
 | 
			
		||||
version = "1.0.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -1021,9 +1099,9 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "spin"
 | 
			
		||||
version = "0.9.0"
 | 
			
		||||
version = "0.9.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "b87bbf98cb81332a56c1ee8929845836f85e8ddd693157c30d76660196014478"
 | 
			
		||||
checksum = "f5fdd7196b4ae35a111c6dc97f9cc152ca3ea8ad744f7cb46a9f27b3ef8f2f54"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "stable-pattern"
 | 
			
		||||
| 
						 | 
				
			
			@ -1045,9 +1123,9 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "state"
 | 
			
		||||
version = "0.5.1"
 | 
			
		||||
version = "0.5.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "0b54c22963194db84a59ee48e1fa9ed6c1fa9909ad5db92a700aa6fe956d632b"
 | 
			
		||||
checksum = "87cf4f5369e6d3044b5e365c9690f451516ac8f0954084622b49ea3fde2f6de5"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "loom",
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			@ -1166,9 +1244,9 @@ dependencies = [
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "tokio"
 | 
			
		||||
version = "1.7.0"
 | 
			
		||||
version = "1.7.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "c79ba603c337335df6ba6dd6afc38c38a7d5e1b0c871678439ea973cd62a118e"
 | 
			
		||||
checksum = "5fb2ed024293bb19f7a5dc54fe83bf86532a44c12a2bb8ba40d64a4509395ca2"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "autocfg",
 | 
			
		||||
 "bytes",
 | 
			
		||||
| 
						 | 
				
			
			@ -1303,9 +1381,9 @@ checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "vcpkg"
 | 
			
		||||
version = "0.2.14"
 | 
			
		||||
version = "0.2.15"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "70455df2fdf4e9bf580a92e443f1eb0303c390d682e2ea817312c9e81f8c3399"
 | 
			
		||||
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "version_check"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,3 +9,9 @@ edition = "2018"
 | 
			
		|||
[dependencies]
 | 
			
		||||
rocket = "0.5.0-rc.1"
 | 
			
		||||
diesel = { version = "1.4.7", features = ["postgres"] }
 | 
			
		||||
diesel_migrations = "1.4.0"
 | 
			
		||||
 | 
			
		||||
[dependencies.rocket_sync_db_pools]
 | 
			
		||||
version = "0.1.0-rc.1"
 | 
			
		||||
default_features = false
 | 
			
		||||
features = ["diesel_postgres_pool"]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										5
									
								
								Makefile
								
								
								
								
							| 
						 | 
				
			
			@ -23,6 +23,10 @@ lint:
 | 
			
		|||
	@ cargo clippy --all-targets -- -D warnings
 | 
			
		||||
.PHONY: lint
 | 
			
		||||
 | 
			
		||||
format:
 | 
			
		||||
	@ cargo fmt
 | 
			
		||||
.PHONY: format
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# =====DATABASE STUFF=====
 | 
			
		||||
db:
 | 
			
		||||
| 
						 | 
				
			
			@ -32,6 +36,7 @@ db:
 | 
			
		|||
		-v hilde_db-data:/var/lib/postgresql/data \
 | 
			
		||||
		-e POSTGRES_USER=hilde \
 | 
			
		||||
		-e POSTGRES_PASSWORD=hilde \
 | 
			
		||||
		-e POSTGRES_DB=hilde \
 | 
			
		||||
		--name hilde_db \
 | 
			
		||||
		-p 5432:5432 \
 | 
			
		||||
		postgres:13-alpine
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										18
									
								
								README.md
								
								
								
								
							
							
						
						
									
										18
									
								
								README.md
								
								
								
								
							| 
						 | 
				
			
			@ -1,3 +1,19 @@
 | 
			
		|||
# hilde
 | 
			
		||||
 | 
			
		||||
A server implementation of a Debian repository.
 | 
			
		||||
A server implementation of a Debian repository.
 | 
			
		||||
 | 
			
		||||
## Development
 | 
			
		||||
 | 
			
		||||
To develop this project, you'll need a few things:
 | 
			
		||||
 | 
			
		||||
* Docker (for setting up the database)
 | 
			
		||||
* Cargo & Rust stable (all hail Rocket v0.5)
 | 
			
		||||
* The PostgreSQL dev libraries (to compile Diesel)
 | 
			
		||||
 | 
			
		||||
That's the ones I can think of right now. If I think of any others, I'll be
 | 
			
		||||
sure to add them to the list.
 | 
			
		||||
 | 
			
		||||
For ease of development, there's a Makefile wrapper that can do everything you
 | 
			
		||||
need to do to work on Hilde. I recommend reading through it (it's not long),
 | 
			
		||||
but the important ones are `make` & `make run`, which are just Cargo aliases,
 | 
			
		||||
and `make db`, which starts a local PostgreSQL database using Docker.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
[debug.databases]
 | 
			
		||||
postgres_hilde = { url = "postgres://hilde:hilde@localhost/hilde" }
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
# For documentation on how to configure this file,
 | 
			
		||||
# see diesel.rs/guides/configuring-diesel-cli
 | 
			
		||||
 | 
			
		||||
[print_schema]
 | 
			
		||||
file = "src/schema.rs"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
-- This file was automatically created by Diesel to setup helper functions
 | 
			
		||||
-- and other internal bookkeeping. This file is safe to edit, any future
 | 
			
		||||
-- changes will be added to existing projects as new migrations.
 | 
			
		||||
 | 
			
		||||
DROP FUNCTION IF EXISTS diesel_manage_updated_at(_tbl regclass);
 | 
			
		||||
DROP FUNCTION IF EXISTS diesel_set_updated_at();
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,36 @@
 | 
			
		|||
-- This file was automatically created by Diesel to setup helper functions
 | 
			
		||||
-- and other internal bookkeeping. This file is safe to edit, any future
 | 
			
		||||
-- changes will be added to existing projects as new migrations.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Sets up a trigger for the given table to automatically set a column called
 | 
			
		||||
-- `updated_at` whenever the row is modified (unless `updated_at` was included
 | 
			
		||||
-- in the modified columns)
 | 
			
		||||
--
 | 
			
		||||
-- # Example
 | 
			
		||||
--
 | 
			
		||||
-- ```sql
 | 
			
		||||
-- CREATE TABLE users (id SERIAL PRIMARY KEY, updated_at TIMESTAMP NOT NULL DEFAULT NOW());
 | 
			
		||||
--
 | 
			
		||||
-- SELECT diesel_manage_updated_at('users');
 | 
			
		||||
-- ```
 | 
			
		||||
CREATE OR REPLACE FUNCTION diesel_manage_updated_at(_tbl regclass) RETURNS VOID AS $$
 | 
			
		||||
BEGIN
 | 
			
		||||
    EXECUTE format('CREATE TRIGGER set_updated_at BEFORE UPDATE ON %s
 | 
			
		||||
                    FOR EACH ROW EXECUTE PROCEDURE diesel_set_updated_at()', _tbl);
 | 
			
		||||
END;
 | 
			
		||||
$$ LANGUAGE plpgsql;
 | 
			
		||||
 | 
			
		||||
CREATE OR REPLACE FUNCTION diesel_set_updated_at() RETURNS trigger AS $$
 | 
			
		||||
BEGIN
 | 
			
		||||
    IF (
 | 
			
		||||
        NEW IS DISTINCT FROM OLD AND
 | 
			
		||||
        NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at
 | 
			
		||||
    ) THEN
 | 
			
		||||
        NEW.updated_at := current_timestamp;
 | 
			
		||||
    END IF;
 | 
			
		||||
    RETURN NEW;
 | 
			
		||||
END;
 | 
			
		||||
$$ LANGUAGE plpgsql;
 | 
			
		||||
							
								
								
									
										35
									
								
								src/main.rs
								
								
								
								
							
							
						
						
									
										35
									
								
								src/main.rs
								
								
								
								
							| 
						 | 
				
			
			@ -1,3 +1,34 @@
 | 
			
		|||
fn main() {
 | 
			
		||||
    println!("Hello, world!");
 | 
			
		||||
#[macro_use]
 | 
			
		||||
extern crate rocket;
 | 
			
		||||
 | 
			
		||||
#[macro_use]
 | 
			
		||||
extern crate diesel_migrations;
 | 
			
		||||
 | 
			
		||||
use rocket::{fairing::AdHoc, Build, Rocket};
 | 
			
		||||
use rocket_sync_db_pools::{database, diesel};
 | 
			
		||||
 | 
			
		||||
embed_migrations!();
 | 
			
		||||
 | 
			
		||||
#[database("postgres_hilde")]
 | 
			
		||||
struct HildeDbConn(diesel::PgConnection);
 | 
			
		||||
 | 
			
		||||
async fn run_db_migrations(rocket: Rocket<Build>) -> Result<Rocket<Build>, Rocket<Build>> {
 | 
			
		||||
    let conn = HildeDbConn::get_one(&rocket)
 | 
			
		||||
        .await
 | 
			
		||||
        .expect("database connection");
 | 
			
		||||
    conn.run(|c| match embedded_migrations::run(c) {
 | 
			
		||||
        Ok(()) => Ok(rocket),
 | 
			
		||||
        Err(_) => Err(rocket),
 | 
			
		||||
    })
 | 
			
		||||
    .await
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[launch]
 | 
			
		||||
fn rocket() -> _ {
 | 
			
		||||
    rocket::build()
 | 
			
		||||
        .attach(HildeDbConn::fairing())
 | 
			
		||||
        .attach(AdHoc::try_on_ignite(
 | 
			
		||||
            "Run database migrations",
 | 
			
		||||
            run_db_migrations,
 | 
			
		||||
        ))
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in New Issue