/**
  * List the current set of contact records
  *
  * @param  array   List of cols to show, Null means all
  * @param  int     Only return this number of records, use negative values for tail
  * @param  boolean True to skip the count query (select only)
  * @return array  Indexed list of contact records, each a hash array
  */
 function list_records($cols = null, $subset = 0, $nocount = false)
 {
     if ($nocount || $this->list_page <= 1) {
         // create dummy result, we don't need a count now
         $this->result = new rcube_result_set();
     } else {
         // count all records
         $this->result = $this->count();
     }
     $start_row = $subset < 0 ? $this->result->first + $this->page_size + $subset : $this->result->first;
     $length = $subset != 0 ? abs($subset) : $this->page_size;
     if ($this->group_id) {
         $join = " LEFT JOIN " . $this->db->table_name($this->db_groupmembers) . " AS m" . " ON (m.contact_id = c." . $this->primary_key . ")";
     }
     $order_col = in_array($this->sort_col, $this->table_cols) ? $this->sort_col : 'name';
     $order_cols = array('c.' . $order_col);
     if ($order_col == 'firstname') {
         $order_cols[] = 'c.surname';
     } else {
         if ($order_col == 'surname') {
             $order_cols[] = 'c.firstname';
         }
     }
     if ($order_col != 'name') {
         $order_cols[] = 'c.name';
     }
     $order_cols[] = 'c.email';
     $sql_result = $this->db->limitquery("SELECT * FROM " . $this->db->table_name($this->db_name) . " AS c" . $join . " WHERE c.del<>1" . " AND c.user_id=?" . ($this->group_id ? " AND m.contactgroup_id=?" : "") . ($this->filter ? " AND (" . $this->filter . ")" : "") . " ORDER BY " . $this->db->concat($order_cols) . " " . $this->sort_order, $start_row, $length, $this->user_id, $this->group_id);
     // determine whether we have to parse the vcard or if only db cols are requested
     $read_vcard = !$cols || count(array_intersect($cols, $this->table_cols)) < count($cols);
     while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) {
         $sql_arr['ID'] = $sql_arr[$this->primary_key];
         if ($read_vcard) {
             $sql_arr = $this->convert_db_data($sql_arr);
         } else {
             $sql_arr['email'] = explode(self::SEPARATOR, $sql_arr['email']);
             $sql_arr['email'] = array_map('trim', $sql_arr['email']);
         }
         $this->result->add($sql_arr);
     }
     $cnt = count($this->result->records);
     // update counter
     if ($nocount) {
         $this->result->count = $cnt;
     } else {
         if ($this->list_page <= 1) {
             if ($cnt < $this->page_size && $subset == 0) {
                 $this->result->count = $cnt;
             } else {
                 if (isset($this->cache['count'])) {
                     $this->result->count = $this->cache['count'];
                 } else {
                     $this->result->count = $this->_count();
                 }
             }
         }
     }
     return $this->result;
 }
 /**
  * Reads cache entry.
  *
  * @param string  $key     Cache key name
  * @param boolean $nostore Enable to skip in-memory store
  *
  * @return mixed Cached value
  */
 private function read_record($key, $nostore = false)
 {
     if (!$this->db) {
         return null;
     }
     if ($this->type != 'db') {
         $this->load_index();
         // Consistency check (#1490390)
         if (!in_array($key, $this->index)) {
             // we always check if the key exist in the index
             // to have data in consistent state. Keeping the index consistent
             // is needed for keys delete operation when we delete all keys or by prefix.
         } else {
             $ckey = $this->ckey($key);
             if ($this->type == 'memcache') {
                 $data = $this->db->get($ckey);
             } else {
                 if ($this->type == 'apc') {
                     $data = apc_fetch($ckey);
                 }
             }
             if ($this->debug) {
                 $this->debug('get', $ckey, $data);
             }
         }
         if ($data) {
             $md5sum = md5($data);
             $data = $this->unserialize($data);
             if ($nostore) {
                 return $data;
             }
             $this->cache_sums[$key] = $md5sum;
             $this->cache[$key] = $data;
         } else {
             $this->cache[$key] = null;
         }
     } else {
         $sql_result = $this->db->limitquery("SELECT `data`, `cache_key`" . " FROM {$this->table}" . " WHERE `user_id` = ? AND `cache_key` = ?" . " ORDER BY `created` DESC", 0, 1, $this->userid, $this->prefix . '.' . $key);
         if ($sql_arr = $this->db->fetch_assoc($sql_result)) {
             $key = substr($sql_arr['cache_key'], strlen($this->prefix) + 1);
             $md5sum = $sql_arr['data'] ? md5($sql_arr['data']) : null;
             if ($sql_arr['data']) {
                 $data = $this->unserialize($sql_arr['data']);
             }
             if ($nostore) {
                 return $data;
             }
             $this->cache[$key] = $data;
             $this->cache_sums[$key] = $md5sum;
         } else {
             $this->cache[$key] = null;
         }
     }
     return $this->cache[$key];
 }
