diff --git a/src/account.rs b/src/account.rs index d3d295d..b05ca5a 100644 --- a/src/account.rs +++ b/src/account.rs @@ -187,7 +187,16 @@ impl Account { } pub fn insert(&mut self, db: &DStorage) -> Result<()> { - let sql = format!("INSERT INTO accounts (gid, name, lock, mnemonic, secret, avatar, height,event, datetime) VALUES ('{}', '{}', '{}', '{}', '{}', '{}', {}, '{}', {})", + let mut unique_check = db.query(&format!( + "SELECT id from accounts WHERE gid = '{}'", + self.gid.to_hex() + ))?; + if unique_check.len() > 0 { + let id = unique_check.pop().unwrap().pop().unwrap().as_i64(); + self.id = id; + self.update(db)?; + } else { + let sql = format!("INSERT INTO accounts (gid, name, lock, mnemonic, secret, avatar, height,event, datetime) VALUES ('{}', '{}', '{}', '{}', '{}', '{}', {}, '{}', {})", self.gid.to_hex(), self.name, self.lock, @@ -198,8 +207,9 @@ impl Account { self.event.to_hex(), self.datetime, ); - let id = db.insert(&sql)?; - self.id = id; + let id = db.insert(&sql)?; + self.id = id; + } Ok(()) } diff --git a/src/apps/chat/layer.rs b/src/apps/chat/layer.rs index b86b3f7..e31042c 100644 --- a/src/apps/chat/layer.rs +++ b/src/apps/chat/layer.rs @@ -324,14 +324,6 @@ impl LayerEvent { results .rpcs .push(session_last(mgid, &id, &msg.datetime, &scontent, false)); - } else { - let c_db = chat_db(&layer.base, &mgid)?; - if let Some(f) = Friend::get_id(&c_db, fid)? { - let mut session = f.to_session(); - session.last_content = scontent; - session.insert(&s_db)?; - results.rpcs.push(session_create(mgid, &session)); - } } } } diff --git a/src/apps/chat/rpc.rs b/src/apps/chat/rpc.rs index 8d0e6b6..f6a7e19 100644 --- a/src/apps/chat/rpc.rs +++ b/src/apps/chat/rpc.rs @@ -446,14 +446,6 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { results .rpcs .push(session_last(gid, &id, &msg.datetime, &scontent, true)); - } else { - let c_db = chat_db(&layer_lock.base, &gid)?; - let f = Friend::get_id(&c_db, fid)??; - let mut session = - Session::new(f.id, f.gid, f.addr, SessionType::Chat, f.name, f.datetime); - session.last_content = scontent; - session.insert(&s_db)?; - results.rpcs.push(session_create(gid, &session)); } drop(layer_lock); diff --git a/src/apps/group_chat/layer.rs b/src/apps/group_chat/layer.rs index 23fd787..668f8e3 100644 --- a/src/apps/group_chat/layer.rs +++ b/src/apps/group_chat/layer.rs @@ -284,15 +284,6 @@ async fn handle_event( results .rpcs .push(session_last(mgid, &id, &msg.datetime, &scontent, false)); - } else { - let c_db = group_chat_db(&base, &mgid)?; - if let Some(f) = GroupChat::get_id(&c_db, &gid)? { - let mut session = f.to_session(); - session.last_content = scontent; - session.last_datetime = msg.datetime; - session.insert(&s_db)?; - results.rpcs.push(session_create(mgid, &session)); - } } } } @@ -409,15 +400,6 @@ fn handle_sync( let s_db = session_db(&base, &mgid)?; if let Ok(id) = Session::last(&s_db, &fid, &SessionType::Group, &t, &sc, true) { results.rpcs.push(session_last(mgid, &id, &t, &sc, false)); - } else { - let c_db = group_chat_db(&base, &mgid)?; - if let Some(f) = GroupChat::get_id(&c_db, &fid)? { - let mut session = f.to_session(); - session.last_content = sc; - session.last_datetime = t; - session.insert(&s_db)?; - results.rpcs.push(session_create(mgid, &session)); - } } } diff --git a/src/apps/group_chat/models.rs b/src/apps/group_chat/models.rs index 965fe74..c856e16 100644 --- a/src/apps/group_chat/models.rs +++ b/src/apps/group_chat/models.rs @@ -311,22 +311,46 @@ impl GroupChat { } pub fn insert(&mut self, db: &DStorage) -> Result<()> { - let sql = format!("INSERT INTO groups (height, owner, gcd, gtype, addr, name, bio, is_ok, is_need_agree, is_closed, key, datetime, is_deleted) VALUES ({}, '{}', '{}', {}, '{}', '{}', '{}', {}, {}, {}, '{}', {}, false)", - self.height, - self.owner.to_hex(), - self.g_id.to_hex(), - self.g_type.to_u32(), - self.g_addr.to_hex(), - self.g_name, - self.g_bio, - self.is_ok, - self.is_need_agree, - self.is_closed, - self.key.to_hex(), - self.datetime, - ); - let id = db.insert(&sql)?; - self.id = id; + let mut unique_check = db.query(&format!( + "SELECT id from groups WHERE gcd = '{}'", + self.g_id.to_hex() + ))?; + if unique_check.len() > 0 { + let id = unique_check.pop().unwrap().pop().unwrap().as_i64(); + self.id = id; + let sql = format!("UPDATE groups SET height = {}, owner = '{}', gtype = {}, addr='{}', name = '{}', bio = '{}', is_ok = {}, is_need_agree = {}, is_closed = {}, key = '{}', datetime = {}, is_deleted = false WHERE id = {}", + self.height, + self.owner.to_hex(), + self.g_type.to_u32(), + self.g_addr.to_hex(), + self.g_name, + self.g_bio, + self.is_ok, + self.is_need_agree, + self.is_closed, + self.key.to_hex(), + self.datetime, + self.id + ); + db.update(&sql)?; + } else { + let sql = format!("INSERT INTO groups (height, owner, gcd, gtype, addr, name, bio, is_ok, is_need_agree, is_closed, key, datetime, is_deleted) VALUES ({}, '{}', '{}', {}, '{}', '{}', '{}', {}, {}, {}, '{}', {}, false)", + self.height, + self.owner.to_hex(), + self.g_id.to_hex(), + self.g_type.to_u32(), + self.g_addr.to_hex(), + self.g_name, + self.g_bio, + self.is_ok, + self.is_need_agree, + self.is_closed, + self.key.to_hex(), + self.datetime, + ); + let id = db.insert(&sql)?; + self.id = id; + } Ok(()) } @@ -653,7 +677,24 @@ impl Member { } pub fn insert(&mut self, db: &DStorage) -> Result<()> { - let sql = format!("INSERT INTO members (fid, mid, addr, name, is_manager, is_block, datetime, is_deleted) VALUES ({}, '{}', '{}', '{}', {}, {}, {}, false)", + let mut unique_check = db.query(&format!( + "SELECT id from members WHERE fid = {} AND mid = '{}'", + self.fid, + self.m_id.to_hex() + ))?; + if unique_check.len() > 0 { + let id = unique_check.pop().unwrap().pop().unwrap().as_i64(); + self.id = id; + let sql = format!("UPDATE members SET addr='{}', name = '{}', is_manager = {}, datetime = {}, is_delete = false WHERE id = {}", + self.m_addr.to_hex(), + self.m_name, + self.is_manager, + self.datetime, + self.id, + ); + db.update(&sql)?; + } else { + let sql = format!("INSERT INTO members (fid, mid, addr, name, is_manager, is_block, datetime, is_deleted) VALUES ({}, '{}', '{}', '{}', {}, {}, {}, false)", self.fid, self.m_id.to_hex(), self.m_addr.to_hex(), @@ -662,8 +703,9 @@ impl Member { self.is_block, self.datetime, ); - let id = db.insert(&sql)?; - self.id = id; + let id = db.insert(&sql)?; + self.id = id; + } Ok(()) } @@ -824,18 +866,27 @@ impl Message { } pub fn insert(&mut self, db: &DStorage) -> Result<()> { - let sql = format!("INSERT INTO messages (height, fid, mid, is_me, m_type, content, is_delivery, datetime, is_deleted) VALUES ({}, {}, {}, {}, {}, '{}', {}, {}, false)", - self.height, - self.fid, - self.mid, - self.is_me, - self.m_type.to_int(), - self.content, - self.is_delivery, - self.datetime, - ); - let id = db.insert(&sql)?; - self.id = id; + let mut unique_check = db.query(&format!( + "SELECT id from messages WHERE fid = {} AND height = {}", + self.fid, self.height + ))?; + if unique_check.len() > 0 { + let id = unique_check.pop().unwrap().pop().unwrap().as_i64(); + self.id = id; + } else { + let sql = format!("INSERT INTO messages (height, fid, mid, is_me, m_type, content, is_delivery, datetime, is_deleted) VALUES ({}, {}, {}, {}, {}, '{}', {}, {}, false)", + self.height, + self.fid, + self.mid, + self.is_me, + self.m_type.to_int(), + self.content, + self.is_delivery, + self.datetime, + ); + let id = db.insert(&sql)?; + self.id = id; + } Ok(()) } } diff --git a/src/apps/group_chat/rpc.rs b/src/apps/group_chat/rpc.rs index c76c251..211f0a4 100644 --- a/src/apps/group_chat/rpc.rs +++ b/src/apps/group_chat/rpc.rs @@ -10,7 +10,7 @@ use tdn_did::Proof; use group_chat_types::{CheckType, Event, GroupType, JoinProof, LayerEvent}; use crate::apps::chat::{Friend, MessageType}; -use crate::rpc::{session_close, session_create, session_delete, session_last, RpcState}; +use crate::rpc::{session_close, session_delete, session_last, RpcState}; use crate::session::{Session, SessionType}; use crate::storage::{chat_db, group_chat_db, read_avatar, session_db, write_avatar}; @@ -365,15 +365,6 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { results .rpcs .push(session_last(gid, &id, &msg.datetime, &sc, false)); - } else { - let c_db = group_chat_db(&base, &gid)?; - if let Some(f) = GroupChat::get_id(&c_db, &fid)? { - let mut session = f.to_session(); - session.last_content = sc; - session.last_datetime = msg.datetime; - session.insert(&s_db)?; - results.rpcs.push(session_create(gid, &session)); - } } } Ok(results) diff --git a/src/session.rs b/src/session.rs index c899b61..7f78975 100644 --- a/src/session.rs +++ b/src/session.rs @@ -116,7 +116,25 @@ impl Session { } pub fn insert(&mut self, db: &DStorage) -> Result<()> { - let sql = format!("INSERT INTO sessions (fid, gid, addr, s_type, name, is_top, is_close, last_datetime, last_content, last_readed) VALUES ({}, '{}', '{}', {}, '{}', {}, {}, {}, '{}', {})", + let mut unique_check = db.query(&format!( + "SELECT id from sessions WHERE fid = {} AND s_type = {}", + self.fid, + self.s_type.to_int() + ))?; + if unique_check.len() > 0 { + let id = unique_check.pop().unwrap().pop().unwrap().as_i64(); + self.id = id; + + let sql = format!("UPDATE sessions SET gid = '{}', addr='{}', name = '{}', is_top = '{}', is_close = false WHERE id = {}", + self.gid.to_hex(), + self.addr.to_hex(), + self.name, + self.is_top, + self.id, + ); + db.update(&sql)?; + } else { + let sql = format!("INSERT INTO sessions (fid, gid, addr, s_type, name, is_top, is_close, last_datetime, last_content, last_readed) VALUES ({}, '{}', '{}', {}, '{}', {}, {}, {}, '{}', {})", self.fid, self.gid.to_hex(), self.addr.to_hex(), @@ -128,8 +146,10 @@ impl Session { self.last_content, self.last_readed, ); - let id = db.insert(&sql)?; - self.id = id; + let id = db.insert(&sql)?; + self.id = id; + } + Ok(()) } @@ -209,7 +229,7 @@ impl Session { if let Some(mut values) = matrix.pop() { let id = values.pop().unwrap().as_i64(); - db.update(&format!("UPDATE sessions SET is_close = 0, last_datetime = {}, last_content = '{}', last_readed = {} WHERE id = {}", datetime, content, if readed { 1 } else { 0 }, id))?; + db.update(&format!("UPDATE sessions SET is_close = false, last_datetime = {}, last_content = '{}', last_readed = {} WHERE id = {}", datetime, content, if readed { 1 } else { 0 }, id))?; Ok(id) } else { Err(new_io_error("session missing"))