protected function indexName($name, $id) { $iwords = $this->getIndexable($name); if (count($iwords) > 0) { $sem = SemaphoreEngineFactory::getEngine(); $sindex = array(); $create = array(); $docreate = false; $query = new Query('SELECT'); $query->field('term'); $query->field('app_id_array'); $query->from('search_name_index'); foreach ($iwords as $iword) { $sindex[$iword] = array(); $create[$iword] = true; $docreate = true; $query->where('term = ?', $iword, 'OR'); } $stmt = $query->prepare(); $semkey = Config::getVal('recache', 'unique_name') . ":LOCK:sindex"; $sem->acquire($semkey); $stmt->execute(); while ($row = $stmt->fetchObj()) { $create[$row->term] = false; $sindex[$row->term] = unserialize($row->app_id_array); } unset($query); unset($stmt); $iquery = new Query('INSERT'); $iquery->ignore(); $iquery->intoTable('search_name_index'); $iquery->intoField('term'); $iquery->intoField('app_id_array'); $uqueries = array(); foreach ($iwords as $iword) { if (!in_array($id, $sindex[$iword])) { $sindex[$iword][] = $id; $this->cm->set("search_name_index:{$iword}", $sindex[$iword], 0); } if ($create[$iword]) { $iquery->VALUES('(?, ?)', array($iword, serialize($sindex[$iword]))); } else { $query = new Query('UPDATE'); $query->table('search_name_index'); $query->set('app_id_array = ?', serialize($sindex[$iword])); $query->where('term = ?', $iword); $uqueries[] = $query; } } if ($docreate) { $stmt = $iquery->prepare(); unset($iquery); $stmt->execute(); } foreach ($uqueries as $uquery) { $stmt = $uquery->prepare(); $stmt->execute(); } $sem->release($semkey); } }