Initial implementation of db stuffs
Got the migrations and datastructures in. Next step is building db utility function into the db module or client module
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
pub mod models;
|
||||
pub mod schema;
|
||||
@@ -0,0 +1,68 @@
|
||||
use diesel::prelude::*;
|
||||
use diesel::deserialize::FromSqlRow;
|
||||
use diesel::expression::AsExpression;
|
||||
// Man this library is brittle
|
||||
use diesel_derive_composite::Composite;
|
||||
|
||||
use diesel::pg::Pg;
|
||||
|
||||
// Gets around broken macro in diesel_derive_composite
|
||||
type MyArr = diesel::sql_types::Array<diesel::sql_types::BigInt>;
|
||||
|
||||
#[derive(Debug, Composite, FromSqlRow, AsExpression)]
|
||||
#[diesel(sql_type = crate::db::schema::sql_types::UserT)]
|
||||
pub struct UserT {
|
||||
#[diesel_composite(sql_type = diesel::sql_types::Text)]
|
||||
pub name: String,
|
||||
#[diesel_composite(sql_type = diesel::sql_types::Text)]
|
||||
pub server: String
|
||||
}
|
||||
|
||||
#[derive(Debug, Composite, FromSqlRow, AsExpression)]
|
||||
#[diesel(sql_type = crate::db::schema::sql_types::UserT)]
|
||||
pub struct RoomId {
|
||||
#[diesel_composite(sql_type = MyArr)]
|
||||
pub coordinates: Vec<i64>,
|
||||
#[diesel_composite(sql_type = diesel::sql_types::Text)]
|
||||
pub server: String
|
||||
}
|
||||
|
||||
#[derive(Queryable, Selectable)]
|
||||
#[diesel(table_name = crate::db::schema::groups)]
|
||||
pub struct Group {
|
||||
pub id: i32,
|
||||
pub groupname: String,
|
||||
pub role: Option<String>,
|
||||
pub username: UserT
|
||||
}
|
||||
|
||||
|
||||
#[derive(Queryable, Selectable)]
|
||||
#[diesel(table_name = crate::db::schema::roles)]
|
||||
pub struct Role {
|
||||
pub id: i32,
|
||||
pub rolename: String,
|
||||
pub groupname: String,
|
||||
pub permission: String
|
||||
}
|
||||
|
||||
|
||||
#[derive(Queryable, Selectable)]
|
||||
#[diesel(table_name = crate::db::schema::users)]
|
||||
pub struct User {
|
||||
pub id: i32,
|
||||
pub username: String,
|
||||
pub password: String,
|
||||
}
|
||||
|
||||
#[derive(Queryable, Selectable)]
|
||||
#[diesel(table_name = crate::db::schema::messages)]
|
||||
pub struct Messages {
|
||||
pub id: i64,
|
||||
pub room: RoomId,
|
||||
pub body: String,
|
||||
pub signature: String,
|
||||
pub client_timestamp: i64,
|
||||
pub server_timestamp: i64,
|
||||
pub username: UserT
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
// @generated automatically by Diesel CLI.
|
||||
|
||||
pub mod sql_types {
|
||||
#[derive(diesel::query_builder::QueryId, Clone, diesel::sql_types::SqlType)]
|
||||
#[diesel(postgres_type(name = "room_id"))]
|
||||
pub struct RoomId;
|
||||
|
||||
#[derive(diesel::query_builder::QueryId, Clone, diesel::sql_types::SqlType)]
|
||||
#[diesel(postgres_type(name = "user_t"))]
|
||||
pub struct UserT;
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
use diesel::sql_types::*;
|
||||
use super::sql_types::UserT;
|
||||
|
||||
groups (id) {
|
||||
id -> Int4,
|
||||
groupname -> Text,
|
||||
role -> Nullable<Text>,
|
||||
username -> UserT,
|
||||
}
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
use diesel::sql_types::*;
|
||||
use super::sql_types::RoomId;
|
||||
use super::sql_types::UserT;
|
||||
|
||||
messages (id) {
|
||||
id -> Int8,
|
||||
room -> RoomId,
|
||||
body -> Text,
|
||||
signature -> Text,
|
||||
client_timestamp -> Int8,
|
||||
server_timestamp -> Int8,
|
||||
username -> UserT,
|
||||
}
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
roles (id) {
|
||||
id -> Int4,
|
||||
rolename -> Text,
|
||||
groupname -> Text,
|
||||
permission -> Text,
|
||||
}
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
users (id) {
|
||||
id -> Int4,
|
||||
username -> Text,
|
||||
password -> Text,
|
||||
}
|
||||
}
|
||||
|
||||
diesel::allow_tables_to_appear_in_same_query!(groups, messages, roles, users,);
|
||||
@@ -1,6 +1,7 @@
|
||||
mod client;
|
||||
mod config;
|
||||
mod connection;
|
||||
mod db;
|
||||
mod state;
|
||||
|
||||
use diesel_async::pooled_connection::AsyncDieselConnectionManager;
|
||||
|
||||
@@ -40,6 +40,9 @@ impl State {
|
||||
|
||||
}
|
||||
pub fn write_to_file(&mut self, path: &str) -> Result<(),io::Error> {
|
||||
// Should write to state.next file, then move to actual state file
|
||||
// Uses twice as much space but won't corrupt state if the program crashes
|
||||
// during an autosave
|
||||
unimplemented!()
|
||||
}
|
||||
pub fn load_from_file(path: &str) -> Result<Self,io::Error> {
|
||||
|
||||
Reference in New Issue
Block a user