function caIncrementHierachicalReindexProgress($ps_table_message, $pn_elapsed_time, $pn_memory_used, $pa_table_list, $pn_table_num, $ps_display_name, $pn_tables_processed) { if (is_null($ps_table_message)) { $ps_table_message = _t('Indexing %1 (%2/%3)', $ps_display_name, $pn_tables_processed, sizeof($pa_table_list)); } $pn_table_percentage = $pn_tables_processed / sizeof($pa_table_list) * 100; print "<script type='text/javascript'>"; print "jQuery('#progressbarTables').progressbar('value',{$pn_table_percentage}); jQuery('#searchReindexTableStatus').html('{$ps_table_message}');"; print "jQuery('#searchReindexElapsedTime').html('" . caFormatInterval($pn_elapsed_time) . "/" . sprintf("%4.2f mb", $pn_memory_used / 1048576) . "');"; print "</script>"; caFlushOutput(); }
function caIncrementBatchEditorProgress($po_request, $pn_rows_complete, $pn_total_rows, $ps_message, $pn_elapsed_time, $pn_memory_used, $pn_num_processed, $pn_num_errors) { $pn_percentage = $pn_rows_complete / $pn_total_rows * 100; if (is_null($ps_message)) { $ps_message = _t('Processed %1/%2', $pn_rows_complete, $pn_total_rows); } $ps_message = addslashes($ps_message); print "<script type='text/javascript'>"; print "jQuery('#progressbar').progressbar('value',{$pn_percentage}); jQuery('#batchProcessingTableStatus').html('{$ps_message}');"; print "jQuery('#batchProcessingElapsedTime').html('" . caFormatInterval($pn_elapsed_time) . "/" . sprintf("%4.2f mb", $pn_memory_used / 1048576) . "');"; print "jQuery('#batchProcessingCounts').html('" . addslashes(_t("%1 processed; %2 errors", $pn_num_processed, $pn_num_errors)) . "');"; print "</script>"; caFlushOutput(); }
function caIncrementSortValueReloadProgress($pn_rows_complete, $pn_total_rows, $ps_row_message, $ps_table_message, $pn_elapsed_time, $pn_memory_used, $pa_table_list, $pn_table_num, $ps_display_name, $pn_tables_processed) { $pn_percentage = $pn_rows_complete / $pn_total_rows * 100; if (is_null($ps_row_message)) { $ps_row_message = _t('Reloading %1/%2', $pn_rows_complete, $pn_total_rows); } if (is_null($ps_table_message)) { $ps_table_message = _t('Reloading sort values for %1 (%2/%3)', $ps_display_name, $pn_tables_processed, sizeof($pa_table_list)); } $pn_table_percentage = $pn_tables_processed / sizeof($pa_table_list) * 100; print "<script type='text/javascript'>"; print "jQuery('#progressbarTables').progressbar('value',{$pn_table_percentage}); jQuery('#searchReindexTableStatus').html('{$ps_table_message}');"; print "jQuery('#progressbarRows').progressbar('value',{$pn_percentage}); jQuery('#searchReindexRowStatus').html('{$ps_row_message}');"; print "jQuery('#searchReindexElapsedTime').html('" . caFormatInterval($pn_elapsed_time) . "/" . sprintf("%4.2f mb", $pn_memory_used / 1048576) . "');"; print "</script>"; caFlushOutput(); }
/** * Returns text describing dimensions of object representation * * @param DbResult or ca_object_representations instance $po_rep An object containing representation data. Can be either a DbResult object (ie. a query result) or ca_object_representations instance (an instance representing a row in the ca_object_representation class) * @param string $ps_version the name of the media version to return dimensions information for * @param array $pa_options Array of options, including: * returnAsArray = if set an array with elements of the dimensions display text is returned * @return mixed Text ready for display describing dimensions of the representation's media. Can be array if 'returnAsArray' option is set. */ function caGetRepresentationDimensionsForDisplay($po_rep, $ps_version, $pa_options = null) { $va_tmp = $po_rep->getMediaInfo('media', $ps_version); $va_dimensions = array(); if (isset($va_tmp['WIDTH']) && isset($va_tmp['HEIGHT'])) { if (($vn_w = $va_tmp['WIDTH']) && ($vn_h = $va_tmp['HEIGHT'])) { $va_dimensions[] = $va_tmp['WIDTH'] . 'p x ' . $va_tmp['HEIGHT'] . 'p'; } } if (isset($va_tmp['PROPERTIES']['bitdepth']) && ($vn_depth = $va_tmp['PROPERTIES']['bitdepth'])) { $va_dimensions[] = intval($vn_depth) . ' bpp'; } if (isset($va_tmp['PROPERTIES']['colorspace']) && ($vs_colorspace = $va_tmp['PROPERTIES']['colorspace'])) { $va_dimensions[] = $vs_colorspace; } if (isset($va_tmp['PROPERTIES']['resolution']) && is_array($va_resolution = $va_tmp['PROPERTIES']['resolution'])) { if (isset($va_resolution['x']) && isset($va_resolution['y']) && $va_resolution['x'] && $va_resolution['y']) { // TODO: units for resolution? right now assume pixels per inch if ($va_resolution['x'] == $va_resolution['y']) { $va_dimensions[] = $va_resolution['x'] . 'ppi'; } else { $va_dimensions[] = $va_resolution['x'] . 'x' . $va_resolution['y'] . 'ppi'; } } } if (isset($va_tmp['PROPERTIES']['duration']) && ($vn_duration = $va_tmp['PROPERTIES']['duration'])) { $va_dimensions[] = caFormatInterval($vn_duration); } if (isset($va_tmp['PROPERTIES']['pages']) && ($vn_pages = $va_tmp['PROPERTIES']['pages'])) { $va_dimensions[] = $vn_pages . ' ' . ($vn_pages == 1 ? _t('page') : _t('pages')); } if (!isset($va_tmp['PROPERTIES']['filesize']) || !($vn_filesize = $va_tmp['PROPERTIES']['filesize'])) { $vn_filesize = @filesize($po_rep->getMediaPath('media', $ps_version)); } if ($vn_filesize) { $va_dimensions[] = caFormatFileSize($vn_filesize); } if (isset($pa_options['returnAsArray']) && $pa_options['returnAsArray']) { return $va_dimensions; } return join('; ', $va_dimensions); }
/** * Forces a full reindex of all rows in the database or, optionally, a single table * * @param array $pa_table_name * @param array $pa_options Reindexing options: * showProgress * interactiveProgressDisplay * log * callback */ public function reindex($pa_table_names = null, $pa_options = null) { define('__CollectiveAccess_IS_REINDEXING__', 1); $t_timer = new Timer(); $pb_display_progress = isset($pa_options['showProgress']) ? (bool) $pa_options['showProgress'] : true; $pb_interactive_display = isset($pa_options['interactiveProgressDisplay']) ? (bool) $pa_options['interactiveProgressDisplay'] : false; $ps_callback = isset($pa_options['callback']) ? (string) $pa_options['callback'] : false; if ($pa_table_names) { if (!is_array($pa_table_names)) { $pa_table_names = array($pa_table_names); } $va_table_names = array(); foreach ($pa_table_names as $vs_table) { if ($this->opo_datamodel->tableExists($vs_table)) { $vn_num = $this->opo_datamodel->getTableNum($vs_table); print "\nTRUNCATING {$vs_table}\n\n"; $this->opo_engine->truncateIndex($vn_num); $t_instance = $this->opo_datamodel->getInstanceByTableName($vs_table, true); $va_table_names[$vn_num] = array('name' => $vs_table, 'num' => $vn_num, 'displayName' => $t_instance->getProperty('NAME_PLURAL')); } } if (!sizeof($va_table_names)) { return false; } } else { // full reindex $this->opo_engine->truncateIndex(); $va_table_names = $this->getIndexedTables(); } $o_db = $this->opo_db; if ($pb_display_progress || $ps_callback) { $va_names = array(); foreach ($va_table_names as $vn_table_num => $va_table_info) { $va_names[] = $va_table_info['displayName']; } if ($pb_display_progress) { print "\nWILL INDEX [" . join(", ", $va_names) . "]\n\n"; } } $vn_tc = 0; foreach ($va_table_names as $vn_table_num => $va_table_info) { $vs_table = $va_table_info['name']; $t_table_timer = new Timer(); $t_instance = $this->opo_datamodel->getInstanceByTableName($vs_table, true); $vs_table_pk = $t_instance->primaryKey(); $va_fields_to_index = $this->getFieldsToIndex($vn_table_num); if (!is_array($va_fields_to_index) || sizeof($va_fields_to_index) == 0) { continue; } $qr_all = $o_db->query("SELECT " . $t_instance->primaryKey() . " FROM {$vs_table}"); $vn_num_rows = $qr_all->numRows(); if ($pb_display_progress) { print CLIProgressBar::start($vn_num_rows, _t('Indexing %1', $t_instance->getProperty('NAME_PLURAL'))); } $vn_c = 0; while ($qr_all->nextRow()) { $t_instance->load($qr_all->get($t_instance->primaryKey())); $t_instance->doSearchIndexing(array(), true, $this->opo_engine->engineName()); if ($pb_display_progress && $pb_interactive_display) { print CLIProgressBar::next(); } if ($ps_callback && !($vn_c % 100)) { $ps_callback($vn_c, $vn_num_rows, null, null, (double) $t_timer->getTime(2), memory_get_usage(true), $va_table_names, $vn_table_num, $t_instance->getProperty('NAME_PLURAL'), $vn_tc + 1); } $vn_c++; } $qr_all->free(); unset($t_instance); if ($pb_display_progress && $pb_interactive_display) { print CLIProgressBar::finish(); } $this->opo_engine->optimizeIndex($vn_table_num); $vn_tc++; } if ($pb_display_progress) { print "\n\n\nDone! [Indexing for " . join(", ", $va_names) . " took " . caFormatInterval((double) $t_timer->getTime(4)) . "]\n"; } if ($ps_callback) { $ps_callback(1, 1, _t('Elapsed time: %1', caFormatInterval((double) $t_timer->getTime(2))), _t('Index rebuild complete!'), (double) $t_timer->getTime(2), memory_get_usage(true), $va_table_names, null, null, sizeof($va_table_names)); } }
/** * Return via Ajax current status of running tool job */ public function GetJobStatus() { if (!$this->request->isLoggedIn() || !$this->request->user->canDoAction('can_use_plugin_tools')) { $this->response->setRedirect($this->request->config->get('error_display_url') . '/n/3500?r=' . urlencode($this->request->getFullUrlPath())); return; } $ps_job_id = $this->request->getParameter('job_id', pString); $o_progress = new ProgressBar('WebUI', null, $ps_job_id); $va_data = $o_progress->getDataForJobID(); $va_data['elapsedTime'] = caFormatInterval(time() - $va_data['start']); $this->view->setVar('jobinfo', $va_data); $this->render('tools/tool_runjob_json.php'); }
public function dispatchLoopShutdown() { // // Force output to be sent - we need the client to have the page before // we start flushing progress bar updates // $app = AppController::getInstance(); $req = $app->getRequest(); $resp = $app->getResponse(); $resp->sendResponse(); $resp->clearContent(); // // Do reindexing // if ($req->isLoggedIn() && $req->user->canDoAction('can_do_search_reindex')) { set_time_limit(3600 * 8); $o_db = new Db(); $t_timer = new Timer(); $va_table_names = array('ca_objects', 'ca_object_lots', 'ca_places', 'ca_entities', 'ca_occurrences', 'ca_collections', 'ca_storage_locations', 'ca_object_representations', 'ca_representation_annotations', 'ca_lists', 'ca_list_items', 'ca_loans', 'ca_movements', 'ca_tours', 'ca_tour_stops'); $vn_tc = 0; foreach ($va_table_names as $vs_table) { require_once __CA_MODELS_DIR__ . "/{$vs_table}.php"; $t_table = new $vs_table(); $vs_pk = $t_table->primaryKey(); $qr_res = $o_db->query("SELECT {$vs_pk} FROM {$vs_table}"); if ($vs_label_table_name = $t_table->getLabelTableName()) { require_once __CA_MODELS_DIR__ . "/{$vs_label_table_name}.php"; $va_table_names[] = $vs_label_table_name; $t_label = new $vs_label_table_name(); $vs_label_pk = $t_label->primaryKey(); $qr_labels = $o_db->query("SELECT {$vs_label_pk} FROM {$vs_label_table_name}"); $vn_c = 0; $vn_num_rows = $qr_labels->numRows(); $vn_table_num = $t_label->tableNum(); while ($qr_labels->nextRow()) { $vn_label_pk_val = $qr_labels->get($vs_label_pk); if (!($vn_c % 100)) { caIncrementSortValueReloadProgress($vn_c, $vn_num_rows, null, null, $t_timer->getTime(2), memory_get_usage(true), $va_table_names, $vn_table_num, $t_label->getProperty('NAME_PLURAL'), $vn_tc + 1); } if ($t_label->load($vn_label_pk_val)) { $t_label->setMode(ACCESS_WRITE); $t_label->update(); } $vn_c++; } $vn_tc++; } $vn_table_num = $t_table->tableNum(); $vn_num_rows = $qr_res->numRows(); $vn_c = 0; while ($qr_res->nextRow()) { $vn_pk_val = $qr_res->get($vs_pk); if (!($vn_c % 100)) { caIncrementSortValueReloadProgress($vn_c, $vn_num_rows, null, null, $t_timer->getTime(2), memory_get_usage(true), $va_table_names, $vn_table_num, $t_table->getProperty('NAME_PLURAL'), $vn_tc + 1); } if ($t_table->load($vn_pk_val)) { $t_table->setMode(ACCESS_WRITE); if ($vs_table == 'ca_object_representations') { $t_table->set('md5', $t_table->getMediaInfo('ca_object_representations.media', 'original', 'MD5')); $t_table->set('mimetype', $t_table->getMediaInfo('ca_object_representations.media', 'original', 'MIMETYPE')); $va_media_info = $t_table->getMediaInfo('ca_object_representations.media'); $t_table->set('original_filename', $va_media_info['ORIGINAL_FILENAME']); } $t_table->update(); if ($vs_table == 'ca_object_representations') { if (!$t_table->getPreferredLabelCount()) { $t_table->addLabel(array('name' => trim($va_media_info['ORIGINAL_FILENAME']) ? $va_media_info['ORIGINAL_FILENAME'] : _t('Representation')), $pn_locale_id, null, true); } } } $vn_c++; } $vn_tc++; } caIncrementSortValueReloadProgress(1, 1, _t('Elapsed time: %1', caFormatInterval($t_timer->getTime(2))), _t('Index rebuild complete!'), $t_timer->getTime(2), memory_get_usage(true), $va_table_names, null, null, sizeof($va_table_names)); } }
/** * Forces a full reindex of all rows in the database or, optionally, a single table * * @param array $pa_table_names * @param array $pa_options Reindexing options: * showProgress * interactiveProgressDisplay * log * callback * @return null|false */ public function reindex($pa_table_names = null, $pa_options = null) { define('__CollectiveAccess_IS_REINDEXING__', 1); $t_timer = new Timer(); $pb_display_progress = isset($pa_options['showProgress']) ? (bool) $pa_options['showProgress'] : true; $pb_interactive_display = isset($pa_options['interactiveProgressDisplay']) ? (bool) $pa_options['interactiveProgressDisplay'] : false; $ps_callback = isset($pa_options['callback']) ? (string) $pa_options['callback'] : false; if ($pa_table_names) { if (!is_array($pa_table_names)) { $pa_table_names = array($pa_table_names); } $va_table_names = array(); foreach ($pa_table_names as $vs_table) { if ($this->opo_datamodel->tableExists($vs_table)) { $vn_num = $this->opo_datamodel->getTableNum($vs_table); if ($pb_display_progress) { print "\nTRUNCATING {$vs_table}\n\n"; } $this->opo_engine->truncateIndex($vn_num); $t_instance = $this->opo_datamodel->getInstanceByTableName($vs_table, true); $va_table_names[$vn_num] = array('name' => $vs_table, 'num' => $vn_num, 'displayName' => $t_instance->getProperty('NAME_PLURAL')); } } if (!sizeof($va_table_names)) { return false; } } else { // full reindex $this->opo_engine->truncateIndex(); $va_table_names = $this->getIndexedTables(); } $o_db = $this->opo_db; if ($pb_display_progress || $ps_callback) { $va_names = array(); foreach ($va_table_names as $vn_table_num => $va_table_info) { $va_names[] = $va_table_info['displayName']; } if ($pb_display_progress) { print "\nWILL INDEX [" . join(", ", $va_names) . "]\n\n"; } } $vn_tc = 0; foreach ($va_table_names as $vn_table_num => $va_table_info) { $vs_table = $va_table_info['name']; $t_table_timer = new Timer(); $t_instance = $this->opo_datamodel->getInstanceByTableName($vs_table, true); $vs_table_pk = $t_instance->primaryKey(); $vn_table_num = $t_instance->tableNum(); $va_fields_to_index = $this->getFieldsToIndex($vn_table_num); if (!is_array($va_fields_to_index) || sizeof($va_fields_to_index) == 0) { continue; } $qr_all = $o_db->query("SELECT " . $t_instance->primaryKey() . " FROM {$vs_table}"); $vn_num_rows = $qr_all->numRows(); if ($pb_display_progress) { print CLIProgressBar::start($vn_num_rows, _t('Indexing %1', $t_instance->getProperty('NAME_PLURAL'))); } $vn_c = 0; $va_ids = $qr_all->getAllFieldValues($t_instance->primaryKey()); $va_element_ids = null; if (method_exists($t_instance, "getApplicableElementCodes")) { $va_element_ids = array_keys($t_instance->getApplicableElementCodes(null, false, false)); } $vn_table_num = $t_instance->tableNum(); $vs_table_pk = $t_instance->primaryKey(); $va_field_data = array(); $va_intrinsic_list = $this->getFieldsToIndex($vs_table, $vs_table, array('intrinsicOnly' => true)); $va_intrinsic_list[$vs_table_pk] = array(); foreach ($va_ids as $vn_i => $vn_id) { if (!($vn_i % 200)) { // Pre-load attribute values for next 200 items to index; improves index performance $va_id_slice = array_slice($va_ids, $vn_i, 200); if ($va_element_ids) { ca_attributes::prefetchAttributes($o_db, $vn_table_num, $va_id_slice, $va_element_ids); } $qr_field_data = $o_db->query("\n\t\t\t\t\t\tSELECT " . join(", ", array_keys($va_intrinsic_list)) . " \n\t\t\t\t\t\tFROM {$vs_table}\n\t\t\t\t\t\tWHERE {$vs_table_pk} IN (?)\t\n\t\t\t\t\t", array($va_id_slice)); $va_field_data = array(); while ($qr_field_data->nextRow()) { $va_field_data[(int) $qr_field_data->get($vs_table_pk)] = $qr_field_data->getRow(); } } $this->indexRow($vn_table_num, $vn_id, $va_field_data[$vn_id], true, null, array(), array()); if ($pb_display_progress && $pb_interactive_display) { CLIProgressBar::setMessage("Memory: " . caGetMemoryUsage()); print CLIProgressBar::next(); } if ($ps_callback && !($vn_c % 100)) { $ps_callback($vn_c, $vn_num_rows, null, null, (double) $t_timer->getTime(2), memory_get_usage(true), $va_table_names, $vn_table_num, $t_instance->getProperty('NAME_PLURAL'), $vn_tc + 1); } $vn_c++; } $qr_all->free(); unset($t_instance); if ($pb_display_progress && $pb_interactive_display) { print CLIProgressBar::finish(); } $this->opo_engine->optimizeIndex($vn_table_num); $vn_tc++; } if ($pb_display_progress) { print "\n\n\nDone! [Indexing for " . join(", ", $va_names) . " took " . caFormatInterval((double) $t_timer->getTime(4)) . "]\n"; print "Note that if you're using an external search service like Apache Solr, the data may only now be sent to the actual service because it was buffered until now. So you still might have to wait a while for the script to finish.\n"; } if ($ps_callback) { $ps_callback(1, 1, _t('Elapsed time: %1', caFormatInterval((double) $t_timer->getTime(2))), _t('Index rebuild complete!'), (double) $t_timer->getTime(2), memory_get_usage(true), $va_table_names, null, null, sizeof($va_table_names)); } }
/** * */ public function getItemInfo() { $ps_search = str_replace('"', '', $this->request->getParameter('search', pString)); $va_values = array(); $t_item = new ca_commerce_order_items(); $o_search = new ObjectSearch(); $qr_res = $o_search->search("ca_objects.idno:\"{$ps_search}\""); if (!$qr_res->numHits()) { $qr_res = $o_search->search($ps_search); } $va_object_ids = array(); while ($qr_res->nextHit()) { $va_object_ids[] = (int) $qr_res->get('ca_objects.object_id'); } $va_items = array('search' => $ps_search, 'matches' => array()); if (sizeof($va_object_ids)) { $o_db = new Db(); $qr_items = $o_db->query("\n\t\t\t\t\tSELECT i.item_id, o.order_id\n\t\t\t\t\tFROM ca_commerce_order_items i\n\t\t\t\t\tINNER JOIN ca_commerce_orders AS o ON o.order_id = i.order_id\n\t\t\t\t\tWHERE\n\t\t\t\t\t\tobject_id IN (?) AND o.order_type = 'L' AND i.loan_return_date IS NULL\n\t\t\t\t", array($va_object_ids)); while ($qr_items->nextRow()) { $t_item = new ca_commerce_order_items($qr_items->get('item_id')); $t_order = $t_item->getOrder(); $va_values = $t_item->getFieldValuesArray(); $va_values['user'] = $t_order->getOrderTransactionUserName(); // get object label $t_object = $t_item->getItemObject(); $va_values['object'] = $t_object->get('ca_objects.preferred_labels.name'); $va_values['idno'] = $t_object->get('ca_objects.idno'); // generate display dates $va_values['loan_checkout_date_raw'] = $va_values['loan_checkout_date']; $va_values['loan_checkout_date'] = caGetLocalizedDate($va_values['loan_checkout_date'], array('dateFormat' => 'delimited', 'timeOmit' => true)); $va_values['loan_due_date_raw'] = $va_values['loan_due_date']; $va_values['loan_due_date'] = caGetLocalizedDate($va_values['loan_due_date'], array('dateFormat' => 'delimited', 'timeOmit' => true)); if ($va_values['loan_due_date_raw'] < time()) { $va_values['loan_due_date'] .= " (<em>" . _t("Overdue by %1", caFormatInterval(time() - $va_values['loan_due_date_raw'], 2)) . "</em>)"; } $va_values['order_number'] = $t_order->getOrderNumber(); $va_rep = $t_object->getPrimaryRepresentation(array('thumbnail')); $va_values['thumbnail_tag'] = $va_rep['tags']['thumbnail']; $va_items['matches'][] = $va_values; } } $this->view->setVar('items', $va_items); return $this->render('ajax_order_item_info_json.php'); }
/** * Get orders matching criteria specified by options * * @param array $pa_options An array of options: * user_id = * transaction_id = * created_on = date range expression * shipping_date = * shipped_on_date = * shipping_method = * order_status = * search = * type = * loan_checkout_date = * loan_due_date = * loan_return_date = * is_overdue = * is_outstanding = * object_id = * exclude = optional array of order_id's to omit from the returned list */ public function getOrders($pa_options = null) { $o_db = $this->getDb(); $vb_join_transactions = false; $va_sql_wheres = $va_sql_values = array(); if (isset($pa_options['is_overdue']) && (bool) $pa_options['is_overdue']) { $pa_options['type'] = 'L'; $va_sql_wheres[] = "(i.loan_due_date < ?)"; $va_sql_values[] = time(); $va_sql_wheres[] = "(i.loan_return_date IS NULL)"; } if (isset($pa_options['exclude']) && is_array($pa_options['exclude'])) { $va_sql_wheres[] = "(o.order_id NOT IN (?))"; $va_sql_values[] = $pa_options['exclude']; } if (isset($pa_options['is_outstanding']) && (bool) $pa_options['is_outstanding']) { $pa_options['type'] = 'L'; $va_sql_wheres[] = "(i.loan_return_date IS NULL)"; } if (!is_array($pa_options['order_status'])) { if (isset($pa_options['order_status']) && strlen($pa_options['order_status'])) { $pa_options['order_status'] = array((string) $pa_options['order_status']); } } if (is_array($pa_options['order_status'])) { foreach ($pa_options['order_status'] as $vn_i => $vs_s) { if (!in_array($vs_s, $this->getFieldInfo('order_status', 'BOUNDS_CHOICE_LIST'))) { unset($pa_options['order_status'][$vn_i]); } } if (sizeof($pa_options['order_status'])) { $va_sql_wheres[] = "(o.order_status IN (?))"; $va_sql_values[] = $pa_options['order_status']; } } if (isset($pa_options['type']) && in_array($pa_options['type'], array('O', 'L'))) { $va_sql_wheres[] = "(o.order_type = ?)"; $va_sql_values[] = (string) $pa_options['type']; } if (isset($pa_options['shipping_method']) && strlen($pa_options['shipping_method'])) { $va_sql_wheres[] = "(o.shipping_method = ?)"; $va_sql_values[] = (string) $pa_options['shipping_method']; } if (isset($pa_options['user_id']) && strlen($pa_options['user_id'])) { $va_sql_wheres[] = "(t.user_id = ?)"; $va_sql_values[] = (int) $pa_options['user_id']; $vb_join_transactions = true; } if (isset($pa_options['transaction_id']) && strlen($pa_options['transaction_id'])) { $va_sql_wheres[] = "(o.transaction_id = ?)"; $va_sql_values[] = (int) $pa_options['transaction_id']; } if (isset($pa_options['created_on']) && strlen($pa_options['created_on'])) { if (is_array($va_dates = caDateToUnixTimestamps($pa_options['created_on']))) { $va_sql_wheres[] = "(o.created_on BETWEEN ? AND ?)"; $va_sql_values[] = (double) $va_dates['start']; $va_sql_values[] = (double) $va_dates['end']; } } if (isset($pa_options['object_id']) && strlen($pa_options['object_id'])) { $va_sql_wheres[] = "(i.object_id = ?)"; $va_sql_values[] = (int) $pa_options['object_id']; } if (isset($pa_options['loan_checkout_date']) && strlen($pa_options['loan_checkout_date'])) { if (is_array($va_dates = caDateToUnixTimestamps($pa_options['loan_checkout_date']))) { $va_sql_wheres[] = "(i.loan_checkout_date BETWEEN ? AND ?)"; $va_sql_values[] = (double) $va_dates['start']; $va_sql_values[] = (double) $va_dates['end']; } } if (isset($pa_options['loan_due_date']) && strlen($pa_options['loan_due_date'])) { if (is_array($va_dates = caDateToUnixTimestamps($pa_options['loan_due_date']))) { $va_sql_wheres[] = "(i.loan_due_date BETWEEN ? AND ?)"; $va_sql_values[] = (double) $va_dates['start']; $va_sql_values[] = (double) $va_dates['end']; } } if (isset($pa_options['loan_return_date']) && strlen($pa_options['loan_return_date'])) { if (is_array($va_dates = caDateToUnixTimestamps($pa_options['loan_return_date']))) { $va_sql_wheres[] = "(i.loan_return_date BETWEEN ? AND ?)"; $va_sql_values[] = (double) $va_dates['start']; $va_sql_values[] = (double) $va_dates['end']; } } if (isset($pa_options['shipping_date']) && strlen($pa_options['shipping_date'])) { $o_tep = new TimeExpressionParser(); if ($o_tep->parse($pa_options['shipping_date'])) { $va_dates = $o_tep->getUnixTimestamps(); $va_sql_wheres[] = "(o.shipping_date BETWEEN ? AND ?)"; $va_sql_values[] = (double) $va_dates['start']; $va_sql_values[] = (double) $va_dates['end']; } } if (isset($pa_options['shipped_on_date']) && strlen($pa_options['shipped_on_date'])) { $o_tep = new TimeExpressionParser(); if ($o_tep->parse($pa_options['shipped_on_date'])) { $va_dates = $o_tep->getUnixTimestamps(); $va_sql_wheres[] = "(o.shipped_on_date BETWEEN ? AND ?)"; $va_sql_values[] = (double) $va_dates['start']; $va_sql_values[] = (double) $va_dates['end']; } } if (isset($pa_options['search']) && strlen($pa_options['search'])) { $o_search = new CommerceOrderSearch(); if ($qr_hits = $o_search->search($pa_options['search'])) { $va_ids = array(); while ($qr_hits->nextHit()) { $va_ids[] = $qr_hits->get('order_id'); } if (sizeof($va_ids)) { $va_sql_wheres[] = "(o.order_id IN (?))"; $va_sql_values[] = $va_ids; } else { $va_sql_wheres[] = "(o.order_id = 0)"; } } } $vs_sql_wheres = ''; if (sizeof($va_sql_wheres)) { $vs_sql_wheres = " AND " . join(" AND ", $va_sql_wheres); } // Get item additional fees $qr_res = $o_db->query($vs_sql = "\n\t \t\tSELECT \n\t \t\t\to.order_id, i.item_id, i.additional_fees\n\t \t\tFROM ca_commerce_orders o\n\t \t\tLEFT JOIN ca_commerce_order_items AS i ON o.order_id = i.order_id\n\t \t\t" . ($vb_join_transactions ? "INNER JOIN ca_commerce_transactions AS t ON t.transaction_id = o.transaction_id" : "") . "\n\t \t\tWHERE\n\t \t\t\to.deleted = 0 {$vs_sql_wheres}\n\t \t\t\t\n\t \t", $va_sql_values); $va_additional_fee_codes = $this->opo_client_services_config->getAssoc($this->get('order_type') == 'L' ? 'additional_loan_fees' : 'additional_order_item_fees'); $va_order_item_additional_fees = array(); while ($qr_res->nextRow()) { $va_fees = caUnserializeForDatabase($qr_res->get('additional_fees')); $vn_fee_total = 0; foreach ($va_additional_fee_codes as $vs_code => $va_info) { if (isset($va_fees[$vs_code])) { $vn_fee_total += (double) $va_fees[$vs_code]; } } $va_order_item_additional_fees[$qr_res->get('order_id')] += $vn_fee_total; } // Get overdue items (only if type is set to [L]oan) if (isset($pa_options['type']) && $pa_options['type'] == 'L') { $qr_res = $o_db->query("\n\t\t\t\tSELECT \n\t\t\t\t\to.order_id, \n\t\t\t\t\tmin(i.loan_checkout_date) loan_checkout_date, min(i.loan_due_date) loan_due_date\n\t\t\t\tFROM ca_commerce_orders o\n\t\t\t\tINNER JOIN ca_commerce_order_items AS i ON o.order_id = i.order_id\n\t \t\t\t" . ($vb_join_transactions ? "INNER JOIN ca_commerce_transactions AS t ON t.transaction_id = o.transaction_id" : "") . "\n\t\t\t\tWHERE\n\t\t\t\t\to.deleted = 0 AND i.loan_return_date IS NULL\n\t\t\t\t\t{$vs_sql_wheres}\n\t\t\t\tGROUP BY o.order_id\n\t\t\t\t\t\n\t\t\t", $va_sql_values); $va_due_dates = $va_overdue_dates = array(); $vn_t = time(); while ($qr_res->nextRow()) { $vn_due_date = $qr_res->get('loan_due_date'); if ($vn_due_date > $vn_t) { $va_due_dates[$qr_res->get('order_id')] = caFormatInterval($vn_due_date - $vn_t, 2); } else { $va_overdue_dates[$qr_res->get('order_id')] = caFormatInterval($vn_t - $vn_due_date, 2); } } } // Get item totals $qr_res = $o_db->query($vs_sql = "\n\t \t\tSELECT \n\t \t\t\to.*, \n\t \t\t\tsum(i.fee) order_total_item_fees, \n\t \t\t\tsum(i.tax) order_total_item_tax, \n\t \t\t\t((o.shipping_cost) + (i.shipping_cost)) order_total_shipping, \n\t \t\t\t((o.handling_cost) + (i.handling_cost)) order_total_handling, \n\t \t\t\tcount(*) num_items, \n\t \t\t\tmin(i.loan_checkout_date) loan_checkout_date_start, min(i.loan_due_date) loan_due_date_start, min(i.loan_return_date) loan_return_date_start,\n\t \t\t\tmax(i.loan_checkout_date) loan_checkout_date_end, max(i.loan_due_date) loan_due_date_end, max(i.loan_return_date) loan_return_date_end\n\t \t\tFROM ca_commerce_orders o\n\t \t\tLEFT JOIN ca_commerce_order_items AS i ON o.order_id = i.order_id\n\t \t\t" . ($vb_join_transactions ? "INNER JOIN ca_commerce_transactions AS t ON t.transaction_id = o.transaction_id" : "") . "\n\t \t\tWHERE\n\t \t\t\to.deleted = 0 {$vs_sql_wheres}\n\t \t\tGROUP BY o.order_id\n\t \t\tORDER BY\n\t \t\t\to.created_on DESC\n\t \t\t\t\n\t \t", $va_sql_values); //print $vs_sql."; ".print_r($va_sql_values, true); $va_orders = array(); while ($qr_res->nextRow()) { $va_order = $qr_res->getRow(); $va_order['order_number'] = date('mdY', $va_order['created_on']) . '-' . $va_order['order_id']; // order additional fees $vn_additional_order_fees = 0; if (is_array($va_additional_fees = caUnserializeForDatabase($va_order['additional_fees']))) { foreach ($va_additional_fees as $vs_code => $vn_fee) { $vn_additional_order_fees += $vn_fee; } } $va_order['order_total'] = $va_order['order_total_item_fees'] + $va_order['order_total_item_tax'] + $va_order['order_total_shipping'] + $va_order['order_total_handling'] + $vn_additional_order_fees + (double) $va_order_item_additional_fees[$qr_res->get('order_id')]; if (isset($va_overdue_dates[$va_order['order_id']])) { $va_order['is_overdue'] = true; $va_order['overdue_period'] = $va_overdue_dates[$va_order['order_id']]; } else { if (isset($va_due_dates[$va_order['order_id']])) { $va_order['is_overdue'] = false; $va_order['due_period'] = $va_due_dates[$va_order['order_id']]; } } $va_orders[] = $va_order; } return $va_orders; }
/** * Import metadata using a mapping * * @param RequestHTTP $po_request The current request * @param string $ps_source A path to a file or directory of files to import * @param string $ps_importer The code of the importer (mapping) to use * @param string $ps_input_format The format of the source data * @param array $pa_options * progressCallback = * reportCallback = * sendMail = * dryRun = * importAllDatasets = * log = log directory path * logLevel = KLogger constant for minimum log level to record. Default is KLogger::INFO. Constants are, in descending order of shrillness: * KLogger::EMERG = Emergency messages (system is unusable) * KLogger::ALERT = Alert messages (action must be taken immediately) * KLogger::CRIT = Critical conditions * KLogger::ERR = Error conditions * KLogger::WARN = Warnings * KLogger::NOTICE = Notices (normal but significant conditions) * KLogger::INFO = Informational messages * KLogger::DEBUG = Debugging messages */ public static function importMetadata($po_request, $ps_source, $ps_importer, $ps_input_format, $pa_options = null) { $va_errors = $va_noticed = array(); $vn_start_time = time(); $o_config = Configuration::load(); if (!ca_data_importers::mappingExists($ps_importer)) { $va_errors['general'] = array('idno' => "*", 'label' => "*", 'errors' => array(_t('Importer %1 does not exist', $ps_importer)), 'status' => 'ERROR'); return false; } $vs_log_dir = caGetOption('log', $pa_options, null); $vs_log_level = caGetOption('logLevel', $pa_options, "INFO"); $vb_import_all_datasets = caGetOption('importAllDatasets', $pa_options, false); $vb_dry_run = caGetOption('dryRun', $pa_options, false); $vn_log_level = BatchProcessor::_logLevelStringToNumber($vs_log_level); if (!isURL($ps_source) && is_dir($ps_source)) { $va_sources = caGetDirectoryContentsAsList($ps_source, true, false, false, false); } else { $va_sources = array($ps_source); } $vn_file_num = 0; foreach ($va_sources as $vs_source) { $vn_file_num++; if (!ca_data_importers::importDataFromSource($vs_source, $ps_importer, array('fileNumber' => $vn_file_num, 'numberOfFiles' => sizeof($va_sources), 'logDirectory' => $o_config->get('batch_metadata_import_log_directory'), 'request' => $po_request, 'format' => $ps_input_format, 'showCLIProgressBar' => false, 'useNcurses' => false, 'progressCallback' => isset($pa_options['progressCallback']) ? $pa_options['progressCallback'] : null, 'reportCallback' => isset($pa_options['reportCallback']) ? $pa_options['reportCallback'] : null, 'logDirectory' => $vs_log_dir, 'logLevel' => $vn_log_level, 'dryRun' => $vb_dry_run, 'importAllDatasets' => $vb_import_all_datasets))) { $va_errors['general'][] = array('idno' => "*", 'label' => "*", 'errors' => array(_t("Could not import source %1", $ps_source)), 'status' => 'ERROR'); return false; } else { $va_notices['general'][] = array('idno' => "*", 'label' => "*", 'errors' => array(_t("Imported data from source %1", $ps_source)), 'status' => 'SUCCESS'); //return true; } } $vn_elapsed_time = time() - $vn_start_time; if (isset($pa_options['sendMail']) && $pa_options['sendMail']) { if ($vs_email = trim($po_request->user->get('email'))) { caSendMessageUsingView($po_request, array($vs_email => $po_request->user->get('fname') . ' ' . $po_request->user->get('lname')), __CA_ADMIN_EMAIL__, _t('[%1] Batch metadata import completed', $po_request->config->get('app_display_name')), 'batch_metadata_import_completed.tpl', array('notices' => $va_notices, 'errors' => $va_errors, 'numErrors' => sizeof($va_errors), 'numProcessed' => sizeof($va_notices), 'subjectNameSingular' => _t('row'), 'subjectNamePlural' => _t('rows'), 'startedOn' => caGetLocalizedDate($vn_start_time), 'completedOn' => caGetLocalizedDate(time()), 'elapsedTime' => caFormatInterval($vn_elapsed_time))); } } if (isset($pa_options['sendSMS']) && $pa_options['sendSMS']) { SMS::send($po_request->getUserID(), _t("[%1] Metadata import processing for begun at %2 is complete", $po_request->config->get('app_display_name'), caGetLocalizedDate($vn_start_time))); } return array('errors' => $va_errors, 'notices' => $va_notices, 'processing_time' => caFormatInterval($vn_elapsed_time)); }
/** * @param array $pa_options * progressCallback = * reportCallback = * sendMail = * log = log directory path * logLevel = KLogger loglevel. Default is "INFO" */ public static function importMetadata($po_request, $ps_source, $ps_importer, $ps_input_format, $pa_options = null) { $va_errors = $va_noticed = array(); $vn_start_time = time(); $o_config = Configuration::load(); if (!ca_data_importers::mappingExists($ps_importer)) { $va_errors['general'] = array('idno' => "*", 'label' => "*", 'errors' => array(_t('Importer %1 does not exist', $ps_importer)), 'status' => 'ERROR'); return false; } $vs_log_dir = isset($pa_options['log']) ? $pa_options['log'] : null; $vn_log_level = KLogger::INFO; switch ($vs_log_level = isset($pa_options['logLevel']) ? $pa_options['logLevel'] : "INFO") { case 'DEBUG': $vn_log_level = KLogger::DEBUG; break; case 'NOTICE': $vn_log_level = KLogger::NOTICE; break; case 'WARN': $vn_log_level = KLogger::WARN; break; case 'ERR': $vn_log_level = KLogger::ERR; break; case 'CRIT': $vn_log_level = KLogger::CRIT; break; case 'ALERT': $vn_log_level = KLogger::ALERT; break; default: case 'INFO': $vn_log_level = KLogger::INFO; break; } if (!ca_data_importers::importDataFromSource($ps_source, $ps_importer, array('logDirectory' => $o_config->get('batch_metadata_import_log_directory'), 'request' => $po_request, 'format' => $ps_input_format, 'showCLIProgressBar' => false, 'useNcurses' => false, 'progressCallback' => isset($pa_options['progressCallback']) ? $pa_options['progressCallback'] : null, 'reportCallback' => isset($pa_options['reportCallback']) ? $pa_options['reportCallback'] : null, 'logDirectory' => $vs_log_dir, 'logLevel' => $vn_log_level))) { $va_errors['general'] = array('idno' => "*", 'label' => "*", 'errors' => array(_t("Could not import source %1", $vs_data_source)), 'status' => 'ERROR'); return false; } else { $va_notices['general'] = array('idno' => "*", 'label' => "*", 'errors' => array(_t("Imported data from source %1", $vs_data_source)), 'status' => 'SUCCESS'); //return true; } $vn_elapsed_time = time() - $vn_start_time; if (isset($pa_options['sendMail']) && $pa_options['sendMail']) { if ($vs_email = trim($po_request->user->get('email'))) { caSendMessageUsingView($po_request, array($vs_email => $po_request->user->get('fname') . ' ' . $po_request->user->get('lname')), __CA_ADMIN_EMAIL__, _t('[%1] Batch metadata import completed', $po_request->config->get('app_display_name')), 'batch_metadata_import_completed.tpl', array('notices' => $va_notices, 'errors' => $va_errors, 'numErrors' => sizeof($va_errors), 'numProcessed' => sizeof($va_notices), 'subjectNameSingular' => _t('row'), 'subjectNamePlural' => _t('rows'), 'startedOn' => $vs_started_on, 'completedOn' => caGetLocalizedDate(time()), 'elapsedTime' => caFormatInterval($vn_elapsed_time))); } } if (isset($pa_options['sendSMS']) && $pa_options['sendSMS']) { SMS::send($po_request->getUserID(), _t("[%1] Metadata import processing for begun at %2 is complete", $po_request->config->get('app_display_name'), $vs_started_on)); } return array('errors' => $va_errors, 'notices' => $va_notices, 'processing_time' => caFormatInterval($vn_elapsed_time)); }
/** * Return via Ajax current status of running import job */ public function GetImportStatus() { if (!$this->request->user->canDoAction('can_import_worldcat')) { return; } $ps_job_id = $this->request->getParameter('job_id', pString); $o_progress = new ProgressBar('WebUI', null, $ps_job_id); $va_data = $o_progress->getDataForJobID(); $va_data['elapsedTime'] = caFormatInterval(time() - $va_data['start']); $this->view->setVar('info', $va_data); $this->render('import_run_json.php'); }
/** * * * @return string */ function caLoadULAN($ps_path_to_ulan_data = null, $ps_path_to_ulan_config = null, $pa_options = null) { require_once __CA_LIB_DIR__ . '/core/Db.php'; require_once __CA_LIB_DIR__ . '/core/Configuration.php'; require_once __CA_LIB_DIR__ . '/ca/Utils/DataMigrationUtils.php'; require_once __CA_MODELS_DIR__ . '/ca_locales.php'; require_once __CA_MODELS_DIR__ . '/ca_entities.php'; require_once __CA_MODELS_DIR__ . '/ca_entities_x_entities.php'; require_once __CA_MODELS_DIR__ . '/ca_lists.php'; require_once __CA_MODELS_DIR__ . '/ca_list_items.php'; require_once __CA_MODELS_DIR__ . '/ca_list_items_x_list_items.php'; require_once __CA_MODELS_DIR__ . '/ca_relationship_types.php'; $t = new Timer(); $o_log = new KLogger(__CA_APP_DIR__ . '/log', KLogger::INFO); $va_parent_child_links = array(); $va_item_item_links = array(); $va_ulan_id_to_item_id = array(); $o_log->logInfo("Starting import of Getty ULAN"); define('__CA_DONT_DO_SEARCH_INDEXING__', true); $_ = new Zend_Translate('gettext', __CA_APP_DIR__ . '/locale/en_US/messages.mo', 'en_US'); $t_locale = new ca_locales(); $pn_en_locale_id = $t_locale->loadLocaleByCode('en_US'); if (!($o_config = Configuration::load($ps_path_to_ulan_config))) { $o_log->logError("Could not load ULAN import configuration file"); die("ERROR: Could not load ULAN import configuration\n"); } $vs_ulan_import_mode = $o_config->get('ulan_import_target'); $t_list = null; if ($vs_ulan_import_mode == 'ca_entities') { $va_ulan_types = $o_config->getAssoc('ulan_entity_types'); $va_mapping = $o_config->getAssoc('ulan_entity_mapping'); } elseif ($vs_ulan_import_mode == 'ca_list_items') { $va_ulan_types = $o_config->getAssoc('ulan_list_item_types'); if (!($vs_ulan_list_code = $o_config->get('ulan_import_list'))) { $vs_ulan_list_code = 'ULAN'; } // create vocabulary list record (if it doesn't exist already) $t_list = new ca_lists(); if (!$t_list->load(array('list_code' => $vs_ulan_list_code))) { $t_list->setMode(ACCESS_WRITE); $t_list->set('list_code', $vs_ulan_list_code); $t_list->set('is_system_list', 0); $t_list->set('is_hierarchical', 1); $t_list->set('use_as_vocabulary', 1); $t_list->insert(); if ($t_list->numErrors()) { $o_log->logError("Could not create list record for ULAN: " . join('; ', $t_list->getErrors())); die("ERROR: couldn't create ca_list row for ULAN: " . join('; ', $t_list->getErrors()) . "\n"); } $t_list->addLabel(array('name' => 'Union List of Artist Names'), $pn_en_locale_id, null, true); } $vn_list_id = $t_list->getPrimaryKey(); $va_mapping = $o_config->getAssoc('ulan_list_item_mapping'); } else { $o_log->logError("Invalid ULAN import mode {$vs_ulan_import_mode}"); die("ERROR: invalid ULAN import mode {$vs_ulan_import_mode}\n"); } $vn_last_message_length = 0; $vn_term_count = 0; $va_subject = array(); foreach (array('ULAN1.xml', 'ULAN2.xml', 'ULAN3.xml') as $vs_file) { if (!$ps_path_to_ulan_data) { $ps_path_to_ulan_data = "."; } if (!file_exists($ps_path_to_ulan_data . "/{$vs_file}")) { $o_log->logError("Could not find ULAN data file {$vs_file}"); print "[ERROR] cannot find ULAN data.\n"; continue; } $o_log->logInfo("Processing ULAN file {$vs_file}"); print "[Notice] Processing ULAN file {$vs_file}\n"; // load $o_xml = new XMLReader(); $o_xml->open($ps_path_to_ulan_data . '/' . $vs_file); while ($o_xml->read()) { switch ($o_xml->name) { # --------------------------- case 'Subject': if ($o_xml->nodeType == XMLReader::END_ELEMENT) { if (in_array($va_subject['subject_id'], array('500000000', '500000001'))) { break; } // skip top-level root $vs_preferred_term = $va_subject['preferred_term']; $pb_is_enabled = false; switch ($va_subject['record_type']) { case 'Person': default: $vn_type_id = $va_ulan_types['Person']; $pb_is_enabled = true; break; case 'Corporate Body': $vn_type_id = $va_ulan_types['Corporate Body']; $pb_is_enabled = true; break; } print str_repeat(chr(8), $vn_last_message_length); $vs_message = "\tIMPORTING #" . ($vn_term_count + 1) . " [" . $va_subject['subject_id'] . "] " . $vs_preferred_term; if (($vn_l = 100 - strlen($vs_message)) < 1) { $vn_l = 1; } $vs_message .= str_repeat(' ', $vn_l); $vn_last_message_length = strlen($vs_message); print $vs_message; if ($vs_ulan_import_mode == 'ca_entities') { $va_np_labels = array(); if (is_array($va_subject['non_preferred_terms'])) { for ($vn_i = 0; $vn_i < sizeof($va_subject['non_preferred_terms']); $vn_i++) { $va_np_labels[] = DataMigrationUtils::splitEntityName(trim(htmlentities($va_subject['non_preferred_terms'][$vn_i]))); } } $t_item = DataMigrationUtils::getEntityID(DataMigrationUtils::splitEntityName(trim(htmlentities($vs_preferred_term, ENT_NOQUOTES))), $vn_type_id, $pn_en_locale_id, array('idno' => $va_subject['subject_id']), array('nonPreferredLabels' => $va_np_labels, 'returnInstance' => true)); if (!$t_item) { $o_log->logError("Failed to create entity for ULAN artist {$vs_preferred_term}"); break; } $t_item->setMode(ACCESS_WRITE); $va_ulan_id_to_item_id[$va_subject['subject_id']] = $t_item->getPrimaryKey(); } else { if ($t_item = $t_list->addItem($va_subject['subject_id'], $pb_is_enabled, false, null, $vn_type_id, $va_subject['subject_id'], '', 4, 1)) { $va_ulan_id_to_item_id[$va_subject['subject_id']] = $t_item->getPrimaryKey(); if ($va_subject['preferred_parent_subject_id'] != 500000000) { $va_parent_child_links[$va_subject['subject_id']] = $va_subject['preferred_parent_subject_id']; } // add preferred labels if (!$t_item->addLabel(array('name_singular' => trim(htmlentities($vs_preferred_term, ENT_NOQUOTES)), 'name_plural' => trim(htmlentities($vs_preferred_term, ENT_NOQUOTES)), 'description' => $va_subject['description']), $pn_en_locale_id, null, true)) { $o_log->logError("Could not add preferred label to ULAN term [" . $va_subject['subject_id'] . "] " . $vs_preferred_term . ": " . join("; ", $t_item->getErrors())); } // add alternate labels if (is_array($va_subject['non_preferred_terms'])) { for ($vn_i = 0; $vn_i < sizeof($va_subject['non_preferred_terms']); $vn_i++) { $vs_np_label = $va_subject['non_preferred_terms'][$vn_i]; $vs_np_term_type = $va_subject['non_preferred_term_types'][$vn_i]; switch ($vs_np_term_type) { case 'Used For Term': $vn_np_term_type_id = $vn_list_item_label_type_uf; break; case 'Alternate Descriptor': $vn_np_term_type_id = $vn_list_item_label_type_alt; break; default: $vn_np_term_type_id = null; break; } if (!$t_item->addLabel(array('name_singular' => trim(htmlentities($vs_np_label, ENT_NOQUOTES)), 'name_plural' => trim(htmlentities($vs_np_label, ENT_NOQUOTES)), 'description' => ''), $pn_en_locale_id, $vn_np_term_type_id, false)) { $o_log->logError("Could not add non-preferred label to ULAN term [" . $va_subject['subject_id'] . "] " . $vs_np_label); } } } } else { $o_log->logError("Could not import ULAN term [" . $va_subject['subject_id'] . "] " . $vs_preferred_term . ": " . join("; ", $t_list->getErrors())); break; } } // Map content fields foreach ($va_mapping as $vs_dest => $vs_source) { $va_values = array(); switch ($vs_source) { case 'biography': if (!is_array($va_subject['biographies'])) { break; } foreach ($va_subject['biographies'] as $va_bio) { $va_values[] = $va_bio['text']; } break; case 'biography_dates': if (!is_array($va_subject['biographies'])) { break; } foreach ($va_subject['biographies'] as $va_bio) { if ($va_bio['birth_date'] == 1000 || $va_bio['birth_date'] < -5000) { if ($va_bio['death_date'] >= 2050) { break 2; } else { $va_values[] = "before " . $va_bio['death_date']; } } elseif ($va_bio['death_date'] >= 2050) { $va_values[] = "after " . $va_bio['birth_date']; } else { $va_values[] = $va_bio['birth_date'] . " - " . $va_bio['death_date']; } } break; case 'sex': if (!is_array($va_subject['biographies'])) { break; } foreach ($va_subject['biographies'] as $va_bio) { $va_values[] = $va_bio['sex']; } break; case 'nationality_name': if (!is_array($va_subject['nationalities'])) { break; } foreach ($va_subject['nationalities'] as $va_nationality) { $va_values[] = $va_nationality['name']; } break; case 'nationality_code': if (!is_array($va_subject['nationalities'])) { break; } foreach ($va_subject['nationalities'] as $va_nationality) { $va_values[] = $va_nationality['code']; } break; case 'role_name': if (!is_array($va_subject['roles'])) { break; } foreach ($va_subject['roles'] as $va_role) { $va_values[] = $va_role['name']; } break; case 'role_code': if (!is_array($va_subject['roles'])) { break; } foreach ($va_subject['roles'] as $va_role) { $va_values[] = $va_role['code']; } break; } if (sizeof($va_values)) { $va_dest = explode('.', $vs_dest); $vs_fld = array_pop($va_dest); if ($t_item->hasField($vs_fld)) { $t_item->set($vs_fld, join("\n", $va_values)); } else { foreach ($va_values as $vs_value) { $t_item->addAttribute(array('locale_id' => $pn_en_locale_id, $vs_fld => $vs_value), $vs_fld); } } $t_item->update(array('dontCheckCircularReferences' => true, 'dontSetHierarchicalIndexing' => true)); if ($t_item->numErrors()) { $o_log->logError("Could not update ULAN list item with content values: " . join("; ", $t_item->getErrors())); } } } // record item-item relations if (is_array($va_subject['related_subjects'])) { foreach ($va_subject['related_subjects'] as $vs_rel_subject_id) { $va_item_item_links[$va_subject['subject_id']] = $vs_rel_subject_id; } } $vn_term_count++; } else { $va_subject = array('subject_id' => $o_xml->getAttribute('Subject_ID')); } break; # --------------------------- # --------------------------- case 'Biographies': while ($o_xml->read()) { switch ($o_xml->name) { case 'Preferred_Biography': $va_bio = array(); while ($o_xml->read()) { switch ($o_xml->name) { case 'Biography_Text': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_bio['text'] = $o_xml->value; break; } break; case 'Birth_Date': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_bio['birth_date'] = $o_xml->value; if ($va_bio['birth_date'] < 0) { $va_bio['birth_date'] = abs($va_bio['birth_date']) . " BCE"; } break; } break; case 'Death_Date': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_bio['death_date'] = $o_xml->value; if ($va_bio['death_date'] < 0) { $va_bio['death_date'] = abs($va_bio['death_date']) . " BCE"; } break; } break; case 'Sex': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_bio['sex'] = $o_xml->value; break; } break; case 'Preferred_Biography': break 2; } } $va_subject['biographies'][] = $va_bio; break; case 'Biographies': break 2; } } break; # --------------------------- # --------------------------- case 'Nationalities': while ($o_xml->read()) { switch ($o_xml->name) { case 'Preferred_Nationality': $va_nationality = array(); while ($o_xml->read()) { switch ($o_xml->name) { case 'Nationality_Code': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_nationality['code'] = $o_xml->value; $va_nationality['name'] = array_pop(explode('/', $o_xml->value)); break; } break; case 'Preferred_Nationality': break 2; } } $va_subject['nationalities'][] = $va_nationality; break; case 'Nationalities': break 2; } } break; # --------------------------- # --------------------------- case 'Roles': while ($o_xml->read()) { switch ($o_xml->name) { case 'Preferred_Role': $va_role = array(); while ($o_xml->read()) { switch ($o_xml->name) { case 'Role_ID': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_role['code'] = $o_xml->value; $va_role['name'] = array_pop(explode('/', $o_xml->value)); break; } break; case 'Preferred_Role': break 2; } } $va_subject['roles'][] = $va_role; break; case 'Roles': break 2; } } break; # --------------------------- # --------------------------- case 'Record_Type': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_subject['record_type'] = $o_xml->value; break; } break; # --------------------------- # --------------------------- case 'Hierarchy': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_subject['hierarchy'] = $o_xml->value; break; } break; # --------------------------- # --------------------------- case 'Parent_Relationships': $vn_parent_id = $vs_historic_flag = null; while ($o_xml->read()) { switch ($o_xml->name) { case 'Preferred_Parent': while ($o_xml->read()) { switch ($o_xml->name) { case 'Parent_Subject_ID': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $vn_parent_id = $o_xml->value; break; } break; case 'Historic_Flag': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $vs_historic_flag = $o_xml->value; break; } break; case 'Preferred_Parent': $va_subject['preferred_parent_subject_id'] = $vn_parent_id; break 2; } } break; case 'Parent_Relationships': break 2; } } break; # --------------------------- # --------------------------- case 'Preferred_Term': while ($o_xml->read()) { switch ($o_xml->name) { case 'Term_Type': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_subject['preferred_term_type'] = $o_xml->value; break; } break; case 'Term_Text': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_subject['preferred_term'] = $o_xml->value; break; } break; case 'Term_ID': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_subject['preferred_term_id'] = $o_xml->value; break; } break; break; case 'Preferred_Term': break 2; } } break; # --------------------------- # --------------------------- case 'Non-Preferred_Term': while ($o_xml->read()) { switch ($o_xml->name) { case 'Term_Type': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_subject['non_preferred_term_types'][] = $o_xml->value; break; } break; case 'Term_Text': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_subject['non_preferred_terms'][] = $o_xml->value; break; } break; case 'Term_ID': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_subject['non_preferred_term_ids'][] = $o_xml->value; break; } break; case 'Non-Preferred_Term': break 2; } } break; # --------------------------- # --------------------------- case 'VP_Subject_ID': switch ($o_xml->nodeType) { case XMLReader::ELEMENT: $o_xml->read(); $va_subject['related_subjects'][] = $o_xml->value; break; } break; # --------------------------- } } $o_xml->close(); } $o_log->logInfo("Begin linking ULAN terms in hierarchy"); print "\n\nLINKING TERMS IN HIERARCHY...\n"; $vn_last_message_length = 0; $t_list = new ca_lists(); $t_item = new ca_list_items(); $t_item->setMode(ACCESS_WRITE); $vn_list_root_id = $t_list->getRootListItemID($vn_list_id); foreach ($va_parent_child_links as $vs_child_id => $vs_parent_id) { print str_repeat(chr(8), $vn_last_message_length); $vs_message = "\tLINKING {$vs_child_id} to parent {$vs_parent_id}"; if (($vn_l = 100 - strlen($vs_message)) < 1) { $vn_l = 1; } $vs_message .= str_repeat(' ', $vn_l); $vn_last_message_length = strlen($vs_message); print $vs_message; if (in_array($vs_parent_id, array('500000000', '500000001'))) { if (!$t_item->load($vn_child_item_id)) { $o_log->logError("Could not load item for {$vs_child_id} (was translated to item_id={$vn_child_item_id})"); continue; } $t_item->set('parent_id', $vn_list_root_id); $t_item->update(array('dontCheckCircularReferences' => true, 'dontSetHierarchicalIndexing' => true)); if ($t_item->numErrors()) { $o_log->logError("Could not set parent_id for {$vs_child_id} to root): " . join('; ', $t_item->getErrors())); continue; } $va_ulan_id_to_item_id[$vs_parent_id] = $vn_list_root_id; } if (!($vn_child_item_id = $va_ulan_id_to_item_id[$vs_child_id])) { $o_log->logError("No list item id for child_id {$vs_child_id} (were there previous errors?)"); continue; } if (!($vn_parent_item_id = $va_ulan_id_to_item_id[$vs_parent_id])) { $o_log->logError("No list item id for parent_id {$vs_parent_id} (were there previous errors?)"); continue; } if (!$t_item->load($vn_child_item_id)) { $o_log->logError("Could not load item for {$vs_child_id} (was translated to item_id={$vn_child_item_id})"); continue; } $t_item->set('parent_id', $vn_parent_item_id); $t_item->update(array('dontCheckCircularReferences' => true, 'dontSetHierarchicalIndexing' => true)); if ($t_item->numErrors()) { $o_log->logError("Could not set parent_id for {$vs_child_id} (was translated to item_id={$vn_child_item_id}): " . join('; ', $t_item->getErrors())); } } if ($vn_list_item_relation_type_id_related > 0) { $o_log->logInfo("Begin adding ULAN related term links"); $vn_last_message_length = 0; $t_item = new ca_list_items(); $t_link = new ca_list_items_x_list_items(); $t_link->setMode(ACCESS_WRITE); foreach ($va_item_item_links as $vs_left_id => $vs_right_id) { print str_repeat(chr(8), $vn_last_message_length); $vs_message = "\tLINKING {$vs_left_id} to {$vs_right_id}"; if (($vn_l = 100 - strlen($vs_message)) < 1) { $vn_l = 1; } $vs_message .= str_repeat(' ', $vn_l); $vn_last_message_length = strlen($vs_message); print $vs_message; if (!($vn_left_item_id = $va_ulan_id_to_item_id[$vs_left_id])) { $o_log->logError("No list item id for left_id {$vs_left_id} (were there previous errors?)"); continue; } if (!($vn_right_item_id = $va_ulan_id_to_item_id[$vs_right_id])) { $o_log->logError("No list item id for right_id {$vs_right_id} (were there previous errors?)"); continue; } $t_link->set('term_left_id', $vn_left_item_id); $t_link->set('term_right_id', $vn_right_item_id); $t_link->set('type_id', $vn_list_item_relation_type_id_related); $t_link->insert(); if ($t_link->numErrors()) { $o_log->logError("Could not set link between {$vs_left_id} (was translated to item_id={$vn_left_item_id}) and {$vs_right_id} (was translated to item_id={$vn_right_item_id}): " . join('; ', $t_link->getErrors())); } } } else { $o_log->logWarn("Skipped import of term-term relationships because the ca_list_items_x_list_items 'related' relationship type is not defined for your installation"); } $vn_duration = $t->getTime(1); $vs_time = caFormatInterval($vn_duration); $o_log->logInfo("Rebuilding hierarchical indices..."); $t_item->rebuildAllHierarchicalIndexes(); $o_log->logInfo("ULAN import complete. Took {$vs_time} ({$vn_duration})"); print "\n\nIMPORT COMPLETE. Took {$vs_time} ({$vn_duration})\n"; }
function caIncrementBatchMetadataImportProgress($po_request, $pn_file_number, $pn_number_of_files, $ps_file_path, $pn_rows_complete, $pn_total_rows, $ps_message, $pn_elapsed_time, $pn_memory_used, $pn_num_processed, $pn_num_errors) { if ($pn_total_rows == 0) { return; } $pn_percentage = $pn_rows_complete / $pn_total_rows * 100; if (is_null($ps_message)) { $ps_message = _t('Processed %1/%2', $pn_rows_complete, $pn_total_rows); } $ps_message = addslashes($ps_message); $ps_file_message = _t('File %1/%2 [%3]', $pn_file_number, $pn_number_of_files, pathinfo($ps_file_path, PATHINFO_FILENAME)); $pn_file_percentage = $pn_file_number / $pn_number_of_files * 100; print "<script type='text/javascript'>"; if ($pn_number_of_files <= 1) { print "jQuery('#batchProcessingTableProgressGroup').hide();"; } print "jQuery('#progressbarFiles').progressbar('value',{$pn_file_percentage}); jQuery('#batchProcessingFileCount').html('{$ps_file_message}');"; print "jQuery('#progressbar').progressbar('value',{$pn_percentage}); jQuery('#batchProcessingRowProgressGroup').html('{$ps_message}');"; print "jQuery('#batchProcessingElapsedTime').html('" . caFormatInterval($pn_elapsed_time) . "/" . sprintf("%4.2f mb", $pn_memory_used / 1048576) . "');"; print "jQuery('#batchProcessingCounts').html('" . addslashes(_t("%1 processed; %2 errors", $pn_num_processed, $pn_num_errors)) . "');"; print "</script>"; caFlushOutput(); }