/** * Return uuid for current transaction group. Will generate a new uuid if required. * * @return string */ public function getTransactionUUID() { if (!$this->ops_transaction_uuid) { $this->ops_transaction_uuid = caGenerateGUID(); } return $this->ops_transaction_uuid; }
/** * Perform sort * * @param array $pa_hits * @param array $pa_sortable_values * @param string $ps_direction * @param array $pa_options * * @return array */ private function _doSort(&$pa_hits, $pa_sortable_values, $ps_direction = 'asc', $pa_options = null) { if (!in_array($ps_direction = strtolower($ps_direction), array('asc', 'desc'))) { $ps_direction = 'asc'; } $va_sorted_rows = array(); if (sizeof($pa_hits) < 1000000) { // // Perform sort in-memory // $va_sort_buffer = array(); foreach ($pa_hits as $vn_hit) { $vs_key = ''; foreach ($pa_sortable_values as $vn_i => $va_sortable_values) { $vs_v = preg_replace("![^\\w_]+!", " ", $va_sortable_values[$vn_hit]); $vs_key .= str_pad(substr($vs_v, 0, 150), 150, ' ', is_numeric($vs_v) ? STR_PAD_LEFT : STR_PAD_RIGHT); } $va_sort_buffer[$vs_key . str_pad($vn_hit, 12, ' ', STR_PAD_LEFT)] = $vn_hit; } ksort($va_sort_buffer, SORT_FLAG_CASE | SORT_NATURAL); $va_sort_buffer = array_values($va_sort_buffer); if ($ps_direction == 'desc') { $va_sort_buffer = array_reverse($va_sort_buffer); } return $va_sort_buffer; } else { // // Use mysql memory-based table to do sorting // $vs_sort_tmp_table = $this->loadListIntoTemporaryResultTable($pa_hits, caGenerateGUID(), array('sortableValues' => $pa_sortable_values)); $vs_sql = "\n\t\t\t\t\tSELECT row_id\n\t\t\t\t\tFROM {$vs_sort_tmp_table}\n\t\t\t\t\tORDER BY sort_key1 {$ps_direction}, sort_key2 {$ps_direction}, sort_key3 {$ps_direction}, row_id\n\t\t\t\t"; $qr_sort = $this->opo_db->query($vs_sql, array()); $va_sorted_rows = $qr_sort->getAllFieldValues('row_id'); $this->cleanupTemporaryResultTable(); } return $va_sorted_rows; }
/** * Returns client's session_id. */ public function getSessionID() { if (isset($_COOKIE[$this->name]) && $_COOKIE[$this->name]) { return $_COOKIE[$this->name]; } // If client doesn't support cookies and connects repeatedly then we'll end up creating a session for // each connection. GoogleSearch appliances do this. // // To avoid this we keep track of connections by IP address and if it connects without a session cookie // too many times in a given period we force it to a fixed session key if (!is_array($va_ip_list = ExternalCache::fetch('ipList', 'SessionVars'))) { $va_ip_list = array(); } if (!is_array($va_ip_last_seen = ExternalCache::fetch('ipLastSeen', 'SessionVars'))) { $va_ip_last_seen = array(); } if (!is_array($va_ip_session_keys = ExternalCache::fetch('ipSessionKeys', 'SessionVars'))) { $va_ip_session_keys = array(); } if (isset($va_ip_last_seen[$_SERVER['REMOTE_ADDR']]) && time() - $va_ip_last_seen[$_SERVER['REMOTE_ADDR']] > 60 * 60 * 4) { // 4 hour window $va_ip_list[$_SERVER['REMOTE_ADDR']] = 0; } $va_ip_list[$_SERVER['REMOTE_ADDR']]++; $va_ip_last_seen[$_SERVER['REMOTE_ADDR']] = time(); if ($vs_key && $va_ip_list[$_SERVER['REMOTE_ADDR']] > 5) { $va_ip_session_keys[$_SERVER['REMOTE_ADDR']] = caGenerateGUID(); } ExternalCache::save('ipList', $va_ip_list, 'SessionVars', 60 * 60 * 24); // ip lists persist for 24 hours ExternalCache::save('ipLastSeen', $va_ip_last_seen, 'SessionVars', 60 * 60 * 24); ExternalCache::save('ipSessionKeys', $va_ip_session_keys, 'SessionVars', 60 * 60 * 24); return isset($va_ip_session_keys[$_SERVER['REMOTE_ADDR']]) && $va_ip_session_keys[$_SERVER['REMOTE_ADDR']] ? $va_ip_session_keys[$_SERVER['REMOTE_ADDR']] : null; }