Exemplo n.º 1
0
 /**
  * Создание идентификатора для указанного 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);
 }