Fast-mode for selecting kolab objects

... for now used only by kolab_notes plugin
This commit is contained in:
Aleksander Machniak 2018-12-13 18:36:17 +00:00 committed by Jeroen van Meeuwen (Kolab Systems)
parent f3d4dadffd
commit 2c98bf2811
4 changed files with 39 additions and 8 deletions

View file

@ -480,7 +480,7 @@ class kolab_notes extends rcube_plugin
$this->_read_lists(); $this->_read_lists();
if ($folder = $this->get_folder($list_id)) { if ($folder = $this->get_folder($list_id)) {
foreach ($folder->select($query) as $record) { foreach ($folder->select($query, empty($query)) as $record) {
// post-filter search results // post-filter search results
if (strlen($search)) { if (strlen($search)) {
$matches = 0; $matches = 0;

View file

@ -48,6 +48,7 @@ class kolab_storage_cache
protected $max_sync_lock_time = 600; protected $max_sync_lock_time = 600;
protected $binary_items = array(); protected $binary_items = array();
protected $extra_cols = array(); protected $extra_cols = array();
protected $data_props = array();
protected $order_by = null; protected $order_by = null;
protected $limit = null; protected $limit = null;
protected $error = 0; protected $error = 0;
@ -585,9 +586,12 @@ class kolab_storage_cache
* @param array Pseudo-SQL query as list of filter parameter triplets * @param array Pseudo-SQL query as list of filter parameter triplets
* triplet: array('<colname>', '<comparator>', '<value>') * triplet: array('<colname>', '<comparator>', '<value>')
* @param boolean Set true to only return UIDs instead of complete objects * @param boolean Set true to only return UIDs instead of complete objects
* @param boolean Use fast mode to fetch only minimal set of information
* (no xml fetching and parsing, etc.)
*
* @return array List of Kolab data objects (each represented as hash array) or UIDs * @return array List of Kolab data objects (each represented as hash array) or UIDs
*/ */
public function select($query = array(), $uids = false) public function select($query = array(), $uids = false, $fast = false)
{ {
$result = $uids ? array() : new kolab_storage_dataset($this); $result = $uids ? array() : new kolab_storage_dataset($this);
@ -621,6 +625,9 @@ class kolab_storage_cache
} }
while ($sql_arr = $this->db->fetch_assoc($sql_result)) { while ($sql_arr = $this->db->fetch_assoc($sql_result)) {
if ($fast) {
$sql_arr['fast-mode'] = true;
}
if ($uids) { if ($uids) {
$this->uid2msg[$sql_arr['uid']] = $sql_arr['_msguid']; $this->uid2msg[$sql_arr['uid']] = $sql_arr['_msguid'];
$result[] = $sql_arr['uid']; $result[] = $sql_arr['uid'];
@ -862,6 +869,11 @@ class kolab_storage_cache
$sql_data['words'] = ' ' . join(' ', $object['_formatobj']->get_words()) . ' '; $sql_data['words'] = ' ' . join(' ', $object['_formatobj']->get_words()) . ' ';
} }
// TODO: get rid of xml column
// TODO: store only small subset of properties in data column, i.e. properties that are
// needed for fast-mode only (use $data_props)
// TODO: store data in JSON format and no base64-encoding
// extract object data // extract object data
$data = array(); $data = array();
foreach ($object as $key => $val) { foreach ($object as $key => $val) {
@ -896,8 +908,25 @@ class kolab_storage_cache
*/ */
protected function _unserialize($sql_arr) protected function _unserialize($sql_arr)
{ {
if ($sql_arr['fast-mode'] && !empty($sql_arr['data'])
&& ($object = unserialize(base64_decode($sql_arr['data'])))
) {
foreach ($this->data_props as $prop) {
if (!isset($object[$prop]) && isset($sql_arr[$prop])) {
$object[$prop] = $sql_arr[$prop];
if (($prop == 'created' || $prop == 'changed') && $object[$prop] && is_string($object[$prop])) {
$object[$prop] = new DateTime($object[$prop]);
}
}
}
$object['_type'] = $sql_arr['type'] ?: $this->folder->type;
$object['_msguid'] = $sql_arr['msguid'];
$object['_mailbox'] = $this->folder->name;
}
// Fetch object xml // Fetch object xml
if ($object = $this->folder->read_object($sql_arr['msguid'])) { else if ($object = $this->folder->read_object($sql_arr['msguid'])) {
// additional meta data // additional meta data
$object['_size'] = strlen($xml); $object['_size'] = strlen($xml);
} }

View file

@ -23,5 +23,5 @@
class kolab_storage_cache_note extends kolab_storage_cache class kolab_storage_cache_note extends kolab_storage_cache
{ {
protected $data_props = array('uid', 'title', 'created', 'changed');
} }

View file

@ -283,10 +283,12 @@ class kolab_storage_folder extends kolab_storage_folder_api
* *
* @param mixed Pseudo-SQL query as list of filter parameter triplets * @param mixed Pseudo-SQL query as list of filter parameter triplets
* or string with object type (e.g. contact, event, todo, journal, note, configuration) * or string with object type (e.g. contact, event, todo, journal, note, configuration)
* @param boolean Use fast mode to fetch only minimal set of information
* (no xml fetching and parsing, etc.)
* *
* @return array List of Kolab data objects (each represented as hash array) * @return array List of Kolab data objects (each represented as hash array)
*/ */
public function select($query = array()) public function select($query = array(), $fast = false)
{ {
if (!$this->valid) { if (!$this->valid) {
return array(); return array();
@ -296,7 +298,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
$this->cache->synchronize(); $this->cache->synchronize();
// fetch objects from cache // fetch objects from cache
return $this->cache->select($this->_prepare_query($query)); return $this->cache->select($this->_prepare_query($query), false, $fast);
} }
/** /**