コード例 #1
0
 /**
  * Writes single cache record into DB.
  *
  * @param string $key  Cache key name
  * @param mixed  $data Serialized cache data
  *
  * @param boolean True on success, False on failure
  */
 private function write_record($key, $data)
 {
     if (!$this->db) {
         return false;
     }
     // don't attempt to write too big data sets
     if (strlen($data) > $this->max_packet_size()) {
         trigger_error("rcube_cache: max_packet_size ({$this->max_packet}) exceeded for key {$key}. Tried to write " . strlen($data) . " bytes", E_USER_WARNING);
         return false;
     }
     if ($this->type == 'memcache' || $this->type == 'apc') {
         $result = $this->add_record($this->ckey($key), $data);
         // make sure index will be updated
         if ($result) {
             if (!array_key_exists($key, $this->cache_sums)) {
                 $this->cache_sums[$key] = true;
             }
             $this->load_index();
             if (!$this->index_changed && !in_array($key, $this->index)) {
                 $this->index_changed = true;
             }
         }
         return $result;
     }
     $db_key = $this->prefix . '.' . $key;
     // Remove NULL rows (here we don't need to check if the record exist)
     if ($data == 'N;') {
         $result = $this->db->query("DELETE FROM {$this->table} WHERE `cache_key` = ?", $db_key);
         return !$this->db->is_error($result);
     }
     $key_exists = array_key_exists($key, $this->cache_sums);
     $expires = $this->ttl ? $this->db->now($this->ttl) : 'NULL';
     if (!$key_exists) {
         // Try INSERT temporarily ignoring "duplicate key" errors
         $this->db->set_option('ignore_key_errors', true);
         $result = $this->db->query("INSERT INTO {$this->table} (`expires`, `cache_key`, `data`)" . " VALUES ({$expires}, ?, ?)", $db_key, $data);
         $this->db->set_option('ignore_key_errors', false);
     }
     // otherwise try UPDATE
     if (!isset($result) || !($count = $this->db->affected_rows($result))) {
         $result = $this->db->query("UPDATE {$this->table} SET `expires` = {$expires}, `data` = ?" . " WHERE `cache_key` = ?", $data, $db_key);
         $count = $this->db->affected_rows($result);
     }
     return $count > 0;
 }
コード例 #2
0
 /**
  * Saves thread data into database
  */
 private function add_thread_row($mailbox, $data, $mbox_data = array(), $exists = false)
 {
     $data = array($this->db->encode($data, true), (int) $this->skip_deleted, (int) $mbox_data['UIDVALIDITY'], (int) $mbox_data['UIDNEXT']);
     $data = implode('@', $data);
     $expires = $this->ttl ? $this->db->now($this->ttl) : 'NULL';
     if ($exists) {
         $res = $this->db->query("UPDATE {$this->thread_table}" . " SET `data` = ?, `expires` = {$expires}" . " WHERE `user_id` = ?" . " AND `mailbox` = ?", $data, $this->userid, $mailbox);
         if ($this->db->affected_rows($res)) {
             return;
         }
     }
     $this->db->set_option('ignore_key_errors', true);
     $res = $this->db->query("INSERT INTO {$this->thread_table}" . " (`user_id`, `mailbox`, `expires`, `data`)" . " VALUES (?, ?, {$expires}, ?)", $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->thread_table}" . " SET `expires` = {$expires}, `data` = ?" . " WHERE `user_id` = ?" . " AND `mailbox` = ?", $data, $this->userid, $mailbox);
     }
     $this->db->set_option('ignore_key_errors', false);
 }
コード例 #3
0
 /**
  * Add the given contact records the a certain group
  *
  * @param string  Group identifier
  * @param array   List of contact identifiers to be added
  * @return int    Number of contacts added 
  */
 function add_to_group($group_id, $ids)
 {
     if (!is_array($ids)) {
         $ids = explode(self::SEPARATOR, $ids);
     }
     $added = 0;
     $exists = array();
     // get existing assignments ...
     $sql_result = $this->db->query("SELECT contact_id FROM " . $this->db->table_name($this->db_groupmembers) . " WHERE contactgroup_id=?" . " AND contact_id IN (" . $this->db->array2list($ids, 'integer') . ")", $group_id);
     while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) {
         $exists[] = $sql_arr['contact_id'];
     }
     // ... and remove them from the list
     $ids = array_diff($ids, $exists);
     foreach ($ids as $contact_id) {
         $this->db->query("INSERT INTO " . $this->db->table_name($this->db_groupmembers) . " (contactgroup_id, contact_id, created)" . " VALUES (?, ?, " . $this->db->now() . ")", $group_id, $contact_id);
         if ($error = $this->db->is_error()) {
             $this->set_error(self::ERROR_SAVING, $error);
         } else {
             $added++;
         }
     }
     return $added;
 }