From 7c3bcb75c93eed022490f65b6824ce885868403d Mon Sep 17 00:00:00 2001 From: Jake Probst Date: Thu, 22 Aug 2019 20:52:28 -0700 Subject: [PATCH] usersetting sql serializer --- src/login/models.rs | 52 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/src/login/models.rs b/src/login/models.rs index 0f92987..7c37b5e 100644 --- a/src/login/models.rs +++ b/src/login/models.rs @@ -1,9 +1,22 @@ use std::time::SystemTime; +use std::io::Write; //use diesel::sql_types::Timestamp; -use diesel::{Insertable, Queryable, Identifiable, Associations}; +use diesel::{Insertable, Queryable, Identifiable, Associations, AsExpression, FromSqlRow}; //use bcrypt::{DEFAULT_COST, hash}; -//use diesel::serialize::ToSql; -use libpso:: +use diesel::pg::Pg; +use diesel::sql_types; +use diesel::deserialize::{self, FromSql}; +use diesel::serialize::{self, ToSql, Output, IsNull}; +use diesel::backend::Backend; + +use libpso::character::settings; + +#[derive(Debug, AsExpression, FromSqlRow)] +#[sql_type="sql_types::Binary"] +pub struct EUserSettings(pub settings::UserSettings); + +//const ELSEWHERE_COST: u32 = bcrypt::DEFAULT_COST; +const ELSEWHERE_COST: u32 = 5; use elseware::schema::*; @@ -28,7 +41,7 @@ pub struct NewUser { impl NewUser { pub fn new(username: String, password: String) -> NewUser { - let crypt_password = bcrypt::hash(password, bcrypt::DEFAULT_COST).expect("could not hash password?"); + let crypt_password = bcrypt::hash(password, ELSEWHERE_COST).expect("could not hash password?"); NewUser { username: username, password: crypt_password, @@ -36,9 +49,36 @@ impl NewUser { } } -#[derive(Queryable, Identifiable, Associations, Debug)] +#[derive(Queryable, Identifiable, Associations)] +#[belongs_to(UserAccount, foreign_key="user_id")] +#[table_name="user_settings"] pub struct UserSettings { id: i32, user_id: i32, - settings_blob: [u32; 0x1160], + //settings: Vec, + pub settings: EUserSettings, +} + +#[derive(Insertable, Debug)] +#[table_name="user_settings"] +pub struct NewUserSettings { + pub user_id: i32, + pub settings: EUserSettings, +} + +impl ToSql for EUserSettings { + fn to_sql(&self, out: &mut Output) -> serialize::Result { + out.write_all(&self.0.as_bytes()[..]) + .map(|_| IsNull::No) + .map_err(|e| Box::new(e) as Box) + } +} + +impl FromSql for EUserSettings { + fn from_sql(bytes: Option<&[u8]>) -> deserialize::Result { + let bytes_vec: Vec = as FromSql>::from_sql(bytes)?; + let mut static_bytes = [0u8; 0x1160]; + static_bytes[..0x1160].clone_from_slice(&bytes_vec); + Ok(EUserSettings(settings::UserSettings::from_bytes(static_bytes))) + } }