示例#3
0
 /**
  * Reads cache entry.
  *
  * @param string  $key     Cache key name
  * @param boolean $nostore Enable to skip in-memory store
  *
  * @return mixed Cached value
  */
 private function read_record($key, $nostore = false)
 {
     if (!$this->db) {
         return null;
     }
     if ($this->type != 'db') {
         if ($this->type == 'memcache') {
             $data = $this->db->get($this->ckey($key));
         } else {
             if ($this->type == 'apc') {
                 $data = apc_fetch($this->ckey($key));
             }
         }
         if ($data) {
             $md5sum = md5($data);
             $data = $this->unserialize($data);
             if ($nostore) {
                 return $data;
             }
             $this->cache_sums[$key] = $md5sum;
             $this->cache[$key] = $data;
         } else {
             $this->cache[$key] = null;
         }
     } else {
         $sql_result = $this->db->limitquery("SELECT data, cache_key" . " FROM " . $this->table . " WHERE user_id = ?" . " AND cache_key = ?" . " ORDER BY created DESC", 0, 1, $this->userid, $this->prefix . '.' . $key);
         if ($sql_arr = $this->db->fetch_assoc($sql_result)) {
             $key = substr($sql_arr['cache_key'], strlen($this->prefix) + 1);
             $md5sum = $sql_arr['data'] ? md5($sql_arr['data']) : null;
             if ($sql_arr['data']) {
                 $data = $this->unserialize($sql_arr['data']);
             }
             if ($nostore) {
                 return $data;
             }
             $this->cache[$key] = $data;
             $this->cache_sums[$key] = $md5sum;
         } else {
             $this->cache[$key] = null;
         }
     }
     return $this->cache[$key];
 }
 /**
  * Reads cache entry.
  *
  * @param string  $key     Cache key name
  * @param boolean $nostore Enable to skip in-memory store
  *
  * @return mixed Cached value
  */
 private function read_record($key, $nostore = false)
 {
     if (!$this->db) {
         return null;
     }
     if ($this->type != 'db') {
         if ($this->type == 'memcache') {
             $data = $this->db->get($this->ckey($key));
         } else {
             if ($this->type == 'apc') {
                 $data = apc_fetch($this->ckey($key));
             }
         }
         if ($data) {
             $md5sum = md5($data);
             $data = $this->unserialize($data);
             if ($nostore) {
                 return $data;
             }
             $this->cache_sums[$key] = $md5sum;
             $this->cache[$key] = $data;
         } else {
             $this->cache[$key] = null;
         }
     } else {
         $sql_result = $this->db->limitquery("SELECT `data`, `cache_key`" . " FROM {$this->table}" . " WHERE `cache_key` = ?" . " ORDER BY `created` DESC", 0, 1, $this->prefix . '.' . $key);
         if ($sql_arr = $this->db->fetch_assoc($sql_result)) {
             $md5sum = $sql_arr['data'] ? md5($sql_arr['data']) : null;
             if ($sql_arr['data']) {
                 $data = $this->unserialize($sql_arr['data']);
             }
             if ($nostore) {
                 return $data;
             }
             $this->cache[$key] = $data;
             $this->cache_sums[$key] = $md5sum;
         } else {
             $this->cache[$key] = null;
         }
     }
     return $this->cache[$key];
 }