Advertisement
mounty

database.rs

Dec 30th, 2023
1,110
0
238 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.77 KB | Source Code | 0 0
  1. use postgres::{Client, NoTls, Error, Row};
  2. use std::collections::HashMap;
  3. use std::task::Context as TC;
  4. use std::vec::Vec;
  5. use actix::{Actor, Addr, Context, System, MailboxError};
  6. use actix::prelude::Handler;
  7. use actix::prelude::Message;
  8. use core::marker::Sync;
  9. use postgres::types::ToSql;
  10. use crate::global_config;
  11. use crate::logging;
  12. use futures::executor::block_on;
  13.  
  14.  
  15. struct Connection { connection: Result<Client, Error> }
  16.  
  17.  
  18. impl Actor for Connection {
  19.     type Context = Context<Self>;
  20.  
  21.     fn started(&mut self, _ctx: &mut Self::Context) {
  22.         logging::info("Database connected");
  23.     }
  24. }
  25.  
  26.  
  27. #[derive(Message)]
  28. #[rtype(result = "Result<Vec<Row>, Error>")]
  29. struct SQLQuery {
  30.     query: &'static str,
  31.     parameters: &'static [&'static (dyn ToSql + Sync)]
  32. }
  33.  
  34.  
  35. impl Handler<SQLQuery> for Connection {
  36.     type Result = Result<Vec<Row>, Error>;
  37.  
  38.     fn handle(&mut self, msg: SQLQuery, _ctx: &mut Context<Self>) -> Self::Result {
  39.         self.connection?.query(msg.query, msg.parameters)
  40.     }
  41. }
  42.  
  43.  
  44. static connection: Addr<Connection> = {
  45.     let system = System::new();
  46.     let addr = system.block_on(async { Connection::create(|ctx| {
  47.         Connection { connection: connection_instance() }
  48.     }) });
  49.     system.run().unwrap();
  50.     addr
  51. };
  52.  
  53.  
  54. pub fn query(query: &'static str, parameters: &'static [&(dyn ToSql + Sync)]) -> Result<Result<Vec<Row>, Error>, MailboxError> {
  55.     block_on(connection.send(SQLQuery{ query, parameters }))
  56. }
  57.  
  58.  
  59. fn connection_instance() -> Result<Client, Error> {
  60.     let useless_default = "docile";
  61.     let host = global_config::item("db.host").unwrap_or("127.0.0.1");
  62.     let user = global_config::item("db.user").unwrap_or(useless_default);
  63.     let base = global_config::item("db.database").unwrap_or(useless_default);
  64.     let connection_string = format!("host={host} user={user} database={base}");
  65.     Client::connect(&connection_string[..], NoTls)
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement