private function _checkSolrConfigState() { $vo_solr = new WLPlugSearchEngineSolr(); if ($vo_solr->_SolrConfigIsOutdated()) { return __CA_SEARCH_CONFIG_WARNING__; } return __CA_SEARCH_CONFIG_OK__; }
public function flushContentBuffer() { /* build Solr xml indexing format for each core */ $va_post_xml = array(); foreach (WLPlugSearchEngineSolr::$s_doc_content_buffer as $vs_key => $va_doc_content_buffer) { $va_key = explode('/', $vs_key); $va_post_xml[$va_key[0]] .= "\t<doc>\n"; foreach ($va_doc_content_buffer as $vs_field_name => $va_field_content) { $va_acc = array(); foreach ($va_field_content as $vs_field_content) { if (is_array($vs_field_content)) { foreach ($vs_field_content as $vs_field_content_element) { $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="'; $va_post_xml[$va_key[0]] .= $vs_field_name; $va_post_xml[$va_key[0]] .= '"><![CDATA['; $va_post_xml[$va_key[0]] .= caEscapeForXML($vs_field_content_element); $va_post_xml[$va_key[0]] .= ']]></field>' . "\n"; } } else { $va_acc[] = $vs_field_content; } } if (sizeof($va_acc)) { $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="'; $va_post_xml[$va_key[0]] .= $vs_field_name; $va_post_xml[$va_key[0]] .= '"><![CDATA['; $va_post_xml[$va_key[0]] .= caEscapeForXML(join("\n", $va_acc)); $va_post_xml[$va_key[0]] .= ']]></field>' . "\n"; } } if (!isset($va_doc_content_buffer[$va_key[0] . "." . $va_key[1]])) { /* add pk */ $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="' . $va_key[0] . "." . $va_key[1] . '">' . $va_key[2] . '</field>' . "\n"; } $va_post_xml[$va_key[0]] .= "\t</doc>\n"; // Output created on and modified on timestamps $qr_res = $this->opo_db->query("\t\n\t\t\t\t\t\t\t\tSELECT ccl.log_id, ccl.log_datetime, ccl.changetype, ccl.user_id\n\t\t\t\t\t\t\t\tFROM ca_change_log ccl\n\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\t(ccl.logged_table_num = ?) AND (ccl.logged_row_id = ?)\n\t\t\t\t\t\t\t\t\tAND\n\t\t\t\t\t\t\t\t\t(ccl.changetype <> 'D')\n\t\t\t\t", $this->opo_datamodel->getTableNum($va_key[0]), (int) $va_key[2]); while ($qr_res->nextRow()) { $va_post_xml[$va_key[0]] .= "\t<doc>\n"; // We "fake" the <table>.<primary key> value here to be the log_id of the change log entry to ensure that the log entry // document has a different unique key than the entry for the actual record. If we didn't do this then we'd overwrite // the indexing for the record itself with indexing for successful log entries. Since the SearchEngine is looking for // just the primary key, sans table name, it's ok to do this hack. $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="' . $va_key[0] . "." . $va_key[1] . '">' . $qr_res->get('log_id') . '</field>' . "\n"; $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="' . $va_key[1] . '">' . $va_key[2] . '</field>' . "\n"; if ($qr_res->get('changetype') == 'I') { $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="created"'; $va_post_xml[$va_key[0]] .= '><![CDATA['; $va_post_xml[$va_key[0]] .= date("c", $qr_res->get('log_datetime')) . 'Z'; $va_post_xml[$va_key[0]] .= ']]></field>' . "\n"; $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="created_user_id"><![CDATA[' . $qr_res->get('user_id') . ']]></field>' . "\n"; } else { $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="modified"'; $va_post_xml[$va_key[0]] .= '><![CDATA['; $va_post_xml[$va_key[0]] .= date("c", $qr_res->get('log_datetime')) . 'Z'; $va_post_xml[$va_key[0]] .= ']]></field>' . "\n"; $va_post_xml[$va_key[0]] .= "\t\t" . '<field name="modified_user_id"><![CDATA[' . $qr_res->get('user_id') . ']]></field>' . "\n"; } $va_post_xml[$va_key[0]] .= "\t</doc>\n"; } } /* No delete of the old stuff needed. If the pk (defined as uniqueKey) already exists, it is automatically updated */ /* send data */ try { $vo_http_client = new Zend_Http_Client(); foreach ($va_post_xml as $vs_core => $vs_post_xml) { $vo_http_client->setUri($this->ops_search_solr_url . "/" . $vs_core . "/update"); $vo_http_client->setRawData($x = "<add>{$vs_post_xml}</add>")->setEncType('text/xml')->request('POST'); try { $vo_http_response = $vo_http_client->request(); if ($o_resp = new SimpleXMLElement($vo_http_response->getBody())) { $va_status = $o_resp->xpath("/response/lst/int[@name='status']"); $vn_status = (int) $va_status[0]; if ($vn_status > 0) { caLogEvent('ERR', _t('Indexing failed for %1: status %2, msg %3', $vs_core, $vn_status, $o_resp->asXML()), 'Solr->flushContentBuffer()'); } else { /* commit */ try { $vs_post_xml = '<commit />'; $vo_http_client->setRawData($vs_post_xml)->setEncType('text/xml')->request('POST'); $vo_http_response = $vo_http_client->request(); if ($o_resp = new SimpleXMLElement($vo_http_response->getBody())) { $va_status = $o_resp->xpath("/response/lst/int[@name='status']"); $vn_status = (int) $va_status[0]; if ($vn_status > 0) { caLogEvent('ERR', _t('Indexing commit failed for %1: status %2, msg %3', $vs_core, $vn_status, $o_resp->asXML()), 'Solr->flushContentBuffer()'); } } else { caLogEvent('ERR', _t('Indexing commit failed for %1: invalid response from SOLR %2', $vs_core, $vo_http_response->getBody()), 'Solr->flushContentBuffer()'); } } catch (Exception $e) { // Commit error caLogEvent('ERR', _t('Indexing commit failed: %1; response was %2', $e->getMessage(), $vo_http_response->getBody()), 'Solr->flushContentBuffer()'); } } } else { caLogEvent('ERR', _t('Indexing failed for %1: invalid response from SOLR %2', $vs_core, $vo_http_response->getBody()), 'Solr->flushContentBuffer()'); } } catch (Exception $e) { // Indexing error caLogEvent('ERR', _t('Indexing failed for %1: %2; response was %3', $vs_core, $e->getMessage(), $vo_http_response->getBody()), 'Solr->flushContentBuffer()'); } } } catch (Exception $e) { caLogEvent('ERR', _t('Could not connect to SOLR server: %1', $e->getMessage()), 'Solr->flushContentBuffer()'); } /* clean up */ unset($vo_http_client); unset($vs_post_xml); $this->opa_doc_content_buffer = array(); WLPlugSearchEngineSolr::$s_doc_content_buffer = array(); }