/** * Создание идентификатора для указанного URI. * Если объект с указанным URI существует, то будет возвращен его идентификатор * @param string $uri URI для которого нужно получить идентификатор * @param bool $create Создать идентификатор, если отсутствует? * @param bool $is_new Возвращаемый прзнак, был ли создан новый идентификатор? * @return int|null */ function localId($uri, $create = true, &$is_new = false) { $is_new = false; if (!is_string($uri)) { return 0; } // Из кэша if (!isset($this->_local_ids)) { // if ($local_ids = Cache::get('mysqlstore/localids')){ // $this->_local_ids = json_decode($local_ids, true); // }else{ $this->_local_ids = array(); // } } if (isset($this->_local_ids[$uri])) { return $this->_local_ids[$uri]; } // Поиск идентифкатора URI $q = $this->db->prepare('SELECT id FROM {ids} WHERE `uri`=? LIMIT 0,1 FOR UPDATE'); $q->execute(array($uri)); if ($row = $q->fetch(DB::FETCH_ASSOC)) { $id = $row['id']; $is_new = false; $this->_local_ids[$uri] = $id; $this->_global_ids[$id] = $uri; // Отношение с родителями $q = $this->db->prepare('SELECT * FROM {parents1} WHERE `id`=? LIMIT 0,1'); $q->execute(array($id)); if ($row = $q->fetch(DB::FETCH_ASSOC)) { $this->_parents_ids[$id] = F::array_clear($row); } // Отношение с прототипами $q = $this->db->prepare('SELECT * FROM {protos1} WHERE `id`=? LIMIT 0,1'); $q->execute(array($id)); if ($row = $q->fetch(DB::FETCH_ASSOC)) { $this->_protos_ids[$id] = F::array_clear($row); } } else { if ($create) { // Создание идентификатора для URI $q = $this->db->prepare('INSERT INTO {ids} (`id`, `uri`) VALUES (null, ?)'); $q->execute([$uri]); $id = $this->db->lastInsertId('id'); $is_new = true; $obj = Data::read($uri); // Отношения с родителями $this->makeParents($id, $this->localId($obj->parent())); // Отношения с прототипами $this->makeProtos($id, $this->localId($obj->proto())); } else { return 0; } } unset($q); return intval($id); }