Browse Source

improve database insert unique check

pull/18/head
Sun 5 years ago
parent
commit
a3b84f4192
  1. 16
      src/account.rs
  2. 8
      src/apps/chat/layer.rs
  3. 8
      src/apps/chat/rpc.rs
  4. 18
      src/apps/group_chat/layer.rs
  5. 113
      src/apps/group_chat/models.rs
  6. 11
      src/apps/group_chat/rpc.rs
  7. 28
      src/session.rs

16
src/account.rs

@ -187,7 +187,16 @@ impl Account { @@ -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 { @@ -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(())
}

8
src/apps/chat/layer.rs

@ -324,14 +324,6 @@ impl LayerEvent { @@ -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));
}
}
}
}

8
src/apps/chat/rpc.rs

@ -446,14 +446,6 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { @@ -446,14 +446,6 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
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);

18
src/apps/group_chat/layer.rs

@ -284,15 +284,6 @@ async fn handle_event( @@ -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( @@ -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));
}
}
}

113
src/apps/group_chat/models.rs

@ -311,22 +311,46 @@ impl GroupChat { @@ -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 { @@ -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 { @@ -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 { @@ -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(())
}
}

11
src/apps/group_chat/rpc.rs

@ -10,7 +10,7 @@ use tdn_did::Proof; @@ -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<RpcState>) { @@ -365,15 +365,6 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
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)

28
src/session.rs

@ -116,7 +116,25 @@ impl Session { @@ -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 { @@ -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 { @@ -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"))

Loading…
Cancel
Save