|
|
|
@ -437,12 +437,28 @@ class rcube_imap_cache
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->db->set_option('ignore_key_errors', true);
|
|
|
|
|
|
|
|
|
|
// insert new record
|
|
|
|
|
$this->db->query(
|
|
|
|
|
$res = $this->db->query(
|
|
|
|
|
"INSERT INTO ".$this->db->table_name('cache_messages')
|
|
|
|
|
." (user_id, mailbox, uid, flags, changed, data)"
|
|
|
|
|
." VALUES (?, ?, ?, ?, ".$this->db->now().", ?)",
|
|
|
|
|
$this->userid, $mailbox, (int) $message->uid, $flags, $msg);
|
|
|
|
|
|
|
|
|
|
// race-condition, insert failed so try update (#1489146)
|
|
|
|
|
// thanks to ignore_key_errors "duplicate row" errors will be ignored
|
|
|
|
|
if ($force && !$res && !$this->db->is_error($res)) {
|
|
|
|
|
$this->db->query(
|
|
|
|
|
"UPDATE ".$this->db->table_name('cache_messages')
|
|
|
|
|
." SET flags = ?, data = ?, changed = ".$this->db->now()
|
|
|
|
|
." WHERE user_id = ?"
|
|
|
|
|
." AND mailbox = ?"
|
|
|
|
|
." AND uid = ?",
|
|
|
|
|
$flags, $msg, $this->userid, $mailbox, (int) $message->uid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->db->set_option('ignore_key_errors', false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -714,20 +730,38 @@ class rcube_imap_cache
|
|
|
|
|
$data = implode('@', $data);
|
|
|
|
|
|
|
|
|
|
if ($exists) {
|
|
|
|
|
$sql_result = $this->db->query(
|
|
|
|
|
$res = $this->db->query(
|
|
|
|
|
"UPDATE ".$this->db->table_name('cache_index')
|
|
|
|
|
." SET data = ?, valid = 1, changed = ".$this->db->now()
|
|
|
|
|
." WHERE user_id = ?"
|
|
|
|
|
." AND mailbox = ?",
|
|
|
|
|
$data, $this->userid, $mailbox);
|
|
|
|
|
|
|
|
|
|
if ($this->db->affected_rows($res)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$sql_result = $this->db->query(
|
|
|
|
|
"INSERT INTO ".$this->db->table_name('cache_index')
|
|
|
|
|
." (user_id, mailbox, data, valid, changed)"
|
|
|
|
|
." VALUES (?, ?, ?, 1, ".$this->db->now().")",
|
|
|
|
|
$this->userid, $mailbox, $data);
|
|
|
|
|
|
|
|
|
|
$this->db->set_option('ignore_key_errors', true);
|
|
|
|
|
|
|
|
|
|
$res = $this->db->query(
|
|
|
|
|
"INSERT INTO ".$this->db->table_name('cache_index')
|
|
|
|
|
." (user_id, mailbox, data, valid, changed)"
|
|
|
|
|
." VALUES (?, ?, ?, 1, ".$this->db->now().")",
|
|
|
|
|
$this->userid, $mailbox, $data);
|
|
|
|
|
|
|
|
|
|
// race-condition, insert failed so try update (#1489146)
|
|
|
|
|
// thanks to ignore_key_errors "duplicate row" errors will be ignored
|
|
|
|
|
if (!$exists && !$res && !$this->db->is_error($res)) {
|
|
|
|
|
$res = $this->db->query(
|
|
|
|
|
"UPDATE ".$this->db->table_name('cache_index')
|
|
|
|
|
." SET data = ?, valid = 1, changed = ".$this->db->now()
|
|
|
|
|
." WHERE user_id = ?"
|
|
|
|
|
." AND mailbox = ?",
|
|
|
|
|
$data, $this->userid, $mailbox);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->db->set_option('ignore_key_errors', false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -745,20 +779,38 @@ class rcube_imap_cache
|
|
|
|
|
$data = implode('@', $data);
|
|
|
|
|
|
|
|
|
|
if ($exists) {
|
|
|
|
|
$sql_result = $this->db->query(
|
|
|
|
|
$res = $this->db->query(
|
|
|
|
|
"UPDATE ".$this->db->table_name('cache_thread')
|
|
|
|
|
." SET data = ?, changed = ".$this->db->now()
|
|
|
|
|
." WHERE user_id = ?"
|
|
|
|
|
." AND mailbox = ?",
|
|
|
|
|
$data, $this->userid, $mailbox);
|
|
|
|
|
|
|
|
|
|
if ($this->db->affected_rows($res)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$sql_result = $this->db->query(
|
|
|
|
|
"INSERT INTO ".$this->db->table_name('cache_thread')
|
|
|
|
|
." (user_id, mailbox, data, changed)"
|
|
|
|
|
." VALUES (?, ?, ?, ".$this->db->now().")",
|
|
|
|
|
$this->userid, $mailbox, $data);
|
|
|
|
|
|
|
|
|
|
$this->db->set_option('ignore_key_errors', true);
|
|
|
|
|
|
|
|
|
|
$res = $this->db->query(
|
|
|
|
|
"INSERT INTO ".$this->db->table_name('cache_thread')
|
|
|
|
|
." (user_id, mailbox, data, changed)"
|
|
|
|
|
." VALUES (?, ?, ?, ".$this->db->now().")",
|
|
|
|
|
$this->userid, $mailbox, $data);
|
|
|
|
|
|
|
|
|
|
// race-condition, insert failed so try update (#1489146)
|
|
|
|
|
// thanks to ignore_key_errors "duplicate row" errors will be ignored
|
|
|
|
|
if (!$exists && !$res && !$this->db->is_error($res)) {
|
|
|
|
|
$this->db->query(
|
|
|
|
|
"UPDATE ".$this->db->table_name('cache_thread')
|
|
|
|
|
." SET data = ?, changed = ".$this->db->now()
|
|
|
|
|
." WHERE user_id = ?"
|
|
|
|
|
." AND mailbox = ?",
|
|
|
|
|
$data, $this->userid, $mailbox);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->db->set_option('ignore_key_errors', false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|