tianyun преди 3 години
родител
ревизия
c50fc1a8e1
променени са 6 файла, в които са добавени 734 реда и са изтрити 25 реда
  1. 645 24
      Cargo.lock
  2. 5 0
      Cargo.toml
  3. 8 0
      config.yaml
  4. 21 0
      src/boot/db.rs
  5. 52 0
      src/boot/mod.rs
  6. 3 1
      src/main.rs

Файловите разлики са ограничени, защото са твърде много
+ 645 - 24
Cargo.lock


+ 5 - 0
Cargo.toml

@@ -10,3 +10,8 @@ actix-web = "3.0.1"
 serde = "1.0.114"
 validator = "0.10.1"
 validator_derive = "0.10.1"
+# sqlx
+serde_yaml = "0.8.13"
+sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "postgres", "macros", "chrono"] }
+once_cell = "1.3.1"
+chrono = { version = "0.4.15", features = ["serde"] }

+ 8 - 0
config.yaml

@@ -0,0 +1,8 @@
+server:
+  port: 8080
+  log: data/logs/app/web.log
+  env: dev
+postgres:
+  dsn: postgres://postgres:postgres@192.168.24.251:5432/postgres
+  min: 5
+  max: 15

+ 21 - 0
src/boot/db.rs

@@ -0,0 +1,21 @@
+use once_cell::sync::OnceCell;
+use sqlx::{Pool, Postgres};
+use sqlx::postgres::PgPoolOptions;
+
+pub static POSTGRES_POOL: OnceCell<Pool<Postgres>> = OnceCell::new();
+
+pub fn init_db_pool() {
+    if let Some(pg) = &crate::boot::global().postgres {
+        let pool = PgPoolOptions::new()
+            .min_connections(pg.min)
+            .max_connections(pg.max)
+            .connect_lazy(&pg.dsn).unwrap();
+        assert!(POSTGRES_POOL.set(pool).is_ok());
+        println!("datasource: {}\n       min: {}\n       max: {}", pg.dsn, pg.min, pg.max)
+    }
+}
+
+#[allow(dead_code)]
+pub fn get_pool() -> Option<&'static Pool<Postgres>> {
+    POSTGRES_POOL.get()
+}

+ 52 - 0
src/boot/mod.rs

@@ -0,0 +1,52 @@
+use std::sync::Arc;
+
+use once_cell::sync::OnceCell;
+use serde::Deserialize;
+use crate::boot;
+
+pub mod db;
+
+#[derive(Debug, Deserialize)]
+pub struct Conf {
+    pub server: Server,
+    pub postgres: Option<Postgres>,
+}
+
+#[derive(Debug, Deserialize)]
+pub struct Server {
+    pub port: u32,
+    pub log: String,
+    pub env: String,
+}
+
+#[derive(Debug, Deserialize)]
+pub struct Postgres {
+    pub dsn: String,
+    pub min: u32,
+    pub max: u32,
+}
+
+#[allow(dead_code)]
+pub fn global() -> &'static Arc<Conf> {
+    static CONFIG: OnceCell<Arc<Conf>> = OnceCell::new();
+    CONFIG.get_or_init(|| {
+        let s = std::fs::read_to_string(&"config.yaml").unwrap();
+        Arc::new(serde_yaml::from_str(&s).unwrap())
+    })
+}
+
+pub fn start() {
+    boot::db::init_db_pool()
+}
+
+impl Conf {
+    #[allow(dead_code)]
+    pub fn get_env(&self) -> String {
+        self.server.env.clone()
+    }
+
+    #[allow(dead_code)]
+    pub fn addr(&self) -> String {
+        format!("0.0.0.0:{}", self.server.port)
+    }
+}

+ 3 - 1
src/main.rs

@@ -3,11 +3,13 @@ extern crate validator_derive;
 
 use actix_web::{App, HttpServer};
 
+mod boot;
 mod module;
 
 #[actix_web::main]
 async fn main() -> std::io::Result<()> {
+    boot::start();
     HttpServer::new(move || App::new()
         .service(module::handler::api_routes())
-    ).bind("0.0.0.0:8080")?.run().await
+    ).bind(boot::global().addr())?.run().await
 }

Някои файлове не бяха показани, защото твърде много файлове са промени