diff --git a/framework/Share/lib/Horde/Share/Base.php b/framework/Share/lib/Horde/Share/Base.php index 13d43d5..8a7e3fd 100644 --- a/framework/Share/lib/Horde/Share/Base.php +++ b/framework/Share/lib/Horde/Share/Base.php @@ -265,9 +265,9 @@ abstract class Horde_Share_Base if (count($missing_ids)) { $shares = $this->_getShares($missing_ids); - foreach (array_keys($shares) as $key) { - $this->_cache[$key] = $shares[$key]; - $this->_shareMap[$shares[$key]->getId()] = $key; + foreach ($shares as $name => $share) { + $this->_cache[$name] = $share; + $this->_shareMap[$share->getId()] = $name; } } @@ -275,7 +275,7 @@ abstract class Horde_Share_Base $all_shares[$this->_shareMap[$cid]] = $this->_cache[$this->_shareMap[$cid]]; } - return $all_shares; + return new Horde_Share_List($all_shares); } /** @@ -353,7 +353,7 @@ abstract class Horde_Share_Base $shares = $this->getShares($shares); if (is_null($params['sort_by'])) { $this->_sortList = $shares; - uasort($shares, array($this, '_sortShares')); + uasort($shares->toArray(), array($this, '_sortShares')); $this->_sortList = null; } diff --git a/framework/Share/lib/Horde/Share/List.php b/framework/Share/lib/Horde/Share/List.php new file mode 100644 index 0000000..fbbc211 --- /dev/null +++ b/framework/Share/lib/Horde/Share/List.php @@ -0,0 +1,40 @@ +_data = $shareList; + } + + public function offsetExists ($offset) + { + return isset($this->_data[$offset]); + } + + public function offsetGet ($offset) + { + return $this->_data[$offset]; + } + + public function offsetSet ($offset, $value) + { + $this->_data[$offset] = $value; + } + + public function offsetUnset ($offset) + { + unset($this->_data[$offset]); + } + + public function toArray() + { + return $this->_data; + } + +} diff --git a/framework/Share/lib/Horde/Share/List/Sql.php b/framework/Share/lib/Horde/Share/List/Sql.php new file mode 100644 index 0000000..ef38a93 --- /dev/null +++ b/framework/Share/lib/Horde/Share/List/Sql.php @@ -0,0 +1,97 @@ +_pdoStatement = $pdoStatement; + $this->_shareDriver = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Share')->create(); + } + + public function next() + { + if (!($this->_current = $this->_pdoStatement->fetch())) { + $this->_current = null; + } + } + + public function current() + { + if (is_null($this->_current)) { + $this->next(); + } + return $this->_shareDriver->getShareById($this->_current['share_id']); + } + + public function key() { + return $this->_current['share_name']; + } + + public function valid() + { + return !is_null($this->_current); + } + + public function rewind() + { + $this->_pdoStatement->closeCursor(); + $this->_pdoStatement->execute(); + $this->_current = null; + //Fetch the first result so the valid() method will succeed + $this->next(); + } + + public function offsetExists($offset) + { + $this->_loadFullSet(); + return parent::offsetExists($offset); + } + + public function offsetGet($offset) + { + $this->_loadFullSet(); + return parent::offsetGet($offset); + } + + public function offsetSet($offset, $value) + { + $this->_loadFullSet(); + return parent::offsetSet($offset, $value); + } + + public function offsetUnset($offset) + { + $this->_loadFullSet(); + return parent::offsetUnset($offset); + } + + public function toArray() + { + $this->_loadFullSet(); + return parent::toArray(); + } + + protected function _loadFullSet() + { + if (empty($this->_data)) { + $this->rewind(); + while ($this->valid()) { + $this->_data[$this->key()] = $this->current(); + $this->next(); + } + } + } +} diff --git a/framework/Share/lib/Horde/Share/Sql.php b/framework/Share/lib/Horde/Share/Sql.php index 4856bf0..ae65f6e 100644 --- a/framework/Share/lib/Horde/Share/Sql.php +++ b/framework/Share/lib/Horde/Share/Sql.php @@ -254,18 +254,11 @@ class Horde_Share_Sql extends Horde_Share_Base protected function _getShares(array $ids) { try { - $rows = $this->_db->selectAll('SELECT * FROM ' . $this->_table . ' WHERE share_id IN (' . str_repeat('?, ', count($ids) - 1) . '?)', $ids); + $pdoStatement = $this->_db->execute('SELECT * FROM ' . $this->_table . ' WHERE share_id IN (' . str_repeat('?, ', count($ids) - 1) . '?)', $ids); + return new Horde_Share_List_Sql($pdoStatement); } catch (Horde_Db_Exception $e) { throw new Horde_Share_Exception($e->getMessage()); } - - $sharelist = array(); - foreach ($rows as $share) { - $this->_loadPermissions($share); - $sharelist[$share['share_name']] = $this->_createObject($share); - } - - return $sharelist; } /** @@ -290,49 +283,12 @@ class Horde_Share_Sql extends Horde_Share_Base */ protected function _listAllShares() { - $shares = array(); - - try { - $rows = $this->_db->selectAll('SELECT * FROM ' . $this->_table . ' ORDER BY share_name ASC'); - } catch (Horde_Db_Exception $e) { - throw new Horde_Share_Exception($e->getMessage()); - } - - foreach ($rows as $share) { - $shares[(int)$share['share_id']] = $this->_fromDriverCharset($share); - } - - // Get users permissions - try { - $rows = $this->_db->selectAll('SELECT * FROM ' . $this->_table . '_users'); - } catch (Horde_Db_Exception $e) { - throw new Horde_Share_Exception($e); - } - foreach ($rows as $row) { - $shares[$row['share_id']]['perm']['users'][$row['user_uid']] = $this->_buildPermsFromRow($row); - } - - // Get groups permissions try { - $rows = $this->_db->selectAll('SELECT * FROM ' . $this->_table . '_groups'); + $pdoStatement = $this->_db->execute('SELECT * FROM ' . $this->_table . ' ORDER BY share_name ASC LIMIT 2'); + return new Horde_Share_List_Sql($pdoStatement); } catch (Horde_Db_Exception $e) { throw new Horde_Share_Exception($e->getMessage()); } - foreach ($rows as $row) { - $shares[$row['share_id']]['perm']['groups'][$row['group_uid']] = $this->_buildPermsFromRow($row); - } - - $sharelist = array(); - foreach ($shares as $data) { - $this->_getSharePerms($data); - if (!empty($data['share_name'])) { - $sharelist[$data['share_name']] = $this->_createObject($data); - } else { - $sharelist[] = $this->_createObject($data); - } - } - - return $sharelist; } /** @@ -387,60 +343,14 @@ class Horde_Share_Sql extends Horde_Share_Base . (($params['direction'] == 0) ? ' ASC' : ' DESC'); $query = $this->_db->addLimitOffset($query, array('limit' => $params['count'], 'offset' => $params['from'])); + try { - $rows = $this->_db->selectAll($query); + $pdoStatement = $this->_db->execute($query); + $sharelist = new Horde_Share_List_Sql($pdoStatement); } catch (Horde_Db_Exception $e) { throw new Horde_Share_Exception($e->getMessage()); } - $users = array(); - $groups = array(); - foreach ($rows as $share) { - $shares[(int)$share['share_id']] = $this->_fromDriverCharset($share); - if ($this->_hasUsers($share)) { - $users[] = (int)$share['share_id']; - } - if ($this->_hasGroups($share)) { - $groups[] = (int)$share['share_id']; - } - } - - // Get users permissions - if (!empty($users)) { - $query = 'SELECT share_id, user_uid, perm FROM ' . $this->_table - . '_users WHERE share_id IN (' . str_repeat('?,', count($users) - 1) . '?)'; - - try { - $rows = $this->_db->selectAll($query, $users); - } catch (Horde_Db_Exception $e) { - throw new Horde_Share_Exception($e->getMessage()); - } - foreach ($rows as $share) { - $shares[$share['share_id']]['perm']['users'][$share['user_uid']] = (int)$share['perm']; - } - } - - // Get groups permissions - if (!empty($groups)) { - $query = 'SELECT share_id, group_uid, perm FROM ' . $this->_table - . '_groups WHERE share_id IN (' . str_repeat('?,', count($groups) - 1) . '?)'; - try { - $rows = $this->_db->selectAll($query, $groups); - } catch (Horde_Db_Exception $e) { - throw new Horde_Share_Exception($e->getMessage()); - } - foreach ($rows as $share) { - $shares[$share['share_id']]['perm']['groups'][$share['group_uid']] = (int)$share['perm']; - } - } - - $sharelist = array(); - foreach ($shares as $id => $data) { - $this->_getSharePerms($data); - $sharelist[$data['share_name']] = $this->_createObject($data); - } - unset($shares); - // Run the results through the callback, if configured. if (!empty($this->_callbacks['list'])) { $sharelist = $this->runCallback('list', array($userid, $sharelist, $params)); @@ -561,21 +471,12 @@ class Horde_Share_Sql extends Horde_Share_Base */ public function listSystemShares() { - $query = 'SELECT * FROM ' . $this->_table . ' WHERE share_owner IS NULL'; try { - $rows = $this->_db->selectAll($query); + $pdoStatement = $this->_db->execute('SELECT * FROM ' . $this->_table . ' WHERE share_owner =\'goncalo@identidades.eu\''); + return new Horde_Share_List_Sql($pdoStatement); } catch (Horde_Db_Exception $e) { - throw new Horde_Share_Exception($e->getMessage());; - } - - $sharelist = array(); - foreach ($rows as $share) { - $data = $this->_fromDriverCharset($share); - $this->_getSharePerms($data); - $sharelist[$data['share_name']] = $this->_createObject($data); + throw new Horde_Share_Exception($e->getMessage()); } - - return $sharelist; } /** diff --git a/framework/Share/lib/Horde/Share/Sqlng.php b/framework/Share/lib/Horde/Share/Sqlng.php index 268b945..abf090d 100644 --- a/framework/Share/lib/Horde/Share/Sqlng.php +++ b/framework/Share/lib/Horde/Share/Sqlng.php @@ -117,25 +117,19 @@ class Horde_Share_Sqlng extends Horde_Share_Sql $query = $this->_db->addLimitOffset($query, array('limit' => $params['count'], 'offset' => $params['from'])); - try { - $rows = $this->_db->selectAll($query); + try { + $pdoStatement = $this->_db->execute($query); + $sharelist = new Horde_Share_List_Sql($pdoStatement); } catch (Horde_Db_Exception $e) { - throw new Horde_Share_Exception($e); - } - - $sharelist = array(); - foreach ($rows as $share) { - $share = $this->_fromDriverCharset($share); - $this->_loadPermissions($share); - $sharelist[$share['share_name']] = $this->_createObject($share); + throw new Horde_Share_Exception($e->getMessage()); } // Run the results through the callback, if configured. if (!empty($this->_callbacks['list'])) { $sharelist = $this->runCallback('list', array($userid, $sharelist, $params)); } - $this->_listcache[$key] = $sharelist; + $this->_listcache[$key] = $sharelist; return $this->_listcache[$key]; } diff --git a/framework/Share/package.xml b/framework/Share/package.xml index ce513ab..7b969a0 100644 --- a/framework/Share/package.xml +++ b/framework/Share/package.xml @@ -35,7 +35,7 @@ owns or has access to. LGPL-2.1 -* +* @@ -49,6 +49,9 @@ owns or has access to. + + + @@ -62,6 +65,7 @@ owns or has access to. + @@ -466,10 +470,12 @@ owns or has access to. + + @@ -825,7 +831,7 @@ Initial release as a PEAR package 2011-11-08 LGPL-2.1 -* +* diff --git a/kronolith/lib/Kronolith.php b/kronolith/lib/Kronolith.php index 51a76b1..077c65a 100644 --- a/kronolith/lib/Kronolith.php +++ b/kronolith/lib/Kronolith.php @@ -1560,7 +1560,7 @@ class Kronolith if (isset($calendars[$default_share])) { $calendar = $calendars[$default_share]; unset($calendars[$default_share]); - $calendars = array($default_share => $calendar) + $calendars; + $calendars = array_merge(array($default_share => $calendar), $calendars->toArray()); } return $calendars;