* @link https://imports.museum-digital.org/parsers/google-arts-and-culture.php */ declare(strict_types = 1); const DB_NAME_IMDAS = 'imdas_dreieich'; /** * Loads all data from statement. * * @param MDMysqliStmt $stmt Statement. * @param integer $object_id Object ID. * * @return array */ function getAllFromStmt(MDMysqliStmt $stmt, int $object_id):array { $stmt->bind_param("i", $object_id); $stmt->execute(); $result = $stmt->do_get_result(); $output = $result->fetch_all(MYSQLI_ASSOC); $result->close(); return $output; } /** * Parse function. * * @param array $version Instance to import into. * @param integer $institution_id Institution to import to. * @param non-empty-string $XMLFolder Folder of the XML files to import. * @param string $dataFolder Data folder. * @param integer $sammlung_id Collection ID. Optional. * @param boolean $visibility Import objects to be directly visible?. * @param boolean $insertOnly If set to true, only new objects are added, * old are not updated. * * @return void */ function parseImportXML(array $version, int $institution_id, string $XMLFolder, string $dataFolder = "", int $sammlung_id = 0, bool $visibility = false, bool $insertOnly = false) { if (!is_dir(MD_IMPORTER_CONF::$import_dir_xml . "{$XMLFolder}")) throw new MDFileDoesNotExist("The folder to import from ($XMLFolder) does not exist."); if (empty($dataFolder)) { $importImages = false; } else $importImages = true; $ignore = $visibility; $ignore = $sammlung_id; // Set up writers $collectionWriter = new MDCollectionWriter($version['mainDB']); # $literatureWriter = new MDLiteratureWriter($version['mainDB']); # $linkWriter = new MDLinkWriter($version['mainDB']); # $seriesWriter = new MDSeriesWriter($version['mainDB']); $tagWriter = new MDTagWriter($version['nodaDB']); $outputHandler = new MDOutputHandler; $outputHandler->setVerbosity(2); $objectWriter = new MDObjectWriter($version['mainDB'], $version['nodaDB'], $version['link'], $version['filepath'], $version['dataFolderLink']); /* $objectWriter->disableImportAdditionalData = true; $objectWriter->disableUpdateBaseData = true; $objectWriter->disableImportCollections = true; $objectWriter->disableImportEvents = true; $objectWriter->disableImportTags = true; $objectWriter->disableImportLiterature = true; $objectWriter->disableImportHyperlinks = true; // $objectWriter->disableImportSeries = true; $objectWriter->disableImportImagesResources = true; $objectWriter->disableImportObjectRecords = true; $objectWriter->disableImportTranscriptions = true; $objectWriter->disableImportMarkings = true; $objectWriter->disableImportExhibitions = true; $objectWriter->disableImportReception = true; $objectWriter->importObjectTypeAsTag = true; */ $mysqli = $version['mainDB']; // Set up prepared statement for checking if a tag of a given name exists $tagNameExistsStmt = $version['nodaDB']->do_prepare("SELECT `tag_id` FROM `tag` WHERE `tag_name` = ? LIMIT 1"); $objResult = $mysqli->do_read_query("SELECT *, `language`.`code` AS `lang_code`, `res_type`.`name` AS `res_type_name` FROM `" . DB_NAME_IMDAS . "`.`object` LEFT JOIN `" . DB_NAME_IMDAS . "`.`real_obj` ON `object`.`object_id` = `real_obj`.`object_id` LEFT JOIN `" . DB_NAME_IMDAS . "`.`res_type` ON `object`.`res_type_id` = `res_type`.`res_type_id` LEFT JOIN `" . DB_NAME_IMDAS . "`.`coin_main` ON `object`.`object_id` = `coin_main`.`object_id` LEFT JOIN `" . DB_NAME_IMDAS . "`.`media_obj` ON `object`.`object_id` = `media_obj`.`object_id` LEFT JOIN `" . DB_NAME_IMDAS . "`.`language` ON `object`.`language_id` = `language`.`language_id` LEFT JOIN `" . DB_NAME_IMDAS . "`.`coll_obj` ON `object`.`object_id` = `coll_obj`.`object_id` "); $colorStmt = $mysqli->do_prepare("SELECT `color_name`, `obj_part`.`name` AS `part_name` FROM `" . DB_NAME_IMDAS . "`.`color_type`, `" . DB_NAME_IMDAS . "`.`obj_color`, `" . DB_NAME_IMDAS . "`.`obj_part` WHERE `object_id` = ? AND `obj_color`.`color_type_id` = `color_type`.`color_type_id` AND `obj_color`.`part_id` = `obj_part`.`part_id`"); $collectionStmt = $mysqli->do_prepare("SELECT * FROM `" . DB_NAME_IMDAS . "`.`collection` WHERE `collection_id` = ?"); $specialsStmt = $mysqli->do_prepare("SELECT * FROM `" . DB_NAME_IMDAS . "`.`obj_specials` WHERE `object_id` = ?"); $tagsStmt = $mysqli->do_prepare("SELECT * FROM `" . DB_NAME_IMDAS . "`.`term_obj`, `" . DB_NAME_IMDAS . "`.`thes_rel` WHERE `object_id` = ? AND `thes_rel`.`thes_rel_id` = `term_obj`.`thes_rel_id`"); /* $vtrStmt = $mysqli->do_prepare("SELECT * FROM `" . DB_NAME_IMDAS . "`.`vtr`, `" . DB_NAME_IMDAS . "`.`vtr_term` WHERE `object_id` = ? AND `vtr_term`.`term_id` = `vtr`.`term_id`"); */ $measurementsStmt = $mysqli->do_prepare("SELECT `obj_value`, `unit`.`name` AS `unit_name`, `value_type`.`name` FROM `" . DB_NAME_IMDAS . "`.`obj_value`, `" . DB_NAME_IMDAS . "`.`value_type`, `" . DB_NAME_IMDAS . "`.`unit` WHERE `object_id` = ? AND `obj_value`.`value_type_id` = `value_type`.`value_type_id` AND `obj_value`.`unit_id` = `unit`.`unit_id`"); $objNumStmt = $mysqli->do_prepare("SELECT `note`, `obj_num`.`num`, `obj_num_type`.`name` AS `type_name` FROM `" . DB_NAME_IMDAS . "`.`obj_num`, `" . DB_NAME_IMDAS . "`.`obj_num_type` WHERE `object_id` = ? AND `obj_num`.`num_type_id` = `obj_num_type`.`num_type_id`"); $entryStmt = $mysqli->do_prepare("SELECT * FROM `" . DB_NAME_IMDAS . "`.`regist_hist`, `" . DB_NAME_IMDAS . "`.`regist_type` WHERE `object_id` = ? AND `regist_hist`.`regist_type_id` = `regist_type`.`regist_type_id`"); $inscriptionStmt = $mysqli->do_prepare("SELECT `inscription`, `obj_part`.`name` AS `part_name` FROM `" . DB_NAME_IMDAS . "`.`obj_inscr`, `" . DB_NAME_IMDAS . "`.`obj_part` WHERE `object_id` = ? AND `obj_inscr`.`part_id` = `obj_part`.`part_id`"); $locationStmt = $mysqli->do_prepare("SELECT * FROM `" . DB_NAME_IMDAS . "`.`obj_loc_new`, `" . DB_NAME_IMDAS . "`.`location` WHERE `object_id` = ? AND `obj_loc_new`.`location_id` = `location`.`location_id`"); $personStmt = $mysqli->do_prepare("SELECT `role`.`name` AS `role_name`, `person`.*, `obj_pers_role`.`note` FROM `" . DB_NAME_IMDAS . "`.`obj_pers_role`, `" . DB_NAME_IMDAS . "`.`role`, `" . DB_NAME_IMDAS . "`.`person` WHERE `object_id` = ? AND `obj_pers_role`.`person_id` = `person`.`person_id` AND `obj_pers_role`.`role_id` = `role`.`role_id`"); $placeStmt = $mysqli->do_prepare("SELECT `place_type`.`name` AS `type_name`, `obj_place`.`note`, `thes_rel`.`name` AS `place_name` FROM `" . DB_NAME_IMDAS . "`.`obj_place`, `" . DB_NAME_IMDAS . "`.`place_type`, `" . DB_NAME_IMDAS . "`.`thes_rel` WHERE `object_id` = ? AND `obj_place`.`place_type_id` = `place_type`.`place_type_id` AND `obj_place`.`thes_rel_id` = `thes_rel`.`thes_rel_id`"); echo "HI"; while ($objectData = $objResult->fetch_assoc()) { $outputHandler->toLog("Reading object " . $objectData['object_id'], 2); if (empty($objectData['object_id'])) continue; $object_id = $objectData['object_id']; $objectData['color'] = getAllFromStmt($colorStmt, $object_id); $objectData['collection'] = getAllFromStmt($collectionStmt, $object_id); $objectData['specials'] = getAllFromStmt($specialsStmt, $object_id); $objectData['tags'] = getAllFromStmt($tagsStmt, $object_id); // $objectData['vtr'] = getAllFromStmt($vtrStmt, $object_id); $objectData['measurements'] = getAllFromStmt($measurementsStmt, $object_id); $objectData['objNum'] = getAllFromStmt($objNumStmt, $object_id); $objectData['entryHist'] = getAllFromStmt($entryStmt, $object_id); $objectData['inscription'] = getAllFromStmt($inscriptionStmt, $object_id); $objectData['location'] = getAllFromStmt($locationStmt, $object_id); $objectData['person'] = getAllFromStmt($personStmt, $object_id); $objectData['place'] = getAllFromStmt($placeStmt, $object_id); // Remove unwanted data foreach ($objectData as $key => $value) { if (empty($value)) { unset($objectData[$key]); continue; } if (is_array($value)) { foreach ($value as $innerKey => $innerValue) { foreach ($innerValue as $innerInnerKey => $innerInnerValue) { if ($innerInnerValue === null || $innerInnerValue === '') { unset($objectData[$key][$innerKey][$innerInnerKey]); } } } if (empty($objectData[$key])) unset($objectData[$key]); } } // Remove unwanted values unset($objectData['regist_num_serial'], $objectData['import_id'], $objectData['updatevtr'], $objectData['invent_jn'], $objectData['publikum'], $objectData['updateobjsort'], $objectData['default_coll'], $objectData['media_type_id'], $objectData['invalid'], $objectData['ser_num'], $objectData['language_id'], $objectData['sort_regist_num'], $objectData['obj_status_id'], $objectData['elimination'], $objectData['name'], $objectData['code'], $objectData['res_type_id'], $objectData['regist_type_id'], $objectData['photographer_id'], $objectData['owner_original_id'], $objectData['collection_id'], $objectData['sort_local_num'], $objectData['regist_str'], ); // Parse if (empty($objectData)) continue; if (!empty($objectData['regist_num'])) { $invNo = $objectData['regist_num']; } else { $invNo = $objectData['object_id']; } $object = new MDObject($version['mainDB'], $version['nodaDB'], $version['language'], $institution_id, $invNo, $objectData["res_type_name"], $objectData["title"] ?? $invNo, $objectData["description"] ?? $objectData['short_descr'] ?? '-', $outputHandler); unset($objectData['regist_num'], $objectData['object_id'], $objectData['title'], $objectData['res_type_name'], $objectData['description']); if (!empty($objectData['regist_date'])) { $object->set_string("ersterfasst_zeitpunkt", (string)$objectData['regist_date']); } if (!empty($objectData['obj_history'])) { $object->set_string("objektgeschichte", (string)$objectData['obj_history']); } unset($objectData['obj_history']); if (!empty($objectData['current_loc'])) { $object->set_string("standort_aktuell", (string)$objectData['current_loc']); } unset($objectData['current_loc']); if (!empty($objectData['condition'])) { $object->set_string("restaurierung", (string)$objectData['condition']); } unset($objectData['condition']); if (!empty($objectData['num_pieces'])) { $object->set_string("stueckzahl", (string)$objectData['num_pieces']); } unset($objectData['num_pieces']); if (!empty($objectData['inscription'])) { foreach ($objectData['inscription'] as $inscription) { $object->append_string("beschriftung2", PHP_EOL . ($inscription['part_name'] ?? '') . ': ' . $inscription['inscription'] . PHP_EOL); } } unset($objectData['inscription']); if (!empty($objectData['lang_code'])) { if (isset(MDLanguagesSet::AVAILABLE_LANGUAGES[$objectData['lang_code']])) { $object->set_string("content_language", $objectData['lang_code']); } } unset($objectData['lang_code']); // Images in the museum $imgFields = [ 'studio', 'rights', 'statu_o_cons', ]; foreach ($imgFields as $fieldName) { if (!empty($objectData[$fieldName])) { $object->append_string("bilder_lokal", PHP_EOL . $fieldName . ' (imdas): ' . $objectData[$fieldName]); } unset($objectData[$fieldName]); } // Notes $notesFields = [ 'regist_num_year', 'lastdate', 'inv_date', 'guid', 'newdate', 'rec_date', 'altbestand', 'regist_date', 'negative_number', 'positive_number', 'local_num_text', 'local_number', 'remarks', 'reservation', 'short_descr', 'local_sub_number', ]; foreach ($notesFields as $fieldName) { if (!empty($objectData[$fieldName])) { $object->append_string("notizen_text1", PHP_EOL . $fieldName . ' (imdas): ' . $objectData[$fieldName]); } unset($objectData[$fieldName]); } if (!empty($objectData['color'])) { foreach ($objectData['color'] as $tEntry) { $object->append_string("notizen_text1", PHP_EOL . implode(': ', $tEntry) . PHP_EOL); } } unset($objectData['color']); if (!empty($objectData['collection'])) { foreach ($objectData['collection'] as $tCollection) { $object->appendCollectionByName($tCollection['name'], "ID: " . $tCollection['collection_id'] . PHP_EOL . 'Registriert: ' . $tCollection['lastdate'], $collectionWriter); } } unset($objectData['collection']); if (!empty($objectData['tags'])) { foreach ($objectData['tags'] as $tEntry) { if (empty($tEntry['name'])) continue; $object->appendTagByName($tEntry['name'], "", $tagWriter); } } unset($objectData['tags']); if (!empty($objectData['place'])) { foreach ($objectData['place'] as $tEntry) { if (empty($tEntry['place_name'])) continue; if (empty(MDConcPlace::PLACE_ROLES_TO_EVENT_TYPE[$tEntry['type_name']])) { throw new Exception("Unknown place type: " . $tEntry['type_name']); } $event = new MDEvent($version['mainDB'], $version['nodaDB'], $version['language'], MDConcPlace::PLACE_ROLES_TO_EVENT_TYPE[$tEntry['type_name']], $outputHandler); $event->set_orte_id($tEntry['place_name']); if (!empty($tEntry['note'])) { $event->set_ereignis_anmerkung($tEntry['note']); } if ($event->get_orte_id() !== 0) $object->appendEvent($event); } } unset($objectData['place']); if (!empty($objectData['location'])) { foreach ($objectData['location'] as $tEntry) { $object->append_string("standort_eigentlich", ' - ' . $tEntry['name'] . ' (' . $tEntry['abbreviation'] . '): ' . ($tEntry['description'] ?? '')); } } unset($objectData['location']); if (!empty($objectData['objNum'])) { foreach ($objectData['objNum'] as $tEntry) { $object->append_string("bilder_lokal", PHP_EOL . $tEntry['type_name'] . ': ' . $tEntry['num']); } } unset($objectData['objNum']); if (!empty($objectData['entryHist'])) { foreach ($objectData['entryHist'] as $tEntry) { if (!empty($tEntry['name'])) $object->set_entry_type("zugang_art", $tEntry['name']); if (!empty($tEntry['regist_hist'])) $object->set_string("zeitpunkt_zugang", $tEntry['regist_hist']); } } unset($objectData['entryHist']); if (!empty($objectData['specials'])) { foreach ($objectData['specials'] as $tKey => $tEntry) { unset($tEntry['object_id'], $tEntry['lastdate'], $tEntry['lastuser']); foreach ($tEntry as $innerKey => $innerValue) { if (empty($innerValue) || $innerValue == '0.0000') { unset($tEntry[$innerKey]); } } if (!empty($tEntry['dating_abs_hist'])) { $event = new MDEvent($version['mainDB'], $version['nodaDB'], $version['language'], 1, $outputHandler); $event->set_zeiten_id($tEntry['dating_abs_hist']); if ($event->get_zeiten_id() !== 0) $object->appendEvent($event); } unset($tEntry['dating_abs_hist']); if (empty($tEntry)) { unset($objectData['specials'][$tKey]); } } if (empty($objectData['specials'])) { unset($objectData['specials']); } } if (!empty($objectData['person'])) { foreach ($objectData['person'] as $tKey => $tEntry) { if ($tEntry['role_name'] === 'Voreigentümer') { $object->set_string("vorbesitzer", $tEntry['letter_addr'] ?? "" . ' ' . $tEntry['first_name'] ?? "" . ' ' . $tEntry['surename'] ?? "" . ' '); unset($objectData['person'][$tKey]); continue; } else if ($tEntry['role_name'] === 'Übernehmer') { $object->append_string("notizen_text1", PHP_EOL . "Überbringer" . $tEntry['letter_addr'] ?? "" . ' ' . $tEntry['first_name'] ?? "" . ' ' . $tEntry['surename'] ?? "" . ' ' . PHP_EOL); unset($objectData['person'][$tKey]); continue; } else if ($tEntry['role_name'] === 'Überbringer') { $object->append_string("notizen_text1", PHP_EOL . "Überbringer" . $tEntry['letter_addr'] ?? "" . ' ' . $tEntry['first_name'] ?? "" . ' ' . $tEntry['surename'] ?? "" . ' ' . PHP_EOL); unset($objectData['person'][$tKey]); continue; } else if ($tEntry['role_name'] === 'Hersteller') { $event = new MDEvent($version['mainDB'], $version['nodaDB'], $version['language'], 1, $outputHandler); $event->set_persinst_id($tEntry['letter_addr'] ?? "" . ' ' . $tEntry['first_name'] ?? "" . ' ' . $tEntry['surename']); if (!empty($tEntry['note'])) { $event->set_ereignis_anmerkung($tEntry['note']); } if ($event->get_persinst_id() !== 0) $object->appendEvent($event); unset($objectData['person'][$tKey]); continue; } } if (empty($objectData['person'])) unset($objectData['person']); } if (!empty($objectData['measurements'])) { foreach ($objectData['measurements'] as $tKey => $tEntry) { if (in_array($tEntry['name'], ['Schätzpreis 2005', 'Schätzpreis 2001', 'Schätzpreis 2004', 'Schätzpreis 2006', 'Schätzpreis 2003', 'Schätzpreis 2002', 'Schätzpreis 2007', 'Schätzpreis 1999', 'Schätzpreis 1998', 'Schätzpreis 1997', 'Bewertung', 'Schätzpreis 2008', 'Schätzpreis 2009'], true)) { $object->set_currency("wert_art", $tEntry['unit_name']); $object->set_string("wert_zahl", (string)$tEntry['obj_value']); $object->append_string("notizen_text1", PHP_EOL . $tEntry['name'] . ': ' . $tEntry['obj_value'] . ' ' . $tEntry['unit_name']); unset($objectData['measurements'][$tKey]); continue; } if (in_array($tEntry['name'], ['Kaufpreis'], true)) { $object->set_currency("geld_art", $tEntry['unit_name']); $object->set_string("ankaufsumme", (string)$tEntry['obj_value']); $object->append_string("notizen_text1", PHP_EOL . $tEntry['name'] . ': ' . $tEntry['obj_value'] . ' ' . $tEntry['unit_name']); unset($objectData['measurements'][$tKey]); continue; } else if (in_array($tEntry['name'], ['Höhe', 'Größe'], true)) { try { $object->set_length_unit("mass2_hoehe_einheit", $tEntry['unit_name']); } catch (MDInvalidLengthUnit $e) { } $object->set_string("mass2_hoehe_wert", (string)$tEntry['obj_value']); unset($objectData['measurements'][$tKey]); continue; } else if (in_array($tEntry['name'], ['Tiefe', 'Länge'], true)) { try { $object->set_length_unit("mass2_laenge_einheit", $tEntry['unit_name']); } catch (MDInvalidLengthUnit $e) { } $object->set_string("mass2_laenge_wert", (string)$tEntry['obj_value']); unset($objectData['measurements'][$tKey]); continue; } else if (in_array($tEntry['name'], ['Breite', 'Dicke'], true)) { try { $object->set_length_unit("mass2_breite_einheit", $tEntry['unit_name']); } catch (MDInvalidLengthUnit $e) { } $object->set_string("mass2_breite_wert", (string)$tEntry['obj_value']); unset($objectData['measurements'][$tKey]); continue; } else if (in_array($tEntry['name'], ['Gewicht'], true)) { try { $object->set_weight_unit("mass2_gewicht_einheit", $tEntry['unit_name']); } catch (MDInvalidWeightUnit $e) { } $object->set_string("mass2_gewicht_wert", (string)$tEntry['obj_value']); unset($objectData['measurements'][$tKey]); continue; } else if (in_array($tEntry['name'], ['Durchmesser', 'größter Durchmesser', 'Außenmaß (Durchmesser)'], true)) { try { $object->set_length_unit("mass2_durchmesser_einheit", $tEntry['unit_name']); } catch (MDInvalidLengthUnit $e) { } $object->set_string("mass2_durchmesser_wert", (string)$tEntry['obj_value']); unset($objectData['measurements'][$tKey]); continue; } else if (in_array($tEntry['name'], ['innen', 'Umfang', 'Hängehöhe', 'Ringmaß'], true)) { $object->append_string("notizen_text1", PHP_EOL . $tEntry['name'] . ': ' . $tEntry['unit_name'] . ', ' . $tEntry['obj_value']); unset($objectData['measurements'][$tKey]); continue; } } if (empty($objectData['measurements'])) unset($objectData['measurements']); } /* if (isset($objectData['Standort'])) { $object->set_string("standort_eigentlich", $objectData['Standort'] . ' / ' . $objectData['Zusatz']); unset($objectData['Standort'], $objectData['Zusatz']); } // Object base data $object = new MDObject($version['mainDB'], $version['nodaDB'], $version['language'], $institution_id, $objectData['Inventarnummer'], $objectData["Objektbezeichnung"], $objectData["Titel"] ?: $objectData['Inventarnummer'], $objectData["Bemerkung"], $outputHandler); unset($objectData['Inventarnummer'], $objectData["Objektbezeichnung"], $objectData["Titel"], $objectData["Bemerkung"]); $object->set_objekt_publik($visibility); if (isset($objectData['Breite'])) { $object->set_string("mass2_breite_wert", $objectData['Breite']); $object->set_length_unit("mass2_breite_einheit", $objectData['Maßeinheit']); unset($objectData['Breite'], $objectData['Maßeinheit']); } if (isset($objectData['Höhe'])) { $object->set_string("mass2_hoehe_wert", $objectData['Höhe']); $object->set_length_unit("mass2_hoehe_einheit", $objectData['Maßeinheit2']); unset($objectData['Höhe'], $objectData['Maßeinheit2']); } if (isset($objectData['Standort'])) { $object->set_string("standort_eigentlich", $objectData['Standort']); unset($objectData['Standort']); } unset($objectData['Objektart']); $object->appendSeriesByName("Schultafeln", "Schultafeln", $seriesWriter); */ if (!empty($objectData)) { throw new MDParserIncomplete(var_export($objectData, true)); } $newObjectID = $objectWriter->writeObject($object, true, $insertOnly, $outputHandler); $this->outputHandler->toLog("Imported to object #" . $newObjectID, MDConsoleStatus::UPDATE); // Sleep for a millisecond usleep(IMPORTER_DELAY_PER_OBJECT); } $tagNameExistsStmt->close(); unset($tagNameExistsStmt); }