/** * Load and merge registry keys by userid and a path. * The user keys will get merged with the default keys (userid = 0). */ public function loadByPath($userid, $path) { $repository = $this->getEntityManager()->getRepository('RegistryBundle:Registry'); /* select * from (select * from registry where userid = 0 and concat(registrykey, "/", name) not in (select concat(registrykey, "/", name) from registry where userid = 2) union select * from registry where userid = 2) x where x.registrykey like 'App/Test/J%' */ $stmt = $this->getEntityManager()->getConnection()->prepare('SELECT r.* FROM ( SELECT * FROM registry r1 WHERE r1.userid = 0 AND CONCAT(r1.registrykey, "/", r1.name) NOT IN ( SELECT CONCAT(r2.registrykey, "/", r2.name) FROM registry r2 WHERE r2.userid = :userid ) UNION SELECT * FROM registry r3 WHERE r3.userid = :userid ) r WHERE r.registrykey LIKE :path'); $params = array('userid' => $userid, 'path' => $path); $stmt->execute($params); $result = array(); while ($row = $stmt->fetch()) { $r = new Registry(); $r->LoadByArray($row); $result[] = $r; } return $result; }
/** * Read a set of registry keys and return them as array. * * @param integer $userid * @param string $path * @return array */ public function getRegistryItems($userid, $path) { $entities = array(); if ($this->isModeRedis()) { // redis load $array = $this->redis->hGetAll($this->redis_prefix . (string) $userid); // filter the result array foreach (array_keys($array) as $key) { if (preg_match('/^' . $path . '/', $key)) { // $key = key; key:name:type // $value = $array[$key]; value // explode key by redis_key_name_delimiter to get key:name:type $s = explode($this->redis_key_name_delimiter, $key); if (count($s) != 3) { throw new \Exception('Redis key format is not correct! (key' . $this->redis_key_name_delimiter . 'name' . $this->redis_key_name_delimiter . 'name)'); } $entity = new RegKey(); $entity->loadByValues(0, $userid, $s[0], $s[1], $s[2], $array[$key]); $entities[] = $entity; } } // cleanup unset($array); } else { if ($this->isModeDoctrine()) { // doctrine load $entities = $this->registry->loadByPath($userid, $path); } } return $entities; }