From 77229dfaf35d7a9178afc2caf33e71b7ac0387b7 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Thu, 30 Apr 2026 09:36:13 -0400 Subject: [PATCH] =?UTF-8?q?chore:=20post-audit=20cleanup=20=E2=80=94=20gr/?= =?UTF-8?q?=20relocated,=20scratch=20+=20PR-body=20snapshots=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - gr/ folder moved to sibling repo at C:\Users\dohertj2\Desktop\graccess\gr; the SQL queries + DDL captures belong with the graccess CLI work, not with the OPC UA server. PR 7.2 retired direct Galaxy-DB access from this repo (mxaccessgw owns those queries server-side now). - Drop the now-obsolete "Galaxy Repository Database" section in CLAUDE.md for the same reason — server no longer queries the DB directly. - Delete root scratch files surfaced by the doc audit (runtimestatus.md, service_info.md) — abandoned plan + operational scratch. - Delete docs/v2/implementation/pr-{1,2,4}-body.md — ephemeral PR-body snapshots from the v2-mxgw rollout. Co-Authored-By: Claude Opus 4.7 (1M context) --- CLAUDE.md | 13 - docs/v2/implementation/pr-1-body.md | 80 - docs/v2/implementation/pr-2-body.md | 69 - docs/v2/implementation/pr-4-body.md | 91 - gr/CLAUDE.md | 51 - gr/build_layout_plan.md | 84 - gr/connectioninfo.md | 26 - gr/data_type_mapping.md | 96 - gr/ddl/tables/ConversionQueue.sql | 13 - gr/ddl/tables/CurrentSessionContainedName.sql | 9 - gr/ddl/tables/ImportTransaction.sql | 7 - gr/ddl/tables/aa_sql_objects.sql | 8 - gr/ddl/tables/affected_overview_symbols.sql | 9 - gr/ddl/tables/alarm_message_defaults.sql | 8 - gr/ddl/tables/alarm_message_timestamps.sql | 8 - gr/ddl/tables/alarm_message_translations.sql | 12 - gr/ddl/tables/alarm_messages.sql | 13 - gr/ddl/tables/attribute_definition.sql | 24 - gr/ddl/tables/attribute_reference.sql | 26 - .../tables/attributes_translation_table.sql | 11 - gr/ddl/tables/autobind_device.sql | 11 - gr/ddl/tables/autobind_device_category.sql | 11 - gr/ddl/tables/autobind_device_template.sql | 11 - gr/ddl/tables/autobind_device_topic.sql | 13 - gr/ddl/tables/autobind_naming_rule.sql | 8 - gr/ddl/tables/autobind_naming_rule_spec.sql | 12 - gr/ddl/tables/autobind_translation_rule.sql | 10 - gr/ddl/tables/autobound_attribute.sql | 17 - gr/ddl/tables/client_control_class_link.sql | 9 - gr/ddl/tables/client_info.sql | 11 - gr/ddl/tables/control_index.sql | 16 - gr/ddl/tables/data_type.sql | 9 - gr/ddl/tables/deleted_gobject.sql | 8 - gr/ddl/tables/deleted_ids.sql | 9 - gr/ddl/tables/deleted_visual_element.sql | 8 - .../tables/deleted_visual_element_version.sql | 13 - gr/ddl/tables/deployed_file.sql | 19 - gr/ddl/tables/deployed_intouch_viewapp.sql | 8 - ...ouch_viewapp_visual_element_dependency.sql | 7 - gr/ddl/tables/dynamic_attribute.sql | 25 - .../tables/external_content_media_types.sql | 12 - gr/ddl/tables/feature.sql | 9 - gr/ddl/tables/feature_file_link.sql | 11 - gr/ddl/tables/file_browserinfo_link.sql | 13 - gr/ddl/tables/file_pending_update.sql | 11 - .../tables/file_primitive_definition_link.sql | 15 - gr/ddl/tables/file_table.sql | 13 - gr/ddl/tables/folder.sql | 14 - gr/ddl/tables/folder_gobject_link.sql | 13 - gr/ddl/tables/galaxy.sql | 18 - gr/ddl/tables/galaxy_data.sql | 7 - gr/ddl/tables/galaxy_settings.sql | 8 - gr/ddl/tables/gobject.sql | 35 - gr/ddl/tables/gobject_asset_order.sql | 11 - gr/ddl/tables/gobject_change_log.sql | 16 - .../tables/gobject_filter_info_timestamp.sql | 11 - gr/ddl/tables/gobject_friendly_name.sql | 11 - gr/ddl/tables/gobject_log_details.sql | 7 - gr/ddl/tables/gobject_protected.sql | 6 - gr/ddl/tables/instance.sql | 13 - .../intouchviewapptemplate_allsymbols.sql | 6 - gr/ddl/tables/lookup_category.sql | 8 - gr/ddl/tables/lookup_folder.sql | 7 - gr/ddl/tables/lookup_operation.sql | 9 - gr/ddl/tables/lookup_package_op_status.sql | 8 - gr/ddl/tables/lookup_status.sql | 8 - gr/ddl/tables/lookup_table_name.sql | 7 - gr/ddl/tables/namespace.sql | 8 - gr/ddl/tables/object_device_linkage.sql | 9 - .../tables/object_wizard_overview_symbols.sql | 9 - .../tables/object_wizard_symbol_override.sql | 12 - .../object_wizard_symbol_override_mapping.sql | 15 - gr/ddl/tables/old_checked_in_packages.sql | 9 - gr/ddl/tables/operation.sql | 13 - gr/ddl/tables/operation_message.sql | 13 - gr/ddl/tables/operation_status.sql | 11 - gr/ddl/tables/operation_status_look_up.sql | 8 - gr/ddl/tables/ow_group_def.sql | 16 - gr/ddl/tables/ow_group_id.sql | 7 - gr/ddl/tables/ow_group_override.sql | 13 - gr/ddl/tables/ow_instance_setting.sql | 17 - gr/ddl/tables/ow_link_def.sql | 19 - gr/ddl/tables/ow_link_id.sql | 11 - gr/ddl/tables/ow_lu_definition.sql | 17 - gr/ddl/tables/ow_lu_setting.sql | 18 - gr/ddl/tables/ow_opt_or_choice_def.sql | 21 - gr/ddl/tables/ow_opt_or_choice_id.sql | 11 - gr/ddl/tables/ow_opt_or_choice_override.sql | 14 - gr/ddl/tables/ow_setting_def.sql | 18 - gr/ddl/tables/ow_setting_id.sql | 11 - gr/ddl/tables/ow_setting_override.sql | 14 - gr/ddl/tables/ow_symbol_setting.sql | 17 - gr/ddl/tables/owned_visual_element.sql | 21 - gr/ddl/tables/package.sql | 21 - gr/ddl/tables/packages_to_be_deleted.sql | 8 - gr/ddl/tables/platform.sql | 21 - gr/ddl/tables/platform_license.sql | 11 - ...primitive_attribute_validation_results.sql | 15 - gr/ddl/tables/primitive_data_type.sql | 11 - gr/ddl/tables/primitive_definition.sql | 21 - gr/ddl/tables/primitive_instance.sql | 34 - .../primitive_instance_feature_link.sql | 15 - .../primitive_instance_file_table_link.sql | 16 - gr/ddl/tables/proxy_timestamp.sql | 9 - gr/ddl/tables/redundancy.sql | 8 - gr/ddl/tables/renamed_visual_element.sql | 14 - gr/ddl/tables/schema_version.sql | 9 - gr/ddl/tables/supported_locales.sql | 7 - gr/ddl/tables/template.sql | 11 - gr/ddl/tables/template_attribute.sql | 20 - gr/ddl/tables/template_definition.sql | 20 - gr/ddl/tables/template_idebehavior_link.sql | 22 - gr/ddl/tables/template_migration_policy.sql | 7 - gr/ddl/tables/timestamp_record.sql | 6 - gr/ddl/tables/toolset.sql | 8 - gr/ddl/tables/user_preferences.sql | 13 - gr/ddl/tables/user_profile.sql | 22 - gr/ddl/tables/visual_element.sql | 10 - ...ual_element_affected_by_undo_check_out.sql | 11 - gr/ddl/tables/visual_element_archive.sql | 12 - gr/ddl/tables/visual_element_id.sql | 6 - gr/ddl/tables/visual_element_reference.sql | 37 - gr/ddl/tables/visual_element_timestamp.sql | 11 - gr/ddl/tables/visual_element_version.sql | 17 - gr/ddl/tables/well_known_client_controls.sql | 8 - gr/ddl/views/internal_all_alarms_view.sql | 11 - gr/ddl/views/internal_all_view_app_view.sql | 10 - ...automation_object_model_hierarchy_view.sql | 9 - ...utomation_object_model_hierarchy_view2.sql | 9 - ...n_object_visual_element_hierarchy_view.sql | 9 - ...lement_hierarchy_view_includetemplates.sql | 9 - ...relative_visual_element_reference_view.sql | 14 - ...relative_visual_element_reference_view.sql | 14 - gr/ddl/views/internal_common_obj.sql | 13 - gr/ddl/views/internal_control_view.sql | 15 - ...internal_get_GRMblob_preview_user_view.sql | 8 - ...l_get_TemplateToolBox_Allelements_view.sql | 10 - ...ernal_get_TemplateToolBox_folders_view.sql | 15 - ...l_get_asset_graphics_preview_user_view.sql | 9 - ...t_attribute_definition_with_validation.sql | 12 - .../internal_get_device_scangroups_view.sql | 12 - ..._get_external_content_media_types_view.sql | 15 - .../internal_get_gtb_Allelements_view.sql | 14 - .../views/internal_get_gtb_elements_view.sql | 14 - .../views/internal_get_gtb_folders_view.sql | 13 - ...ual_element_references_deployment_view.sql | 11 - ...visual_element_references_preview_view.sql | 11 - ...get_gtb_visual_element_references_view.sql | 11 - ...d_symbol_override_mapping_preview_view.sql | 9 - ...ct_wizard_symbol_override_mapping_view.sql | 9 - ...ct_wizard_symbol_override_preview_view.sql | 9 - ...get_object_wizard_symbol_override_view.sql | 9 - ...ual_element_primitives_deployment_view.sql | 8 - ...nal_get_visual_element_primitives_view.sql | 11 - .../internal_gtb_symbols_hierarchy_view.sql | 12 - ...isual_element_definition_per_user_view.sql | 9 - .../internal_list_automation_objects_view.sql | 13 - .../internal_list_model_objects_view.sql | 18 - gr/ddl/views/internal_list_objects_view.sql | 9 - .../internal_list_unassigned_objects_view.sql | 16 - .../internal_localized_alarm_messages.sql | 7 - .../internal_model_hierarchy_asset_view.sql | 12 - gr/ddl/views/internal_package_status_view.sql | 16 - gr/ddl/views/internal_proxy_obj.sql | 12 - ...internal_reference_primitive_attribute.sql | 9 - .../internal_required_support_features.sql | 9 - gr/ddl/views/internal_runtime_attributes.sql | 13 - ...nternal_visible_packages_per_user_view.sql | 12 - ..._element_description_all_packages_view.sql | 13 - ...sual_element_description_per_user_view.sql | 9 - ...ternal_visual_element_description_view.sql | 13 - ...l_element_primitives_preview_user_view.sql | 8 - ...visual_element_reference_per_user_view.sql | 12 - ...internal_visual_element_reference_view.sql | 13 - ..._element_reference_warning_status_view.sql | 15 - ...visual_element_timestamp_per_user_view.sql | 15 - gr/ddl/views/public_gobject_definition.sql | 7 - gr/hierarchy.jpeg | Bin 16788 -> 0 bytes gr/layout.md | 78 - gr/parse_tables.py | 122 - gr/queries/attributes.sql | 123 - gr/queries/attributes_extended.sql | 196 -- gr/queries/change_detection.sql | 8 - gr/queries/hierarchy.sql | 89 - gr/schema.md | 2204 ----------------- gr/tags.JPG | Bin 28675 -> 0 bytes runtimestatus.md | 553 ----- service_info.md | 932 ------- 188 files changed, 6913 deletions(-) delete mode 100644 docs/v2/implementation/pr-1-body.md delete mode 100644 docs/v2/implementation/pr-2-body.md delete mode 100644 docs/v2/implementation/pr-4-body.md delete mode 100644 gr/CLAUDE.md delete mode 100644 gr/build_layout_plan.md delete mode 100644 gr/connectioninfo.md delete mode 100644 gr/data_type_mapping.md delete mode 100644 gr/ddl/tables/ConversionQueue.sql delete mode 100644 gr/ddl/tables/CurrentSessionContainedName.sql delete mode 100644 gr/ddl/tables/ImportTransaction.sql delete mode 100644 gr/ddl/tables/aa_sql_objects.sql delete mode 100644 gr/ddl/tables/affected_overview_symbols.sql delete mode 100644 gr/ddl/tables/alarm_message_defaults.sql delete mode 100644 gr/ddl/tables/alarm_message_timestamps.sql delete mode 100644 gr/ddl/tables/alarm_message_translations.sql delete mode 100644 gr/ddl/tables/alarm_messages.sql delete mode 100644 gr/ddl/tables/attribute_definition.sql delete mode 100644 gr/ddl/tables/attribute_reference.sql delete mode 100644 gr/ddl/tables/attributes_translation_table.sql delete mode 100644 gr/ddl/tables/autobind_device.sql delete mode 100644 gr/ddl/tables/autobind_device_category.sql delete mode 100644 gr/ddl/tables/autobind_device_template.sql delete mode 100644 gr/ddl/tables/autobind_device_topic.sql delete mode 100644 gr/ddl/tables/autobind_naming_rule.sql delete mode 100644 gr/ddl/tables/autobind_naming_rule_spec.sql delete mode 100644 gr/ddl/tables/autobind_translation_rule.sql delete mode 100644 gr/ddl/tables/autobound_attribute.sql delete mode 100644 gr/ddl/tables/client_control_class_link.sql delete mode 100644 gr/ddl/tables/client_info.sql delete mode 100644 gr/ddl/tables/control_index.sql delete mode 100644 gr/ddl/tables/data_type.sql delete mode 100644 gr/ddl/tables/deleted_gobject.sql delete mode 100644 gr/ddl/tables/deleted_ids.sql delete mode 100644 gr/ddl/tables/deleted_visual_element.sql delete mode 100644 gr/ddl/tables/deleted_visual_element_version.sql delete mode 100644 gr/ddl/tables/deployed_file.sql delete mode 100644 gr/ddl/tables/deployed_intouch_viewapp.sql delete mode 100644 gr/ddl/tables/deployed_intouch_viewapp_visual_element_dependency.sql delete mode 100644 gr/ddl/tables/dynamic_attribute.sql delete mode 100644 gr/ddl/tables/external_content_media_types.sql delete mode 100644 gr/ddl/tables/feature.sql delete mode 100644 gr/ddl/tables/feature_file_link.sql delete mode 100644 gr/ddl/tables/file_browserinfo_link.sql delete mode 100644 gr/ddl/tables/file_pending_update.sql delete mode 100644 gr/ddl/tables/file_primitive_definition_link.sql delete mode 100644 gr/ddl/tables/file_table.sql delete mode 100644 gr/ddl/tables/folder.sql delete mode 100644 gr/ddl/tables/folder_gobject_link.sql delete mode 100644 gr/ddl/tables/galaxy.sql delete mode 100644 gr/ddl/tables/galaxy_data.sql delete mode 100644 gr/ddl/tables/galaxy_settings.sql delete mode 100644 gr/ddl/tables/gobject.sql delete mode 100644 gr/ddl/tables/gobject_asset_order.sql delete mode 100644 gr/ddl/tables/gobject_change_log.sql delete mode 100644 gr/ddl/tables/gobject_filter_info_timestamp.sql delete mode 100644 gr/ddl/tables/gobject_friendly_name.sql delete mode 100644 gr/ddl/tables/gobject_log_details.sql delete mode 100644 gr/ddl/tables/gobject_protected.sql delete mode 100644 gr/ddl/tables/instance.sql delete mode 100644 gr/ddl/tables/intouchviewapptemplate_allsymbols.sql delete mode 100644 gr/ddl/tables/lookup_category.sql delete mode 100644 gr/ddl/tables/lookup_folder.sql delete mode 100644 gr/ddl/tables/lookup_operation.sql delete mode 100644 gr/ddl/tables/lookup_package_op_status.sql delete mode 100644 gr/ddl/tables/lookup_status.sql delete mode 100644 gr/ddl/tables/lookup_table_name.sql delete mode 100644 gr/ddl/tables/namespace.sql delete mode 100644 gr/ddl/tables/object_device_linkage.sql delete mode 100644 gr/ddl/tables/object_wizard_overview_symbols.sql delete mode 100644 gr/ddl/tables/object_wizard_symbol_override.sql delete mode 100644 gr/ddl/tables/object_wizard_symbol_override_mapping.sql delete mode 100644 gr/ddl/tables/old_checked_in_packages.sql delete mode 100644 gr/ddl/tables/operation.sql delete mode 100644 gr/ddl/tables/operation_message.sql delete mode 100644 gr/ddl/tables/operation_status.sql delete mode 100644 gr/ddl/tables/operation_status_look_up.sql delete mode 100644 gr/ddl/tables/ow_group_def.sql delete mode 100644 gr/ddl/tables/ow_group_id.sql delete mode 100644 gr/ddl/tables/ow_group_override.sql delete mode 100644 gr/ddl/tables/ow_instance_setting.sql delete mode 100644 gr/ddl/tables/ow_link_def.sql delete mode 100644 gr/ddl/tables/ow_link_id.sql delete mode 100644 gr/ddl/tables/ow_lu_definition.sql delete mode 100644 gr/ddl/tables/ow_lu_setting.sql delete mode 100644 gr/ddl/tables/ow_opt_or_choice_def.sql delete mode 100644 gr/ddl/tables/ow_opt_or_choice_id.sql delete mode 100644 gr/ddl/tables/ow_opt_or_choice_override.sql delete mode 100644 gr/ddl/tables/ow_setting_def.sql delete mode 100644 gr/ddl/tables/ow_setting_id.sql delete mode 100644 gr/ddl/tables/ow_setting_override.sql delete mode 100644 gr/ddl/tables/ow_symbol_setting.sql delete mode 100644 gr/ddl/tables/owned_visual_element.sql delete mode 100644 gr/ddl/tables/package.sql delete mode 100644 gr/ddl/tables/packages_to_be_deleted.sql delete mode 100644 gr/ddl/tables/platform.sql delete mode 100644 gr/ddl/tables/platform_license.sql delete mode 100644 gr/ddl/tables/primitive_attribute_validation_results.sql delete mode 100644 gr/ddl/tables/primitive_data_type.sql delete mode 100644 gr/ddl/tables/primitive_definition.sql delete mode 100644 gr/ddl/tables/primitive_instance.sql delete mode 100644 gr/ddl/tables/primitive_instance_feature_link.sql delete mode 100644 gr/ddl/tables/primitive_instance_file_table_link.sql delete mode 100644 gr/ddl/tables/proxy_timestamp.sql delete mode 100644 gr/ddl/tables/redundancy.sql delete mode 100644 gr/ddl/tables/renamed_visual_element.sql delete mode 100644 gr/ddl/tables/schema_version.sql delete mode 100644 gr/ddl/tables/supported_locales.sql delete mode 100644 gr/ddl/tables/template.sql delete mode 100644 gr/ddl/tables/template_attribute.sql delete mode 100644 gr/ddl/tables/template_definition.sql delete mode 100644 gr/ddl/tables/template_idebehavior_link.sql delete mode 100644 gr/ddl/tables/template_migration_policy.sql delete mode 100644 gr/ddl/tables/timestamp_record.sql delete mode 100644 gr/ddl/tables/toolset.sql delete mode 100644 gr/ddl/tables/user_preferences.sql delete mode 100644 gr/ddl/tables/user_profile.sql delete mode 100644 gr/ddl/tables/visual_element.sql delete mode 100644 gr/ddl/tables/visual_element_affected_by_undo_check_out.sql delete mode 100644 gr/ddl/tables/visual_element_archive.sql delete mode 100644 gr/ddl/tables/visual_element_id.sql delete mode 100644 gr/ddl/tables/visual_element_reference.sql delete mode 100644 gr/ddl/tables/visual_element_timestamp.sql delete mode 100644 gr/ddl/tables/visual_element_version.sql delete mode 100644 gr/ddl/tables/well_known_client_controls.sql delete mode 100644 gr/ddl/views/internal_all_alarms_view.sql delete mode 100644 gr/ddl/views/internal_all_view_app_view.sql delete mode 100644 gr/ddl/views/internal_automation_object_model_hierarchy_view.sql delete mode 100644 gr/ddl/views/internal_automation_object_model_hierarchy_view2.sql delete mode 100644 gr/ddl/views/internal_automation_object_visual_element_hierarchy_view.sql delete mode 100644 gr/ddl/views/internal_automation_object_visual_element_hierarchy_view_includetemplates.sql delete mode 100644 gr/ddl/views/internal_checked_in_unbound_relative_visual_element_reference_view.sql delete mode 100644 gr/ddl/views/internal_checked_out_unbound_relative_visual_element_reference_view.sql delete mode 100644 gr/ddl/views/internal_common_obj.sql delete mode 100644 gr/ddl/views/internal_control_view.sql delete mode 100644 gr/ddl/views/internal_get_GRMblob_preview_user_view.sql delete mode 100644 gr/ddl/views/internal_get_TemplateToolBox_Allelements_view.sql delete mode 100644 gr/ddl/views/internal_get_TemplateToolBox_folders_view.sql delete mode 100644 gr/ddl/views/internal_get_asset_graphics_preview_user_view.sql delete mode 100644 gr/ddl/views/internal_get_attribute_definition_with_validation.sql delete mode 100644 gr/ddl/views/internal_get_device_scangroups_view.sql delete mode 100644 gr/ddl/views/internal_get_external_content_media_types_view.sql delete mode 100644 gr/ddl/views/internal_get_gtb_Allelements_view.sql delete mode 100644 gr/ddl/views/internal_get_gtb_elements_view.sql delete mode 100644 gr/ddl/views/internal_get_gtb_folders_view.sql delete mode 100644 gr/ddl/views/internal_get_gtb_visual_element_references_deployment_view.sql delete mode 100644 gr/ddl/views/internal_get_gtb_visual_element_references_preview_view.sql delete mode 100644 gr/ddl/views/internal_get_gtb_visual_element_references_view.sql delete mode 100644 gr/ddl/views/internal_get_object_wizard_symbol_override_mapping_preview_view.sql delete mode 100644 gr/ddl/views/internal_get_object_wizard_symbol_override_mapping_view.sql delete mode 100644 gr/ddl/views/internal_get_object_wizard_symbol_override_preview_view.sql delete mode 100644 gr/ddl/views/internal_get_object_wizard_symbol_override_view.sql delete mode 100644 gr/ddl/views/internal_get_visual_element_primitives_deployment_view.sql delete mode 100644 gr/ddl/views/internal_get_visual_element_primitives_view.sql delete mode 100644 gr/ddl/views/internal_gtb_symbols_hierarchy_view.sql delete mode 100644 gr/ddl/views/internal_linked_visual_element_definition_per_user_view.sql delete mode 100644 gr/ddl/views/internal_list_automation_objects_view.sql delete mode 100644 gr/ddl/views/internal_list_model_objects_view.sql delete mode 100644 gr/ddl/views/internal_list_objects_view.sql delete mode 100644 gr/ddl/views/internal_list_unassigned_objects_view.sql delete mode 100644 gr/ddl/views/internal_localized_alarm_messages.sql delete mode 100644 gr/ddl/views/internal_model_hierarchy_asset_view.sql delete mode 100644 gr/ddl/views/internal_package_status_view.sql delete mode 100644 gr/ddl/views/internal_proxy_obj.sql delete mode 100644 gr/ddl/views/internal_reference_primitive_attribute.sql delete mode 100644 gr/ddl/views/internal_required_support_features.sql delete mode 100644 gr/ddl/views/internal_runtime_attributes.sql delete mode 100644 gr/ddl/views/internal_visible_packages_per_user_view.sql delete mode 100644 gr/ddl/views/internal_visual_element_description_all_packages_view.sql delete mode 100644 gr/ddl/views/internal_visual_element_description_per_user_view.sql delete mode 100644 gr/ddl/views/internal_visual_element_description_view.sql delete mode 100644 gr/ddl/views/internal_visual_element_primitives_preview_user_view.sql delete mode 100644 gr/ddl/views/internal_visual_element_reference_per_user_view.sql delete mode 100644 gr/ddl/views/internal_visual_element_reference_view.sql delete mode 100644 gr/ddl/views/internal_visual_element_reference_warning_status_view.sql delete mode 100644 gr/ddl/views/internal_visual_element_timestamp_per_user_view.sql delete mode 100644 gr/ddl/views/public_gobject_definition.sql delete mode 100644 gr/hierarchy.jpeg delete mode 100644 gr/layout.md delete mode 100644 gr/parse_tables.py delete mode 100644 gr/queries/attributes.sql delete mode 100644 gr/queries/attributes_extended.sql delete mode 100644 gr/queries/change_detection.sql delete mode 100644 gr/queries/hierarchy.sql delete mode 100644 gr/schema.md delete mode 100644 gr/tags.JPG delete mode 100644 runtimestatus.md delete mode 100644 service_info.md diff --git a/CLAUDE.md b/CLAUDE.md index 4cbda0a..6b24ce6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -58,19 +58,6 @@ Galaxy `mx_data_type` values map to OPC UA types (Boolean, Int32, Float, Double, The gateway lives in a sibling repo at `c:\Users\dohertj2\Desktop\mxaccessgw\`. See `docs/v2/Galaxy.ParityRig.md` for the gw setup recipe (build, API key provisioning via `apikey create-key`, env-var overrides for HTTP/2 cleartext + worker path). The gw's MXAccess Toolkit reference (its `gateway.md`) is the canonical MxAccess API doc; the standalone `mxaccess_documentation.md` previously kept in this repo retired in PR 7.3. -## Galaxy Repository Database - -Connection: `sqlcmd -S localhost -d ZB -E` (Windows Auth). See `gr/connectioninfo.md`. - -The `gr/` folder contains: -- `queries/` — SQL for hierarchy extraction, attribute lookup, and change detection -- `ddl/tables/` and `ddl/views/` — Schema definitions -- `schema.md` — Full table/view reference -- `build_layout_plan.md` — Step-by-step plan for building the OPC UA address space from DB queries -- `gr/CLAUDE.md` — Detailed guidance for working within the `gr/` subfolder - -Key tables: `gobject` (hierarchy/deployment), `template_definition` (object categories), `dynamic_attribute` (user-defined attributes), `primitive_instance` (primitive-to-attribute links), `galaxy` (change detection). - ## Build Commands ```bash diff --git a/docs/v2/implementation/pr-1-body.md b/docs/v2/implementation/pr-1-body.md deleted file mode 100644 index 4e78fec..0000000 --- a/docs/v2/implementation/pr-1-body.md +++ /dev/null @@ -1,80 +0,0 @@ -# PR 1 — Phase 1 + Phase 2 A/B/C → v2 - -**Source**: `phase-1-configuration` (commits `980ea51..7403b92`, 11 commits) -**Target**: `v2` -**URL**: https://gitea.dohertylan.com/dohertj2/lmxopcua/pulls/new/phase-1-configuration - -## Summary - -- **Phase 1 complete** — Configuration project with 16 entities + 3 EF migrations - (InitialSchema + 8 stored procs + AuthorizationGrants), Core + Server + full Admin UI - (Blazor Server with cluster CRUD, draft → diff → publish → rollback, equipment with - OPC 40010, UNS, namespaces, drivers, ACLs, reservations, audit), LDAP via GLAuth - (`localhost:3893`), SignalR real-time fleet status + alerts. -- **Phase 2 Streams A + B + C feature-complete** — full IPC contract surface - (Galaxy.Shared, netstandard2.0, MessagePack), Galaxy.Host with real Win32 STA pump, - ACL + caller-SID + per-process-secret IPC, Galaxy-specific MemoryWatchdog + - RecyclePolicy + PostMortemMmf + MxAccessHandle, three `IGalaxyBackend` - implementations (Stub / DbBacked / **MxAccess** — real ArchestrA.MxAccess.dll - reference, x86, smoke-tested live against `LMXProxyServer`), Galaxy.Proxy with all - 9 capability interfaces (`IDriver` / `ITagDiscovery` / `IReadable` / `IWritable` / - `ISubscribable` / `IAlarmSource` / `IHistoryProvider` / `IRediscoverable` / - `IHostConnectivityProbe`) + supervisor (Backoff + CircuitBreaker + - HeartbeatMonitor). -- **Phase 2 Stream D non-destructive deliverables** — appsettings.json → DriverConfig - migration script, two-service Windows installer scripts, process-spawn cross-FX - parity test, Stream D removal procedure doc with both Option A (rewrite 494 v1 - tests) and Option B (archive + new v2 E2E suite) spelled out step-by-step. - -## What's NOT in this PR - -- Legacy `OtOpcUa.Host` deletion (Stream D.1) — reserved for a follow-up PR after - Option B's E2E suite is green. The 494 v1 tests still pass against the unchanged - legacy Host. -- Live-Galaxy parity validation (Stream E) — needs the iterative debug cycle the - removal-procedure doc describes. - -## Tests - -**964 pass / 1 pre-existing Phase 0 baseline failure**, across 14 test projects: - -| Project | Pass | Notes | -|---|---:|---| -| Core.Abstractions.Tests | 24 | | -| Configuration.Tests | 42 | incl. 7 schema compliance, 8 stored-proc, 3 SQL-role auth, 13 validator, 6 LiteDB cache, 5 generation-applier | -| Core.Tests | 4 | DriverHost lifecycle | -| Server.Tests | 2 | NodeBootstrap + LiteDB cache fallback | -| Admin.Tests | 21 | incl. 5 RoleMapper, 6 LdapAuth, 3 LiveLdap, 2 FleetStatusPoller, 2 services-integration | -| Driver.Galaxy.Shared.Tests | 6 | Round-trip + framing | -| Driver.Galaxy.Host.Tests | 30 | incl. 5 GalaxyRepository live ZB, 3 live MXAccess COM, 5 EndToEndIpc, 2 IpcHandshake, 4 MemoryWatchdog, 3 RecyclePolicy, 3 PostMortemMmf, 3 StaPump, 2 service-installer dry-run | -| Driver.Galaxy.Proxy.Tests | 10 | 9 unit + 1 process-spawn parity | -| Client.Shared.Tests | 131 | unchanged | -| Client.UI.Tests | 98 | unchanged | -| Client.CLI.Tests | 51 / 1 fail | pre-existing baseline failure | -| Historian.Aveva.Tests | 41 | unchanged | -| IntegrationTests (net48) | 6 | unchanged — v1 parity baseline | -| **OtOpcUa.Tests (net48)** | **494** | **unchanged — v1 parity baseline** | - -## Test plan for reviewers - -- [ ] `dotnet build ZB.MOM.WW.OtOpcUa.slnx` succeeds with no warnings beyond the - known NuGetAuditSuppress + xUnit1051 warnings -- [ ] `dotnet test ZB.MOM.WW.OtOpcUa.slnx` shows the same 964/1 result -- [ ] `Get-Service aaGR, aaBootstrap` reports Running on the merger's box -- [ ] `docker ps --filter name=otopcua-mssql` shows the SQL container Up -- [ ] Admin UI boots (`dotnet run --project src/ZB.MOM.WW.OtOpcUa.Admin`); home page - renders at http://localhost:5123/; LDAP sign-in with GLAuth `readonly` / - `readonly123` succeeds -- [ ] Migration script dry-run: `powershell -File - scripts/migration/Migrate-AppSettings-To-DriverConfig.ps1 -DryRun` produces - a well-formed DriverConfig JSON -- [ ] Spot-read three commit messages to confirm the deferred-with-rationale items - are explicitly documented (`549cd36`, `a7126ba`, `7403b92` are the most - recent and most detailed) - -## Follow-up tracking - -PR 2 (next session) will execute Stream D Option B — archive `OtOpcUa.Tests` as -`OtOpcUa.Tests.v1Archive`, build the new `OtOpcUa.Driver.Galaxy.E2E` test project, -delete legacy `OtOpcUa.Host`, and run the parity-validation cycle. See -`docs/v2/implementation/stream-d-removal-procedure.md`. diff --git a/docs/v2/implementation/pr-2-body.md b/docs/v2/implementation/pr-2-body.md deleted file mode 100644 index 87cb467..0000000 --- a/docs/v2/implementation/pr-2-body.md +++ /dev/null @@ -1,69 +0,0 @@ -# PR 2 — Phase 2 Stream D Option B (archive v1 + E2E suite) → v2 - -**Source**: `phase-2-stream-d` (branched from `phase-1-configuration`) -**Target**: `v2` -**URL** (after push): https://gitea.dohertylan.com/dohertj2/lmxopcua/pulls/new/phase-2-stream-d - -## Summary - -Phase 2 Stream D Option B per `docs/v2/implementation/stream-d-removal-procedure.md`: - -- **Archived the v1 surface** without deleting: - - `tests/ZB.MOM.WW.OtOpcUa.Tests/` → `tests/ZB.MOM.WW.OtOpcUa.Tests.v1Archive/` - (`` kept as `ZB.MOM.WW.OtOpcUa.Tests` so v1 Host's `InternalsVisibleTo` - still matches; `false` so solution test runs skip it). - - `tests/ZB.MOM.WW.OtOpcUa.IntegrationTests/` — `false` - + archive comment. - - `src/ZB.MOM.WW.OtOpcUa.Host/` + `src/ZB.MOM.WW.OtOpcUa.Historian.Aveva/` — archive - PropertyGroup comments. Both still build (Historian plugin + 41 historian tests still - pass) so Phase 2 PR 3 can delete them in a focused, reviewable destructive change. -- **New `tests/ZB.MOM.WW.OtOpcUa.Driver.Galaxy.E2E/`** test project (.NET 10): - - `ParityFixture` spawns `OtOpcUa.Driver.Galaxy.Host.exe` (net48 x86) as a subprocess via - `Process.Start`, connects via real named pipe, exposes a connected `GalaxyProxyDriver`. - Skips when Galaxy ZB unreachable / Host EXE not built / Administrator shell. - - `HierarchyParityTests` (3) and `StabilityFindingsRegressionTests` (4) — one test per - 2026-04-13 stability finding (phantom probe, cross-host quality clear, sync-over-async, - fire-and-forget alarm shutdown race). -- **`docs/v2/V1_ARCHIVE_STATUS.md`** — inventory + deletion plan for PR 3. -- **`docs/v2/implementation/exit-gate-phase-2-final.md`** — supersedes the two partial-exit - docs with the as-built state, adversarial review of PR 2 deltas (4 new findings), and the - recommended PR sequence (1 → 2 → 3 → 4). - -## What's NOT in this PR - -- Deletion of the v1 archive — saved for PR 3 with explicit operator review (destructive change). -- Wonderware Historian SDK plugin port — Task B.1.h, follow-up to enable real `HistoryRead`. -- MxAccess subscription push-frames — Task B.1.s, follow-up to enable real-time - data-change push from Host → Proxy. - -## Tests - -**`dotnet test ZB.MOM.WW.OtOpcUa.slnx`**: **470 pass / 7 skip / 1 pre-existing baseline**. - -The 7 skips are the new E2E tests, all skipping with the documented reason -"PipeAcl denies Administrators on dev shells" — the production install runs as a non-admin -service account and these tests will execute there. - -Run the archived v1 suites explicitly: -```powershell -dotnet test tests/ZB.MOM.WW.OtOpcUa.Tests.v1Archive # → 494 pass -dotnet test tests/ZB.MOM.WW.OtOpcUa.IntegrationTests # → 6 pass -``` - -## Test plan for reviewers - -- [ ] `dotnet build ZB.MOM.WW.OtOpcUa.slnx` succeeds with no warnings beyond the known - NuGetAuditSuppress + NU1702 cross-FX -- [ ] `dotnet test ZB.MOM.WW.OtOpcUa.slnx` shows the 470/7-skip/1-baseline result -- [ ] Both archived suites pass when run explicitly -- [ ] Build the Galaxy.Host EXE (`dotnet build src/ZB.MOM.WW.OtOpcUa.Driver.Galaxy.Host`), - then run E2E tests on a non-admin shell — they should actually execute and pass - against live Galaxy ZB -- [ ] Spot-read `docs/v2/V1_ARCHIVE_STATUS.md` and confirm the deletion plan is acceptable - -## Follow-up tracking - -- **PR 3** (next session, when ready): execute the deletion plan in `V1_ARCHIVE_STATUS.md`. - 4 projects removed, .slnx updated, full solution test confirms parity. -- **PR 4** (Phase 2 follow-up): port Historian plugin + wire MxAccess subscription pushes + - close the high/medium open findings from `exit-gate-phase-2-final.md`. diff --git a/docs/v2/implementation/pr-4-body.md b/docs/v2/implementation/pr-4-body.md deleted file mode 100644 index 0412c06..0000000 --- a/docs/v2/implementation/pr-4-body.md +++ /dev/null @@ -1,91 +0,0 @@ -# PR 4 — Phase 2 follow-up: close the 4 open MXAccess findings - -**Source**: `phase-2-pr4-findings` (branched from `phase-2-stream-d`) -**Target**: `v2` - -## Summary - -Closes the 4 high/medium open findings carried forward in `exit-gate-phase-2-final.md`: - -- **High 1 — `ReadAsync` subscription-leak on cancel.** One-shot read now wraps the - subscribe→first-OnDataChange→unsubscribe pattern in a `try/finally` so the per-tag - callback is always detached, and if the read installed the underlying MXAccess - subscription itself (no other caller had it), it tears it down on the way out. -- **High 2 — No reconnect loop on the MXAccess COM connection.** New - `MxAccessClientOptions { AutoReconnect, MonitorInterval, StaleThreshold }` + a background - `MonitorLoopAsync` that watches a stale-activity threshold + probes the proxy via a - no-op COM call, then reconnects-with-replay (re-Register, re-AddItem every active - subscription) when the proxy is dead. Liveness signal: every `OnDataChange` callback bumps - `_lastObservedActivityUtc`. Defaults match v1 monitor cadence (5s poll, 60s stale). - `ReconnectCount` exposed for diagnostics; `ConnectionStateChanged` event for downstream - consumers (the supervisor on the Proxy side already surfaces this through its - HeartbeatMonitor, but the Host-side event lets local logging/metrics hook in). -- **Medium 3 — `MxAccessGalaxyBackend.SubscribeAsync` doesn't push OnDataChange frames back to - the Proxy.** New `IGalaxyBackend.OnDataChange` / `OnAlarmEvent` / `OnHostStatusChanged` - events that the new `GalaxyFrameHandler.AttachConnection` subscribes per-connection and - forwards as outbound `OnDataChangeNotification` / `AlarmEvent` / - `RuntimeStatusChange` frames through the connection's `FrameWriter`. `MxAccessGalaxyBackend` - fans out per-tag value changes to every `SubscriptionId` that's listening to that tag - (multiple Proxy subs may share a Galaxy attribute — single COM subscription, multi-fan-out - on the wire). Stub + DbBacked backends declare the events with `#pragma warning disable - CS0067` (treat-warnings-as-errors would otherwise fail on never-raised events that exist - only to satisfy the interface). -- **Medium 4 — `WriteValuesAsync` doesn't await `OnWriteComplete`.** New - `WriteAsync(...)` overload returns `bool` after awaiting the OnWriteComplete callback via - the v1-style `TaskCompletionSource`-keyed-by-item-handle pattern in `_pendingWrites`. - `MxAccessGalaxyBackend.WriteValuesAsync` now reports per-tag `Bad_InternalError` when the - runtime rejected the write, instead of false-positive `Good`. - -## Pipe server change - -`IFrameHandler` gains `AttachConnection(FrameWriter writer): IDisposable` so the handler can -register backend event sinks on each accepted connection and detach them at disconnect. The -`PipeServer.RunOneConnectionAsync` calls it after the Hello handshake and disposes it in the -finally of the per-connection scope. `StubFrameHandler` returns `IFrameHandler.NoopAttachment.Instance` -(net48 doesn't support default interface methods, so the empty-attach lives as a public nested -class). - -## Tests - -**`dotnet test ZB.MOM.WW.OtOpcUa.slnx`**: **460 pass / 7 skip (E2E on admin shell) / 1 -pre-existing baseline failure**. No regressions. The Driver.Galaxy.Host unit tests + 5 live -ZB smoke + 3 live MXAccess COM smoke all pass unchanged. - -## Test plan for reviewers - -- [ ] `dotnet build` clean -- [ ] `dotnet test` shows 460/7-skip/1-baseline -- [ ] Spot-check `MxAccessClient.MonitorLoopAsync` against v1's `MxAccessClient.Monitor` - partial (`src/ZB.MOM.WW.OtOpcUa.Host/MxAccess/MxAccessClient.Monitor.cs`) — same - polling cadence, same probe-then-reconnect-with-replay shape -- [ ] Read `GalaxyFrameHandler.ConnectionSink.Dispose` and confirm event handlers are - detached on connection close (no leaked invocation list refs) -- [ ] `WriteValuesAsync` returning `Bad_InternalError` on a runtime-rejected write is the - correct shape — confirm against the v1 `MxAccessClient.ReadWrite.cs` pattern - -## What's NOT in this PR - -- Wonderware Historian SDK plugin port (Task B.1.h) — separate PR, larger scope. -- Alarm subsystem wire-up (`MxAccessGalaxyBackend.SubscribeAlarmsAsync` is still a no-op). - `OnAlarmEvent` is declared on the backend interface and pushed by the frame handler when - raised; `MxAccessGalaxyBackend` just doesn't raise it yet (waits for the alarm-tracking - port from v1's `AlarmObjectFilter` + Galaxy alarm primitives). -- Host-status push (`OnHostStatusChanged`) — declared on the interface and pushed by the - frame handler; `MxAccessGalaxyBackend` doesn't raise it (the Galaxy.Host's - `HostConnectivityProbe` from v1 needs porting too, scoped under the Historian PR). - -## Adversarial review - -Quick pass over the PR 4 deltas. No new findings beyond: - -- **Low 1** — `MonitorLoopAsync`'s `$Heartbeat` probe item-handle is leaked - (`AddItem` succeeds, never `RemoveItem`'d). Cosmetic — the probe item is internal to - the COM connection, dies with `Unregister` at disconnect/recycle. Worth a follow-up - to call `RemoveItem` after the probe succeeds. -- **Low 2** — Replay loop in `MonitorLoopAsync` swallows per-subscription failures. If - Galaxy permanently rejects a previously-valid reference (rare but possible after a - re-deploy), the user gets silent data loss for that one subscription. The stub-handler- - unaware operator wouldn't notice. Worth surfacing as a `ConnectionStateChanged(false) - → ConnectionStateChanged(true)` payload that includes the replay-failures list. - -Both are low-priority follow-ups, not PR 4 blockers. diff --git a/gr/CLAUDE.md b/gr/CLAUDE.md deleted file mode 100644 index 550643e..0000000 --- a/gr/CLAUDE.md +++ /dev/null @@ -1,51 +0,0 @@ -# CLAUDE.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Purpose - -The goal of this project is to identify and develop SQL queries that extract the Galaxy object hierarchy from the **System Platform Galaxy Repository** database in order to build a tag structure for an OPC UA server. - -Specifically, we need to: -- Build the hierarchy of **areas** and **automation objects** (using contained names for human-readable browsing) -- Translate contained names to **tag_names** for read/write operations (e.g., `TestMachine_001.DelmiaReceiver` in the hierarchy becomes `DelmiaReceiver_001` when addressing tag values) - -See `layout.md` for details on the hierarchy vs tag name relationship. - -## Key Files - -### Documentation -- `connectioninfo.md` — Database connection details and sqlcmd usage -- `layout.md` — Galaxy object hierarchy, contained_name vs tag_name translation, and target OPC UA structure -- `build_layout_plan.md` — Step-by-step plan for extracting hierarchy, attaching attributes, and monitoring for changes -- `data_type_mapping.md` — Galaxy mx_data_type to OPC UA DataType mapping, including array handling (ValueRank, ArrayDimensions) - -### Queries -- `queries/hierarchy.sql` — Deployed object hierarchy with browse names and parent relationships -- `queries/attributes.sql` — User-defined (dynamic) attributes with data types and array dimensions -- `queries/attributes_extended.sql` — All attributes (system + user-defined) with data types and array dimensions -- `queries/change_detection.sql` — Poll `galaxy.time_of_last_deploy` to detect deployment changes - -### Schema Reference -- `schema.md` — Full schema reference for all tables and views in the ZB database -- `ddl/tables/` — Individual CREATE TABLE definitions -- `ddl/views/` — Individual view definitions - -## Working with the Galaxy Repository Database - -The Galaxy Repository is the backing SQL Server database for Wonderware/AVEVA System Platform (Galaxy: ZB, localhost, Windows Auth). Key tables used by the queries: - -- **gobject** — Object instances, hierarchy (contained_by_gobject_id, area_gobject_id), deployment state (deployed_package_id) -- **template_definition** — Object type categories (category_id distinguishes areas, engines, user-defined objects, etc.) -- **dynamic_attribute** — User-defined attributes on templates, inherited by instances via derived_from_gobject_id chain -- **attribute_definition** — System/primitive attributes -- **primitive_instance** — Links objects to their primitive components and attribute definitions -- **galaxy** — Single-row table with time_of_last_deploy for change detection - -Use `sqlcmd -S localhost -d ZB -E -Q "..."` to run queries. See `connectioninfo.md` for details. - -## Conventions - -- Store all connection parameters in `connectioninfo.md`, not scattered across scripts. -- Keep SQL query examples and extraction notes as Markdown files in this repo. -- If scripts are added (Python, PowerShell, etc.), document their usage and dependencies alongside them. diff --git a/gr/build_layout_plan.md b/gr/build_layout_plan.md deleted file mode 100644 index ea5f916..0000000 --- a/gr/build_layout_plan.md +++ /dev/null @@ -1,84 +0,0 @@ -# OPC UA Server Layout — Build Plan - -## Overview - -Extract the Galaxy object hierarchy and tag definitions from the ZB (Galaxy Repository) database to construct an OPC UA server address space. The root node is hardcoded as **ZB**. - -## Step 1: Build the Browse Tree - -Run `queries/hierarchy.sql` to get all deployed automation objects and their parent-child relationships. - -For each row returned: -- `parent_gobject_id = 0` → child of the root ZB node -- `is_area = 1` → create as an OPC UA folder node (organizational) -- `is_area = 0` → create as an OPC UA object node (container for tags) -- Use `browse_name` as the OPC UA BrowseName/DisplayName -- Store `gobject_id` and `tag_name` for attribute lookup and tag reference translation - -Build the tree by matching each row's `parent_gobject_id` to another row's `gobject_id`. The result is: - -``` -ZB (root, hardcoded) -└── DEV (folder, is_area=1) - ├── DevAppEngine (object) - ├── DevPlatform (object) - └── TestArea (folder, is_area=1) - ├── DevTestObject (object) - └── TestMachine_001 (object) - ├── DelmiaReceiver (object, browse_name from contained_name) - └── MESReceiver (object, browse_name from contained_name) -``` - -## Step 2: Attach Attributes as Tag Nodes - -Run `queries/attributes.sql` to get all user-defined attributes for deployed objects. - -For each attribute row: -- Match to the browse tree via `gobject_id` -- Create an OPC UA variable node under the matching object node -- Use `attribute_name` as the BrowseName/DisplayName -- Use `full_tag_reference` as the runtime tag path for read/write operations -- Map `mx_data_type` to OPC UA built-in types: - -| mx_data_type | Description | OPC UA Type | -|--------------|-------------|-------------| -| 1 | Boolean | Boolean | -| 2 | Integer | Int32 | -| 3 | Float | Float | -| 4 | Double | Double | -| 5 | String | String | -| 6 | Time | DateTime | -| 7 | ElapsedTime | Double (seconds) or Duration | - -- If `is_array = 1`, create the variable as an array with rank 1 and dimension from `array_dimension` - -## Step 3: Monitor for Changes - -Poll `queries/change_detection.sql` on a regular interval (e.g., every 30 seconds). - -``` -SELECT time_of_last_deploy FROM galaxy; -``` - -Compare the returned `time_of_last_deploy` to the last known value: -- **No change** → do nothing -- **Changed** → a deployment occurred; re-run Steps 1 and 2 to rebuild the address space - -This handles objects being deployed, undeployed, added, or removed. - -## Connection Details - -See `connectioninfo.md` for database connection parameters and sqlcmd usage. - -``` -sqlcmd -S localhost -d ZB -E -Q "YOUR QUERY HERE" -``` - -## Query Files - -| File | Purpose | -|------|---------| -| `queries/hierarchy.sql` | Deployed object hierarchy with browse names and parent relationships | -| `queries/attributes.sql` | User-defined attributes with data types and array dimensions | -| `queries/attributes_extended.sql` | All attributes (system + user-defined) with data types and array dimensions | -| `queries/change_detection.sql` | Poll galaxy.time_of_last_deploy for deployment changes | diff --git a/gr/connectioninfo.md b/gr/connectioninfo.md deleted file mode 100644 index a615514..0000000 --- a/gr/connectioninfo.md +++ /dev/null @@ -1,26 +0,0 @@ -# Galaxy Repository — Connection Information - -## Database Connection - -| Parameter | Value | -|-----------------|----------------| -| Server | localhost (default instance) | -| Database Name | ZB | -| Port | 1433 (default) | -| Authentication | Windows Auth | -| Username | dohertj2 | - -## sqlcmd Usage - -``` -sqlcmd -S localhost -d ZB -E -Q "YOUR QUERY HERE" -``` - -- `-S localhost` — default instance -- `-d ZB` — database name -- `-E` — Windows Authentication (dohertj2) - -## Notes - -- The Galaxy Repository is a SQL Server database created and managed by AVEVA System Platform (formerly Wonderware). -- Typically accessed via SQL Server Management Studio (SSMS), `sqlcmd`, or programmatically via ODBC/ADO.NET/pyodbc. diff --git a/gr/data_type_mapping.md b/gr/data_type_mapping.md deleted file mode 100644 index 23c1920..0000000 --- a/gr/data_type_mapping.md +++ /dev/null @@ -1,96 +0,0 @@ -# Data Type Mapping — Galaxy Repository to OPC UA - -## Scalar Type Mapping - -| mx_data_type | Galaxy Description | OPC UA DataType | OPC UA NodeId | Notes | -|--------------|--------------------|-----------------|---------------|-------| -| 1 | Boolean | Boolean | i=1 | Direct mapping | -| 2 | Integer (Int32) | Int32 | i=6 | Galaxy integers are 32-bit signed | -| 3 | Float (Single) | Float | i=10 | 32-bit IEEE 754 | -| 4 | Double | Double | i=11 | 64-bit IEEE 754 | -| 5 | String | String | i=12 | Unicode string | -| 6 | Time (DateTime) | DateTime | i=13 | Galaxy DateTime to OPC UA DateTime (100ns ticks since 1601-01-01) | -| 7 | ElapsedTime (TimeSpan) | Double | i=11 | No native OPC UA TimeSpan; map to Double representing seconds (or use Duration type alias, NodeId i=290) | -| 8 | (reference) | String | i=12 | Object reference; expose as string representation | -| 13 | (enumeration) | Int32 | i=6 | Enum backing value is integer | -| 14 | (custom) | String | i=12 | Fallback to string | -| 15 | InternationalizedString | LocalizedText | i=21 | OPC UA LocalizedText supports locale + text pairs | -| 16 | (custom) | String | i=12 | Fallback to string | - -## OPC UA Built-in Type Reference - -For context, the full set of OPC UA built-in types and their NodeIds: - -| NodeId | Type | Description | -|--------|------|-------------| -| i=1 | Boolean | True/false | -| i=2 | SByte | Signed 8-bit integer | -| i=3 | Byte | Unsigned 8-bit integer | -| i=4 | Int16 | Signed 16-bit integer | -| i=5 | UInt16 | Unsigned 16-bit integer | -| i=6 | Int32 | Signed 32-bit integer | -| i=7 | UInt32 | Unsigned 32-bit integer | -| i=8 | Int64 | Signed 64-bit integer | -| i=9 | UInt64 | Unsigned 64-bit integer | -| i=10 | Float | 32-bit IEEE 754 | -| i=11 | Double | 64-bit IEEE 754 | -| i=12 | String | Unicode string | -| i=13 | DateTime | Date and time (100ns ticks since 1601-01-01) | -| i=14 | Guid | 128-bit globally unique identifier | -| i=15 | ByteString | Sequence of bytes | -| i=21 | LocalizedText | Locale + text pair | - -## Array Handling - -When `is_array = 1` in the attributes query, the OPC UA variable node must be configured as an array. - -### ValueRank - -Set on the OPC UA variable node to indicate scalar vs array: - -| is_array | ValueRank | Meaning | -|----------|-----------|---------| -| 0 | -1 (Scalar) | Value is not an array | -| 1 | 1 (OneDimension) | Value is a one-dimensional array | - -### ArrayDimensions - -When `ValueRank = 1`, set the `ArrayDimensions` attribute to a single-element array containing the `array_dimension` value from the attributes query. - -Example for `MESReceiver_001.MoveInPartNumbers` (`is_array=1`, `array_dimension=50`): -- DataType: String (i=12) -- ValueRank: 1 -- ArrayDimensions: [50] - -Example for `TestMachine_001.MachineID` (`is_array=0`): -- DataType: String (i=12) -- ValueRank: -1 -- ArrayDimensions: (not set) - -## Security Classification - -Galaxy attributes have a `security_classification` column that controls the access level required for writes. The attributes query returns this value for each attribute. - -| security_classification | Galaxy Level | OPC UA Access | Description | -|-------------------------|--------------|---------------|-------------| -| 0 | FreeAccess | ReadWrite | No security restrictions | -| 1 | Operate | ReadWrite | Normal operating level (default) | -| 2 | SecuredWrite | ReadOnly | Requires elevated write access | -| 3 | VerifiedWrite | ReadOnly | Requires verified/confirmed write access | -| 4 | Tune | ReadWrite | Tuning-level access | -| 5 | Configure | ReadWrite | Configuration-level access | -| 6 | ViewOnly | ReadOnly | Read-only, no writes permitted | - -Most attributes default to `Operate` (1). Higher values indicate more restrictive write access. `ViewOnly` (6) attributes should be exposed as read-only in OPC UA (`AccessLevel = CurrentRead` only, no `CurrentWrite`). - -## DateTime Conversion - -Galaxy `Time` (mx_data_type=6) stores DateTime values. OPC UA DateTime is defined as the number of 100-nanosecond intervals since January 1, 1601 (UTC). Ensure the conversion accounts for: -- Timezone: Galaxy may store local time; OPC UA expects UTC -- Epoch difference: adjust if Galaxy uses a different epoch (e.g., Unix epoch 1970-01-01) - -## ElapsedTime Handling - -Galaxy `ElapsedTime` (mx_data_type=7) represents a duration/timespan. OPC UA has no native TimeSpan type. Options: -- **Double (i=11)**: Store as seconds (recommended for simplicity) -- **Duration (i=290)**: OPC UA type alias for Double, semantically represents milliseconds — use if the OPC UA SDK supports it diff --git a/gr/ddl/tables/ConversionQueue.sql b/gr/ddl/tables/ConversionQueue.sql deleted file mode 100644 index 3044c68..0000000 --- a/gr/ddl/tables/ConversionQueue.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: ConversionQueue -CREATE TABLE [ConversionQueue] ( - [id] int NULL, - [Name] nvarchar(329) NULL, - [IsCheckedOut] bit NOT NULL, - [Status] bit NOT NULL DEFAULT ((0)), - [MetaData] nchar(256) NULL, - [OperationType] nchar(20) NOT NULL, - [timestamp_of_last_change] bigint NULL, - [change_type] int NULL -); -GO - diff --git a/gr/ddl/tables/CurrentSessionContainedName.sql b/gr/ddl/tables/CurrentSessionContainedName.sql deleted file mode 100644 index 7e258ea..0000000 --- a/gr/ddl/tables/CurrentSessionContainedName.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Table: CurrentSessionContainedName -CREATE TABLE [CurrentSessionContainedName] ( - [Uniqeid] int NOT NULL, - [obj_id] int NULL, - [containedname] nvarchar(32) NULL, - CONSTRAINT [PK_CurrentSessionContainedName] PRIMARY KEY ([Uniqeid]) -); -GO - diff --git a/gr/ddl/tables/ImportTransaction.sql b/gr/ddl/tables/ImportTransaction.sql deleted file mode 100644 index e8a1110..0000000 --- a/gr/ddl/tables/ImportTransaction.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Table: ImportTransaction -CREATE TABLE [ImportTransaction] ( - [ImportOperationId] nvarchar(329) NULL, - [Status] bit NOT NULL DEFAULT ((1)) -); -GO - diff --git a/gr/ddl/tables/aa_sql_objects.sql b/gr/ddl/tables/aa_sql_objects.sql deleted file mode 100644 index 33b5918..0000000 --- a/gr/ddl/tables/aa_sql_objects.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: aa_sql_objects -CREATE TABLE [aa_sql_objects] ( - [object_name] nvarchar(128) NOT NULL, - [object_type] nvarchar(10) NOT NULL, - CONSTRAINT [PK_aa_sql_objects] PRIMARY KEY ([object_name]) -); -GO - diff --git a/gr/ddl/tables/affected_overview_symbols.sql b/gr/ddl/tables/affected_overview_symbols.sql deleted file mode 100644 index f47a607..0000000 --- a/gr/ddl/tables/affected_overview_symbols.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Table: affected_overview_symbols -CREATE TABLE [affected_overview_symbols] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [visual_element_id] int NOT NULL -); -GO - diff --git a/gr/ddl/tables/alarm_message_defaults.sql b/gr/ddl/tables/alarm_message_defaults.sql deleted file mode 100644 index dac2099..0000000 --- a/gr/ddl/tables/alarm_message_defaults.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: alarm_message_defaults -CREATE TABLE [alarm_message_defaults] ( - [phrase_id] int NOT NULL, - [default_message] nvarchar(1024) NOT NULL, - CONSTRAINT [PK_alarm_message_defaults] PRIMARY KEY ([phrase_id]) -); -GO - diff --git a/gr/ddl/tables/alarm_message_timestamps.sql b/gr/ddl/tables/alarm_message_timestamps.sql deleted file mode 100644 index 2eb44fe..0000000 --- a/gr/ddl/tables/alarm_message_timestamps.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: alarm_message_timestamps -CREATE TABLE [alarm_message_timestamps] ( - [gobject_id] int NOT NULL, - [timestamp_of_populate] bigint NOT NULL DEFAULT ((0)), - CONSTRAINT [PK_alarm_message_timestamps] PRIMARY KEY ([gobject_id]) -); -GO - diff --git a/gr/ddl/tables/alarm_message_translations.sql b/gr/ddl/tables/alarm_message_translations.sql deleted file mode 100644 index c48fb43..0000000 --- a/gr/ddl/tables/alarm_message_translations.sql +++ /dev/null @@ -1,12 +0,0 @@ --- Table: alarm_message_translations -CREATE TABLE [alarm_message_translations] ( - [phrase_id] int NOT NULL, - [locale_id] smallint NOT NULL, - [translated_message] nvarchar(1024) NOT NULL, - CONSTRAINT [PK_alarm_message_translations] PRIMARY KEY ([phrase_id], [locale_id], [phrase_id], [locale_id]) -); -GO - -ALTER TABLE [alarm_message_translations] ADD FOREIGN KEY ([locale_id]) REFERENCES [supported_locales] ([locale_id]); -GO - diff --git a/gr/ddl/tables/alarm_messages.sql b/gr/ddl/tables/alarm_messages.sql deleted file mode 100644 index 29f75a8..0000000 --- a/gr/ddl/tables/alarm_messages.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: alarm_messages -CREATE TABLE [alarm_messages] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [phrase_id] int NOT NULL, - CONSTRAINT [PK_alarm_messages] PRIMARY KEY ([gobject_id], [package_id], [mx_primitive_id], [phrase_id], [gobject_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id]) -); -GO - -ALTER TABLE [alarm_messages] ADD FOREIGN KEY ([package_id]) REFERENCES [primitive_instance] ([package_id]); -GO - diff --git a/gr/ddl/tables/attribute_definition.sql b/gr/ddl/tables/attribute_definition.sql deleted file mode 100644 index 5caab0c..0000000 --- a/gr/ddl/tables/attribute_definition.sql +++ /dev/null @@ -1,24 +0,0 @@ --- Table: attribute_definition -CREATE TABLE [attribute_definition] ( - [attribute_definition_id] int NOT NULL, - [primitive_definition_id] int NOT NULL, - [attribute_name] nvarchar(329) NOT NULL, - [mx_attribute_id] smallint NOT NULL, - [has_config_set_handler] bit NOT NULL, - [mx_data_type] smallint NOT NULL, - [is_array] bit NOT NULL, - [security_classification] smallint NOT NULL, - [security_classification_needs_deployed] bit NOT NULL, - [mx_attribute_category] int NOT NULL, - [is_frequently_accessed] bit NOT NULL, - [is_locked] bit NOT NULL, - [is_locked_needs_deployed] bit NOT NULL, - [mx_value] text(2147483647) NOT NULL, - [mx_value_needs_deployed] bit NOT NULL, - CONSTRAINT [PK_attribute_definition] PRIMARY KEY ([primitive_definition_id], [mx_attribute_id], [primitive_definition_id]) -); -GO - -ALTER TABLE [attribute_definition] ADD FOREIGN KEY ([primitive_definition_id]) REFERENCES [primitive_definition] ([primitive_definition_id]); -GO - diff --git a/gr/ddl/tables/attribute_reference.sql b/gr/ddl/tables/attribute_reference.sql deleted file mode 100644 index 156e221..0000000 --- a/gr/ddl/tables/attribute_reference.sql +++ /dev/null @@ -1,26 +0,0 @@ --- Table: attribute_reference -CREATE TABLE [attribute_reference] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [referring_mx_primitive_id] smallint NOT NULL DEFAULT ((0)), - [referring_mx_attribute_id] smallint NOT NULL DEFAULT ((0)), - [element_index] smallint NOT NULL DEFAULT ((0)), - [resolved_gobject_id] int NOT NULL DEFAULT ((0)), - [reference_string] nvarchar(700) NOT NULL DEFAULT (''), - [context_string] nvarchar(329) NOT NULL DEFAULT (''), - [object_signature] int NOT NULL DEFAULT ((0)), - [resolved_mx_primitive_id] smallint NOT NULL DEFAULT ((0)), - [resolved_mx_attribute_id] smallint NOT NULL DEFAULT ((0)), - [resolved_mx_property_id] smallint NOT NULL DEFAULT ((0)), - [attribute_signature] int NOT NULL DEFAULT ((0)), - [lock_type] int NOT NULL DEFAULT ((0)), - [is_valid] bit NOT NULL DEFAULT ((0)), - [attr_res_status] int NOT NULL DEFAULT ((0)), - [attribute_index] smallint NULL DEFAULT ((-1)), - CONSTRAINT [PK_attribute_reference] PRIMARY KEY ([gobject_id], [package_id], [referring_mx_primitive_id], [referring_mx_attribute_id], [element_index], [gobject_id], [package_id], [referring_mx_primitive_id], [gobject_id], [package_id], [referring_mx_primitive_id], [gobject_id], [package_id], [referring_mx_primitive_id]) -); -GO - -ALTER TABLE [attribute_reference] ADD FOREIGN KEY ([referring_mx_primitive_id]) REFERENCES [primitive_instance] ([package_id]); -GO - diff --git a/gr/ddl/tables/attributes_translation_table.sql b/gr/ddl/tables/attributes_translation_table.sql deleted file mode 100644 index bd23e89..0000000 --- a/gr/ddl/tables/attributes_translation_table.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: attributes_translation_table -CREATE TABLE [attributes_translation_table] ( - [gobject_id] int NULL, - [attribute_name] nvarchar(329) NOT NULL, - [new_primitive_id] int NULL, - [new_attribute_id] int NULL, - [old_primitive_id] int NULL, - [old_attribute_id] int NULL -); -GO - diff --git a/gr/ddl/tables/autobind_device.sql b/gr/ddl/tables/autobind_device.sql deleted file mode 100644 index 61e1e94..0000000 --- a/gr/ddl/tables/autobind_device.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: autobind_device -CREATE TABLE [autobind_device] ( - [dio_id] int NOT NULL, - [overridden_naming_rule_id] int NULL, - CONSTRAINT [PK_autobind_device] PRIMARY KEY ([dio_id], [overridden_naming_rule_id], [dio_id]) -); -GO - -ALTER TABLE [autobind_device] ADD FOREIGN KEY ([dio_id]) REFERENCES [gobject] ([gobject_id]); -GO - diff --git a/gr/ddl/tables/autobind_device_category.sql b/gr/ddl/tables/autobind_device_category.sql deleted file mode 100644 index 148c1fc..0000000 --- a/gr/ddl/tables/autobind_device_category.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: autobind_device_category -CREATE TABLE [autobind_device_category] ( - [category_id] smallint NOT NULL, - [rule_id] int NULL DEFAULT ((0)), - CONSTRAINT [PK_autobind_device_category] PRIMARY KEY ([category_id], [rule_id], [category_id]) -); -GO - -ALTER TABLE [autobind_device_category] ADD FOREIGN KEY ([category_id]) REFERENCES [lookup_category] ([category_id]); -GO - diff --git a/gr/ddl/tables/autobind_device_template.sql b/gr/ddl/tables/autobind_device_template.sql deleted file mode 100644 index 9cd1c5a..0000000 --- a/gr/ddl/tables/autobind_device_template.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: autobind_device_template -CREATE TABLE [autobind_device_template] ( - [template_definition_id] int NOT NULL, - [rule_id] int NULL, - CONSTRAINT [PK_autobind_device_template] PRIMARY KEY ([template_definition_id], [rule_id], [template_definition_id]) -); -GO - -ALTER TABLE [autobind_device_template] ADD FOREIGN KEY ([template_definition_id]) REFERENCES [template_definition] ([template_definition_id]); -GO - diff --git a/gr/ddl/tables/autobind_device_topic.sql b/gr/ddl/tables/autobind_device_topic.sql deleted file mode 100644 index a5c4afc..0000000 --- a/gr/ddl/tables/autobind_device_topic.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: autobind_device_topic -CREATE TABLE [autobind_device_topic] ( - [dio_id] int NOT NULL, - [sg_mx_primitive_id] smallint NOT NULL DEFAULT ((0)), - [overridden_naming_rule_id] int NULL, - [default_xlate_rule_id] int NOT NULL DEFAULT ((0)), - CONSTRAINT [PK_autobind_device_topic] PRIMARY KEY ([dio_id], [sg_mx_primitive_id], [overridden_naming_rule_id], [dio_id]) -); -GO - -ALTER TABLE [autobind_device_topic] ADD FOREIGN KEY ([dio_id]) REFERENCES [autobind_device] ([dio_id]); -GO - diff --git a/gr/ddl/tables/autobind_naming_rule.sql b/gr/ddl/tables/autobind_naming_rule.sql deleted file mode 100644 index 940403f..0000000 --- a/gr/ddl/tables/autobind_naming_rule.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: autobind_naming_rule -CREATE TABLE [autobind_naming_rule] ( - [rule_id] int NOT NULL, - [rule_name] nvarchar(329) NOT NULL, - CONSTRAINT [PK_autobind_naming_rule] PRIMARY KEY ([rule_id]) -); -GO - diff --git a/gr/ddl/tables/autobind_naming_rule_spec.sql b/gr/ddl/tables/autobind_naming_rule_spec.sql deleted file mode 100644 index 6ee7648..0000000 --- a/gr/ddl/tables/autobind_naming_rule_spec.sql +++ /dev/null @@ -1,12 +0,0 @@ --- Table: autobind_naming_rule_spec -CREATE TABLE [autobind_naming_rule_spec] ( - [rule_id] int NOT NULL, - [io_type] nchar(1) NOT NULL, - [rule_spec] nvarchar(512) NOT NULL, - CONSTRAINT [PK_autobind_naming_rule_spec] PRIMARY KEY ([rule_id], [io_type], [rule_id]) -); -GO - -ALTER TABLE [autobind_naming_rule_spec] ADD FOREIGN KEY ([rule_id]) REFERENCES [autobind_naming_rule] ([rule_id]); -GO - diff --git a/gr/ddl/tables/autobind_translation_rule.sql b/gr/ddl/tables/autobind_translation_rule.sql deleted file mode 100644 index 5ebb145..0000000 --- a/gr/ddl/tables/autobind_translation_rule.sql +++ /dev/null @@ -1,10 +0,0 @@ --- Table: autobind_translation_rule -CREATE TABLE [autobind_translation_rule] ( - [xlate_rule_id] int NOT NULL, - [xlate_rule_name] nvarchar(329) NOT NULL, - [xlate_rule_gsub_str] nvarchar(1000) NULL, - [xlate_rule_scope_global] bit NOT NULL DEFAULT ((0)), - CONSTRAINT [PK_autobind_translation_rule] PRIMARY KEY ([xlate_rule_id]) -); -GO - diff --git a/gr/ddl/tables/autobound_attribute.sql b/gr/ddl/tables/autobound_attribute.sql deleted file mode 100644 index 02e126b..0000000 --- a/gr/ddl/tables/autobound_attribute.sql +++ /dev/null @@ -1,17 +0,0 @@ --- Table: autobound_attribute -CREATE TABLE [autobound_attribute] ( - [dio_id] int NOT NULL, - [sg_mx_primitive_id] smallint NOT NULL DEFAULT ((0)), - [gobject_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [mx_attribute_id] smallint NOT NULL, - [element_index] smallint NOT NULL DEFAULT ((0)), - [attr_alias] nvarchar(329) NULL, - [xlate_rule_id] int NOT NULL DEFAULT ((0)), - CONSTRAINT [PK_autobound_attribute] PRIMARY KEY ([gobject_id], [mx_primitive_id], [mx_attribute_id], [element_index], [dio_id], [sg_mx_primitive_id], [dio_id], [sg_mx_primitive_id], [xlate_rule_id]) -); -GO - -ALTER TABLE [autobound_attribute] ADD FOREIGN KEY ([xlate_rule_id]) REFERENCES [autobind_translation_rule] ([xlate_rule_id]); -GO - diff --git a/gr/ddl/tables/client_control_class_link.sql b/gr/ddl/tables/client_control_class_link.sql deleted file mode 100644 index 06c0a73..0000000 --- a/gr/ddl/tables/client_control_class_link.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Table: client_control_class_link -CREATE TABLE [client_control_class_link] ( - [gobject_id] int NOT NULL, - [file_id] int NULL, - [class_name] nvarchar(1024) NOT NULL, - CONSTRAINT [PK_client_control_class_link] PRIMARY KEY ([gobject_id]) -); -GO - diff --git a/gr/ddl/tables/client_info.sql b/gr/ddl/tables/client_info.sql deleted file mode 100644 index d7a740a..0000000 --- a/gr/ddl/tables/client_info.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: client_info -CREATE TABLE [client_info] ( - [id] int NOT NULL, - [client_unique_identifier] nvarchar(4000) NOT NULL, - [client_name] nvarchar(64) NOT NULL, - [deployed_files_count] smallint NOT NULL, - [time_of_last_deployed_object_components] datetime NULL DEFAULT (getdate()), - [timestamp_of_last_synchronized] bigint NOT NULL DEFAULT ((0)) -); -GO - diff --git a/gr/ddl/tables/control_index.sql b/gr/ddl/tables/control_index.sql deleted file mode 100644 index 97ff795..0000000 --- a/gr/ddl/tables/control_index.sql +++ /dev/null @@ -1,16 +0,0 @@ --- Table: control_index -CREATE TABLE [control_index] ( - [entity_id] int NOT NULL, - [gobject_id] int NOT NULL, - [control_id] nvarchar(329) NULL, - [control_name] nvarchar(329) NOT NULL, - [control_description] nvarchar(2000) NULL, - [properties] nvarchar(-1) NULL, - [thumbnail] nvarchar(-1) NULL, - CONSTRAINT [PK_control_index] PRIMARY KEY ([gobject_id], [control_name], [gobject_id]) -); -GO - -ALTER TABLE [control_index] ADD FOREIGN KEY ([gobject_id]) REFERENCES [gobject] ([gobject_id]); -GO - diff --git a/gr/ddl/tables/data_type.sql b/gr/ddl/tables/data_type.sql deleted file mode 100644 index 580091a..0000000 --- a/gr/ddl/tables/data_type.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Table: data_type -CREATE TABLE [data_type] ( - [mx_data_type] tinyint NOT NULL, - [description] varchar(30) NOT NULL, - [ow_data_type] varchar(10) NULL, - CONSTRAINT [PK_data_type] PRIMARY KEY ([mx_data_type]) -); -GO - diff --git a/gr/ddl/tables/deleted_gobject.sql b/gr/ddl/tables/deleted_gobject.sql deleted file mode 100644 index b0de805..0000000 --- a/gr/ddl/tables/deleted_gobject.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: deleted_gobject -CREATE TABLE [deleted_gobject] ( - [gobject_id] int NOT NULL DEFAULT ((0)), - [timestamp_of_delete] timestamp NOT NULL, - CONSTRAINT [PK_deleted_gobject] PRIMARY KEY ([timestamp_of_delete]) -); -GO - diff --git a/gr/ddl/tables/deleted_ids.sql b/gr/ddl/tables/deleted_ids.sql deleted file mode 100644 index 159810d..0000000 --- a/gr/ddl/tables/deleted_ids.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Table: deleted_ids -CREATE TABLE [deleted_ids] ( - [table_id] smallint NULL, - [deleted_id] int NOT NULL, - [deletion_timestamp] timestamp NOT NULL, - [deletion_time] datetime NULL -); -GO - diff --git a/gr/ddl/tables/deleted_visual_element.sql b/gr/ddl/tables/deleted_visual_element.sql deleted file mode 100644 index eaf8866..0000000 --- a/gr/ddl/tables/deleted_visual_element.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: deleted_visual_element -CREATE TABLE [deleted_visual_element] ( - [visual_element_name] nvarchar(329) NULL, - [visual_element_type] nvarchar(32) NULL, - [timestamp_of_delete] timestamp NOT NULL -); -GO - diff --git a/gr/ddl/tables/deleted_visual_element_version.sql b/gr/ddl/tables/deleted_visual_element_version.sql deleted file mode 100644 index ce672b9..0000000 --- a/gr/ddl/tables/deleted_visual_element_version.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: deleted_visual_element_version -CREATE TABLE [deleted_visual_element_version] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [visual_element_name] nvarchar(329) NOT NULL, - [visual_element_type] nvarchar(32) NOT NULL, - [timestamp_of_delete] timestamp NOT NULL, - [visual_element_id] int NOT NULL, - CONSTRAINT [PK_deleted_visual_element_version] PRIMARY KEY ([gobject_id], [package_id], [timestamp_of_delete]) -); -GO - diff --git a/gr/ddl/tables/deployed_file.sql b/gr/ddl/tables/deployed_file.sql deleted file mode 100644 index 2da76c1..0000000 --- a/gr/ddl/tables/deployed_file.sql +++ /dev/null @@ -1,19 +0,0 @@ --- Table: deployed_file -CREATE TABLE [deployed_file] ( - [deployed_file_id] int NOT NULL, - [file_id] int NOT NULL, - [node_name] nvarchar(256) NOT NULL, - [need_to_delete] int NOT NULL DEFAULT ((0)), - [is_package_deployed] bit NOT NULL, - [is_editor_deployed] bit NOT NULL, - [is_runtime_deployed] bit NOT NULL, - [is_browser_deployed] bit NOT NULL, - [file_version] nvarchar(50) NOT NULL DEFAULT (''), - [file_modified_time] nvarchar(50) NOT NULL DEFAULT (''), - CONSTRAINT [PK_deployed_file] PRIMARY KEY ([deployed_file_id], [file_id]) -); -GO - -ALTER TABLE [deployed_file] ADD FOREIGN KEY ([file_id]) REFERENCES [file_table] ([file_id]); -GO - diff --git a/gr/ddl/tables/deployed_intouch_viewapp.sql b/gr/ddl/tables/deployed_intouch_viewapp.sql deleted file mode 100644 index a69d529..0000000 --- a/gr/ddl/tables/deployed_intouch_viewapp.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: deployed_intouch_viewapp -CREATE TABLE [deployed_intouch_viewapp] ( - [timestamp_of_deploy] bigint NOT NULL DEFAULT ((1)), - [gobject_id] int NOT NULL, - [deploy_file_transfering] bit NULL DEFAULT ((0)) -); -GO - diff --git a/gr/ddl/tables/deployed_intouch_viewapp_visual_element_dependency.sql b/gr/ddl/tables/deployed_intouch_viewapp_visual_element_dependency.sql deleted file mode 100644 index 708ac34..0000000 --- a/gr/ddl/tables/deployed_intouch_viewapp_visual_element_dependency.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Table: deployed_intouch_viewapp_visual_element_dependency -CREATE TABLE [deployed_intouch_viewapp_visual_element_dependency] ( - [gobject_id] int NULL, - [visual_element_name] nvarchar(2000) NULL -); -GO - diff --git a/gr/ddl/tables/dynamic_attribute.sql b/gr/ddl/tables/dynamic_attribute.sql deleted file mode 100644 index 0867681..0000000 --- a/gr/ddl/tables/dynamic_attribute.sql +++ /dev/null @@ -1,25 +0,0 @@ --- Table: dynamic_attribute -CREATE TABLE [dynamic_attribute] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [mx_attribute_id] smallint NOT NULL, - [attribute_name] nvarchar(329) NOT NULL, - [mx_data_type] smallint NOT NULL, - [is_array] bit NOT NULL, - [security_classification] smallint NOT NULL, - [mx_attribute_category] int NOT NULL, - [lock_type] int NOT NULL, - [mx_value] text(2147483647) NOT NULL, - [owned_by_gobject_id] int NOT NULL DEFAULT ((0)), - [original_lock_type] int NOT NULL DEFAULT ((0)), - [dynamic_attribute_type] smallint NOT NULL DEFAULT ((0)), - [bitvalues] smallint NOT NULL DEFAULT ((0)), - [dynamic_attribute_id] bigint NOT NULL, - CONSTRAINT [PK_dynamic_attribute] PRIMARY KEY ([gobject_id], [package_id], [mx_primitive_id], [mx_attribute_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id]) -); -GO - -ALTER TABLE [dynamic_attribute] ADD FOREIGN KEY ([package_id]) REFERENCES [primitive_instance] ([package_id]); -GO - diff --git a/gr/ddl/tables/external_content_media_types.sql b/gr/ddl/tables/external_content_media_types.sql deleted file mode 100644 index aaa10c4..0000000 --- a/gr/ddl/tables/external_content_media_types.sql +++ /dev/null @@ -1,12 +0,0 @@ --- Table: external_content_media_types -CREATE TABLE [external_content_media_types] ( - [entity_id] int NOT NULL, - [media_type] nvarchar(255) NOT NULL, - [control_entity_id] int NOT NULL, - [uri_property_name] nvarchar(1023) NULL, - [media_type_property_name] nvarchar(1023) NULL, - [is_default] bit NULL, - CONSTRAINT [PK_external_content_media_types] PRIMARY KEY ([entity_id]) -); -GO - diff --git a/gr/ddl/tables/feature.sql b/gr/ddl/tables/feature.sql deleted file mode 100644 index e09c1af..0000000 --- a/gr/ddl/tables/feature.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Table: feature -CREATE TABLE [feature] ( - [feature_id] int NOT NULL, - [feature_name] nvarchar(256) NOT NULL, - [feature_type] nvarchar(256) NOT NULL, - CONSTRAINT [PK_feature] PRIMARY KEY ([feature_id]) -); -GO - diff --git a/gr/ddl/tables/feature_file_link.sql b/gr/ddl/tables/feature_file_link.sql deleted file mode 100644 index 4b6626c..0000000 --- a/gr/ddl/tables/feature_file_link.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: feature_file_link -CREATE TABLE [feature_file_link] ( - [feature_id] int NOT NULL, - [file_id] int NOT NULL, - CONSTRAINT [PK_feature_file_link] PRIMARY KEY ([feature_id], [file_id], [feature_id], [file_id]) -); -GO - -ALTER TABLE [feature_file_link] ADD FOREIGN KEY ([file_id]) REFERENCES [file_table] ([file_id]); -GO - diff --git a/gr/ddl/tables/file_browserinfo_link.sql b/gr/ddl/tables/file_browserinfo_link.sql deleted file mode 100644 index 6b0c1b2..0000000 --- a/gr/ddl/tables/file_browserinfo_link.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: file_browserinfo_link -CREATE TABLE [file_browserinfo_link] ( - [primitive_definition_id] int NOT NULL, - [file_id] int NOT NULL, - [assembly_strong_name] nvarchar(512) NOT NULL, - [assembly_type_name] nvarchar(256) NOT NULL, - CONSTRAINT [PK_file_browserinfo_link] PRIMARY KEY ([primitive_definition_id], [file_id], [file_id], [primitive_definition_id]) -); -GO - -ALTER TABLE [file_browserinfo_link] ADD FOREIGN KEY ([primitive_definition_id]) REFERENCES [primitive_definition] ([primitive_definition_id]); -GO - diff --git a/gr/ddl/tables/file_pending_update.sql b/gr/ddl/tables/file_pending_update.sql deleted file mode 100644 index fcbe6ad..0000000 --- a/gr/ddl/tables/file_pending_update.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: file_pending_update -CREATE TABLE [file_pending_update] ( - [file_id] int NOT NULL, - [node_name] nvarchar(256) NOT NULL, - CONSTRAINT [PK_file_pending_update] PRIMARY KEY ([file_id]) -); -GO - -ALTER TABLE [file_pending_update] ADD FOREIGN KEY ([file_id]) REFERENCES [file_table] ([file_id]); -GO - diff --git a/gr/ddl/tables/file_primitive_definition_link.sql b/gr/ddl/tables/file_primitive_definition_link.sql deleted file mode 100644 index 6cbb3b1..0000000 --- a/gr/ddl/tables/file_primitive_definition_link.sql +++ /dev/null @@ -1,15 +0,0 @@ --- Table: file_primitive_definition_link -CREATE TABLE [file_primitive_definition_link] ( - [primitive_definition_id] int NOT NULL, - [file_id] int NOT NULL, - [is_needed_for_package] bit NOT NULL DEFAULT ((0)), - [is_needed_for_runtime] bit NOT NULL DEFAULT ((0)), - [is_needed_for_editor] bit NOT NULL DEFAULT ((0)), - [is_needed_for_browser] bit NOT NULL DEFAULT ((0)), - CONSTRAINT [PK_file_primitive_definition_link] PRIMARY KEY ([primitive_definition_id], [file_id], [file_id], [primitive_definition_id]) -); -GO - -ALTER TABLE [file_primitive_definition_link] ADD FOREIGN KEY ([primitive_definition_id]) REFERENCES [primitive_definition] ([primitive_definition_id]); -GO - diff --git a/gr/ddl/tables/file_table.sql b/gr/ddl/tables/file_table.sql deleted file mode 100644 index a5e97aa..0000000 --- a/gr/ddl/tables/file_table.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: file_table -CREATE TABLE [file_table] ( - [file_id] int NOT NULL, - [file_name] nvarchar(256) NOT NULL, - [vendor_name] nvarchar(256) NOT NULL, - [registration_type] int NOT NULL, - [subfolder] nvarchar(256) NOT NULL DEFAULT (''), - [file_version] nvarchar(50) NOT NULL DEFAULT (''), - [file_modified_time] nvarchar(50) NOT NULL DEFAULT (''), - CONSTRAINT [PK_file_table] PRIMARY KEY ([file_id]) -); -GO - diff --git a/gr/ddl/tables/folder.sql b/gr/ddl/tables/folder.sql deleted file mode 100644 index 4c9f32c..0000000 --- a/gr/ddl/tables/folder.sql +++ /dev/null @@ -1,14 +0,0 @@ --- Table: folder -CREATE TABLE [folder] ( - [folder_id] int NOT NULL, - [folder_type] smallint NOT NULL, - [folder_name] nvarchar(64) NOT NULL, - [parent_folder_id] int NOT NULL, - [depth] int NOT NULL, - [has_objects] bit NOT NULL, - [has_folders] bit NOT NULL, - [timestamp_of_last_change] timestamp NOT NULL, - CONSTRAINT [PK_folder] PRIMARY KEY ([folder_id]) -); -GO - diff --git a/gr/ddl/tables/folder_gobject_link.sql b/gr/ddl/tables/folder_gobject_link.sql deleted file mode 100644 index 0fd8b41..0000000 --- a/gr/ddl/tables/folder_gobject_link.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: folder_gobject_link -CREATE TABLE [folder_gobject_link] ( - [folder_id] int NOT NULL, - [folder_type] smallint NOT NULL, - [gobject_id] int NOT NULL, - [timestamp_of_last_change] timestamp NOT NULL, - CONSTRAINT [PK_folder_gobject_link] PRIMARY KEY ([folder_id], [gobject_id], [gobject_id]) -); -GO - -ALTER TABLE [folder_gobject_link] ADD FOREIGN KEY ([gobject_id]) REFERENCES [gobject] ([gobject_id]); -GO - diff --git a/gr/ddl/tables/galaxy.sql b/gr/ddl/tables/galaxy.sql deleted file mode 100644 index 6767e8e..0000000 --- a/gr/ddl/tables/galaxy.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Table: galaxy -CREATE TABLE [galaxy] ( - [time_of_last_deploy] datetime NULL DEFAULT (getdate()), - [time_of_last_config_change] datetime NULL DEFAULT (getdate()), - [is_galaxy_installed] bit NOT NULL DEFAULT ((1)), - [time_of_last_reference_binding] datetime NULL DEFAULT (getdate()), - [timestamp_of_last_cascade] bigint NOT NULL DEFAULT ((1)), - [timestamp_of_last_visual_element_reference_bind] bigint NOT NULL DEFAULT ((0)), - [max_proxy_timestamp] bigint NOT NULL DEFAULT (CONVERT([bigint],@@dbts)), - [max_visual_element_timestamp] bigint NOT NULL DEFAULT (CONVERT([bigint],@@dbts)), - [is_migration_in_progress] bit NOT NULL DEFAULT ((0)), - [time_of_last_association_change] datetime NULL DEFAULT (getdate()), - [subscription_id] uniqueidentifier NULL, - [batch_id] uniqueidentifier NULL, - [iteration_id] int NOT NULL DEFAULT ((0)) -); -GO - diff --git a/gr/ddl/tables/galaxy_data.sql b/gr/ddl/tables/galaxy_data.sql deleted file mode 100644 index 8eb60e2..0000000 --- a/gr/ddl/tables/galaxy_data.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Table: galaxy_data -CREATE TABLE [galaxy_data] ( - [data_type] nvarchar(256) NOT NULL, - [data] image(2147483647) NULL -); -GO - diff --git a/gr/ddl/tables/galaxy_settings.sql b/gr/ddl/tables/galaxy_settings.sql deleted file mode 100644 index 3c5b477..0000000 --- a/gr/ddl/tables/galaxy_settings.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: galaxy_settings -CREATE TABLE [galaxy_settings] ( - [galaxyid] int NULL, - [default_qs_data] ntext(1073741823) NOT NULL, - [current_qs_data] ntext(1073741823) NOT NULL -); -GO - diff --git a/gr/ddl/tables/gobject.sql b/gr/ddl/tables/gobject.sql deleted file mode 100644 index 1d81551..0000000 --- a/gr/ddl/tables/gobject.sql +++ /dev/null @@ -1,35 +0,0 @@ --- Table: gobject -CREATE TABLE [gobject] ( - [gobject_id] int NOT NULL, - [template_definition_id] int NOT NULL, - [derived_from_gobject_id] int NOT NULL DEFAULT ((0)), - [contained_by_gobject_id] int NOT NULL DEFAULT ((0)), - [area_gobject_id] int NOT NULL DEFAULT ((0)), - [hosted_by_gobject_id] int NOT NULL DEFAULT ((0)), - [checked_out_by_user_guid] uniqueidentifier NULL, - [default_symbol_gobject_id] int NOT NULL DEFAULT ((0)), - [default_display_gobject_id] int NOT NULL DEFAULT ((0)), - [checked_in_package_id] int NOT NULL DEFAULT ((0)), - [checked_out_package_id] int NOT NULL DEFAULT ((0)), - [deployed_package_id] int NOT NULL DEFAULT ((0)), - [last_deployed_package_id] int NOT NULL DEFAULT ((0)), - [tag_name] nvarchar(329) NOT NULL, - [contained_name] nvarchar(32) NOT NULL DEFAULT (''), - [identity_guid] uniqueidentifier NOT NULL DEFAULT (newid()), - [configuration_guid] uniqueidentifier NOT NULL, - [configuration_version] int NOT NULL, - [deployed_version] int NOT NULL DEFAULT ((0)), - [is_template] bit NOT NULL DEFAULT ((0)), - [is_hidden] bit NOT NULL DEFAULT ((0)), - [software_upgrade_needed] bit NOT NULL DEFAULT ((0)), - [hosting_tree_level] smallint NOT NULL DEFAULT ((0)), - [hierarchical_name] nvarchar(329) NOT NULL DEFAULT (''), - [namespace_id] smallint NOT NULL DEFAULT ((1)), - [deployment_pending_status] bit NOT NULL DEFAULT ((0)), - CONSTRAINT [PK_gobject] PRIMARY KEY ([gobject_id], [namespace_id], [template_definition_id]) -); -GO - -ALTER TABLE [gobject] ADD FOREIGN KEY ([template_definition_id]) REFERENCES [template_definition] ([template_definition_id]); -GO - diff --git a/gr/ddl/tables/gobject_asset_order.sql b/gr/ddl/tables/gobject_asset_order.sql deleted file mode 100644 index 7750a60..0000000 --- a/gr/ddl/tables/gobject_asset_order.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: gobject_asset_order -CREATE TABLE [gobject_asset_order] ( - [gobject_id] int NOT NULL, - [relative_index] float(53,) NOT NULL, - CONSTRAINT [PK_gobject_asset_order] PRIMARY KEY ([gobject_id]) -); -GO - -ALTER TABLE [gobject_asset_order] ADD FOREIGN KEY ([gobject_id]) REFERENCES [gobject] ([gobject_id]); -GO - diff --git a/gr/ddl/tables/gobject_change_log.sql b/gr/ddl/tables/gobject_change_log.sql deleted file mode 100644 index 070844e..0000000 --- a/gr/ddl/tables/gobject_change_log.sql +++ /dev/null @@ -1,16 +0,0 @@ --- Table: gobject_change_log -CREATE TABLE [gobject_change_log] ( - [gobject_change_log_id] int NOT NULL, - [gobject_id] int NOT NULL, - [change_date] datetime NULL, - [operation_id] smallint NOT NULL, - [user_comment] nvarchar(1024) NOT NULL DEFAULT (''), - [configuration_version] int NOT NULL DEFAULT ((0)), - [user_profile_name] nvarchar(256) NOT NULL, - CONSTRAINT [PK_gobject_change_log] PRIMARY KEY ([gobject_id], [operation_id]) -); -GO - -ALTER TABLE [gobject_change_log] ADD FOREIGN KEY ([operation_id]) REFERENCES [lookup_operation] ([operation_id]); -GO - diff --git a/gr/ddl/tables/gobject_filter_info_timestamp.sql b/gr/ddl/tables/gobject_filter_info_timestamp.sql deleted file mode 100644 index 57e5aff..0000000 --- a/gr/ddl/tables/gobject_filter_info_timestamp.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: gobject_filter_info_timestamp -CREATE TABLE [gobject_filter_info_timestamp] ( - [gobject_id] int NULL, - [timestamp_of_last_change] timestamp NOT NULL, - CONSTRAINT [PK_gobject_filter_info_timestamp] PRIMARY KEY ([timestamp_of_last_change], [gobject_id]) -); -GO - -ALTER TABLE [gobject_filter_info_timestamp] ADD FOREIGN KEY ([gobject_id]) REFERENCES [gobject] ([gobject_id]); -GO - diff --git a/gr/ddl/tables/gobject_friendly_name.sql b/gr/ddl/tables/gobject_friendly_name.sql deleted file mode 100644 index f15d33b..0000000 --- a/gr/ddl/tables/gobject_friendly_name.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: gobject_friendly_name -CREATE TABLE [gobject_friendly_name] ( - [gobject_id] int NOT NULL, - [friendly_name] nvarchar(1024) NOT NULL DEFAULT (''), - CONSTRAINT [PK_gobject_friendly_name] PRIMARY KEY ([gobject_id]) -); -GO - -ALTER TABLE [gobject_friendly_name] ADD FOREIGN KEY ([gobject_id]) REFERENCES [gobject] ([gobject_id]); -GO - diff --git a/gr/ddl/tables/gobject_log_details.sql b/gr/ddl/tables/gobject_log_details.sql deleted file mode 100644 index ff59371..0000000 --- a/gr/ddl/tables/gobject_log_details.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Table: gobject_log_details -CREATE TABLE [gobject_log_details] ( - [gobject_id] int NOT NULL, - [tag_name] nvarchar(329) NOT NULL -); -GO - diff --git a/gr/ddl/tables/gobject_protected.sql b/gr/ddl/tables/gobject_protected.sql deleted file mode 100644 index 5a54fbe..0000000 --- a/gr/ddl/tables/gobject_protected.sql +++ /dev/null @@ -1,6 +0,0 @@ --- Table: gobject_protected -CREATE TABLE [gobject_protected] ( - [gobject_id] int NOT NULL -); -GO - diff --git a/gr/ddl/tables/instance.sql b/gr/ddl/tables/instance.sql deleted file mode 100644 index 70b64f8..0000000 --- a/gr/ddl/tables/instance.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: instance -CREATE TABLE [instance] ( - [gobject_id] int NOT NULL, - [mx_platform_id] smallint NOT NULL DEFAULT ((0)), - [mx_engine_id] smallint NOT NULL DEFAULT ((0)), - [mx_object_id] smallint NOT NULL DEFAULT ((0)), - CONSTRAINT [PK_instance] PRIMARY KEY ([gobject_id], [gobject_id]) -); -GO - -ALTER TABLE [instance] ADD FOREIGN KEY ([gobject_id]) REFERENCES [gobject] ([gobject_id]); -GO - diff --git a/gr/ddl/tables/intouchviewapptemplate_allsymbols.sql b/gr/ddl/tables/intouchviewapptemplate_allsymbols.sql deleted file mode 100644 index 67ad651..0000000 --- a/gr/ddl/tables/intouchviewapptemplate_allsymbols.sql +++ /dev/null @@ -1,6 +0,0 @@ --- Table: intouchviewapptemplate_allsymbols -CREATE TABLE [intouchviewapptemplate_allsymbols] ( - [gobject_id] int NOT NULL -); -GO - diff --git a/gr/ddl/tables/lookup_category.sql b/gr/ddl/tables/lookup_category.sql deleted file mode 100644 index 8948a03..0000000 --- a/gr/ddl/tables/lookup_category.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: lookup_category -CREATE TABLE [lookup_category] ( - [category_id] smallint NOT NULL, - [category_name] nvarchar(50) NOT NULL, - CONSTRAINT [PK_lookup_category] PRIMARY KEY ([category_id]) -); -GO - diff --git a/gr/ddl/tables/lookup_folder.sql b/gr/ddl/tables/lookup_folder.sql deleted file mode 100644 index 2c226a1..0000000 --- a/gr/ddl/tables/lookup_folder.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Table: lookup_folder -CREATE TABLE [lookup_folder] ( - [folder_type] smallint NOT NULL, - [folder_type_name] nvarchar(32) NULL -); -GO - diff --git a/gr/ddl/tables/lookup_operation.sql b/gr/ddl/tables/lookup_operation.sql deleted file mode 100644 index 6517ce4..0000000 --- a/gr/ddl/tables/lookup_operation.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Table: lookup_operation -CREATE TABLE [lookup_operation] ( - [operation_id] smallint NOT NULL, - [operation_code] nvarchar(50) NOT NULL, - [operation_name] nvarchar(256) NOT NULL, - CONSTRAINT [PK_lookup_operation] PRIMARY KEY ([operation_id]) -); -GO - diff --git a/gr/ddl/tables/lookup_package_op_status.sql b/gr/ddl/tables/lookup_package_op_status.sql deleted file mode 100644 index e4c013a..0000000 --- a/gr/ddl/tables/lookup_package_op_status.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: lookup_package_op_status -CREATE TABLE [lookup_package_op_status] ( - [status_id] int NOT NULL, - [status_name] nvarchar(50) NOT NULL, - CONSTRAINT [PK_lookup_package_op_status] PRIMARY KEY ([status_id]) -); -GO - diff --git a/gr/ddl/tables/lookup_status.sql b/gr/ddl/tables/lookup_status.sql deleted file mode 100644 index 97f6dd6..0000000 --- a/gr/ddl/tables/lookup_status.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: lookup_status -CREATE TABLE [lookup_status] ( - [status_id] int NOT NULL, - [status_name] nvarchar(50) NOT NULL, - CONSTRAINT [PK_lookup_status] PRIMARY KEY ([status_id]) -); -GO - diff --git a/gr/ddl/tables/lookup_table_name.sql b/gr/ddl/tables/lookup_table_name.sql deleted file mode 100644 index 5e16e28..0000000 --- a/gr/ddl/tables/lookup_table_name.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Table: lookup_table_name -CREATE TABLE [lookup_table_name] ( - [table_id] smallint NOT NULL, - [table_name] nvarchar(250) NULL -); -GO - diff --git a/gr/ddl/tables/namespace.sql b/gr/ddl/tables/namespace.sql deleted file mode 100644 index 18130f0..0000000 --- a/gr/ddl/tables/namespace.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: namespace -CREATE TABLE [namespace] ( - [namespace_id] smallint NOT NULL, - [namespace_name] nvarchar(32) NULL, - CONSTRAINT [PK_namespace] PRIMARY KEY ([namespace_id]) -); -GO - diff --git a/gr/ddl/tables/object_device_linkage.sql b/gr/ddl/tables/object_device_linkage.sql deleted file mode 100644 index 6448fcb..0000000 --- a/gr/ddl/tables/object_device_linkage.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Table: object_device_linkage -CREATE TABLE [object_device_linkage] ( - [gobject_id] int NOT NULL, - [dio_id] int NOT NULL, - [sg_mx_primitive_id] smallint NOT NULL, - CONSTRAINT [PK_object_device_linkage] PRIMARY KEY ([gobject_id]) -); -GO - diff --git a/gr/ddl/tables/object_wizard_overview_symbols.sql b/gr/ddl/tables/object_wizard_overview_symbols.sql deleted file mode 100644 index 728e95e..0000000 --- a/gr/ddl/tables/object_wizard_overview_symbols.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Table: object_wizard_overview_symbols -CREATE TABLE [object_wizard_overview_symbols] ( - [gobject_id] int NOT NULL, - [visual_element_id] int NOT NULL, - [change_type] int NOT NULL, - [mx_primitive_id] int NULL -); -GO - diff --git a/gr/ddl/tables/object_wizard_symbol_override.sql b/gr/ddl/tables/object_wizard_symbol_override.sql deleted file mode 100644 index 0c19b23..0000000 --- a/gr/ddl/tables/object_wizard_symbol_override.sql +++ /dev/null @@ -1,12 +0,0 @@ --- Table: object_wizard_symbol_override -CREATE TABLE [object_wizard_symbol_override] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [symbol_overrides] image(2147483647) NULL, - CONSTRAINT [PK_object_wizard_symbol_override] PRIMARY KEY ([gobject_id], [package_id], [gobject_id], [package_id]) -); -GO - -ALTER TABLE [object_wizard_symbol_override] ADD FOREIGN KEY ([package_id]) REFERENCES [package] ([package_id]); -GO - diff --git a/gr/ddl/tables/object_wizard_symbol_override_mapping.sql b/gr/ddl/tables/object_wizard_symbol_override_mapping.sql deleted file mode 100644 index 1701569..0000000 --- a/gr/ddl/tables/object_wizard_symbol_override_mapping.sql +++ /dev/null @@ -1,15 +0,0 @@ --- Table: object_wizard_symbol_override_mapping -CREATE TABLE [object_wizard_symbol_override_mapping] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [has_local_overrides] bit NOT NULL, - [thumbnail] image(2147483647) NULL, - [preview] image(2147483647) NULL, - CONSTRAINT [PK_object_wizard_symbol_override_mapping] PRIMARY KEY ([gobject_id], [package_id], [mx_primitive_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id]) -); -GO - -ALTER TABLE [object_wizard_symbol_override_mapping] ADD FOREIGN KEY ([package_id]) REFERENCES [primitive_instance] ([package_id]); -GO - diff --git a/gr/ddl/tables/old_checked_in_packages.sql b/gr/ddl/tables/old_checked_in_packages.sql deleted file mode 100644 index c60a271..0000000 --- a/gr/ddl/tables/old_checked_in_packages.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Table: old_checked_in_packages -CREATE TABLE [old_checked_in_packages] ( - [package_id] int NULL, - [gobject_id] int NULL, - [is_template] bit NULL, - [is_being_referenced] bit NULL DEFAULT ((0)) -); -GO - diff --git a/gr/ddl/tables/operation.sql b/gr/ddl/tables/operation.sql deleted file mode 100644 index 12daf9d..0000000 --- a/gr/ddl/tables/operation.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: operation -CREATE TABLE [operation] ( - [operation_id] int NOT NULL, - [user_profile_id] int NOT NULL, - [operation_name] nvarchar(300) NOT NULL, - [start_time] datetime NOT NULL DEFAULT (getdate()), - CONSTRAINT [PK_operation] PRIMARY KEY ([operation_id], [user_profile_id]) -); -GO - -ALTER TABLE [operation] ADD FOREIGN KEY ([user_profile_id]) REFERENCES [user_profile] ([user_profile_id]); -GO - diff --git a/gr/ddl/tables/operation_message.sql b/gr/ddl/tables/operation_message.sql deleted file mode 100644 index 8b01bb3..0000000 --- a/gr/ddl/tables/operation_message.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: operation_message -CREATE TABLE [operation_message] ( - [message_id] int NOT NULL, - [operation_id] int NOT NULL, - [message_text] nvarchar(300) NOT NULL, - [message_time] datetime NOT NULL DEFAULT (getdate()), - CONSTRAINT [PK_operation_message] PRIMARY KEY ([message_id], [operation_id]) -); -GO - -ALTER TABLE [operation_message] ADD FOREIGN KEY ([operation_id]) REFERENCES [operation] ([operation_id]); -GO - diff --git a/gr/ddl/tables/operation_status.sql b/gr/ddl/tables/operation_status.sql deleted file mode 100644 index dd91a1c..0000000 --- a/gr/ddl/tables/operation_status.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: operation_status -CREATE TABLE [operation_status] ( - [operation_id] int NOT NULL, - [status] int NOT NULL, - CONSTRAINT [PK_operation_status] PRIMARY KEY ([operation_id], [status], [operation_id]) -); -GO - -ALTER TABLE [operation_status] ADD FOREIGN KEY ([operation_id]) REFERENCES [operation] ([operation_id]); -GO - diff --git a/gr/ddl/tables/operation_status_look_up.sql b/gr/ddl/tables/operation_status_look_up.sql deleted file mode 100644 index 1c47383..0000000 --- a/gr/ddl/tables/operation_status_look_up.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: operation_status_look_up -CREATE TABLE [operation_status_look_up] ( - [status] int NOT NULL, - [status_name] varchar(100) NOT NULL, - CONSTRAINT [PK_operation_status_look_up] PRIMARY KEY ([status]) -); -GO - diff --git a/gr/ddl/tables/ow_group_def.sql b/gr/ddl/tables/ow_group_def.sql deleted file mode 100644 index 9bc8002..0000000 --- a/gr/ddl/tables/ow_group_def.sql +++ /dev/null @@ -1,16 +0,0 @@ --- Table: ow_group_def -CREATE TABLE [ow_group_def] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [ow_group_id] int NOT NULL, - [prompt] nvarchar(260) NOT NULL, - [GUID] varchar(36) NOT NULL, - [description] nvarchar(260) NULL, - [visibility_rules] nvarchar(-1) NULL, - CONSTRAINT [PK_ow_group_def] PRIMARY KEY ([gobject_id], [package_id], [ow_group_id], [ow_group_id]) -); -GO - -ALTER TABLE [ow_group_def] ADD FOREIGN KEY ([ow_group_id]) REFERENCES [ow_group_id] ([ow_group_id]); -GO - diff --git a/gr/ddl/tables/ow_group_id.sql b/gr/ddl/tables/ow_group_id.sql deleted file mode 100644 index 73d74b7..0000000 --- a/gr/ddl/tables/ow_group_id.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Table: ow_group_id -CREATE TABLE [ow_group_id] ( - [ow_group_id] int NOT NULL, - CONSTRAINT [PK_ow_group_id] PRIMARY KEY ([ow_group_id]) -); -GO - diff --git a/gr/ddl/tables/ow_group_override.sql b/gr/ddl/tables/ow_group_override.sql deleted file mode 100644 index 5426baf..0000000 --- a/gr/ddl/tables/ow_group_override.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: ow_group_override -CREATE TABLE [ow_group_override] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [ow_group_id] int NOT NULL, - [property_bitmask] int NOT NULL, - CONSTRAINT [PK_ow_group_override] PRIMARY KEY ([gobject_id], [package_id], [ow_group_id], [ow_group_id]) -); -GO - -ALTER TABLE [ow_group_override] ADD FOREIGN KEY ([ow_group_id]) REFERENCES [ow_group_id] ([ow_group_id]); -GO - diff --git a/gr/ddl/tables/ow_instance_setting.sql b/gr/ddl/tables/ow_instance_setting.sql deleted file mode 100644 index f68caf9..0000000 --- a/gr/ddl/tables/ow_instance_setting.sql +++ /dev/null @@ -1,17 +0,0 @@ --- Table: ow_instance_setting -CREATE TABLE [ow_instance_setting] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [name] nvarchar(329) NOT NULL, - [ow_setting_type] int NOT NULL, - [is_dmv] bit NOT NULL, - [override_value] nvarchar(-1) NULL, - [is_mx] bit NOT NULL, - [is_implicit] bit NULL, - CONSTRAINT [PK_ow_instance_setting] PRIMARY KEY ([gobject_id], [package_id], [name], [ow_setting_type], [is_dmv], [ow_setting_type]) -); -GO - -ALTER TABLE [ow_instance_setting] ADD FOREIGN KEY ([ow_setting_type]) REFERENCES [ow_lu_setting] ([ow_setting_type]); -GO - diff --git a/gr/ddl/tables/ow_link_def.sql b/gr/ddl/tables/ow_link_def.sql deleted file mode 100644 index 99ce9b1..0000000 --- a/gr/ddl/tables/ow_link_def.sql +++ /dev/null @@ -1,19 +0,0 @@ --- Table: ow_link_def -CREATE TABLE [ow_link_def] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [ow_link_id] int NOT NULL, - [ow_link_type] int NOT NULL, - [name] nvarchar(329) NOT NULL, - [mx_primitive_id] smallint NULL, - [dynamic_attribute_id] bigint NULL, - [optional_id] int NULL, - [property_bitmask] int NOT NULL, - [sort] int NOT NULL, - CONSTRAINT [PK_ow_link_def] PRIMARY KEY ([gobject_id], [package_id], [ow_link_id], [ow_link_id]) -); -GO - -ALTER TABLE [ow_link_def] ADD FOREIGN KEY ([ow_link_id]) REFERENCES [ow_link_id] ([ow_link_id]); -GO - diff --git a/gr/ddl/tables/ow_link_id.sql b/gr/ddl/tables/ow_link_id.sql deleted file mode 100644 index b1f6906..0000000 --- a/gr/ddl/tables/ow_link_id.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: ow_link_id -CREATE TABLE [ow_link_id] ( - [ow_link_id] int NOT NULL, - [ow_opt_or_choice_id] int NOT NULL, - CONSTRAINT [PK_ow_link_id] PRIMARY KEY ([ow_link_id], [ow_opt_or_choice_id]) -); -GO - -ALTER TABLE [ow_link_id] ADD FOREIGN KEY ([ow_opt_or_choice_id]) REFERENCES [ow_opt_or_choice_id] ([ow_opt_or_choice_id]); -GO - diff --git a/gr/ddl/tables/ow_lu_definition.sql b/gr/ddl/tables/ow_lu_definition.sql deleted file mode 100644 index d832c27..0000000 --- a/gr/ddl/tables/ow_lu_definition.sql +++ /dev/null @@ -1,17 +0,0 @@ --- Table: ow_lu_definition -CREATE TABLE [ow_lu_definition] ( - [ow_setting_type] int NOT NULL, - [primitive_definition_id] int NOT NULL, - [template_definition_id] int NOT NULL, - [boolean_analog] bit NOT NULL, - [ext] varchar(20) NOT NULL, - [link_setting] int NULL, - [link_feature] int NULL, - [mx_attribute_id] smallint NULL, - CONSTRAINT [PK_ow_lu_definition] PRIMARY KEY ([ow_setting_type], [primitive_definition_id], [ow_setting_type]) -); -GO - -ALTER TABLE [ow_lu_definition] ADD FOREIGN KEY ([ow_setting_type]) REFERENCES [ow_lu_setting] ([ow_setting_type]); -GO - diff --git a/gr/ddl/tables/ow_lu_setting.sql b/gr/ddl/tables/ow_lu_setting.sql deleted file mode 100644 index 88dec60..0000000 --- a/gr/ddl/tables/ow_lu_setting.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Table: ow_lu_setting -CREATE TABLE [ow_lu_setting] ( - [ow_setting_type] int NOT NULL, - [category] varchar(10) NOT NULL, - [mx_data_type] tinyint NULL, - [setting_name] nvarchar(30) NOT NULL, - [feature_id] int NULL, - [feature_sub_id] int NULL, - [parent_type] int NULL, - [no_ext] bit NULL, - [raw_value] nvarchar(100) NULL, - CONSTRAINT [PK_ow_lu_setting] PRIMARY KEY ([ow_setting_type], [mx_data_type]) -); -GO - -ALTER TABLE [ow_lu_setting] ADD FOREIGN KEY ([mx_data_type]) REFERENCES [data_type] ([mx_data_type]); -GO - diff --git a/gr/ddl/tables/ow_opt_or_choice_def.sql b/gr/ddl/tables/ow_opt_or_choice_def.sql deleted file mode 100644 index 93ea34d..0000000 --- a/gr/ddl/tables/ow_opt_or_choice_def.sql +++ /dev/null @@ -1,21 +0,0 @@ --- Table: ow_opt_or_choice_def -CREATE TABLE [ow_opt_or_choice_def] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [ow_opt_or_choice_id] int NOT NULL, - [prompt] nvarchar(260) NOT NULL, - [GUID] varchar(36) NOT NULL, - [name] varchar(10) NOT NULL, - [description] nvarchar(260) NULL, - [choice_sequence_number] int NULL, - [after_group_or_option] int NULL, - [initial_value] bit NOT NULL DEFAULT ((0)), - [visibility_rules] nvarchar(-1) NULL, - [sort] int NOT NULL, - CONSTRAINT [PK_ow_opt_or_choice_def] PRIMARY KEY ([gobject_id], [package_id], [ow_opt_or_choice_id], [ow_opt_or_choice_id]) -); -GO - -ALTER TABLE [ow_opt_or_choice_def] ADD FOREIGN KEY ([ow_opt_or_choice_id]) REFERENCES [ow_opt_or_choice_id] ([ow_opt_or_choice_id]); -GO - diff --git a/gr/ddl/tables/ow_opt_or_choice_id.sql b/gr/ddl/tables/ow_opt_or_choice_id.sql deleted file mode 100644 index ee09c8a..0000000 --- a/gr/ddl/tables/ow_opt_or_choice_id.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: ow_opt_or_choice_id -CREATE TABLE [ow_opt_or_choice_id] ( - [ow_opt_or_choice_id] int NOT NULL, - [ow_group_id] int NOT NULL, - CONSTRAINT [PK_ow_opt_or_choice_id] PRIMARY KEY ([ow_opt_or_choice_id], [ow_group_id]) -); -GO - -ALTER TABLE [ow_opt_or_choice_id] ADD FOREIGN KEY ([ow_group_id]) REFERENCES [ow_group_id] ([ow_group_id]); -GO - diff --git a/gr/ddl/tables/ow_opt_or_choice_override.sql b/gr/ddl/tables/ow_opt_or_choice_override.sql deleted file mode 100644 index 00486df..0000000 --- a/gr/ddl/tables/ow_opt_or_choice_override.sql +++ /dev/null @@ -1,14 +0,0 @@ --- Table: ow_opt_or_choice_override -CREATE TABLE [ow_opt_or_choice_override] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [ow_opt_or_choice_id] int NOT NULL, - [property_bitmask] int NULL, - [override_value] bit NULL, - CONSTRAINT [PK_ow_opt_or_choice_override] PRIMARY KEY ([gobject_id], [package_id], [ow_opt_or_choice_id], [ow_opt_or_choice_id]) -); -GO - -ALTER TABLE [ow_opt_or_choice_override] ADD FOREIGN KEY ([ow_opt_or_choice_id]) REFERENCES [ow_opt_or_choice_id] ([ow_opt_or_choice_id]); -GO - diff --git a/gr/ddl/tables/ow_setting_def.sql b/gr/ddl/tables/ow_setting_def.sql deleted file mode 100644 index e4e4414..0000000 --- a/gr/ddl/tables/ow_setting_def.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Table: ow_setting_def -CREATE TABLE [ow_setting_def] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [ow_setting_id] int NOT NULL, - [ow_setting_type] int NOT NULL, - [reference] nvarchar(260) NULL, - [property_id] varchar(36) NULL, - [initial_value] nvarchar(-1) NULL, - [property_bitmask] int NULL, - [sort] int NOT NULL, - CONSTRAINT [PK_ow_setting_def] PRIMARY KEY ([gobject_id], [package_id], [ow_setting_id], [ow_setting_type], [ow_setting_id]) -); -GO - -ALTER TABLE [ow_setting_def] ADD FOREIGN KEY ([ow_setting_id]) REFERENCES [ow_setting_id] ([ow_setting_id]); -GO - diff --git a/gr/ddl/tables/ow_setting_id.sql b/gr/ddl/tables/ow_setting_id.sql deleted file mode 100644 index db55966..0000000 --- a/gr/ddl/tables/ow_setting_id.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: ow_setting_id -CREATE TABLE [ow_setting_id] ( - [ow_setting_id] int NOT NULL, - [ow_link_id] int NOT NULL, - CONSTRAINT [PK_ow_setting_id] PRIMARY KEY ([ow_setting_id], [ow_link_id]) -); -GO - -ALTER TABLE [ow_setting_id] ADD FOREIGN KEY ([ow_link_id]) REFERENCES [ow_link_id] ([ow_link_id]); -GO - diff --git a/gr/ddl/tables/ow_setting_override.sql b/gr/ddl/tables/ow_setting_override.sql deleted file mode 100644 index 6c52e44..0000000 --- a/gr/ddl/tables/ow_setting_override.sql +++ /dev/null @@ -1,14 +0,0 @@ --- Table: ow_setting_override -CREATE TABLE [ow_setting_override] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [ow_setting_id] int NOT NULL, - [override_value] nvarchar(-1) NULL, - [property_bitmask] int NULL, - CONSTRAINT [PK_ow_setting_override] PRIMARY KEY ([gobject_id], [package_id], [ow_setting_id], [ow_setting_id]) -); -GO - -ALTER TABLE [ow_setting_override] ADD FOREIGN KEY ([ow_setting_id]) REFERENCES [ow_setting_id] ([ow_setting_id]); -GO - diff --git a/gr/ddl/tables/ow_symbol_setting.sql b/gr/ddl/tables/ow_symbol_setting.sql deleted file mode 100644 index 5d82c14..0000000 --- a/gr/ddl/tables/ow_symbol_setting.sql +++ /dev/null @@ -1,17 +0,0 @@ --- Table: ow_symbol_setting -CREATE TABLE [ow_symbol_setting] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [sym_name] nvarchar(33) NOT NULL, - [ow_setting_type] int NOT NULL, - [reference] nvarchar(260) NOT NULL, - [property_id] nvarchar(36) NULL, - [value] nvarchar(-1) NULL, - [property_bitmask] int NULL, - CONSTRAINT [PK_ow_symbol_setting] PRIMARY KEY ([gobject_id], [package_id], [sym_name], [ow_setting_type], [reference], [ow_setting_type]) -); -GO - -ALTER TABLE [ow_symbol_setting] ADD FOREIGN KEY ([ow_setting_type]) REFERENCES [ow_lu_setting] ([ow_setting_type]); -GO - diff --git a/gr/ddl/tables/owned_visual_element.sql b/gr/ddl/tables/owned_visual_element.sql deleted file mode 100644 index e5d64b8..0000000 --- a/gr/ddl/tables/owned_visual_element.sql +++ /dev/null @@ -1,21 +0,0 @@ --- Table: owned_visual_element -CREATE TABLE [owned_visual_element] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [visual_element_id] int NOT NULL, - [thumbnail] image(2147483647) NULL, - [description] nvarchar(1024) NULL, - [visual_element_definition] image(2147483647) NOT NULL, - [is_thumbnail_dirty] bit NOT NULL DEFAULT ((0)), - [visual_element_definition_grm] image(2147483647) NOT NULL, - [content_type] nvarchar(1024) NULL, - [visual_element_crossRef] nvarchar(-1) NULL, - [preview] image(2147483647) NULL, - CONSTRAINT [PK_owned_visual_element] PRIMARY KEY ([gobject_id], [package_id], [mx_primitive_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id]) -); -GO - -ALTER TABLE [owned_visual_element] ADD FOREIGN KEY ([package_id]) REFERENCES [visual_element_version] ([package_id]); -GO - diff --git a/gr/ddl/tables/package.sql b/gr/ddl/tables/package.sql deleted file mode 100644 index 7b1329c..0000000 --- a/gr/ddl/tables/package.sql +++ /dev/null @@ -1,21 +0,0 @@ --- Table: package -CREATE TABLE [package] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [status_id] int NOT NULL DEFAULT ((0)), - [reference_status_id] int NOT NULL DEFAULT ((0)), - [instance_attributes] image(2147483647) NULL, - [operation_status] int NOT NULL DEFAULT ((0)), - [security_group] nvarchar(32) NOT NULL DEFAULT ('Default'), - [derived_from_package_id] int NOT NULL DEFAULT ((0)), - [deployable_configuration_version] int NOT NULL DEFAULT ((0)), - [package_type] nvarchar(5) NOT NULL DEFAULT ('I'), - [package_version] smallint NOT NULL DEFAULT ((0)), - [object_status] smallint NOT NULL DEFAULT ((0)), - CONSTRAINT [PK_package] PRIMARY KEY ([gobject_id], [package_id], [gobject_id], [status_id]) -); -GO - -ALTER TABLE [package] ADD FOREIGN KEY ([status_id]) REFERENCES [lookup_status] ([status_id]); -GO - diff --git a/gr/ddl/tables/packages_to_be_deleted.sql b/gr/ddl/tables/packages_to_be_deleted.sql deleted file mode 100644 index 1864a86..0000000 --- a/gr/ddl/tables/packages_to_be_deleted.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: packages_to_be_deleted -CREATE TABLE [packages_to_be_deleted] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - CONSTRAINT [PK_packages_to_be_deleted] PRIMARY KEY ([gobject_id], [package_id]) -); -GO - diff --git a/gr/ddl/tables/platform.sql b/gr/ddl/tables/platform.sql deleted file mode 100644 index b128f2b..0000000 --- a/gr/ddl/tables/platform.sql +++ /dev/null @@ -1,21 +0,0 @@ --- Table: platform -CREATE TABLE [platform] ( - [platform_id] int NOT NULL, - [platform_gobject_id] int NOT NULL, - [node_name] nvarchar(256) NOT NULL DEFAULT (''), - [last_deployed_node_name] nvarchar(256) NOT NULL DEFAULT (''), - [rmcNode_name] nvarchar(256) NOT NULL DEFAULT (''), - [last_deployed_rmcNode_name] nvarchar(256) NOT NULL DEFAULT (''), - [portNMX] int NOT NULL DEFAULT ((0)), - [last_deployed_portNMX] int NOT NULL DEFAULT ((0)), - [portRMC] int NOT NULL DEFAULT ((0)), - [last_deployed_portRMC] int NOT NULL DEFAULT ((0)), - [portRPC] int NOT NULL DEFAULT ((0)), - [last_deployed_portRPC] int NOT NULL DEFAULT ((0)), - CONSTRAINT [PK_platform] PRIMARY KEY ([platform_gobject_id], [platform_gobject_id]) -); -GO - -ALTER TABLE [platform] ADD FOREIGN KEY ([platform_gobject_id]) REFERENCES [gobject] ([gobject_id]); -GO - diff --git a/gr/ddl/tables/platform_license.sql b/gr/ddl/tables/platform_license.sql deleted file mode 100644 index fa0c7a0..0000000 --- a/gr/ddl/tables/platform_license.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: platform_license -CREATE TABLE [platform_license] ( - [gobject_id] int NOT NULL, - [license_type] int NOT NULL, - CONSTRAINT [PK_platform_license] PRIMARY KEY ([gobject_id], [gobject_id]) -); -GO - -ALTER TABLE [platform_license] ADD FOREIGN KEY ([gobject_id]) REFERENCES [gobject] ([gobject_id]); -GO - diff --git a/gr/ddl/tables/primitive_attribute_validation_results.sql b/gr/ddl/tables/primitive_attribute_validation_results.sql deleted file mode 100644 index bf6e4d7..0000000 --- a/gr/ddl/tables/primitive_attribute_validation_results.sql +++ /dev/null @@ -1,15 +0,0 @@ --- Table: primitive_attribute_validation_results -CREATE TABLE [primitive_attribute_validation_results] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [mx_attribute_id] smallint NOT NULL, - [validationCode] nvarchar(329) NOT NULL, - [validationState] smallint NOT NULL, - CONSTRAINT [PK_primitive_attribute_validation_results] PRIMARY KEY ([gobject_id], [package_id], [mx_primitive_id], [mx_attribute_id], [validationCode], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id]) -); -GO - -ALTER TABLE [primitive_attribute_validation_results] ADD FOREIGN KEY ([package_id]) REFERENCES [primitive_instance] ([package_id]); -GO - diff --git a/gr/ddl/tables/primitive_data_type.sql b/gr/ddl/tables/primitive_data_type.sql deleted file mode 100644 index 0def6dc..0000000 --- a/gr/ddl/tables/primitive_data_type.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: primitive_data_type -CREATE TABLE [primitive_data_type] ( - [mx_data_type] tinyint NOT NULL, - [primitive_definition_id] int NOT NULL, - CONSTRAINT [PK_primitive_data_type] PRIMARY KEY ([mx_data_type], [primitive_definition_id], [mx_data_type], [primitive_definition_id]) -); -GO - -ALTER TABLE [primitive_data_type] ADD FOREIGN KEY ([primitive_definition_id]) REFERENCES [primitive_definition] ([primitive_definition_id]); -GO - diff --git a/gr/ddl/tables/primitive_definition.sql b/gr/ddl/tables/primitive_definition.sql deleted file mode 100644 index 5771df8..0000000 --- a/gr/ddl/tables/primitive_definition.sql +++ /dev/null @@ -1,21 +0,0 @@ --- Table: primitive_definition -CREATE TABLE [primitive_definition] ( - [primitive_definition_id] int NOT NULL, - [template_definition_id] int NOT NULL, - [parent_mx_primitive_id] smallint NOT NULL, - [mx_primitive_id] smallint NOT NULL DEFAULT ((0)), - [primitive_name] nvarchar(329) NOT NULL DEFAULT (''), - [execution_group] smallint NOT NULL, - [is_virtual] bit NOT NULL, - [primitive_guid] uniqueidentifier NOT NULL, - [runtime_handler_clsid] uniqueidentifier NULL, - [package_handler_clsid] uniqueidentifier NULL, - [supports_dynamic_attributes] bit NOT NULL, - [major_version] int NOT NULL, - CONSTRAINT [PK_primitive_definition] PRIMARY KEY ([primitive_definition_id], [template_definition_id]) -); -GO - -ALTER TABLE [primitive_definition] ADD FOREIGN KEY ([template_definition_id]) REFERENCES [template_definition] ([template_definition_id]); -GO - diff --git a/gr/ddl/tables/primitive_instance.sql b/gr/ddl/tables/primitive_instance.sql deleted file mode 100644 index 8f3e20c..0000000 --- a/gr/ddl/tables/primitive_instance.sql +++ /dev/null @@ -1,34 +0,0 @@ --- Table: primitive_instance -CREATE TABLE [primitive_instance] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [primitive_definition_id] int NOT NULL, - [primitive_name] nvarchar(329) NOT NULL, - [parent_mx_primitive_id] smallint NOT NULL, - [execution_group] int NOT NULL, - [execution_order] int NOT NULL DEFAULT ((-1)), - [owned_by_gobject_id] int NOT NULL DEFAULT ((0)), - [timestamp_of_last_change] bigint NULL DEFAULT ((0)), - [max_child_timestamp] bigint NULL DEFAULT ((0)), - [extension_type] nvarchar(329) NULL, - [is_object_extension] bit NULL DEFAULT ((0)), - [checked_in_primitive_version] int NOT NULL DEFAULT ((1)), - [checked_out_primitive_version] int NOT NULL DEFAULT ((1)), - [entity_change_type] int NOT NULL DEFAULT ((1)), - [operation_on_primitive_mask] int NOT NULL DEFAULT ((0)), - [created_by_parent] smallint NOT NULL DEFAULT ((0)), - [status_id] smallint NOT NULL DEFAULT ((0)), - [ref_status_id] smallint NOT NULL DEFAULT ((0)), - [primitive_attributes] image(2147483647) NULL, - [mx_value_errors] text(2147483647) NOT NULL, - [mx_value_warnings] text(2147483647) NOT NULL, - [mx_value_reference_warnings] text(2147483647) NOT NULL, - [property_bitmask] smallint NOT NULL DEFAULT ((0)), - CONSTRAINT [PK_primitive_instance] PRIMARY KEY ([gobject_id], [package_id], [mx_primitive_id], [gobject_id], [package_id], [gobject_id], [package_id]) -); -GO - -ALTER TABLE [primitive_instance] ADD FOREIGN KEY ([package_id]) REFERENCES [package] ([package_id]); -GO - diff --git a/gr/ddl/tables/primitive_instance_feature_link.sql b/gr/ddl/tables/primitive_instance_feature_link.sql deleted file mode 100644 index 064c02e..0000000 --- a/gr/ddl/tables/primitive_instance_feature_link.sql +++ /dev/null @@ -1,15 +0,0 @@ --- Table: primitive_instance_feature_link -CREATE TABLE [primitive_instance_feature_link] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [feature_id] int NOT NULL, - [feature_name] nvarchar(256) NOT NULL DEFAULT (''), - [feature_type] nvarchar(256) NOT NULL DEFAULT (''), - CONSTRAINT [PK_primitive_instance_feature_link] PRIMARY KEY ([gobject_id], [package_id], [mx_primitive_id], [feature_id], [feature_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id]) -); -GO - -ALTER TABLE [primitive_instance_feature_link] ADD FOREIGN KEY ([package_id]) REFERENCES [primitive_instance] ([package_id]); -GO - diff --git a/gr/ddl/tables/primitive_instance_file_table_link.sql b/gr/ddl/tables/primitive_instance_file_table_link.sql deleted file mode 100644 index c14c8d1..0000000 --- a/gr/ddl/tables/primitive_instance_file_table_link.sql +++ /dev/null @@ -1,16 +0,0 @@ --- Table: primitive_instance_file_table_link -CREATE TABLE [primitive_instance_file_table_link] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [file_id] int NOT NULL, - [is_needed_for_package] bit NOT NULL DEFAULT ((0)), - [is_needed_for_runtime] bit NOT NULL DEFAULT ((0)), - [is_needed_for_editor] bit NOT NULL DEFAULT ((0)), - CONSTRAINT [PK_primitive_instance_file_table_link] PRIMARY KEY ([gobject_id], [package_id], [mx_primitive_id], [file_id], [file_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id]) -); -GO - -ALTER TABLE [primitive_instance_file_table_link] ADD FOREIGN KEY ([package_id]) REFERENCES [primitive_instance] ([package_id]); -GO - diff --git a/gr/ddl/tables/proxy_timestamp.sql b/gr/ddl/tables/proxy_timestamp.sql deleted file mode 100644 index 0676dfe..0000000 --- a/gr/ddl/tables/proxy_timestamp.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Table: proxy_timestamp -CREATE TABLE [proxy_timestamp] ( - [gobject_id] int NOT NULL, - [timestamp_of_last_change] timestamp NOT NULL, - [ImportGUID] nvarchar(265) NULL, - CONSTRAINT [PK_proxy_timestamp] PRIMARY KEY ([gobject_id]) -); -GO - diff --git a/gr/ddl/tables/redundancy.sql b/gr/ddl/tables/redundancy.sql deleted file mode 100644 index 12f3a7a..0000000 --- a/gr/ddl/tables/redundancy.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: redundancy -CREATE TABLE [redundancy] ( - [primary_gobject_id] int NOT NULL, - [backup_gobject_id] int NOT NULL, - CONSTRAINT [PK_redundancy] PRIMARY KEY ([primary_gobject_id], [backup_gobject_id]) -); -GO - diff --git a/gr/ddl/tables/renamed_visual_element.sql b/gr/ddl/tables/renamed_visual_element.sql deleted file mode 100644 index 3f433b8..0000000 --- a/gr/ddl/tables/renamed_visual_element.sql +++ /dev/null @@ -1,14 +0,0 @@ --- Table: renamed_visual_element -CREATE TABLE [renamed_visual_element] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [visual_element_id] int NOT NULL, - [old_visual_element_name] nvarchar(329) NOT NULL, - [new_visual_element_name] nvarchar(329) NOT NULL, - [visual_element_type] nvarchar(32) NOT NULL, - [timestamp_of_rename] timestamp NOT NULL, - CONSTRAINT [PK_renamed_visual_element] PRIMARY KEY ([gobject_id], [package_id], [timestamp_of_rename]) -); -GO - diff --git a/gr/ddl/tables/schema_version.sql b/gr/ddl/tables/schema_version.sql deleted file mode 100644 index ef79598..0000000 --- a/gr/ddl/tables/schema_version.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Table: schema_version -CREATE TABLE [schema_version] ( - [version_number] int NOT NULL, - [version_string] nvarchar(64) NOT NULL, - [cdi_version] nvarchar(64) NOT NULL, - [old_version_number] int NOT NULL DEFAULT ((0)) -); -GO - diff --git a/gr/ddl/tables/supported_locales.sql b/gr/ddl/tables/supported_locales.sql deleted file mode 100644 index 81697b5..0000000 --- a/gr/ddl/tables/supported_locales.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Table: supported_locales -CREATE TABLE [supported_locales] ( - [locale_id] smallint NOT NULL, - CONSTRAINT [PK_supported_locales] PRIMARY KEY ([locale_id]) -); -GO - diff --git a/gr/ddl/tables/template.sql b/gr/ddl/tables/template.sql deleted file mode 100644 index 3d96c22..0000000 --- a/gr/ddl/tables/template.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: template -CREATE TABLE [template] ( - [gobject_id] int NOT NULL, - [toolset_id] int NOT NULL, - CONSTRAINT [PK_template] PRIMARY KEY ([gobject_id], [gobject_id], [toolset_id]) -); -GO - -ALTER TABLE [template] ADD FOREIGN KEY ([toolset_id]) REFERENCES [toolset] ([toolset_id]); -GO - diff --git a/gr/ddl/tables/template_attribute.sql b/gr/ddl/tables/template_attribute.sql deleted file mode 100644 index 5426adb..0000000 --- a/gr/ddl/tables/template_attribute.sql +++ /dev/null @@ -1,20 +0,0 @@ --- Table: template_attribute -CREATE TABLE [template_attribute] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [mx_attribute_id] smallint NOT NULL, - [security_classification] int NOT NULL, - [mx_data_type] smallint NOT NULL, - [mx_value] text(2147483647) NOT NULL, - [lock_type] int NOT NULL, - [original_lock_type] int NOT NULL DEFAULT ((0)), - [bit_values] smallint NOT NULL DEFAULT ((0)), - [raw_value] nvarchar(1024) NULL DEFAULT (NULL), - CONSTRAINT [PK_template_attribute] PRIMARY KEY ([gobject_id], [package_id], [mx_primitive_id], [mx_attribute_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id]) -); -GO - -ALTER TABLE [template_attribute] ADD FOREIGN KEY ([package_id]) REFERENCES [primitive_instance] ([package_id]); -GO - diff --git a/gr/ddl/tables/template_definition.sql b/gr/ddl/tables/template_definition.sql deleted file mode 100644 index 51426a6..0000000 --- a/gr/ddl/tables/template_definition.sql +++ /dev/null @@ -1,20 +0,0 @@ --- Table: template_definition -CREATE TABLE [template_definition] ( - [template_definition_id] int NOT NULL, - [base_gobject_id] int NOT NULL DEFAULT ((0)), - [original_template_tagname] nvarchar(32) NOT NULL DEFAULT (''), - [required_features] nvarchar(256) NULL, - [supported_features] nvarchar(256) NULL, - [category_id] smallint NOT NULL, - [category_clsid] uniqueidentifier NULL, - [runtime_clsid] uniqueidentifier NULL, - [base_template_location] nchar(260) NOT NULL DEFAULT (''), - [vendor_name] nvarchar(256) NULL, - [major_version] smallint NULL, - [codebase] nvarchar(322) NULL, - [codebase_minor_version] int NOT NULL DEFAULT ((0)), - [event_mask] int NOT NULL DEFAULT ((0)), - CONSTRAINT [PK_template_definition] PRIMARY KEY ([template_definition_id]) -); -GO - diff --git a/gr/ddl/tables/template_idebehavior_link.sql b/gr/ddl/tables/template_idebehavior_link.sql deleted file mode 100644 index 4454525..0000000 --- a/gr/ddl/tables/template_idebehavior_link.sql +++ /dev/null @@ -1,22 +0,0 @@ --- Table: template_idebehavior_link -CREATE TABLE [template_idebehavior_link] ( - [template_definition_id] int NOT NULL, - [shown_in_template_toolbox] bit NOT NULL DEFAULT ((1)), - [shown_in_model_view] bit NOT NULL DEFAULT ((1)), - [shown_in_deployment_view] bit NOT NULL DEFAULT ((1)), - [shown_in_security_editor] bit NOT NULL DEFAULT ((1)), - [shown_tagname] bit NOT NULL DEFAULT ((1)), - [shown_containedname] bit NOT NULL DEFAULT ((1)), - [shown_in_archestra_browser] bit NOT NULL DEFAULT ((1)), - [shown_standard_archestra_editor_tab] bit NOT NULL DEFAULT ((1)), - [enable_objectviewermenu] bit NOT NULL DEFAULT ((1)), - [enable_createinstance] bit NOT NULL DEFAULT ((1)), - [enable_createtemplate] bit NOT NULL DEFAULT ((1)), - [idebehavior_flags] int NOT NULL DEFAULT ((511)), - CONSTRAINT [PK_template_idebehavior_link] PRIMARY KEY ([template_definition_id], [template_definition_id]) -); -GO - -ALTER TABLE [template_idebehavior_link] ADD FOREIGN KEY ([template_definition_id]) REFERENCES [template_definition] ([template_definition_id]); -GO - diff --git a/gr/ddl/tables/template_migration_policy.sql b/gr/ddl/tables/template_migration_policy.sql deleted file mode 100644 index 2e5789a..0000000 --- a/gr/ddl/tables/template_migration_policy.sql +++ /dev/null @@ -1,7 +0,0 @@ --- Table: template_migration_policy -CREATE TABLE [template_migration_policy] ( - [migrate_to_codebase] nvarchar(322) NOT NULL, - [migrate_from_codebase] nvarchar(322) NOT NULL -); -GO - diff --git a/gr/ddl/tables/timestamp_record.sql b/gr/ddl/tables/timestamp_record.sql deleted file mode 100644 index ab36be7..0000000 --- a/gr/ddl/tables/timestamp_record.sql +++ /dev/null @@ -1,6 +0,0 @@ --- Table: timestamp_record -CREATE TABLE [timestamp_record] ( - [ts] timestamp NOT NULL -); -GO - diff --git a/gr/ddl/tables/toolset.sql b/gr/ddl/tables/toolset.sql deleted file mode 100644 index bffb46f..0000000 --- a/gr/ddl/tables/toolset.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: toolset -CREATE TABLE [toolset] ( - [toolset_id] int NOT NULL, - [toolset_name] nvarchar(64) NOT NULL, - CONSTRAINT [PK_toolset] PRIMARY KEY ([toolset_id]) -); -GO - diff --git a/gr/ddl/tables/user_preferences.sql b/gr/ddl/tables/user_preferences.sql deleted file mode 100644 index cdba241..0000000 --- a/gr/ddl/tables/user_preferences.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Table: user_preferences -CREATE TABLE [user_preferences] ( - [user_preferences_id] int NOT NULL, - [user_profile_id] int NOT NULL, - [preference_type] nvarchar(256) NOT NULL, - [preferences] image(2147483647) NULL, - CONSTRAINT [PK_user_preferences] PRIMARY KEY ([user_preferences_id], [user_profile_id]) -); -GO - -ALTER TABLE [user_preferences] ADD FOREIGN KEY ([user_profile_id]) REFERENCES [user_profile] ([user_profile_id]); -GO - diff --git a/gr/ddl/tables/user_profile.sql b/gr/ddl/tables/user_profile.sql deleted file mode 100644 index 344d618..0000000 --- a/gr/ddl/tables/user_profile.sql +++ /dev/null @@ -1,22 +0,0 @@ --- Table: user_profile -CREATE TABLE [user_profile] ( - [user_profile_id] int NOT NULL, - [user_profile_name] nvarchar(256) NOT NULL, - [user_guid] uniqueidentifier NOT NULL DEFAULT (newid()), - [password_hash] int NULL, - [default_platform_tag_name] nvarchar(32) NULL, - [default_app_engine_tag_name] nvarchar(32) NULL, - [default_view_engine_tag_name] nvarchar(32) NULL, - [default_history_engine_tag_name] nvarchar(32) NULL, - [default_area_tag_name] nvarchar(32) NULL, - [default_security_group] nvarchar(32) NOT NULL DEFAULT ('Default'), - [ide_preferences] ntext(1073741823) NULL, - [roles] ntext(1073741823) NULL, - [user_full_name] nvarchar(256) NULL, - [intouch_access_level] int NULL DEFAULT ((0)), - [user_version_id] int NOT NULL DEFAULT ((1)), - [crypto_secure_hashed_pwd] ntext(1073741823) NULL, - CONSTRAINT [PK_user_profile] PRIMARY KEY ([user_profile_id]) -); -GO - diff --git a/gr/ddl/tables/visual_element.sql b/gr/ddl/tables/visual_element.sql deleted file mode 100644 index 131d8b5..0000000 --- a/gr/ddl/tables/visual_element.sql +++ /dev/null @@ -1,10 +0,0 @@ --- Table: visual_element -CREATE TABLE [visual_element] ( - [visual_element_id] int NOT NULL, - [visual_element_type] nvarchar(32) NULL, - [inheritance_status] nchar(1) NULL, - [visual_element_category] nchar(1) NULL, - CONSTRAINT [PK_visual_element] PRIMARY KEY ([visual_element_id]) -); -GO - diff --git a/gr/ddl/tables/visual_element_affected_by_undo_check_out.sql b/gr/ddl/tables/visual_element_affected_by_undo_check_out.sql deleted file mode 100644 index 65ed7c6..0000000 --- a/gr/ddl/tables/visual_element_affected_by_undo_check_out.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: visual_element_affected_by_undo_check_out -CREATE TABLE [visual_element_affected_by_undo_check_out] ( - [visual_element_name] nvarchar(329) NULL, - [visual_element_id] int NULL, - [visual_element_type] nvarchar(32) NULL, - [change_type] int NULL, - [check_out_undone_by_user_guid] uniqueidentifier NOT NULL, - [timestamp_of_last_change] timestamp NOT NULL -); -GO - diff --git a/gr/ddl/tables/visual_element_archive.sql b/gr/ddl/tables/visual_element_archive.sql deleted file mode 100644 index 1d1f2ae..0000000 --- a/gr/ddl/tables/visual_element_archive.sql +++ /dev/null @@ -1,12 +0,0 @@ --- Table: visual_element_archive -CREATE TABLE [visual_element_archive] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [visual_element_name] nvarchar(329) NOT NULL, - [visual_element_type] nvarchar(32) NOT NULL, - [visual_element_id] int NOT NULL, - [persisted_for_gobject_id] int NOT NULL -); -GO - diff --git a/gr/ddl/tables/visual_element_id.sql b/gr/ddl/tables/visual_element_id.sql deleted file mode 100644 index c864c50..0000000 --- a/gr/ddl/tables/visual_element_id.sql +++ /dev/null @@ -1,6 +0,0 @@ --- Table: visual_element_id -CREATE TABLE [visual_element_id] ( - [visual_element_id] int NOT NULL -); -GO - diff --git a/gr/ddl/tables/visual_element_reference.sql b/gr/ddl/tables/visual_element_reference.sql deleted file mode 100644 index 7e57026..0000000 --- a/gr/ddl/tables/visual_element_reference.sql +++ /dev/null @@ -1,37 +0,0 @@ --- Table: visual_element_reference -CREATE TABLE [visual_element_reference] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [visual_element_reference_index] int NOT NULL, - [visual_element_bind_status] int NOT NULL, - [is_relative_reference] char(1) NOT NULL, - [checked_in_bound_visual_element_gobject_id] int NULL, - [checked_in_bound_visual_element_package_id] int NULL, - [checked_in_bound_visual_element_mx_primitive_id] smallint NULL, - [checked_out_bound_visual_element_gobject_id] int NULL, - [checked_out_bound_visual_element_package_id] int NULL, - [checked_out_bound_visual_element_mx_primitive_id] smallint NULL, - [unbound_timestamp] timestamp NOT NULL, - [checked_in_unbound_visual_element_name] nvarchar(362) NULL, - [checked_in_unbound_visual_element_type] nvarchar(32) NULL, - [checked_in_unbound_tag_name] nvarchar(329) NULL, - [checked_in_unbound_primitive_name] nvarchar(329) NULL, - [checked_in_unbound_relative_object_name] nvarchar(329) NULL, - [checked_in_unbound_visual_element_id] int NULL, - [checked_out_unbound_visual_element_name] nvarchar(362) NULL, - [checked_out_unbound_visual_element_type] nvarchar(32) NULL, - [checked_out_unbound_tag_name] nvarchar(329) NULL, - [checked_out_unbound_primitive_name] nvarchar(329) NULL, - [checked_out_unbound_relative_object_name] nvarchar(329) NULL, - [checked_out_unbound_visual_element_id] int NULL, - [checked_out_visual_element_package_id] int NULL, - [checked_out_visual_element_gobject_id] int NULL, - [checked_out_to_user_guid] uniqueidentifier NULL, - CONSTRAINT [PK_visual_element_reference] PRIMARY KEY ([gobject_id], [package_id], [mx_primitive_id], [visual_element_reference_index], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id]) -); -GO - -ALTER TABLE [visual_element_reference] ADD FOREIGN KEY ([package_id]) REFERENCES [primitive_instance] ([package_id]); -GO - diff --git a/gr/ddl/tables/visual_element_timestamp.sql b/gr/ddl/tables/visual_element_timestamp.sql deleted file mode 100644 index 690d051..0000000 --- a/gr/ddl/tables/visual_element_timestamp.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Table: visual_element_timestamp -CREATE TABLE [visual_element_timestamp] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [visual_element_id] int NOT NULL, - [change_type] int NOT NULL, - [timestamp_of_last_change] timestamp NOT NULL -); -GO - diff --git a/gr/ddl/tables/visual_element_version.sql b/gr/ddl/tables/visual_element_version.sql deleted file mode 100644 index 9ff8823..0000000 --- a/gr/ddl/tables/visual_element_version.sql +++ /dev/null @@ -1,17 +0,0 @@ --- Table: visual_element_version -CREATE TABLE [visual_element_version] ( - [gobject_id] int NOT NULL, - [package_id] int NOT NULL, - [mx_primitive_id] smallint NOT NULL, - [visual_element_id] int NOT NULL, - [inherited_from_gobject_id] int NOT NULL, - [inherited_from_package_id] int NOT NULL, - [inherited_from_mx_primitive_id] smallint NOT NULL, - [inherited_from_visual_element_id] int NULL, - CONSTRAINT [PK_visual_element_version] PRIMARY KEY ([gobject_id], [package_id], [mx_primitive_id], [inherited_from_gobject_id], [inherited_from_mx_primitive_id], [inherited_from_package_id], [inherited_from_gobject_id], [inherited_from_mx_primitive_id], [inherited_from_package_id], [inherited_from_gobject_id], [inherited_from_mx_primitive_id], [inherited_from_package_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id], [gobject_id], [mx_primitive_id], [package_id], [visual_element_id]) -); -GO - -ALTER TABLE [visual_element_version] ADD FOREIGN KEY ([visual_element_id]) REFERENCES [visual_element] ([visual_element_id]); -GO - diff --git a/gr/ddl/tables/well_known_client_controls.sql b/gr/ddl/tables/well_known_client_controls.sql deleted file mode 100644 index 268fbe6..0000000 --- a/gr/ddl/tables/well_known_client_controls.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Table: well_known_client_controls -CREATE TABLE [well_known_client_controls] ( - [file_id] int NULL, - [class_name] nvarchar(1024) NOT NULL, - [toolbox_info] nvarchar(-1) NULL -); -GO - diff --git a/gr/ddl/views/internal_all_alarms_view.sql b/gr/ddl/views/internal_all_alarms_view.sql deleted file mode 100644 index c1443e3..0000000 --- a/gr/ddl/views/internal_all_alarms_view.sql +++ /dev/null @@ -1,11 +0,0 @@ --- View: internal_all_alarms_view - -CREATE VIEW [dbo].[internal_all_alarms_view] -AS -select (CASE - WHEN p.extension_type = N'badvaluealarmextension' - THEN g.tag_name + N'.' + p.primitive_name + N'.Bad' - ELSE - g.tag_name + N'.' + p.pri -GO - diff --git a/gr/ddl/views/internal_all_view_app_view.sql b/gr/ddl/views/internal_all_view_app_view.sql deleted file mode 100644 index 6d4141a..0000000 --- a/gr/ddl/views/internal_all_view_app_view.sql +++ /dev/null @@ -1,10 +0,0 @@ --- View: internal_all_view_app_view - --- this view becomes an indexed view and is used to increase --- the performance of internal_mark_view_app_for_redeploy --- --- contains gobject_ids of all view apps -CREATE view dbo.internal_all_view_app_view with schemabinding as - select TOP 100 -GO - diff --git a/gr/ddl/views/internal_automation_object_model_hierarchy_view.sql b/gr/ddl/views/internal_automation_object_model_hierarchy_view.sql deleted file mode 100644 index 162933b..0000000 --- a/gr/ddl/views/internal_automation_object_model_hierarchy_view.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_automation_object_model_hierarchy_view - -/* -*********************************************************************************************************************** -*** -*** object name: internal_automation_object_Model_hierarchy_view -*** description: view is use -GO - diff --git a/gr/ddl/views/internal_automation_object_model_hierarchy_view2.sql b/gr/ddl/views/internal_automation_object_model_hierarchy_view2.sql deleted file mode 100644 index 8b0035e..0000000 --- a/gr/ddl/views/internal_automation_object_model_hierarchy_view2.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_automation_object_model_hierarchy_view2 - -/* -*********************************************************************************************************************** -*** -*** object name: internal_automation_object_Model_hierarchy_view2 -*** description: view is -GO - diff --git a/gr/ddl/views/internal_automation_object_visual_element_hierarchy_view.sql b/gr/ddl/views/internal_automation_object_visual_element_hierarchy_view.sql deleted file mode 100644 index 1989869..0000000 --- a/gr/ddl/views/internal_automation_object_visual_element_hierarchy_view.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_automation_object_visual_element_hierarchy_view - -/* -*********************************************************************************************************************** -*** -*** object name: internal_automation_object_visual_element_hierarchy_view -*** description: vi -GO - diff --git a/gr/ddl/views/internal_automation_object_visual_element_hierarchy_view_includetemplates.sql b/gr/ddl/views/internal_automation_object_visual_element_hierarchy_view_includetemplates.sql deleted file mode 100644 index 6693507..0000000 --- a/gr/ddl/views/internal_automation_object_visual_element_hierarchy_view_includetemplates.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_automation_object_visual_element_hierarchy_view_includetemplates - -/* -*********************************************************************************************************************** -*** -*** object name: internal_automation_object_visual_element_hierarchy_view -*** description: vi -GO - diff --git a/gr/ddl/views/internal_checked_in_unbound_relative_visual_element_reference_view.sql b/gr/ddl/views/internal_checked_in_unbound_relative_visual_element_reference_view.sql deleted file mode 100644 index d83dc89..0000000 --- a/gr/ddl/views/internal_checked_in_unbound_relative_visual_element_reference_view.sql +++ /dev/null @@ -1,14 +0,0 @@ --- View: internal_checked_in_unbound_relative_visual_element_reference_view - -create view - dbo.internal_checked_in_unbound_relative_visual_element_reference_view -with schemabinding -as -select - ver.gobject_id, - ver.package_id, - ver.mx_primitive_id, - ver.visual_element_reference_index, - ver.checked_in_unbou -GO - diff --git a/gr/ddl/views/internal_checked_out_unbound_relative_visual_element_reference_view.sql b/gr/ddl/views/internal_checked_out_unbound_relative_visual_element_reference_view.sql deleted file mode 100644 index e878e57..0000000 --- a/gr/ddl/views/internal_checked_out_unbound_relative_visual_element_reference_view.sql +++ /dev/null @@ -1,14 +0,0 @@ --- View: internal_checked_out_unbound_relative_visual_element_reference_view - -create view - dbo.internal_checked_out_unbound_relative_visual_element_reference_view -with schemabinding -as -select - ver.gobject_id, - ver.package_id, - ver.mx_primitive_id, - ver.visual_element_reference_index, - ver.checked_out_unb -GO - diff --git a/gr/ddl/views/internal_common_obj.sql b/gr/ddl/views/internal_common_obj.sql deleted file mode 100644 index adaadc7..0000000 --- a/gr/ddl/views/internal_common_obj.sql +++ /dev/null @@ -1,13 +0,0 @@ --- View: internal_common_obj - -create view dbo.internal_common_obj as -SELECT - gobj.gobject_id AS gobject_id, - gobj.tag_name AS tag_name, - td.category_id AS category_id, - tset.toolset_name AS toolset_name, - gobj.is_template AS is_template, - pg.status_id AS status, - gob -GO - diff --git a/gr/ddl/views/internal_control_view.sql b/gr/ddl/views/internal_control_view.sql deleted file mode 100644 index b8258b6..0000000 --- a/gr/ddl/views/internal_control_view.sql +++ /dev/null @@ -1,15 +0,0 @@ --- View: internal_control_view - -create view dbo.internal_control_view -with schemabinding -as -select - ci.entity_id, - ci.control_name as name, - g.tag_name + '.' + ci.control_name as full_name, - g.gobject_id as parent_id, - g.tag_name as parent_name, - ci.control_id, - ci.control -GO - diff --git a/gr/ddl/views/internal_get_GRMblob_preview_user_view.sql b/gr/ddl/views/internal_get_GRMblob_preview_user_view.sql deleted file mode 100644 index 7dff96d..0000000 --- a/gr/ddl/views/internal_get_GRMblob_preview_user_view.sql +++ /dev/null @@ -1,8 +0,0 @@ --- View: internal_get_GRMblob_preview_user_view - -/****** Object: View [dbo].[[internal_get_GRMblob_preview_user_view]] - - This purpose of this view to get GRM Definition blob for the list of all visual elements in the galaxy. - It uses the latest checked-out package for preview and consider's the -GO - diff --git a/gr/ddl/views/internal_get_TemplateToolBox_Allelements_view.sql b/gr/ddl/views/internal_get_TemplateToolBox_Allelements_view.sql deleted file mode 100644 index 65333ab..0000000 --- a/gr/ddl/views/internal_get_TemplateToolBox_Allelements_view.sql +++ /dev/null @@ -1,10 +0,0 @@ --- View: internal_get_TemplateToolBox_Allelements_view - -CREATE view [dbo].[internal_get_TemplateToolBox_Allelements_view] -AS -SELECT Entities.* FROM -( - SELECT - -parent_folder_id as 'parent_id', -- this '-' is required to identify the folder as parent in browisng service while generating the SQ -GO - diff --git a/gr/ddl/views/internal_get_TemplateToolBox_folders_view.sql b/gr/ddl/views/internal_get_TemplateToolBox_folders_view.sql deleted file mode 100644 index bf6d0bf..0000000 --- a/gr/ddl/views/internal_get_TemplateToolBox_folders_view.sql +++ /dev/null @@ -1,15 +0,0 @@ --- View: internal_get_TemplateToolBox_folders_view - -CREATE view [dbo].[internal_get_TemplateToolBox_folders_view] -AS -SELECT folder_id, - folder_name, - parent_folder_id, - depth, - has_objects, - has_folders, - timestamp_of_last_change - FROM folder - Where folder_typ -GO - diff --git a/gr/ddl/views/internal_get_asset_graphics_preview_user_view.sql b/gr/ddl/views/internal_get_asset_graphics_preview_user_view.sql deleted file mode 100644 index d0e159e..0000000 --- a/gr/ddl/views/internal_get_asset_graphics_preview_user_view.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_get_asset_graphics_preview_user_view - -/****** Object: View [dbo].[internal_asset_graphics_preview_user_view] - - This purpose of this view to get Asset graphics in the galaxy. - It uses the latest checked-out package for preview and consider's the users context. -******/ -GO - diff --git a/gr/ddl/views/internal_get_attribute_definition_with_validation.sql b/gr/ddl/views/internal_get_attribute_definition_with_validation.sql deleted file mode 100644 index d171d9e..0000000 --- a/gr/ddl/views/internal_get_attribute_definition_with_validation.sql +++ /dev/null @@ -1,12 +0,0 @@ --- View: internal_get_attribute_definition_with_validation - -CREATE VIEW [dbo].[internal_get_attribute_definition_with_validation] -AS -SELECT - ad.*, - pd.primitive_name, - CASE - WHEN pd.primitive_name = 'ScalingExtension' AND ad.mx_attribute_id IN (101, 102, 103, 104, 105, 106, 107, 108) THEN 1 - WHEN pd.primit -GO - diff --git a/gr/ddl/views/internal_get_device_scangroups_view.sql b/gr/ddl/views/internal_get_device_scangroups_view.sql deleted file mode 100644 index a298d3d..0000000 --- a/gr/ddl/views/internal_get_device_scangroups_view.sql +++ /dev/null @@ -1,12 +0,0 @@ --- View: internal_get_device_scangroups_view - -create view [dbo].[internal_get_device_scangroups_view] -as -select -convert(int, p.mx_primitive_id) as entity_id, - p.primitive_name as name, g.gobject_id as parent_id - from gobject g - inner join [dbo].primitive_instance p - on p.gobject_id = g.gob -GO - diff --git a/gr/ddl/views/internal_get_external_content_media_types_view.sql b/gr/ddl/views/internal_get_external_content_media_types_view.sql deleted file mode 100644 index 18d0bd9..0000000 --- a/gr/ddl/views/internal_get_external_content_media_types_view.sql +++ /dev/null @@ -1,15 +0,0 @@ --- View: internal_get_external_content_media_types_view - -create view dbo.internal_get_external_content_media_types_view -with schemabinding -as -select - mt.entity_id, - mt.media_type, - g.tag_name as parent_name, - ci.control_id, - mt.uri_property_name, - mt.media_type_property_name, - mt -GO - diff --git a/gr/ddl/views/internal_get_gtb_Allelements_view.sql b/gr/ddl/views/internal_get_gtb_Allelements_view.sql deleted file mode 100644 index afe64ed..0000000 --- a/gr/ddl/views/internal_get_gtb_Allelements_view.sql +++ /dev/null @@ -1,14 +0,0 @@ --- View: internal_get_gtb_Allelements_view - -CREATE view [dbo].[internal_get_gtb_Allelements_view] -as - -SELECT Entities.* FROM -( - SELECT - -parent_folder_id as 'parent_id', - folder_name as name, - 'Folder' as type, - -folder_id as 'entity_id', -GO - diff --git a/gr/ddl/views/internal_get_gtb_elements_view.sql b/gr/ddl/views/internal_get_gtb_elements_view.sql deleted file mode 100644 index 68e75d0..0000000 --- a/gr/ddl/views/internal_get_gtb_elements_view.sql +++ /dev/null @@ -1,14 +0,0 @@ --- View: internal_get_gtb_elements_view - -create view [dbo].[internal_get_gtb_elements_view] -as -SELECT - vev.gobject_id, - cd.last_modified, - tv.timestamp_of_last_change, - vev.user_guid, - vev.visual_element_name, - vev.thumbnail, - vev.visual_element_de -GO - diff --git a/gr/ddl/views/internal_get_gtb_folders_view.sql b/gr/ddl/views/internal_get_gtb_folders_view.sql deleted file mode 100644 index 8615add..0000000 --- a/gr/ddl/views/internal_get_gtb_folders_view.sql +++ /dev/null @@ -1,13 +0,0 @@ --- View: internal_get_gtb_folders_view - -create view dbo.internal_get_gtb_folders_view -as -SELECT folder_id, - folder_name, - parent_folder_id, - depth, - has_objects, - case when f.has_folders = 1 or (Select count(*) from gobject g - inner join folder_gobject_link -GO - diff --git a/gr/ddl/views/internal_get_gtb_visual_element_references_deployment_view.sql b/gr/ddl/views/internal_get_gtb_visual_element_references_deployment_view.sql deleted file mode 100644 index 971d382..0000000 --- a/gr/ddl/views/internal_get_gtb_visual_element_references_deployment_view.sql +++ /dev/null @@ -1,11 +0,0 @@ --- View: internal_get_gtb_visual_element_references_deployment_view - -create view [dbo].[internal_get_gtb_visual_element_references_deployment_view] -as - -WITH linkedSymbol (visual_element_id, visual_element_bind_status, gobject_id, package_id, mx_primitive_id) - AS - ( - select vev.visual_element_id,ver -GO - diff --git a/gr/ddl/views/internal_get_gtb_visual_element_references_preview_view.sql b/gr/ddl/views/internal_get_gtb_visual_element_references_preview_view.sql deleted file mode 100644 index fae53ca..0000000 --- a/gr/ddl/views/internal_get_gtb_visual_element_references_preview_view.sql +++ /dev/null @@ -1,11 +0,0 @@ --- View: internal_get_gtb_visual_element_references_preview_view - -/****** Object: View [dbo].[internal_get_gtb_visual_element_references_preview_view] - - This purpose of this view is to get Symbol VERL in the galaxy. -******/ -create view [dbo].[internal_get_gtb_visual_element_references_preview_view] -as -WITH li -GO - diff --git a/gr/ddl/views/internal_get_gtb_visual_element_references_view.sql b/gr/ddl/views/internal_get_gtb_visual_element_references_view.sql deleted file mode 100644 index 815e0af..0000000 --- a/gr/ddl/views/internal_get_gtb_visual_element_references_view.sql +++ /dev/null @@ -1,11 +0,0 @@ --- View: internal_get_gtb_visual_element_references_view - -create view [dbo].[internal_get_gtb_visual_element_references_view] -as - -WITH linkedSymbol (visual_element_id, visual_element_bind_status, gobject_id, package_id, mx_primitive_id) - AS - ( - select vev.visual_element_id,ver.visual_ele -GO - diff --git a/gr/ddl/views/internal_get_object_wizard_symbol_override_mapping_preview_view.sql b/gr/ddl/views/internal_get_object_wizard_symbol_override_mapping_preview_view.sql deleted file mode 100644 index 7f82822..0000000 --- a/gr/ddl/views/internal_get_object_wizard_symbol_override_mapping_preview_view.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_get_object_wizard_symbol_override_mapping_preview_view - -/* -*********************************************************************************************************************** -*** -*** object name: internal_get_object_wizard_symbol_override_mapping_preview_view -*** description: -GO - diff --git a/gr/ddl/views/internal_get_object_wizard_symbol_override_mapping_view.sql b/gr/ddl/views/internal_get_object_wizard_symbol_override_mapping_view.sql deleted file mode 100644 index 950567f..0000000 --- a/gr/ddl/views/internal_get_object_wizard_symbol_override_mapping_view.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_get_object_wizard_symbol_override_mapping_view - -/* -*********************************************************************************************************************** -*** -*** object name: internal_get_object_wizard_symbol_override_mapping_view -*** description: vie -GO - diff --git a/gr/ddl/views/internal_get_object_wizard_symbol_override_preview_view.sql b/gr/ddl/views/internal_get_object_wizard_symbol_override_preview_view.sql deleted file mode 100644 index 66e3a92..0000000 --- a/gr/ddl/views/internal_get_object_wizard_symbol_override_preview_view.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_get_object_wizard_symbol_override_preview_view - -/* -*********************************************************************************************************************** -*** -*** object name: internal_get_object_wizard_symbol_override_preview_view -*** description: vie -GO - diff --git a/gr/ddl/views/internal_get_object_wizard_symbol_override_view.sql b/gr/ddl/views/internal_get_object_wizard_symbol_override_view.sql deleted file mode 100644 index af76a8c..0000000 --- a/gr/ddl/views/internal_get_object_wizard_symbol_override_view.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_get_object_wizard_symbol_override_view - -/* -*********************************************************************************************************************** -*** -*** object name: internal_get_object_wizard_symbol_override_view -*** description: view is use -GO - diff --git a/gr/ddl/views/internal_get_visual_element_primitives_deployment_view.sql b/gr/ddl/views/internal_get_visual_element_primitives_deployment_view.sql deleted file mode 100644 index 5cf08f2..0000000 --- a/gr/ddl/views/internal_get_visual_element_primitives_deployment_view.sql +++ /dev/null @@ -1,8 +0,0 @@ --- View: internal_get_visual_element_primitives_deployment_view - -/****** Object: View [dbo].[internal_get_visual_element_primitives_deployment_view] - - This purpose of this view to get GRM Definition blob for the list of all visual elements in the galaxy. - It uses the latest checked-in package for deployment -GO - diff --git a/gr/ddl/views/internal_get_visual_element_primitives_view.sql b/gr/ddl/views/internal_get_visual_element_primitives_view.sql deleted file mode 100644 index 581d530..0000000 --- a/gr/ddl/views/internal_get_visual_element_primitives_view.sql +++ /dev/null @@ -1,11 +0,0 @@ --- View: internal_get_visual_element_primitives_view - -CREATE VIEW dbo.internal_get_visual_element_primitives_view -AS - WITH parentfoldersprefixed - AS (SELECT gobject_id, - contained_by_gobject_id, - Cast(tag_name AS NVARCHAR(250)) AS fullName - FROM -GO - diff --git a/gr/ddl/views/internal_gtb_symbols_hierarchy_view.sql b/gr/ddl/views/internal_gtb_symbols_hierarchy_view.sql deleted file mode 100644 index b819377..0000000 --- a/gr/ddl/views/internal_gtb_symbols_hierarchy_view.sql +++ /dev/null @@ -1,12 +0,0 @@ --- View: internal_gtb_symbols_hierarchy_view - -/****** Object: View [dbo].[internal_gtb_symbols_hierarchy_view] - - This purpose of this view to get the hierarchy for the GTB graphics in the galaxy. -******/ -CREATE view [dbo].[internal_gtb_symbols_hierarchy_view] -as - --- Query to get GTB symbo -GO - diff --git a/gr/ddl/views/internal_linked_visual_element_definition_per_user_view.sql b/gr/ddl/views/internal_linked_visual_element_definition_per_user_view.sql deleted file mode 100644 index 8c3bb16..0000000 --- a/gr/ddl/views/internal_linked_visual_element_definition_per_user_view.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_linked_visual_element_definition_per_user_view - -/* -*********************************************************************************************************************** -*** -*** object name: internal_linked_visual_element_definition_per_user_view -*** description: vie -GO - diff --git a/gr/ddl/views/internal_list_automation_objects_view.sql b/gr/ddl/views/internal_list_automation_objects_view.sql deleted file mode 100644 index e9252ab..0000000 --- a/gr/ddl/views/internal_list_automation_objects_view.sql +++ /dev/null @@ -1,13 +0,0 @@ --- View: internal_list_automation_objects_view - -create view [dbo].[internal_list_automation_objects_view] -AS - -select distinct g.gobject_id as 'entity_id', - g.tag_name as 'name', - 'object' as type, - '' as description, - up.user_guid, - CASE WHEN g.checked_out_by_user_guid = up.user_guid T -GO - diff --git a/gr/ddl/views/internal_list_model_objects_view.sql b/gr/ddl/views/internal_list_model_objects_view.sql deleted file mode 100644 index e483805..0000000 --- a/gr/ddl/views/internal_list_model_objects_view.sql +++ /dev/null @@ -1,18 +0,0 @@ --- View: internal_list_model_objects_view - -CREATE view dbo.internal_list_model_objects_view -AS - -with ParentFoldersPrefixed as - -( - - select gobject_id, contained_by_gobject_id,cast(tag_name as nvarchar(250)) as fullName - - from gobject - - where contained_by_gobject_id = 0 - - union a -GO - diff --git a/gr/ddl/views/internal_list_objects_view.sql b/gr/ddl/views/internal_list_objects_view.sql deleted file mode 100644 index 6b952e6..0000000 --- a/gr/ddl/views/internal_list_objects_view.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_list_objects_view - -/**************************************************/ -/*Object Name : internal_list_objects_view */ -/*Object Type : View. */ -/*Purpose : To provide a generic view used by the different list objects stored procedure*/ -/*Used By : CDI -GO - diff --git a/gr/ddl/views/internal_list_unassigned_objects_view.sql b/gr/ddl/views/internal_list_unassigned_objects_view.sql deleted file mode 100644 index b13f5db..0000000 --- a/gr/ddl/views/internal_list_unassigned_objects_view.sql +++ /dev/null @@ -1,16 +0,0 @@ --- View: internal_list_unassigned_objects_view - -create view dbo.internal_list_unassigned_objects_view -AS - -with ParentFoldersPrefixed as -( - select gobject_id, contained_by_gobject_id - from gobject - where contained_by_gobject_id = 0 - - union all - - select c.gobject_id, c.contained_by_ -GO - diff --git a/gr/ddl/views/internal_localized_alarm_messages.sql b/gr/ddl/views/internal_localized_alarm_messages.sql deleted file mode 100644 index 1f7087b..0000000 --- a/gr/ddl/views/internal_localized_alarm_messages.sql +++ /dev/null @@ -1,7 +0,0 @@ --- View: internal_localized_alarm_messages - -CREATE VIEW dbo.internal_localized_alarm_messages -AS - --select g.tag_name + '.' + p.primitive_name 'Name', amd.default_message, amd.indexable_default_message, amd.phrase_id, amt.translated_message, amt.locale_id, am.gobject_id, am.package_id, am.mx_primi -GO - diff --git a/gr/ddl/views/internal_model_hierarchy_asset_view.sql b/gr/ddl/views/internal_model_hierarchy_asset_view.sql deleted file mode 100644 index 1e57f5e..0000000 --- a/gr/ddl/views/internal_model_hierarchy_asset_view.sql +++ /dev/null @@ -1,12 +0,0 @@ --- View: internal_model_hierarchy_asset_view - -/****** Object: View [dbo].[internal_model_hierarchy_asset_view] - - This purpose of this view to get the Model hierarchy for the objects in the galaxy. -******/ -Create view [dbo].[internal_model_hierarchy_asset_view] -as - -select g.gobject_id, -GO - diff --git a/gr/ddl/views/internal_package_status_view.sql b/gr/ddl/views/internal_package_status_view.sql deleted file mode 100644 index 5114f36..0000000 --- a/gr/ddl/views/internal_package_status_view.sql +++ /dev/null @@ -1,16 +0,0 @@ --- View: internal_package_status_view - -/* - This view is used by the WWCDI:QueryObject.h - -*/ - -create view dbo.internal_package_status_view -as - select - g.gobject_id, - p.package_id, - CASE WHEN (p.status_id = 0 and p.reference_status_id = 0) THEN - CASE WHEN ver_warning_view.has_wa -GO - diff --git a/gr/ddl/views/internal_proxy_obj.sql b/gr/ddl/views/internal_proxy_obj.sql deleted file mode 100644 index cbb81b8..0000000 --- a/gr/ddl/views/internal_proxy_obj.sql +++ /dev/null @@ -1,12 +0,0 @@ --- View: internal_proxy_obj - -create view dbo.internal_proxy_obj -as -SELECT - -- These are the data used in the proxy object - gobject.gobject_id AS gobject_id, - gobject.tag_name AS tag_name, - gobject.contained_name AS contained_name, - gobject.hierarchical_name AS hierarch -GO - diff --git a/gr/ddl/views/internal_reference_primitive_attribute.sql b/gr/ddl/views/internal_reference_primitive_attribute.sql deleted file mode 100644 index e089fc0..0000000 --- a/gr/ddl/views/internal_reference_primitive_attribute.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_reference_primitive_attribute - -/**********************************************************************/ -/*Object Name : internal_reference_primitive_attribute */ -/*Object Type : View. */ -/*Purpose : To provide reference and cross reference information */ -/* -GO - diff --git a/gr/ddl/views/internal_required_support_features.sql b/gr/ddl/views/internal_required_support_features.sql deleted file mode 100644 index 63ec7cc..0000000 --- a/gr/ddl/views/internal_required_support_features.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_required_support_features - -/**************************************************/ -/*Object Name : internal_required_support_features */ -/*Object Type : View. */ -/*Purpose : To provide required_feature and supported feature of all the instances*/ -/*Used By : CDI -GO - diff --git a/gr/ddl/views/internal_runtime_attributes.sql b/gr/ddl/views/internal_runtime_attributes.sql deleted file mode 100644 index 442f75b..0000000 --- a/gr/ddl/views/internal_runtime_attributes.sql +++ /dev/null @@ -1,13 +0,0 @@ --- View: internal_runtime_attributes - --- --- This view is used to supply the GalaxyTagDictionary with tagnames --- for the InTouch tag browser. --- -create view dbo.internal_runtime_attributes -as -select - case when primitive_instance.primitive_name = '' then - gobject.tag_name + -GO - diff --git a/gr/ddl/views/internal_visible_packages_per_user_view.sql b/gr/ddl/views/internal_visible_packages_per_user_view.sql deleted file mode 100644 index ee665bc..0000000 --- a/gr/ddl/views/internal_visible_packages_per_user_view.sql +++ /dev/null @@ -1,12 +0,0 @@ --- View: internal_visible_packages_per_user_view - --- This view returns package versions visible to each --- user. --- --- It is designed to be added to joins to select packages for --- a given user. --- --- For example, to get the visual element versions to use for 'Administrator' --- user given by @user_ -GO - diff --git a/gr/ddl/views/internal_visual_element_description_all_packages_view.sql b/gr/ddl/views/internal_visual_element_description_all_packages_view.sql deleted file mode 100644 index f903117..0000000 --- a/gr/ddl/views/internal_visual_element_description_all_packages_view.sql +++ /dev/null @@ -1,13 +0,0 @@ --- View: internal_visual_element_description_all_packages_view - -create view dbo.internal_visual_element_description_all_packages_view -as - -select - vev.gobject_id, - vev.visual_element_id, - ve.visual_element_type, - ve.visual_element_category, - case when pri.primitive_name <> '' -GO - diff --git a/gr/ddl/views/internal_visual_element_description_per_user_view.sql b/gr/ddl/views/internal_visual_element_description_per_user_view.sql deleted file mode 100644 index f7e06a3..0000000 --- a/gr/ddl/views/internal_visual_element_description_per_user_view.sql +++ /dev/null @@ -1,9 +0,0 @@ --- View: internal_visual_element_description_per_user_view - -/* -*********************************************************************************************************************** -*** -*** object name: internal_visual_element_description_per_user_view -*** description: view is u -GO - diff --git a/gr/ddl/views/internal_visual_element_description_view.sql b/gr/ddl/views/internal_visual_element_description_view.sql deleted file mode 100644 index be1241e..0000000 --- a/gr/ddl/views/internal_visual_element_description_view.sql +++ /dev/null @@ -1,13 +0,0 @@ --- View: internal_visual_element_description_view - -create view dbo.internal_visual_element_description_view -with schemabinding -as -select - vev.gobject_id, - vev.visual_element_id, - ve.visual_element_type, - ve.visual_element_category, - case when pri.primitive_name -GO - diff --git a/gr/ddl/views/internal_visual_element_primitives_preview_user_view.sql b/gr/ddl/views/internal_visual_element_primitives_preview_user_view.sql deleted file mode 100644 index d3f2f3b..0000000 --- a/gr/ddl/views/internal_visual_element_primitives_preview_user_view.sql +++ /dev/null @@ -1,8 +0,0 @@ --- View: internal_visual_element_primitives_preview_user_view - -/****** Object: View [dbo].[internal_visual_element_primitives_preview_user_view] - - This purpose of this view to get GRM Definition blob for the list of all visual elements in the galaxy. - It uses the latest checked-out package for preview and co -GO - diff --git a/gr/ddl/views/internal_visual_element_reference_per_user_view.sql b/gr/ddl/views/internal_visual_element_reference_per_user_view.sql deleted file mode 100644 index f430ac6..0000000 --- a/gr/ddl/views/internal_visual_element_reference_per_user_view.sql +++ /dev/null @@ -1,12 +0,0 @@ --- View: internal_visual_element_reference_per_user_view - -create view dbo.internal_visual_element_reference_per_user_view -as -select distinct - ver.gobject_id, - ver.package_id, - ver.mx_primitive_id, - ver.visual_element_bind_status, - ver.visual_element_reference_index, -GO - diff --git a/gr/ddl/views/internal_visual_element_reference_view.sql b/gr/ddl/views/internal_visual_element_reference_view.sql deleted file mode 100644 index 7e8dbd0..0000000 --- a/gr/ddl/views/internal_visual_element_reference_view.sql +++ /dev/null @@ -1,13 +0,0 @@ --- View: internal_visual_element_reference_view - -create view dbo.internal_visual_element_reference_view -as -select distinct - ver.gobject_id, - ver.package_id, - ver.mx_primitive_id, - ver.visual_element_bind_status, - ver.visual_element_reference_index, - ch -GO - diff --git a/gr/ddl/views/internal_visual_element_reference_warning_status_view.sql b/gr/ddl/views/internal_visual_element_reference_warning_status_view.sql deleted file mode 100644 index f0f3796..0000000 --- a/gr/ddl/views/internal_visual_element_reference_warning_status_view.sql +++ /dev/null @@ -1,15 +0,0 @@ --- View: internal_visual_element_reference_warning_status_view - -create view dbo.internal_visual_element_reference_warning_status_view -as -select - distinct - g.gobject_id, - p.package_id, - case when (isnull(ver.gobject_id,0)> 0) then 1 - else 0 - end as has_warning -from package p with(nolock) -inner join gobject g w -GO - diff --git a/gr/ddl/views/internal_visual_element_timestamp_per_user_view.sql b/gr/ddl/views/internal_visual_element_timestamp_per_user_view.sql deleted file mode 100644 index 4691c3d..0000000 --- a/gr/ddl/views/internal_visual_element_timestamp_per_user_view.sql +++ /dev/null @@ -1,15 +0,0 @@ --- View: internal_visual_element_timestamp_per_user_view - -create view dbo.internal_visual_element_timestamp_per_user_view -as -select - g.gobject_id, - vev.package_id, - vev.mx_primitive_id, - vev.visual_element_id, - vet.change_type, - vet.timestamp_of_last_change, - up.user_guid, - pri.property_b -GO - diff --git a/gr/ddl/views/public_gobject_definition.sql b/gr/ddl/views/public_gobject_definition.sql deleted file mode 100644 index 0b7d11d..0000000 --- a/gr/ddl/views/public_gobject_definition.sql +++ /dev/null @@ -1,7 +0,0 @@ --- View: public_gobject_definition - -create view dbo.public_gobject_definition as - -SELECT gobject.tag_name, gobject.contained_name, primitive_definition.primitive_name, attribute_definition.attribute_name, attribute_definition.mx_attribute_id, attribute_definition.has_config_set_handler -GO - diff --git a/gr/hierarchy.jpeg b/gr/hierarchy.jpeg deleted file mode 100644 index f9924ee0f40df9eb4554bc83ee885db20847e8fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16788 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 C. -``` - -Examples: -- `TestMachine_001.MachineID` -- `TestMachine_001.MachineCode` -- `MESReceiver_001.MoveInBatchID` -- `MESReceiver_001.MoveInCompleteFlag` -- `MESReceiver_001.MoveInJobSequenceNumber` -- `DelmiaReceiver_001.DownloadPath` -- `DelmiaReceiver_001.JobStepNumber` -- `DelmiaReceiver_001.PartNumber` -- `DelmiaReceiver_001.RecipeDownloadFlag` - -This flat view collapses the hierarchy — all attributes across all objects appear as `tag_name.AttributeName` regardless of where the object sits in the containment tree. diff --git a/gr/parse_tables.py b/gr/parse_tables.py deleted file mode 100644 index 7bd72a2..0000000 --- a/gr/parse_tables.py +++ /dev/null @@ -1,122 +0,0 @@ -import re, os - -base = r"C:\Users\dohertj2\Desktop\gr" -ddl_dir = os.path.join(base, "ddl", "tables") -os.makedirs(ddl_dir, exist_ok=True) - -with open(os.path.join(base, "table_dump_raw.txt"), "r", encoding="utf-8") as f: - content = f.read() - -tables = re.findall(r'---TABLE_START:(.+?)---(.+?)---TABLE_END:\1---', content, re.DOTALL) - -schema_lines = ["# Schema Reference\n\nGenerated from the ZB (Galaxy Repository) database.\n\n## Tables\n"] - -for tbl_name, tbl_content in tables: - tbl_name = tbl_name.strip() - - # Parse columns - sections = tbl_content.strip().split("COLUMN_NAME") - cols = [] - pk_cols = [] - fks = [] - - # Parse column definitions (first section after header) - if len(sections) >= 2: - col_section = sections[1] - lines = [l.strip() for l in col_section.split("\n") if l.strip() and not l.strip().startswith("---")] - for line in lines: - parts = [p.strip() for p in line.split("|")] - if len(parts) >= 6 and parts[0] not in ("", "COLUMN_NAME") and not all(c in "-|" for c in parts[0]): - col_name = parts[0] - data_type = parts[1] - char_len = parts[2] if parts[2] != "NULL" else None - num_prec = parts[3] if parts[3] != "NULL" else None - num_scale = parts[4] if parts[4] != "NULL" else None - nullable = parts[5] - default_val = parts[6] if len(parts) > 6 and parts[6] != "NULL" else None - - # Build type string - if char_len: - type_str = f"{data_type}({char_len})" - elif num_prec and data_type not in ("int", "smallint", "bigint", "tinyint", "bit"): - type_str = f"{data_type}({num_prec},{num_scale})" - else: - type_str = data_type - - cols.append({ - "name": col_name, - "type": type_str, - "nullable": nullable, - "default": default_val - }) - - # Parse PK columns (second COLUMN_NAME section) - if len(sections) >= 3: - pk_section = sections[2] - lines = [l.strip() for l in pk_section.split("\n") if l.strip() and not l.strip().startswith("---") and not l.strip().startswith("fk_")] - for line in lines: - parts = [p.strip() for p in line.split("|")] - pk_candidate = parts[0] - if pk_candidate and pk_candidate not in ("", "COLUMN_NAME") and not all(c in "-|" for c in pk_candidate): - # Stop if we hit the FK header - if "ref_table" in line or "fk_column" in line: - break - pk_cols.append(pk_candidate) - - # Parse FKs - fk_matches = re.findall(r'fk_column\|ref_table\|ref_column\|fk_name\n-+\|.+\n(.*?)(?=---TABLE_END|$)', tbl_content, re.DOTALL) - if fk_matches: - for fk_block in fk_matches: - for line in fk_block.strip().split("\n"): - line = line.strip() - if line and "|" in line: - parts = [p.strip() for p in line.split("|")] - if len(parts) >= 3 and parts[0] and not all(c in "-" for c in parts[0]): - fks.append({"col": parts[0], "ref_table": parts[1], "ref_col": parts[2]}) - - # Write DDL file - ddl_lines = [f"-- Table: {tbl_name}\n"] - ddl_lines.append(f"CREATE TABLE [{tbl_name}] (") - col_defs = [] - for c in cols: - line = f" [{c['name']}] {c['type']}" - if c['nullable'] == 'NO': - line += " NOT NULL" - else: - line += " NULL" - if c['default']: - line += f" DEFAULT {c['default']}" - col_defs.append(line) - if pk_cols: - col_defs.append(f" CONSTRAINT [PK_{tbl_name}] PRIMARY KEY ({', '.join('[' + c + ']' for c in pk_cols)})") - ddl_lines.append(",\n".join(col_defs)) - ddl_lines.append(");\nGO\n") - - if fks: - for fk in fks: - ddl_lines.append(f"ALTER TABLE [{tbl_name}] ADD FOREIGN KEY ([{fk['col']}]) REFERENCES [{fk['ref_table']}] ([{fk['ref_col']}]);") - ddl_lines.append("GO\n") - - with open(os.path.join(ddl_dir, f"{tbl_name}.sql"), "w", encoding="utf-8") as f: - f.write("\n".join(ddl_lines)) - - # Build schema.md entry - schema_lines.append(f"### {tbl_name}\n") - schema_lines.append("| Column | Type | Nullable | Notes |") - schema_lines.append("|--------|------|----------|-------|") - for c in cols: - notes = [] - if c['name'] in pk_cols: - notes.append("PK") - for fk in fks: - if fk['col'] == c['name']: - notes.append(f"FK -> {fk['ref_table']}.{fk['ref_col']}") - if c['default']: - notes.append(f"Default: {c['default']}") - schema_lines.append(f"| {c['name']} | {c['type']} | {c['nullable']} | {' '.join(notes)} |") - schema_lines.append("") - -print(f"Processed {len(tables)} tables") - -with open(os.path.join(base, "schema_tables.md"), "w", encoding="utf-8") as f: - f.write("\n".join(schema_lines)) diff --git a/gr/queries/attributes.sql b/gr/queries/attributes.sql deleted file mode 100644 index 1b0a44f..0000000 --- a/gr/queries/attributes.sql +++ /dev/null @@ -1,123 +0,0 @@ --- Galaxy Object User-Defined Attributes/Tags for OPC UA Server --- Returns user-defined (dynamic) attributes for deployed automation objects. --- These are the attributes defined on templates and inherited by instances --- via the deployed package derivation chain (e.g., MachineID, MoveInFlag). --- --- Use full_tag_reference for read/write operations against the runtime. --- Join with hierarchy.sql results on gobject_id to place attributes in the OPC UA browse tree. --- --- For system/primitive attributes as well, see attributes_extended.sql. --- --- Only attributes that existed at deploy time are included. The CTE walks --- package.derived_from_package_id starting from each instance's deployed_package_id, --- then joins dynamic_attribute on package_id to filter out post-deploy additions. --- When the same attribute appears at multiple levels, only the shallowest --- (most-derived) version is kept. --- --- Historization detection: an attribute is historized when a primitive_instance --- with a matching name exists in the deployed package chain and its primitive_definition --- has primitive_name = 'HistoryExtension'. --- --- Array dimensions are extracted from the mx_value hex string on the template's --- dynamic_attribute row (bytes 5-6, little-endian uint16 at hex positions 13-16). --- --- Data types (mx_data_type): --- 1 = Boolean, 2 = Integer (Int32), 3 = Float (Single), 4 = Double, --- 5 = String, 6 = Time (DateTime), 7 = ElapsedTime (TimeSpan), --- 8 = (reference), 13 = (enumeration), 14 = (custom), 15 = InternationalizedString, 16 = (custom) - -;WITH deployed_package_chain AS ( - -- Start from each deployed instance's deployed package - SELECT - g.gobject_id, - p.package_id, - p.derived_from_package_id, - 0 AS depth - FROM gobject g - INNER JOIN package p - ON p.package_id = g.deployed_package_id - WHERE g.is_template = 0 - AND g.deployed_package_id <> 0 - UNION ALL - -- Walk up the package derivation chain - SELECT - dpc.gobject_id, - p.package_id, - p.derived_from_package_id, - dpc.depth + 1 - FROM deployed_package_chain dpc - INNER JOIN package p - ON p.package_id = dpc.derived_from_package_id - WHERE dpc.derived_from_package_id <> 0 AND dpc.depth < 10 -) -SELECT - gobject_id, - tag_name, - attribute_name, - full_tag_reference, - mx_data_type, - data_type_name, - is_array, - array_dimension, - mx_attribute_category, - security_classification, - is_historized, - is_alarm -FROM ( - SELECT - dpc.gobject_id, - g.tag_name, - da.attribute_name, - g.tag_name + '.' + da.attribute_name - + CASE WHEN da.is_array = 1 THEN '[]' ELSE '' END - AS full_tag_reference, - da.mx_data_type, - dt.description AS data_type_name, - da.is_array, - CASE WHEN da.is_array = 1 - THEN CONVERT(int, CONVERT(varbinary(2), - SUBSTRING(da.mx_value, 15, 2) + SUBSTRING(da.mx_value, 13, 2), 2)) - ELSE NULL - END AS array_dimension, - da.mx_attribute_category, - da.security_classification, - CASE WHEN EXISTS ( - SELECT 1 FROM deployed_package_chain dpc2 - INNER JOIN primitive_instance pi - ON pi.package_id = dpc2.package_id - AND pi.primitive_name = da.attribute_name - INNER JOIN primitive_definition pd - ON pd.primitive_definition_id = pi.primitive_definition_id - AND pd.primitive_name = 'HistoryExtension' - WHERE dpc2.gobject_id = dpc.gobject_id - ) THEN 1 ELSE 0 END AS is_historized, - CASE WHEN EXISTS ( - SELECT 1 FROM deployed_package_chain dpc2 - INNER JOIN primitive_instance pi - ON pi.package_id = dpc2.package_id - AND pi.primitive_name = da.attribute_name - INNER JOIN primitive_definition pd - ON pd.primitive_definition_id = pi.primitive_definition_id - AND pd.primitive_name = 'AlarmExtension' - WHERE dpc2.gobject_id = dpc.gobject_id - ) THEN 1 ELSE 0 END AS is_alarm, - ROW_NUMBER() OVER ( - PARTITION BY dpc.gobject_id, da.attribute_name - ORDER BY dpc.depth - ) AS rn - FROM deployed_package_chain dpc - INNER JOIN dynamic_attribute da - ON da.package_id = dpc.package_id - INNER JOIN gobject g - ON g.gobject_id = dpc.gobject_id - INNER JOIN template_definition td - ON td.template_definition_id = g.template_definition_id - LEFT JOIN data_type dt - ON dt.mx_data_type = da.mx_data_type - WHERE td.category_id IN (1, 3, 4, 10, 11, 13, 17, 24, 26) - AND da.attribute_name NOT LIKE '[_]%' - AND da.attribute_name NOT LIKE '%.Description' - AND da.mx_attribute_category IN (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 24) -) ranked -WHERE rn = 1 -ORDER BY tag_name, attribute_name; diff --git a/gr/queries/attributes_extended.sql b/gr/queries/attributes_extended.sql deleted file mode 100644 index 12a3b43..0000000 --- a/gr/queries/attributes_extended.sql +++ /dev/null @@ -1,196 +0,0 @@ --- Galaxy Object Attributes/Tags for OPC UA Server --- Returns all runtime-readable attributes for deployed automation objects. --- Use full_tag_reference for read/write operations against the runtime. --- Join with hierarchy.sql results on gobject_id to place attributes in the OPC UA browse tree. --- --- Two sources of attributes: --- 1. attribute_definition (via primitive_instance) — system/primitive attributes --- Joined via the instance's deployed_package_id to exclude undeployed changes. --- 2. dynamic_attribute — user-defined attributes (e.g., MachineID, MoveInFlag) --- Walked via the deployed package derivation chain (package.derived_from_package_id) --- to only include attributes that existed at deploy time. --- When the same attribute appears at multiple levels (e.g., instance override and --- base template), only the shallowest (most-derived) version is kept. --- --- Historization detection: a dynamic attribute is historized when a primitive_instance --- with a matching name exists in the deployed package chain and its primitive_definition --- has primitive_name = 'HistoryExtension'. --- --- Attribute category filter (mx_attribute_category): --- 2-11, 24 = runtime readable attributes --- --- Attribute names starting with '_' are internal/hidden and excluded. --- dynamic_attribute '.Description' suffixed entries are metadata, excluded. --- --- Array dimensions are extracted from the mx_value hex string (bytes 5-6, little-endian --- uint16 at hex positions 13-16). Works for both attribute_definition and dynamic_attribute. --- --- Data types (mx_data_type): --- 1 = Boolean, 2 = Integer (Int32), 3 = Float (Single), 4 = Double, --- 5 = String, 6 = Time (DateTime), 7 = ElapsedTime (TimeSpan), --- 8 = (reference), 13 = (enumeration), 14 = (custom), 15 = InternationalizedString, 16 = (custom) - -;WITH deployed_package_chain AS ( - -- Start from each deployed instance's deployed package - SELECT - g.gobject_id, - p.package_id, - p.derived_from_package_id, - 0 AS depth - FROM gobject g - INNER JOIN package p - ON p.package_id = g.deployed_package_id - WHERE g.is_template = 0 - AND g.deployed_package_id <> 0 - UNION ALL - -- Walk up the package derivation chain - SELECT - dpc.gobject_id, - p.package_id, - p.derived_from_package_id, - dpc.depth + 1 - FROM deployed_package_chain dpc - INNER JOIN package p - ON p.package_id = dpc.derived_from_package_id - WHERE dpc.derived_from_package_id <> 0 AND dpc.depth < 10 -), --- Rank dynamic attributes: shallowest (most-derived) wins per object + attribute -ranked_dynamic AS ( - SELECT - dpc.gobject_id, - g.tag_name, - da.attribute_name, - g.tag_name + '.' + da.attribute_name - + CASE WHEN da.is_array = 1 THEN '[]' ELSE '' END - AS full_tag_reference, - da.mx_data_type, - dt.description AS data_type_name, - da.is_array, - CASE WHEN da.is_array = 1 - THEN CONVERT(int, CONVERT(varbinary(2), - SUBSTRING(da.mx_value, 15, 2) + SUBSTRING(da.mx_value, 13, 2), 2)) - ELSE NULL - END AS array_dimension, - da.mx_attribute_category, - da.security_classification, - CASE WHEN EXISTS ( - SELECT 1 FROM deployed_package_chain dpc2 - INNER JOIN primitive_instance pi - ON pi.package_id = dpc2.package_id - AND pi.primitive_name = da.attribute_name - INNER JOIN primitive_definition pd - ON pd.primitive_definition_id = pi.primitive_definition_id - AND pd.primitive_name = 'HistoryExtension' - WHERE dpc2.gobject_id = dpc.gobject_id - ) THEN 1 ELSE 0 END AS is_historized, - CASE WHEN EXISTS ( - SELECT 1 FROM deployed_package_chain dpc2 - INNER JOIN primitive_instance pi - ON pi.package_id = dpc2.package_id - AND pi.primitive_name = da.attribute_name - INNER JOIN primitive_definition pd - ON pd.primitive_definition_id = pi.primitive_definition_id - AND pd.primitive_name = 'AlarmExtension' - WHERE dpc2.gobject_id = dpc.gobject_id - ) THEN 1 ELSE 0 END AS is_alarm, - ROW_NUMBER() OVER ( - PARTITION BY dpc.gobject_id, da.attribute_name - ORDER BY dpc.depth - ) AS rn - FROM deployed_package_chain dpc - INNER JOIN dynamic_attribute da - ON da.package_id = dpc.package_id - INNER JOIN gobject g - ON g.gobject_id = dpc.gobject_id - INNER JOIN template_definition td - ON td.template_definition_id = g.template_definition_id - LEFT JOIN data_type dt - ON dt.mx_data_type = da.mx_data_type - WHERE td.category_id IN (1, 3, 4, 10, 11, 13, 17, 24, 26) - AND da.attribute_name NOT LIKE '[_]%' - AND da.attribute_name NOT LIKE '%.Description' - AND da.mx_attribute_category IN (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 24) -) -SELECT - gobject_id, - tag_name, - primitive_name, - attribute_name, - full_tag_reference, - mx_data_type, - data_type_name, - is_array, - array_dimension, - mx_attribute_category, - security_classification, - is_historized, - is_alarm, - attribute_source -FROM ( - -- Part 1: System/primitive attributes (from attribute_definition via deployed package) - SELECT - g.gobject_id, - g.tag_name, - pi.primitive_name, - ad.attribute_name, - CASE WHEN pi.primitive_name = '' - THEN g.tag_name + '.' + ad.attribute_name - ELSE g.tag_name + '.' + pi.primitive_name + '.' + ad.attribute_name - END + CASE WHEN ad.is_array = 1 THEN '[]' ELSE '' END - AS full_tag_reference, - ad.mx_data_type, - dt.description AS data_type_name, - ad.is_array, - CASE WHEN ad.is_array = 1 - THEN CONVERT(int, CONVERT(varbinary(2), - SUBSTRING(ad.mx_value, 15, 2) + SUBSTRING(ad.mx_value, 13, 2), 2)) - ELSE NULL - END AS array_dimension, - ad.mx_attribute_category, - ad.security_classification, - CAST(0 AS int) AS is_historized, - CAST(0 AS int) AS is_alarm, - 'primitive' AS attribute_source - FROM gobject g - INNER JOIN instance i - ON i.gobject_id = g.gobject_id - INNER JOIN template_definition td - ON td.template_definition_id = g.template_definition_id - AND td.runtime_clsid <> '{00000000-0000-0000-0000-000000000000}' - INNER JOIN package p - ON p.package_id = g.deployed_package_id - INNER JOIN primitive_instance pi - ON pi.package_id = p.package_id - AND pi.property_bitmask & 0x10 <> 0x10 - INNER JOIN attribute_definition ad - ON ad.primitive_definition_id = pi.primitive_definition_id - AND ad.attribute_name NOT LIKE '[_]%' - AND ad.mx_attribute_category IN (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 24) - LEFT JOIN data_type dt - ON dt.mx_data_type = ad.mx_data_type - WHERE td.category_id IN (1, 3, 4, 10, 11, 13, 17, 24, 26) - AND g.is_template = 0 - AND g.deployed_package_id <> 0 - - UNION ALL - - -- Part 2: User-defined attributes (shallowest override from deployed package chain) - SELECT - gobject_id, - tag_name, - '' AS primitive_name, - attribute_name, - full_tag_reference, - mx_data_type, - data_type_name, - is_array, - array_dimension, - mx_attribute_category, - security_classification, - is_historized, - is_alarm, - 'dynamic' AS attribute_source - FROM ranked_dynamic - WHERE rn = 1 -) all_attributes -ORDER BY tag_name, primitive_name, attribute_name; diff --git a/gr/queries/change_detection.sql b/gr/queries/change_detection.sql deleted file mode 100644 index d6d3a41..0000000 --- a/gr/queries/change_detection.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Galaxy Change Detection for OPC UA Server --- Poll this query on an interval to detect when the hierarchy needs refreshing. --- When time_of_last_deploy changes, a deployment has occurred and the OPC UA --- server should re-run hierarchy.sql and attributes.sql to pick up changes --- (new/removed objects, undeployed objects, etc.). - -SELECT time_of_last_deploy -FROM galaxy; diff --git a/gr/queries/hierarchy.sql b/gr/queries/hierarchy.sql deleted file mode 100644 index 524faa0..0000000 --- a/gr/queries/hierarchy.sql +++ /dev/null @@ -1,89 +0,0 @@ --- Galaxy Object Hierarchy for OPC UA Server --- Returns the parent-child hierarchy with both browse names (contained_name) and tag names. --- Use browse_name for OPC UA browse tree display. --- Use tag_name for runtime read/write tag references. --- --- Derived from internal_automation_object_model_hierarchy_view2 logic: --- - gobject: provides hierarchy (contained_by_gobject_id, area_gobject_id) and names --- - template_definition: category_id filters to automation-relevant objects --- --- Category IDs: --- 1 = $WinPlatform (platform objects) --- 3 = $AppEngine (application engines) --- 4 = $InTouchViewApp (InTouch view apps) --- 10 = $UserDefined (user-defined automation objects) --- 11 = $FieldReference (field reference objects) --- 13 = $Area (areas / folders) --- 17 = $DIObject (DI objects) --- 24 = $DDESuiteLinkClient --- 26 = $OPCClient --- --- template_chain (new): pipe-delimited list of template tag_names walking --- gobject.derived_from_gobject_id from the instance upward. Index 0 is the --- object's own immediate template, the last entry is the most ancestral --- template before $Object. Mirrors the deployed_package_chain CTE pattern --- in attributes.sql. Consumed by AlarmObjectFilter for template-based --- alarm filtering with wildcard support. - -;WITH template_chain AS ( - -- Start from each non-template deployed instance's own template - SELECT - g.gobject_id AS instance_gobject_id, - t.gobject_id AS template_gobject_id, - t.tag_name AS template_tag_name, - t.derived_from_gobject_id, - 0 AS depth - FROM gobject g - INNER JOIN gobject t - ON t.gobject_id = g.derived_from_gobject_id - WHERE g.is_template = 0 - AND g.deployed_package_id <> 0 - AND g.derived_from_gobject_id <> 0 - UNION ALL - -- Walk up the template derivation chain - SELECT - tc.instance_gobject_id, - t.gobject_id, - t.tag_name, - t.derived_from_gobject_id, - tc.depth + 1 - FROM template_chain tc - INNER JOIN gobject t - ON t.gobject_id = tc.derived_from_gobject_id - WHERE tc.derived_from_gobject_id <> 0 AND tc.depth < 10 -) -SELECT DISTINCT - g.gobject_id, - g.tag_name, - g.contained_name, - CASE WHEN g.contained_name IS NULL OR g.contained_name = '' - THEN g.tag_name - ELSE g.contained_name - END AS browse_name, - CASE WHEN g.contained_by_gobject_id = 0 - THEN g.area_gobject_id - ELSE g.contained_by_gobject_id - END AS parent_gobject_id, - CASE WHEN td.category_id = 13 - THEN 1 - ELSE 0 - END AS is_area, - td.category_id AS category_id, - g.hosted_by_gobject_id AS hosted_by_gobject_id, - ISNULL( - STUFF(( - SELECT '|' + tc.template_tag_name - FROM template_chain tc - WHERE tc.instance_gobject_id = g.gobject_id - ORDER BY tc.depth - FOR XML PATH('') - ), 1, 1, ''), - '' - ) AS template_chain -FROM gobject g -INNER JOIN template_definition td - ON g.template_definition_id = td.template_definition_id -WHERE td.category_id IN (1, 3, 4, 10, 11, 13, 17, 24, 26) - AND g.is_template = 0 - AND g.deployed_package_id <> 0 -ORDER BY parent_gobject_id, g.tag_name; diff --git a/gr/schema.md b/gr/schema.md deleted file mode 100644 index 76e3efb..0000000 --- a/gr/schema.md +++ /dev/null @@ -1,2204 +0,0 @@ -# Schema Reference - -Generated from the ZB (Galaxy Repository) database. - -## Tables - -### aa_sql_objects - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| object_name | nvarchar(128) | NO | PK | -| object_type | nvarchar(10) | NO | | - -### affected_overview_symbols - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | | -| package_id | int | NO | | -| mx_primitive_id | smallint | NO | | -| visual_element_id | int | NO | | - -### alarm_message_defaults - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| phrase_id | int | NO | PK | -| default_message | nvarchar(1024) | NO | | - -### alarm_message_timestamps - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| timestamp_of_populate | bigint | NO | Default: ((0)) | - -### alarm_message_translations - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| phrase_id | int | NO | PK | -| locale_id | smallint | NO | PK; FK -> supported_locales.locale_id | -| translated_message | nvarchar(1024) | NO | | - -### alarm_messages - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK; FK -> primitive_instance.package_id | -| mx_primitive_id | smallint | NO | PK | -| phrase_id | int | NO | PK | - -### attribute_definition - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| attribute_definition_id | int | NO | | -| primitive_definition_id | int | NO | PK; FK -> primitive_definition.primitive_definition_id | -| attribute_name | nvarchar(329) | NO | | -| mx_attribute_id | smallint | NO | PK | -| has_config_set_handler | bit | NO | | -| mx_data_type | smallint | NO | | -| is_array | bit | NO | | -| security_classification | smallint | NO | | -| security_classification_needs_deployed | bit | NO | | -| mx_attribute_category | int | NO | | -| is_frequently_accessed | bit | NO | | -| is_locked | bit | NO | | -| is_locked_needs_deployed | bit | NO | | -| mx_value | text(2147483647) | NO | | -| mx_value_needs_deployed | bit | NO | | - -### attribute_reference - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| referring_mx_primitive_id | smallint | NO | PK; FK -> primitive_instance.package_id; Default: ((0)) | -| referring_mx_attribute_id | smallint | NO | PK; Default: ((0)) | -| element_index | smallint | NO | PK; Default: ((0)) | -| resolved_gobject_id | int | NO | Default: ((0)) | -| reference_string | nvarchar(700) | NO | Default: ('') | -| context_string | nvarchar(329) | NO | Default: ('') | -| object_signature | int | NO | Default: ((0)) | -| resolved_mx_primitive_id | smallint | NO | Default: ((0)) | -| resolved_mx_attribute_id | smallint | NO | Default: ((0)) | -| resolved_mx_property_id | smallint | NO | Default: ((0)) | -| attribute_signature | int | NO | Default: ((0)) | -| lock_type | int | NO | Default: ((0)) | -| is_valid | bit | NO | Default: ((0)) | -| attr_res_status | int | NO | Default: ((0)) | -| attribute_index | smallint | YES | Default: ((-1)) | - -### attributes_translation_table - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | YES | | -| attribute_name | nvarchar(329) | NO | | -| new_primitive_id | int | YES | | -| new_attribute_id | int | YES | | -| old_primitive_id | int | YES | | -| old_attribute_id | int | YES | | - -### autobind_device - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| dio_id | int | NO | PK; FK -> gobject.gobject_id | -| overridden_naming_rule_id | int | YES | PK | - -### autobind_device_category - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| category_id | smallint | NO | PK; FK -> lookup_category.category_id | -| rule_id | int | YES | PK; Default: ((0)) | - -### autobind_device_template - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| template_definition_id | int | NO | PK; FK -> template_definition.template_definition_id | -| rule_id | int | YES | PK | - -### autobind_device_topic - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| dio_id | int | NO | PK; FK -> autobind_device.dio_id | -| sg_mx_primitive_id | smallint | NO | PK; Default: ((0)) | -| overridden_naming_rule_id | int | YES | PK | -| default_xlate_rule_id | int | NO | Default: ((0)) | - -### autobind_naming_rule - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| rule_id | int | NO | PK | -| rule_name | nvarchar(329) | NO | | - -### autobind_naming_rule_spec - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| rule_id | int | NO | PK; FK -> autobind_naming_rule.rule_id | -| io_type | nchar(1) | NO | PK | -| rule_spec | nvarchar(512) | NO | | - -### autobind_translation_rule - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| xlate_rule_id | int | NO | PK | -| xlate_rule_name | nvarchar(329) | NO | | -| xlate_rule_gsub_str | nvarchar(1000) | YES | | -| xlate_rule_scope_global | bit | NO | Default: ((0)) | - -### autobound_attribute - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| dio_id | int | NO | PK | -| sg_mx_primitive_id | smallint | NO | PK; Default: ((0)) | -| gobject_id | int | NO | PK | -| mx_primitive_id | smallint | NO | PK | -| mx_attribute_id | smallint | NO | PK | -| element_index | smallint | NO | PK; Default: ((0)) | -| attr_alias | nvarchar(329) | YES | | -| xlate_rule_id | int | NO | PK; FK -> autobind_translation_rule.xlate_rule_id; Default: ((0)) | - -### client_control_class_link - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| file_id | int | YES | | -| class_name | nvarchar(1024) | NO | | - -### client_info - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| id | int | NO | | -| client_unique_identifier | nvarchar(4000) | NO | | -| client_name | nvarchar(64) | NO | | -| deployed_files_count | smallint | NO | | -| time_of_last_deployed_object_components | datetime | YES | Default: (getdate()) | -| timestamp_of_last_synchronized | bigint | NO | Default: ((0)) | - -### control_index - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| entity_id | int | NO | | -| gobject_id | int | NO | PK; FK -> gobject.gobject_id | -| control_id | nvarchar(329) | YES | | -| control_name | nvarchar(329) | NO | PK | -| control_description | nvarchar(2000) | YES | | -| properties | nvarchar(-1) | YES | | -| thumbnail | nvarchar(-1) | YES | | - -### ConversionQueue - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| id | int | YES | | -| Name | nvarchar(329) | YES | | -| IsCheckedOut | bit | NO | | -| Status | bit | NO | Default: ((0)) | -| MetaData | nchar(256) | YES | | -| OperationType | nchar(20) | NO | | -| timestamp_of_last_change | bigint | YES | | -| change_type | int | YES | | - -### CurrentSessionContainedName - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| Uniqeid | int | NO | PK | -| obj_id | int | YES | | -| containedname | nvarchar(32) | YES | | - -### data_type - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| mx_data_type | tinyint | NO | PK | -| description | varchar(30) | NO | | -| ow_data_type | varchar(10) | YES | | - -### deleted_gobject - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | Default: ((0)) | -| timestamp_of_delete | timestamp | NO | PK | - -### deleted_ids - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| table_id | smallint | YES | | -| deleted_id | int | NO | | -| deletion_timestamp | timestamp | NO | | -| deletion_time | datetime | YES | | - -### deleted_visual_element - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| visual_element_name | nvarchar(329) | YES | | -| visual_element_type | nvarchar(32) | YES | | -| timestamp_of_delete | timestamp | NO | | - -### deleted_visual_element_version - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| mx_primitive_id | smallint | NO | | -| visual_element_name | nvarchar(329) | NO | | -| visual_element_type | nvarchar(32) | NO | | -| timestamp_of_delete | timestamp | NO | PK | -| visual_element_id | int | NO | | - -### deployed_file - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| deployed_file_id | int | NO | PK | -| file_id | int | NO | PK; FK -> file_table.file_id | -| node_name | nvarchar(256) | NO | | -| need_to_delete | int | NO | Default: ((0)) | -| is_package_deployed | bit | NO | | -| is_editor_deployed | bit | NO | | -| is_runtime_deployed | bit | NO | | -| is_browser_deployed | bit | NO | | -| file_version | nvarchar(50) | NO | Default: ('') | -| file_modified_time | nvarchar(50) | NO | Default: ('') | - -### deployed_intouch_viewapp - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| timestamp_of_deploy | bigint | NO | Default: ((1)) | -| gobject_id | int | NO | | -| deploy_file_transfering | bit | YES | Default: ((0)) | - -### deployed_intouch_viewapp_visual_element_dependency - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | YES | | -| visual_element_name | nvarchar(2000) | YES | | - -### dynamic_attribute - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK; FK -> primitive_instance.package_id | -| mx_primitive_id | smallint | NO | PK | -| mx_attribute_id | smallint | NO | PK | -| attribute_name | nvarchar(329) | NO | | -| mx_data_type | smallint | NO | | -| is_array | bit | NO | | -| security_classification | smallint | NO | | -| mx_attribute_category | int | NO | | -| lock_type | int | NO | | -| mx_value | text(2147483647) | NO | | -| owned_by_gobject_id | int | NO | Default: ((0)) | -| original_lock_type | int | NO | Default: ((0)) | -| dynamic_attribute_type | smallint | NO | Default: ((0)) | -| bitvalues | smallint | NO | Default: ((0)) | -| dynamic_attribute_id | bigint | NO | | - -### external_content_media_types - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| entity_id | int | NO | PK | -| media_type | nvarchar(255) | NO | | -| control_entity_id | int | NO | | -| uri_property_name | nvarchar(1023) | YES | | -| media_type_property_name | nvarchar(1023) | YES | | -| is_default | bit | YES | | - -### feature - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| feature_id | int | NO | PK | -| feature_name | nvarchar(256) | NO | | -| feature_type | nvarchar(256) | NO | | - -### feature_file_link - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| feature_id | int | NO | PK | -| file_id | int | NO | PK; FK -> file_table.file_id | - -### file_browserinfo_link - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| primitive_definition_id | int | NO | PK; FK -> primitive_definition.primitive_definition_id | -| file_id | int | NO | PK | -| assembly_strong_name | nvarchar(512) | NO | | -| assembly_type_name | nvarchar(256) | NO | | - -### file_pending_update - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| file_id | int | NO | PK; FK -> file_table.file_id | -| node_name | nvarchar(256) | NO | | - -### file_primitive_definition_link - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| primitive_definition_id | int | NO | PK; FK -> primitive_definition.primitive_definition_id | -| file_id | int | NO | PK | -| is_needed_for_package | bit | NO | Default: ((0)) | -| is_needed_for_runtime | bit | NO | Default: ((0)) | -| is_needed_for_editor | bit | NO | Default: ((0)) | -| is_needed_for_browser | bit | NO | Default: ((0)) | - -### file_table - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| file_id | int | NO | PK | -| file_name | nvarchar(256) | NO | | -| vendor_name | nvarchar(256) | NO | | -| registration_type | int | NO | | -| subfolder | nvarchar(256) | NO | Default: ('') | -| file_version | nvarchar(50) | NO | Default: ('') | -| file_modified_time | nvarchar(50) | NO | Default: ('') | - -### folder - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| folder_id | int | NO | PK | -| folder_type | smallint | NO | | -| folder_name | nvarchar(64) | NO | | -| parent_folder_id | int | NO | | -| depth | int | NO | | -| has_objects | bit | NO | | -| has_folders | bit | NO | | -| timestamp_of_last_change | timestamp | NO | | - -### folder_gobject_link - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| folder_id | int | NO | PK | -| folder_type | smallint | NO | | -| gobject_id | int | NO | PK; FK -> gobject.gobject_id | -| timestamp_of_last_change | timestamp | NO | | - -### galaxy - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| time_of_last_deploy | datetime | YES | Default: (getdate()) | -| time_of_last_config_change | datetime | YES | Default: (getdate()) | -| is_galaxy_installed | bit | NO | Default: ((1)) | -| time_of_last_reference_binding | datetime | YES | Default: (getdate()) | -| timestamp_of_last_cascade | bigint | NO | Default: ((1)) | -| timestamp_of_last_visual_element_reference_bind | bigint | NO | Default: ((0)) | -| max_proxy_timestamp | bigint | NO | Default: (CONVERT([bigint],@@dbts)) | -| max_visual_element_timestamp | bigint | NO | Default: (CONVERT([bigint],@@dbts)) | -| is_migration_in_progress | bit | NO | Default: ((0)) | -| time_of_last_association_change | datetime | YES | Default: (getdate()) | -| subscription_id | uniqueidentifier | YES | | -| batch_id | uniqueidentifier | YES | | -| iteration_id | int | NO | Default: ((0)) | - -### galaxy_data - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| data_type | nvarchar(256) | NO | | -| data | image(2147483647) | YES | | - -### galaxy_settings - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| galaxyid | int | YES | | -| default_qs_data | ntext(1073741823) | NO | | -| current_qs_data | ntext(1073741823) | NO | | - -### gobject - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| template_definition_id | int | NO | PK; FK -> template_definition.template_definition_id | -| derived_from_gobject_id | int | NO | Default: ((0)) | -| contained_by_gobject_id | int | NO | Default: ((0)) | -| area_gobject_id | int | NO | Default: ((0)) | -| hosted_by_gobject_id | int | NO | Default: ((0)) | -| checked_out_by_user_guid | uniqueidentifier | YES | | -| default_symbol_gobject_id | int | NO | Default: ((0)) | -| default_display_gobject_id | int | NO | Default: ((0)) | -| checked_in_package_id | int | NO | Default: ((0)) | -| checked_out_package_id | int | NO | Default: ((0)) | -| deployed_package_id | int | NO | Default: ((0)) | -| last_deployed_package_id | int | NO | Default: ((0)) | -| tag_name | nvarchar(329) | NO | | -| contained_name | nvarchar(32) | NO | Default: ('') | -| identity_guid | uniqueidentifier | NO | Default: (newid()) | -| configuration_guid | uniqueidentifier | NO | | -| configuration_version | int | NO | | -| deployed_version | int | NO | Default: ((0)) | -| is_template | bit | NO | Default: ((0)) | -| is_hidden | bit | NO | Default: ((0)) | -| software_upgrade_needed | bit | NO | Default: ((0)) | -| hosting_tree_level | smallint | NO | Default: ((0)) | -| hierarchical_name | nvarchar(329) | NO | Default: ('') | -| namespace_id | smallint | NO | PK; Default: ((1)) | -| deployment_pending_status | bit | NO | Default: ((0)) | - -### gobject_asset_order - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK; FK -> gobject.gobject_id | -| relative_index | float(53,) | NO | | - -### gobject_change_log - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_change_log_id | int | NO | | -| gobject_id | int | NO | PK | -| change_date | datetime | YES | | -| operation_id | smallint | NO | PK; FK -> lookup_operation.operation_id | -| user_comment | nvarchar(1024) | NO | Default: ('') | -| configuration_version | int | NO | Default: ((0)) | -| user_profile_name | nvarchar(256) | NO | | - -### gobject_filter_info_timestamp - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | YES | PK; FK -> gobject.gobject_id | -| timestamp_of_last_change | timestamp | NO | PK | - -### gobject_friendly_name - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK; FK -> gobject.gobject_id | -| friendly_name | nvarchar(1024) | NO | Default: ('') | - -### gobject_log_details - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | | -| tag_name | nvarchar(329) | NO | | - -### gobject_protected - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | | - -### ImportTransaction - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| ImportOperationId | nvarchar(329) | YES | | -| Status | bit | NO | Default: ((1)) | - -### instance - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK; FK -> gobject.gobject_id | -| mx_platform_id | smallint | NO | Default: ((0)) | -| mx_engine_id | smallint | NO | Default: ((0)) | -| mx_object_id | smallint | NO | Default: ((0)) | - -### intouchviewapptemplate_allsymbols - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | | - -### lookup_category - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| category_id | smallint | NO | PK | -| category_name | nvarchar(50) | NO | | - -### lookup_folder - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| folder_type | smallint | NO | | -| folder_type_name | nvarchar(32) | YES | | - -### lookup_operation - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| operation_id | smallint | NO | PK | -| operation_code | nvarchar(50) | NO | | -| operation_name | nvarchar(256) | NO | | - -### lookup_package_op_status - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| status_id | int | NO | PK | -| status_name | nvarchar(50) | NO | | - -### lookup_status - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| status_id | int | NO | PK | -| status_name | nvarchar(50) | NO | | - -### lookup_table_name - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| table_id | smallint | NO | | -| table_name | nvarchar(250) | YES | | - -### namespace - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| namespace_id | smallint | NO | PK | -| namespace_name | nvarchar(32) | YES | | - -### object_device_linkage - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| dio_id | int | NO | | -| sg_mx_primitive_id | smallint | NO | | - -### object_wizard_overview_symbols - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | | -| visual_element_id | int | NO | | -| change_type | int | NO | | -| mx_primitive_id | int | YES | | - -### object_wizard_symbol_override - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK; FK -> package.package_id | -| symbol_overrides | image(2147483647) | YES | | - -### object_wizard_symbol_override_mapping - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK; FK -> primitive_instance.package_id | -| mx_primitive_id | smallint | NO | PK | -| has_local_overrides | bit | NO | | -| thumbnail | image(2147483647) | YES | | -| preview | image(2147483647) | YES | | - -### old_checked_in_packages - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| package_id | int | YES | | -| gobject_id | int | YES | | -| is_template | bit | YES | | -| is_being_referenced | bit | YES | Default: ((0)) | - -### operation - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| operation_id | int | NO | PK | -| user_profile_id | int | NO | PK; FK -> user_profile.user_profile_id | -| operation_name | nvarchar(300) | NO | | -| start_time | datetime | NO | Default: (getdate()) | - -### operation_message - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| message_id | int | NO | PK | -| operation_id | int | NO | PK; FK -> operation.operation_id | -| message_text | nvarchar(300) | NO | | -| message_time | datetime | NO | Default: (getdate()) | - -### operation_status - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| operation_id | int | NO | PK; FK -> operation.operation_id | -| status | int | NO | PK | - -### operation_status_look_up - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| status | int | NO | PK | -| status_name | varchar(100) | NO | | - -### ow_group_def - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| ow_group_id | int | NO | PK; FK -> ow_group_id.ow_group_id | -| prompt | nvarchar(260) | NO | | -| GUID | varchar(36) | NO | | -| description | nvarchar(260) | YES | | -| visibility_rules | nvarchar(-1) | YES | | - -### ow_group_id - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| ow_group_id | int | NO | PK | - -### ow_group_override - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| ow_group_id | int | NO | PK; FK -> ow_group_id.ow_group_id | -| property_bitmask | int | NO | | - -### ow_instance_setting - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| name | nvarchar(329) | NO | PK | -| ow_setting_type | int | NO | PK; FK -> ow_lu_setting.ow_setting_type | -| is_dmv | bit | NO | PK | -| override_value | nvarchar(-1) | YES | | -| is_mx | bit | NO | | -| is_implicit | bit | YES | | - -### ow_link_def - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| ow_link_id | int | NO | PK; FK -> ow_link_id.ow_link_id | -| ow_link_type | int | NO | | -| name | nvarchar(329) | NO | | -| mx_primitive_id | smallint | YES | | -| dynamic_attribute_id | bigint | YES | | -| optional_id | int | YES | | -| property_bitmask | int | NO | | -| sort | int | NO | | - -### ow_link_id - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| ow_link_id | int | NO | PK | -| ow_opt_or_choice_id | int | NO | PK; FK -> ow_opt_or_choice_id.ow_opt_or_choice_id | - -### ow_lu_definition - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| ow_setting_type | int | NO | PK; FK -> ow_lu_setting.ow_setting_type | -| primitive_definition_id | int | NO | PK | -| template_definition_id | int | NO | | -| boolean_analog | bit | NO | | -| ext | varchar(20) | NO | | -| link_setting | int | YES | | -| link_feature | int | YES | | -| mx_attribute_id | smallint | YES | | - -### ow_lu_setting - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| ow_setting_type | int | NO | PK | -| category | varchar(10) | NO | | -| mx_data_type | tinyint | YES | PK; FK -> data_type.mx_data_type | -| setting_name | nvarchar(30) | NO | | -| feature_id | int | YES | | -| feature_sub_id | int | YES | | -| parent_type | int | YES | | -| no_ext | bit | YES | | -| raw_value | nvarchar(100) | YES | | - -### ow_opt_or_choice_def - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| ow_opt_or_choice_id | int | NO | PK; FK -> ow_opt_or_choice_id.ow_opt_or_choice_id | -| prompt | nvarchar(260) | NO | | -| GUID | varchar(36) | NO | | -| name | varchar(10) | NO | | -| description | nvarchar(260) | YES | | -| choice_sequence_number | int | YES | | -| after_group_or_option | int | YES | | -| initial_value | bit | NO | Default: ((0)) | -| visibility_rules | nvarchar(-1) | YES | | -| sort | int | NO | | - -### ow_opt_or_choice_id - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| ow_opt_or_choice_id | int | NO | PK | -| ow_group_id | int | NO | PK; FK -> ow_group_id.ow_group_id | - -### ow_opt_or_choice_override - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| ow_opt_or_choice_id | int | NO | PK; FK -> ow_opt_or_choice_id.ow_opt_or_choice_id | -| property_bitmask | int | YES | | -| override_value | bit | YES | | - -### ow_setting_def - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| ow_setting_id | int | NO | PK; FK -> ow_setting_id.ow_setting_id | -| ow_setting_type | int | NO | PK | -| reference | nvarchar(260) | YES | | -| property_id | varchar(36) | YES | | -| initial_value | nvarchar(-1) | YES | | -| property_bitmask | int | YES | | -| sort | int | NO | | - -### ow_setting_id - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| ow_setting_id | int | NO | PK | -| ow_link_id | int | NO | PK; FK -> ow_link_id.ow_link_id | - -### ow_setting_override - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| ow_setting_id | int | NO | PK; FK -> ow_setting_id.ow_setting_id | -| override_value | nvarchar(-1) | YES | | -| property_bitmask | int | YES | | - -### ow_symbol_setting - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| sym_name | nvarchar(33) | NO | PK | -| ow_setting_type | int | NO | PK; FK -> ow_lu_setting.ow_setting_type | -| reference | nvarchar(260) | NO | PK | -| property_id | nvarchar(36) | YES | | -| value | nvarchar(-1) | YES | | -| property_bitmask | int | YES | | - -### owned_visual_element - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK; FK -> visual_element_version.package_id | -| mx_primitive_id | smallint | NO | PK | -| visual_element_id | int | NO | | -| thumbnail | image(2147483647) | YES | | -| description | nvarchar(1024) | YES | | -| visual_element_definition | image(2147483647) | NO | | -| is_thumbnail_dirty | bit | NO | Default: ((0)) | -| visual_element_definition_grm | image(2147483647) | NO | | -| content_type | nvarchar(1024) | YES | | -| visual_element_crossRef | nvarchar(-1) | YES | | -| preview | image(2147483647) | YES | | - -### package - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| status_id | int | NO | PK; FK -> lookup_status.status_id; Default: ((0)) | -| reference_status_id | int | NO | Default: ((0)) | -| instance_attributes | image(2147483647) | YES | | -| operation_status | int | NO | Default: ((0)) | -| security_group | nvarchar(32) | NO | Default: ('Default') | -| derived_from_package_id | int | NO | Default: ((0)) | -| deployable_configuration_version | int | NO | Default: ((0)) | -| package_type | nvarchar(5) | NO | Default: ('I') | -| package_version | smallint | NO | Default: ((0)) | -| object_status | smallint | NO | Default: ((0)) | - -### packages_to_be_deleted - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | - -### platform - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| platform_id | int | NO | | -| platform_gobject_id | int | NO | PK; FK -> gobject.gobject_id | -| node_name | nvarchar(256) | NO | Default: ('') | -| last_deployed_node_name | nvarchar(256) | NO | Default: ('') | -| rmcNode_name | nvarchar(256) | NO | Default: ('') | -| last_deployed_rmcNode_name | nvarchar(256) | NO | Default: ('') | -| portNMX | int | NO | Default: ((0)) | -| last_deployed_portNMX | int | NO | Default: ((0)) | -| portRMC | int | NO | Default: ((0)) | -| last_deployed_portRMC | int | NO | Default: ((0)) | -| portRPC | int | NO | Default: ((0)) | -| last_deployed_portRPC | int | NO | Default: ((0)) | - -### platform_license - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK; FK -> gobject.gobject_id | -| license_type | int | NO | | - -### primitive_attribute_validation_results - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK; FK -> primitive_instance.package_id | -| mx_primitive_id | smallint | NO | PK | -| mx_attribute_id | smallint | NO | PK | -| validationCode | nvarchar(329) | NO | PK | -| validationState | smallint | NO | | - -### primitive_data_type - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| mx_data_type | tinyint | NO | PK | -| primitive_definition_id | int | NO | PK; FK -> primitive_definition.primitive_definition_id | - -### primitive_definition - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| primitive_definition_id | int | NO | PK | -| template_definition_id | int | NO | PK; FK -> template_definition.template_definition_id | -| parent_mx_primitive_id | smallint | NO | | -| mx_primitive_id | smallint | NO | Default: ((0)) | -| primitive_name | nvarchar(329) | NO | Default: ('') | -| execution_group | smallint | NO | | -| is_virtual | bit | NO | | -| primitive_guid | uniqueidentifier | NO | | -| runtime_handler_clsid | uniqueidentifier | YES | | -| package_handler_clsid | uniqueidentifier | YES | | -| supports_dynamic_attributes | bit | NO | | -| major_version | int | NO | | - -### primitive_instance - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK; FK -> package.package_id | -| mx_primitive_id | smallint | NO | PK | -| primitive_definition_id | int | NO | | -| primitive_name | nvarchar(329) | NO | | -| parent_mx_primitive_id | smallint | NO | | -| execution_group | int | NO | | -| execution_order | int | NO | Default: ((-1)) | -| owned_by_gobject_id | int | NO | Default: ((0)) | -| timestamp_of_last_change | bigint | YES | Default: ((0)) | -| max_child_timestamp | bigint | YES | Default: ((0)) | -| extension_type | nvarchar(329) | YES | | -| is_object_extension | bit | YES | Default: ((0)) | -| checked_in_primitive_version | int | NO | Default: ((1)) | -| checked_out_primitive_version | int | NO | Default: ((1)) | -| entity_change_type | int | NO | Default: ((1)) | -| operation_on_primitive_mask | int | NO | Default: ((0)) | -| created_by_parent | smallint | NO | Default: ((0)) | -| status_id | smallint | NO | Default: ((0)) | -| ref_status_id | smallint | NO | Default: ((0)) | -| primitive_attributes | image(2147483647) | YES | | -| mx_value_errors | text(2147483647) | NO | | -| mx_value_warnings | text(2147483647) | NO | | -| mx_value_reference_warnings | text(2147483647) | NO | | -| property_bitmask | smallint | NO | Default: ((0)) | - -### primitive_instance_feature_link - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK; FK -> primitive_instance.package_id | -| mx_primitive_id | smallint | NO | PK | -| feature_id | int | NO | PK | -| feature_name | nvarchar(256) | NO | Default: ('') | -| feature_type | nvarchar(256) | NO | Default: ('') | - -### primitive_instance_file_table_link - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK; FK -> primitive_instance.package_id | -| mx_primitive_id | smallint | NO | PK | -| file_id | int | NO | PK | -| is_needed_for_package | bit | NO | Default: ((0)) | -| is_needed_for_runtime | bit | NO | Default: ((0)) | -| is_needed_for_editor | bit | NO | Default: ((0)) | - -### proxy_timestamp - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| timestamp_of_last_change | timestamp | NO | | -| ImportGUID | nvarchar(265) | YES | | - -### redundancy - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| primary_gobject_id | int | NO | PK | -| backup_gobject_id | int | NO | PK | - -### renamed_visual_element - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| mx_primitive_id | smallint | NO | | -| visual_element_id | int | NO | | -| old_visual_element_name | nvarchar(329) | NO | | -| new_visual_element_name | nvarchar(329) | NO | | -| visual_element_type | nvarchar(32) | NO | | -| timestamp_of_rename | timestamp | NO | PK | - -### schema_version - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| version_number | int | NO | | -| version_string | nvarchar(64) | NO | | -| cdi_version | nvarchar(64) | NO | | -| old_version_number | int | NO | Default: ((0)) | - -### supported_locales - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| locale_id | smallint | NO | PK | - -### template - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| toolset_id | int | NO | PK; FK -> toolset.toolset_id | - -### template_attribute - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK; FK -> primitive_instance.package_id | -| mx_primitive_id | smallint | NO | PK | -| mx_attribute_id | smallint | NO | PK | -| security_classification | int | NO | | -| mx_data_type | smallint | NO | | -| mx_value | text(2147483647) | NO | | -| lock_type | int | NO | | -| original_lock_type | int | NO | Default: ((0)) | -| bit_values | smallint | NO | Default: ((0)) | -| raw_value | nvarchar(1024) | YES | Default: (NULL) | - -### template_definition - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| template_definition_id | int | NO | PK | -| base_gobject_id | int | NO | Default: ((0)) | -| original_template_tagname | nvarchar(32) | NO | Default: ('') | -| required_features | nvarchar(256) | YES | | -| supported_features | nvarchar(256) | YES | | -| category_id | smallint | NO | | -| category_clsid | uniqueidentifier | YES | | -| runtime_clsid | uniqueidentifier | YES | | -| base_template_location | nchar(260) | NO | Default: ('') | -| vendor_name | nvarchar(256) | YES | | -| major_version | smallint | YES | | -| codebase | nvarchar(322) | YES | | -| codebase_minor_version | int | NO | Default: ((0)) | -| event_mask | int | NO | Default: ((0)) | - -### template_idebehavior_link - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| template_definition_id | int | NO | PK; FK -> template_definition.template_definition_id | -| shown_in_template_toolbox | bit | NO | Default: ((1)) | -| shown_in_model_view | bit | NO | Default: ((1)) | -| shown_in_deployment_view | bit | NO | Default: ((1)) | -| shown_in_security_editor | bit | NO | Default: ((1)) | -| shown_tagname | bit | NO | Default: ((1)) | -| shown_containedname | bit | NO | Default: ((1)) | -| shown_in_archestra_browser | bit | NO | Default: ((1)) | -| shown_standard_archestra_editor_tab | bit | NO | Default: ((1)) | -| enable_objectviewermenu | bit | NO | Default: ((1)) | -| enable_createinstance | bit | NO | Default: ((1)) | -| enable_createtemplate | bit | NO | Default: ((1)) | -| idebehavior_flags | int | NO | Default: ((511)) | - -### template_migration_policy - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| migrate_to_codebase | nvarchar(322) | NO | | -| migrate_from_codebase | nvarchar(322) | NO | | - -### timestamp_record - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| ts | timestamp | NO | | - -### toolset - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| toolset_id | int | NO | PK | -| toolset_name | nvarchar(64) | NO | | - -### user_preferences - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| user_preferences_id | int | NO | PK | -| user_profile_id | int | NO | PK; FK -> user_profile.user_profile_id | -| preference_type | nvarchar(256) | NO | | -| preferences | image(2147483647) | YES | | - -### user_profile - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| user_profile_id | int | NO | PK | -| user_profile_name | nvarchar(256) | NO | | -| user_guid | uniqueidentifier | NO | Default: (newid()) | -| password_hash | int | YES | | -| default_platform_tag_name | nvarchar(32) | YES | | -| default_app_engine_tag_name | nvarchar(32) | YES | | -| default_view_engine_tag_name | nvarchar(32) | YES | | -| default_history_engine_tag_name | nvarchar(32) | YES | | -| default_area_tag_name | nvarchar(32) | YES | | -| default_security_group | nvarchar(32) | NO | Default: ('Default') | -| ide_preferences | ntext(1073741823) | YES | | -| roles | ntext(1073741823) | YES | | -| user_full_name | nvarchar(256) | YES | | -| intouch_access_level | int | YES | Default: ((0)) | -| user_version_id | int | NO | Default: ((1)) | -| crypto_secure_hashed_pwd | ntext(1073741823) | YES | | - -### visual_element - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| visual_element_id | int | NO | PK | -| visual_element_type | nvarchar(32) | YES | | -| inheritance_status | nchar(1) | YES | | -| visual_element_category | nchar(1) | YES | | - -### visual_element_affected_by_undo_check_out - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| visual_element_name | nvarchar(329) | YES | | -| visual_element_id | int | YES | | -| visual_element_type | nvarchar(32) | YES | | -| change_type | int | YES | | -| check_out_undone_by_user_guid | uniqueidentifier | NO | | -| timestamp_of_last_change | timestamp | NO | | - -### visual_element_archive - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | | -| package_id | int | NO | | -| mx_primitive_id | smallint | NO | | -| visual_element_name | nvarchar(329) | NO | | -| visual_element_type | nvarchar(32) | NO | | -| visual_element_id | int | NO | | -| persisted_for_gobject_id | int | NO | | - -### visual_element_id - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| visual_element_id | int | NO | | - -### visual_element_reference - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK; FK -> primitive_instance.package_id | -| mx_primitive_id | smallint | NO | PK | -| visual_element_reference_index | int | NO | PK | -| visual_element_bind_status | int | NO | | -| is_relative_reference | char(1) | NO | | -| checked_in_bound_visual_element_gobject_id | int | YES | | -| checked_in_bound_visual_element_package_id | int | YES | | -| checked_in_bound_visual_element_mx_primitive_id | smallint | YES | | -| checked_out_bound_visual_element_gobject_id | int | YES | | -| checked_out_bound_visual_element_package_id | int | YES | | -| checked_out_bound_visual_element_mx_primitive_id | smallint | YES | | -| unbound_timestamp | timestamp | NO | | -| checked_in_unbound_visual_element_name | nvarchar(362) | YES | | -| checked_in_unbound_visual_element_type | nvarchar(32) | YES | | -| checked_in_unbound_tag_name | nvarchar(329) | YES | | -| checked_in_unbound_primitive_name | nvarchar(329) | YES | | -| checked_in_unbound_relative_object_name | nvarchar(329) | YES | | -| checked_in_unbound_visual_element_id | int | YES | | -| checked_out_unbound_visual_element_name | nvarchar(362) | YES | | -| checked_out_unbound_visual_element_type | nvarchar(32) | YES | | -| checked_out_unbound_tag_name | nvarchar(329) | YES | | -| checked_out_unbound_primitive_name | nvarchar(329) | YES | | -| checked_out_unbound_relative_object_name | nvarchar(329) | YES | | -| checked_out_unbound_visual_element_id | int | YES | | -| checked_out_visual_element_package_id | int | YES | | -| checked_out_visual_element_gobject_id | int | YES | | -| checked_out_to_user_guid | uniqueidentifier | YES | | - -### visual_element_timestamp - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | | -| package_id | int | NO | | -| mx_primitive_id | smallint | NO | | -| visual_element_id | int | NO | | -| change_type | int | NO | | -| timestamp_of_last_change | timestamp | NO | | - -### visual_element_version - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| gobject_id | int | NO | PK | -| package_id | int | NO | PK | -| mx_primitive_id | smallint | NO | PK | -| visual_element_id | int | NO | PK; FK -> visual_element.visual_element_id | -| inherited_from_gobject_id | int | NO | PK | -| inherited_from_package_id | int | NO | PK | -| inherited_from_mx_primitive_id | smallint | NO | PK | -| inherited_from_visual_element_id | int | YES | | - -### well_known_client_controls - -| Column | Type | Nullable | Notes | -|--------|------|----------|-------| -| file_id | int | YES | | -| class_name | nvarchar(1024) | NO | | -| toolbox_info | nvarchar(-1) | YES | | - -## Views - -### internal_all_alarms_view - -| Column | Type | Nullable | -|--------|------|----------| -| name | nvarchar(663) | NO | -| gobject_id | int | NO | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | - -### internal_all_view_app_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| category_id | smallint | NO | - -### internal_automation_object_model_hierarchy_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| tag_name | nvarchar(329) | NO | -| folderid | int | NO | -| is_area | int | NO | - -### internal_automation_object_model_hierarchy_view2 - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| tag_name | nvarchar(329) | NO | -| folderid | int | NO | -| is_area | int | NO | - -### internal_automation_object_visual_element_hierarchy_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| tag_name | nvarchar(329) | NO | -| folderId | int | NO | -| visual_element_name | nvarchar(362) | YES | -| visual_element_definition_id | int | NO | -| is_area | int | NO | -| defining_visual_element_name | nvarchar(362) | NO | -| category_id | smallint | NO | -| is_template | bit | NO | -| relative_asset_order | float(53,NULL) | NO | -| friendly_name | nvarchar(1024) | NO | -| property_bitmask | smallint | YES | - -### internal_automation_object_visual_element_hierarchy_view_includetemplates - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| tag_name | nvarchar(329) | NO | -| folderId | int | NO | -| visual_element_name | nvarchar(362) | YES | -| visual_element_definition_id | int | NO | -| is_area | int | NO | -| defining_visual_element_name | nvarchar(362) | NO | -| category_id | smallint | NO | -| is_template | bit | NO | -| relative_asset_order | float(53,NULL) | NO | -| friendly_name | nvarchar(1024) | NO | -| property_bitmask | smallint | YES | - -### internal_checked_in_unbound_relative_visual_element_reference_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | -| visual_element_reference_index | int | NO | -| checked_in_unbound_visual_element_type | nvarchar(32) | YES | -| checked_in_unbound_hierarchical_visual_element_name | nvarchar(989) | YES | - -### internal_checked_out_unbound_relative_visual_element_reference_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | -| visual_element_reference_index | int | NO | -| checked_out_unbound_visual_element_type | nvarchar(32) | YES | -| checked_out_unbound_hierarchical_visual_element_name | nvarchar(989) | YES | - -### internal_common_obj - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| tag_name | nvarchar(329) | NO | -| category_id | smallint | NO | -| toolset_name | nvarchar(64) | NO | -| is_template | bit | NO | -| status | int | NO | -| derived_from | int | NO | -| checkedout_by | uniqueidentifier | YES | -| base_type | int | NO | -| myhost | int | NO | -| required_feature_guid | nvarchar(256) | YES | -| supported_feature_guid | nvarchar(256) | YES | -| is_checkout | int | NO | -| is_deployed | int | NO | -| haspendingupdate | int | NO | -| checkedinpg | int | NO | -| checkedoutpg | int | NO | -| readpgid | int | NO | -| packagestate | int | NO | -| objectid | int | NO | -| mycontainer | int | NO | -| myarea | int | NO | -| hierarchical_name | nvarchar(329) | NO | -| is_hidden | bit | NO | -| myengine | int | NO | -| myplatform | int | NO | - -### internal_control_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | int | NO | -| name | nvarchar(329) | NO | -| full_name | nvarchar(659) | NO | -| parent_id | int | NO | -| parent_name | nvarchar(329) | NO | -| control_id | nvarchar(329) | YES | -| description | nvarchar(2000) | YES | -| thumbnail | nvarchar(-1) | YES | -| properties | nvarchar(-1) | YES | -| relationship_id | int | NO | -| type | varchar(7) | NO | -| VisualElementType | varchar(7) | NO | -| path | int | NO | -| path_prefix | nvarchar(329) | NO | -| user_guid | int | YES | - -### internal_get_asset_graphics_preview_user_view - -| Column | Type | Nullable | -|--------|------|----------| -| parent_id | int | NO | -| name | nvarchar(362) | YES | -| visual_element_id | int | NO | -| user_guid | uniqueidentifier | NO | - -### internal_get_attribute_definition_with_validation - -| Column | Type | Nullable | -|--------|------|----------| -| attribute_definition_id | int | NO | -| primitive_definition_id | int | NO | -| attribute_name | nvarchar(329) | NO | -| mx_attribute_id | smallint | NO | -| has_config_set_handler | bit | NO | -| mx_data_type | smallint | NO | -| is_array | bit | NO | -| security_classification | smallint | NO | -| security_classification_needs_deployed | bit | NO | -| mx_attribute_category | int | NO | -| is_frequently_accessed | bit | NO | -| is_locked | bit | NO | -| is_locked_needs_deployed | bit | NO | -| mx_value | text(2147483647) | NO | -| mx_value_needs_deployed | bit | NO | -| primitive_name | nvarchar(329) | NO | -| requires_validation | int | NO | -| requires_raw_copy | int | NO | - -### internal_get_device_scangroups_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | int | YES | -| name | nvarchar(329) | NO | -| parent_id | int | NO | - -### internal_get_external_content_media_types_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | int | NO | -| media_type | nvarchar(255) | NO | -| parent_name | nvarchar(329) | NO | -| control_id | nvarchar(329) | YES | -| uri_property_name | nvarchar(1023) | YES | -| media_type_property_name | nvarchar(1023) | YES | -| is_default | bit | YES | -| user_guid | int | YES | - -### internal_get_GRMblob_preview_user_view - -| Column | Type | Nullable | -|--------|------|----------| -| parent_id | int | NO | -| entity_id | int | NO | -| name | nvarchar(362) | YES | -| visualelementtype | nvarchar(32) | YES | -| user_guid | uniqueidentifier | NO | -| is_checkout | int | NO | -| visual_element_id | int | NO | -| definition_grm | varbinary(-1) | YES | -| definingvename | nvarchar(362) | YES | - -### internal_get_gtb_Allelements_view - -| Column | Type | Nullable | -|--------|------|----------| -| parent_id | int | YES | -| name | nvarchar(362) | YES | -| type | varchar(6) | NO | -| entity_id | int | YES | -| last_modified | datetime | YES | -| user_guid | uniqueidentifier | YES | -| is_checkout | int | YES | -| timestamp_of_last_change | timestamp | NO | -| thumbnail | varbinary(-1) | YES | -| definition | varbinary(-1) | YES | -| description | nvarchar(1024) | YES | -| status | int | YES | -| refStatus | int | YES | -| CheckedoutStatus | int | YES | -| CheckedoutbyUser | uniqueidentifier | YES | -| CheckoutByName | nvarchar(256) | YES | -| VisualElementType | nvarchar(32) | YES | -| hasObjects | bit | YES | -| hasFolders | bit | YES | -| is_hidden | int | NO | -| isprotected | int | NO | -| relationship_id | int | NO | -| path | int | YES | -| path_prefix | varchar(1) | NO | -| full_name | varchar(1) | NO | -| parent_name | varchar(1) | NO | -| control_id | varchar(1) | NO | -| content_type | nvarchar(1024) | YES | -| preview | varbinary(-1) | YES | - -### internal_get_gtb_elements_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| last_modified | datetime | YES | -| timestamp_of_last_change | timestamp | NO | -| user_guid | uniqueidentifier | NO | -| visual_element_name | nvarchar(362) | YES | -| thumbnail | image(2147483647) | YES | -| visual_element_definition | image(2147483647) | NO | -| folder_id | int | YES | -| visual_element_type | nvarchar(32) | YES | -| description | nvarchar(1024) | YES | -| is_checkout | int | NO | -| status | int | YES | -| refStatus | int | YES | -| checked_out_package_status | int | YES | -| checkedout_by | uniqueidentifier | YES | -| checkoutbyname | nvarchar(256) | YES | -| is_hidden | bit | NO | -| isprotected | int | NO | -| visual_element_id | int | NO | -| content_type | nvarchar(1024) | YES | -| preview | image(2147483647) | YES | - -### internal_get_gtb_folders_view - -| Column | Type | Nullable | -|--------|------|----------| -| folder_id | int | NO | -| folder_name | nvarchar(64) | NO | -| parent_folder_id | int | NO | -| depth | int | NO | -| has_objects | bit | NO | -| has_folders | bit | YES | -| timestamp_of_last_change | timestamp | NO | - -### internal_get_gtb_visual_element_references_deployment_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | nvarchar(694) | YES | -| gobject_id | int | NO | -| name | nvarchar(329) | NO | -| user_guid | uniqueidentifier | YES | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | -| referee_visual_element_id | int | YES | -| referee_visual_element_type | nvarchar(32) | YES | -| visual_element_bind_status | int | YES | -| visual_element_reference_index | int | NO | -| visual_element_id | int | YES | -| checked_in_unbound_visual_element_name | nvarchar(362) | YES | -| visual_element_type | nvarchar(32) | YES | -| primitive_name | nvarchar(329) | YES | -| tag_name | nvarchar(329) | YES | -| reference_string | nvarchar(694) | YES | -| calculated_visual_element_name | nvarchar(661) | YES | -| calculated_visual_element_type | nvarchar(32) | YES | -| package_type | nvarchar(5) | NO | -| is_relative_reference | char(1) | NO | - -### internal_get_gtb_visual_element_references_preview_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | varchar(21) | YES | -| name | nvarchar(329) | NO | -| visualelementtype | nvarchar(6) | NO | -| referee_visual_element_id | int | YES | -| referee_visual_element_type | nvarchar(32) | YES | -| visual_element_reference_index | int | NO | -| visual_element_id | int | YES | -| reference_string | nvarchar(694) | YES | - -### internal_get_gtb_visual_element_references_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | nvarchar(683) | YES | -| gobject_id | int | NO | -| name | nvarchar(329) | NO | -| user_guid | uniqueidentifier | YES | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | -| referee_visual_element_id | int | YES | -| referee_visual_element_type | nvarchar(32) | YES | -| visual_element_bind_status | int | YES | -| visual_element_reference_index | int | NO | -| visual_element_id | int | YES | -| checked_in_unbound_visual_element_name | nvarchar(362) | YES | -| visual_element_type | nvarchar(32) | YES | -| primitive_name | nvarchar(329) | YES | -| tag_name | nvarchar(329) | YES | -| reference_string | nvarchar(694) | YES | -| calculated_visual_element_name | nvarchar(661) | YES | -| calculated_visual_element_type | nvarchar(32) | YES | -| package_type | nvarchar(5) | NO | -| is_relative_reference | char(1) | NO | - -### internal_get_object_wizard_symbol_override_mapping_preview_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | int | NO | -| owning_object_id | int | NO | -| package_id | int | NO | -| owning_object_name | nvarchar(329) | NO | -| visual_element_name | nvarchar(329) | NO | -| defining_object_id | int | NO | -| user_guid | uniqueidentifier | NO | - -### internal_get_object_wizard_symbol_override_mapping_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | int | NO | -| owning_object_id | int | NO | -| owning_object_name | nvarchar(329) | NO | -| visual_element_name | nvarchar(329) | NO | -| defining_object_id | int | NO | - -### internal_get_object_wizard_symbol_override_preview_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | int | NO | -| defining_object_name | nvarchar(329) | NO | -| package_id | int | NO | -| symbol_overrides | varbinary(-1) | YES | -| user_guid | uniqueidentifier | NO | - -### internal_get_object_wizard_symbol_override_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | int | NO | -| defining_object_name | nvarchar(329) | NO | -| package_id | int | NO | -| symbol_overrides | varbinary(-1) | YES | - -### internal_get_TemplateToolBox_Allelements_view - -| Column | Type | Nullable | -|--------|------|----------| -| parent_id | int | YES | -| name | nvarchar(329) | NO | -| type | varchar(6) | NO | -| entity_id | int | YES | -| last_modified | datetime | YES | -| user_guid | uniqueidentifier | YES | -| is_checkout | int | YES | -| timestamp_of_last_change | bigint | YES | -| description | varchar(1) | YES | -| status | int | YES | -| refStatus | int | YES | -| CheckedoutStatus | int | YES | -| CheckedoutbyUser | uniqueidentifier | YES | -| CheckedoutbyUserName | nvarchar(256) | YES | -| hasObjects | bit | YES | -| hasFolders | bit | YES | -| is_hidden | int | NO | -| isprotected | int | NO | -| is_template | int | NO | -| namespace_id | int | NO | -| contained_name | nvarchar(32) | YES | -| hierarchical_name | nvarchar(329) | YES | -| derived_from_id | int | NO | -| base_type | int | NO | -| toolset_id | int | YES | -| checked_in_package_id | int | NO | -| template_definition_id | int | NO | -| container_id | int | NO | -| gObjectStatus | int | YES | -| category_id | int | NO | -| codebase | nvarchar(322) | YES | -| required_features | nvarchar(256) | YES | -| iswizard | int | NO | -| path | int | YES | -| path_prefix | varchar(1) | NO | - -### internal_get_TemplateToolBox_folders_view - -| Column | Type | Nullable | -|--------|------|----------| -| folder_id | int | NO | -| folder_name | nvarchar(64) | NO | -| parent_folder_id | int | NO | -| depth | int | NO | -| has_objects | bit | NO | -| has_folders | bit | NO | -| timestamp_of_last_change | timestamp | NO | - -### internal_get_visual_element_primitives_deployment_view - -| Column | Type | Nullable | -|--------|------|----------| -| parent_id | int | NO | -| entity_id | int | NO | -| package_id | int | NO | -| name | nvarchar(362) | YES | -| visualelementtype | nvarchar(32) | YES | -| owningobject | nvarchar(329) | NO | -| visual_element_id | int | NO | -| inherited_from_gobject_id | int | NO | -| inherited_from_visual_element_id | int | YES | -| definition | varbinary(-1) | YES | -| definition_grm | varbinary(-1) | YES | -| content_type | nvarchar(1024) | YES | -| definingvename | nvarchar(362) | YES | - -### internal_get_visual_element_primitives_view - -| Column | Type | Nullable | -|--------|------|----------| -| parent_id | int | NO | -| entity_id | int | NO | -| NAME | nvarchar(362) | YES | -| visualelementtype | nvarchar(32) | YES | -| type | varchar(4) | NO | -| thumbnail | image(2147483647) | YES | -| user_guid | uniqueidentifier | NO | -| is_checkout | int | NO | -| visual_element_id | int | NO | -| inherited_from_visual_element_id | int | YES | -| path | int | YES | -| path_prefix | nvarchar(329) | YES | -| definition | varbinary(-1) | YES | -| definition_grm | varbinary(-1) | YES | -| content_type | nvarchar(1024) | YES | -| preview | image(2147483647) | YES | -| owningobject | nvarchar(329) | NO | -| definingvename | nvarchar(362) | YES | - -### internal_gtb_symbols_hierarchy_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| name | nvarchar(329) | NO | -| folder_id | int | NO | - -### internal_linked_visual_element_definition_per_user_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | -| visual_element_id | int | NO | -| inherited_from_visual_element_id | int | YES | -| linked_visual_element_id | int | NO | -| name | nvarchar(362) | YES | -| linked_visual_element_package_id | int | NO | -| linked_visual_element_definition | image(2147483647) | NO | -| linked_visual_element_definition_grm | image(2147483647) | NO | -| linked_gobject_id | int | NO | -| user_guid | uniqueidentifier | NO | -| islinked | int | NO | -| thumbnail | image(2147483647) | YES | -| content_type | nvarchar(1024) | YES | -| preview | image(2147483647) | YES | -| property_bitmask | smallint | NO | - -### internal_list_automation_objects_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | int | NO | -| name | nvarchar(329) | NO | -| type | varchar(6) | NO | -| description | varchar(1) | NO | -| user_guid | uniqueidentifier | NO | -| is_checkout | int | NO | -| last_modified | datetime | YES | -| contained_name | nvarchar(32) | NO | -| hierarchical_name | nvarchar(329) | NO | -| area_gobject_id | int | NO | -| is_template | bit | NO | -| is_hidden | bit | NO | -| status | int | NO | -| refStatus | int | NO | -| hosted_by_gobject_id | int | NO | -| derived_from_id | int | NO | -| base_type | int | NO | -| checkoutbyname | nvarchar(256) | NO | -| checkedout_by | uniqueidentifier | YES | -| toolset_id | int | YES | -| checked_in_package_id | int | NO | -| template_definition_id | int | NO | -| container_id | int | NO | -| area_id | int | NO | -| checked_out_package_status | int | NO | -| gObjectStatus | int | YES | -| category_id | smallint | NO | -| timestamp_of_last_change | bigint | YES | -| namespace_id | smallint | NO | -| folder_id | int | YES | -| codebase | nvarchar(322) | YES | -| required_features | nvarchar(256) | YES | -| isprotected | int | NO | -| iswizard | int | NO | -| isparentwizard | int | NO | - -### internal_list_model_objects_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | int | NO | -| name | nvarchar(329) | NO | -| type | varchar(6) | NO | -| description | varchar(1) | NO | -| user_guid | int | YES | -| contained_name | nvarchar(32) | NO | -| hierarchical_name | nvarchar(329) | NO | -| area_gobject_id | int | NO | -| is_template | bit | NO | -| is_hidden | bit | NO | -| hosted_by_gobject_id | int | NO | -| derived_from_id | int | NO | -| base_type | int | NO | -| checkoutbyname | nvarchar(256) | NO | -| checkedout_by | uniqueidentifier | YES | -| checked_in_package_id | int | NO | -| template_definition_id | int | NO | -| container_id | int | NO | -| area_id | int | NO | -| gObjectStatus | int | YES | -| category_id | smallint | NO | -| namespace_id | smallint | NO | -| codebase | nvarchar(322) | YES | -| required_features | nvarchar(256) | YES | -| iswizard | int | NO | -| isparentwizard | int | NO | -| path | int | NO | -| path_prefix | nvarchar(250) | YES | -| relative_asset_order | float(53,NULL) | NO | -| friendly_name | nvarchar(1024) | NO | - -### internal_list_objects_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| tag_name | nvarchar(329) | NO | -| contained_name | nvarchar(32) | NO | -| hierarchical_name | nvarchar(329) | NO | -| is_template | bit | NO | -| status | int | NO | -| refStatus | int | NO | -| hosted_by_gobject_id | int | NO | -| derived_from_id | int | NO | -| base_type | int | NO | -| checkoutbyname | nvarchar(256) | YES | -| checkedout_by | uniqueidentifier | YES | -| toolset_id | int | YES | -| is_checkout | int | NO | -| deployed_package_id | int | NO | -| checked_in_package_id | int | NO | -| template_definition_id | int | NO | -| hasderived_obj | int | NO | -| hasassigned_obj | int | NO | -| container_id | int | NO | -| area_id | int | NO | -| hasContained_obj | int | NO | -| hasBelongTo_obj | int | NO | -| is_hidden | bit | NO | -| software_upgrade_needed | bit | NO | -| checked_out_package_status | int | YES | -| category_id | smallint | NO | -| IsCheckedOut | int | NO | -| IsSoftwareUpgradeRequired | int | NO | -| HasPendingUpdate | int | NO | -| IsDeployed | int | NO | -| IsPrimaryEngine | int | NO | -| IsBackupEngine | int | NO | -| is_failover_enabled | int | NO | -| IsPartiallyDeployed | int | NO | -| IsPartiallyUndeployed | int | NO | -| gObjectStatus | int | YES | -| timestamp_of_last_change | bigint | YES | -| namespace_id | smallint | NO | -| folder_id | int | YES | - -### internal_list_unassigned_objects_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | int | NO | -| area_gobject_id | int | NO | -| is_template | bit | NO | -| is_hidden | bit | NO | -| container_id | int | NO | -| category_id | smallint | NO | -| namespace_id | smallint | NO | - -### internal_localized_alarm_messages - -| Column | Type | Nullable | -|--------|------|----------| -| Name | nvarchar(663) | NO | -| default_message | nvarchar(1024) | NO | -| phrase_id | int | NO | -| translated_message | nvarchar(1024) | NO | -| locale_id | smallint | NO | -| gobject_id | int | NO | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | - -### internal_model_hierarchy_asset_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| tag_name | nvarchar(329) | NO | -| folderId | int | NO | -| is_area | int | NO | -| relative_asset_order | float(53,NULL) | NO | -| friendly_name | nvarchar(1024) | NO | - -### internal_package_status_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| package_id | int | NO | -| status_id | int | NO | - -### internal_proxy_obj - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| tag_name | nvarchar(329) | NO | -| contained_name | nvarchar(32) | NO | -| hierarchical_name | nvarchar(329) | NO | -| is_template | bit | NO | -| status | int | NO | -| refStatus | int | NO | -| hosted_by_gobject_id | int | NO | -| derived_from | int | NO | -| base_type | int | NO | -| checkedout_by | uniqueidentifier | YES | -| toolset_id | int | YES | -| is_checkout | int | NO | -| deployed_package_id | int | NO | -| checkedinpg | int | NO | -| template_definition_id | int | NO | -| mycontainer | int | NO | -| myarea | int | NO | -| is_hidden | bit | NO | -| software_upgrade_needed | bit | NO | -| checked_out_package_status | int | YES | -| category_id | smallint | NO | -| IsCheckedOut | int | NO | -| IsSoftwareUpgradeRequired | int | NO | -| HasPendingUpdate | int | NO | -| IsDeployed | int | NO | -| IsPrimaryEngine | int | NO | -| IsBackupEngine | int | NO | -| is_failover_enabled | int | NO | -| IsPartiallyDeployed | int | NO | -| IsPartiallyUndeployed | int | NO | -| deploy_file_transfering | bit | NO | -| timestamp_of_last_change | bigint | YES | -| namespace_id | smallint | NO | -| folder_id | int | YES | - -### internal_reference_primitive_attribute - -| Column | Type | Nullable | -|--------|------|----------| -| referringGobjectID | int | NO | -| referring_TagName | nvarchar(329) | NO | -| referringPrimitiveName | nvarchar(329) | NO | -| referringAttributeName | nvarchar(329) | NO | -| referringAttribute_full_name | nvarchar(989) | NO | -| reference_string | nvarchar(700) | NO | -| context_string | nvarchar(329) | NO | -| referredToGobjectID | int | YES | -| Referred_TagName | nvarchar(329) | YES | -| referredToPrimitiveName | nvarchar(329) | NO | -| referredToAttributeName | nvarchar(329) | NO | -| referredAttribute_full_name | nvarchar(989) | YES | - -### internal_required_support_features - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| tag_name | nvarchar(329) | NO | -| required_features | nvarchar(256) | YES | -| supported_features | nvarchar(256) | YES | - -### internal_runtime_attributes - -| Column | Type | Nullable | -|--------|------|----------| -| full_attribute_name | nvarchar(989) | NO | -| datatype | smallint | NO | -| area | nvarchar(329) | NO | -| template | nvarchar(329) | NO | - -### internal_visible_packages_per_user_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| package_id | int | NO | -| user_guid | uniqueidentifier | NO | - -### internal_visual_element_description_all_packages_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| visual_element_id | int | NO | -| visual_element_type | nvarchar(32) | YES | -| visual_element_category | nchar(1) | YES | -| visual_element_name | nvarchar(659) | NO | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | -| inheritance_status | nchar(1) | YES | -| description | nvarchar(1024) | YES | -| thumbnail | image(2147483647) | YES | -| tag_name | nvarchar(329) | NO | -| primitive_name | nvarchar(329) | NO | -| gobject_tag_name | nvarchar(329) | NO | -| package_type | nvarchar(5) | NO | -| hierarchical_visual_element_name | nvarchar(659) | NO | -| gobject_hierarchical_name | nvarchar(329) | NO | -| is_library_visual_element | int | NO | -| inherited_from_visual_element_id | int | YES | -| is_thumbnail_dirty | bit | NO | -| property_bitmask | smallint | NO | - -### internal_visual_element_description_per_user_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| visual_element_id | int | NO | -| visual_element_type | nvarchar(32) | YES | -| visual_element_category | nchar(1) | YES | -| visual_element_name | nvarchar(362) | YES | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | -| inheritance_status | nchar(1) | YES | -| description | nvarchar(1024) | YES | -| primitive_name | nvarchar(329) | NO | -| tag_name | nvarchar(329) | NO | -| package_type | nvarchar(5) | NO | -| hierarchical_visual_element_name | nvarchar(362) | YES | -| gobject_hierarchical_name | nvarchar(329) | NO | -| is_library_visual_element | int | NO | -| thumbnail | image(2147483647) | YES | -| visual_element_definition | image(2147483647) | NO | -| visual_element_definition_grm | image(2147483647) | NO | -| user_guid | uniqueidentifier | NO | -| inherited_from_gobject_id | int | NO | -| is_hidden | bit | NO | -| inherited_from_visual_element_id | int | YES | -| folder_id | int | YES | -| is_thumbnail_dirty | bit | NO | -| islinked | int | NO | -| content_type | nvarchar(1024) | YES | -| preview | image(2147483647) | YES | -| property_bitmask | smallint | NO | - -### internal_visual_element_description_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| visual_element_id | int | NO | -| visual_element_type | nvarchar(32) | YES | -| visual_element_category | nchar(1) | YES | -| visual_element_name | nvarchar(362) | YES | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | -| inheritance_status | nchar(1) | YES | -| description | nvarchar(1024) | YES | -| primitive_name | nvarchar(329) | NO | -| tag_name | nvarchar(329) | NO | -| package_type | nvarchar(5) | NO | -| hierarchical_visual_element_name | nvarchar(362) | YES | -| gobject_hierarchical_name | nvarchar(329) | NO | -| is_library_visual_element | int | NO | -| inherited_from_visual_element_id | int | YES | -| checked_in_package_id | int | NO | -| checked_out_package_id | int | NO | -| checked_out_by_user_guid | uniqueidentifier | YES | -| inherited_from_gobject_id | int | NO | -| is_thumbnail_dirty | bit | NO | -| property_bitmask | smallint | NO | - -### internal_visual_element_primitives_preview_user_view - -| Column | Type | Nullable | -|--------|------|----------| -| entity_id | int | NO | -| name | nvarchar(362) | YES | -| visualelementtype | nvarchar(6) | NO | -| user_guid | uniqueidentifier | YES | -| visual_element_id | int | NO | -| content_type | nvarchar(1024) | YES | -| owningobject | nvarchar(329) | YES | -| definingvename | nvarchar(362) | YES | - -### internal_visual_element_reference_per_user_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | -| visual_element_bind_status | int | NO | -| visual_element_reference_index | int | NO | -| visual_element_id | int | YES | -| checked_in_unbound_visual_element_name | nvarchar(362) | YES | -| visual_element_type | nvarchar(32) | YES | -| primitive_name | nvarchar(329) | YES | -| tag_name | nvarchar(329) | YES | -| reference_string | nvarchar(694) | YES | -| calculated_visual_element_name | nvarchar(661) | YES | -| calculated_visual_element_type | nvarchar(32) | YES | -| user_guid | uniqueidentifier | NO | -| package_type | nvarchar(5) | NO | -| is_relative_reference | char(1) | NO | - -### internal_visual_element_reference_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | -| visual_element_bind_status | int | NO | -| visual_element_reference_index | int | NO | -| visual_element_id | int | YES | -| checked_in_unbound_visual_element_name | nvarchar(362) | YES | -| visual_element_type | nvarchar(32) | YES | -| primitive_name | nvarchar(329) | YES | -| tag_name | nvarchar(329) | YES | -| reference_string | nvarchar(694) | YES | -| calculated_visual_element_name | nvarchar(661) | YES | -| calculated_visual_element_type | nvarchar(32) | YES | -| package_type | nvarchar(5) | NO | -| is_relative_reference | char(1) | NO | - -### internal_visual_element_reference_warning_status_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| package_id | int | NO | -| has_warning | int | NO | - -### internal_visual_element_timestamp_per_user_view - -| Column | Type | Nullable | -|--------|------|----------| -| gobject_id | int | NO | -| package_id | int | NO | -| mx_primitive_id | smallint | NO | -| visual_element_id | int | NO | -| change_type | int | NO | -| timestamp_of_last_change | timestamp | NO | -| user_guid | uniqueidentifier | NO | -| property_bitmask | smallint | NO | - -### public_gobject_definition - -| Column | Type | Nullable | -|--------|------|----------| -| tag_name | nvarchar(329) | NO | -| contained_name | nvarchar(32) | NO | -| primitive_name | nvarchar(329) | NO | -| attribute_name | nvarchar(329) | NO | -| mx_attribute_id | smallint | NO | -| has_config_set_handler | bit | NO | -| mx_data_type | smallint | NO | -| is_array | bit | NO | -| security_classification | smallint | NO | -| mx_attribute_category | int | NO | -| is_frequently_accessed | bit | NO | -| is_locked | bit | NO | -| mx_value | text(2147483647) | NO | -| gobject_id | int | NO | -| derived_from_gobject_id | int | NO | -| contained_by_gobject_id | int | NO | -| area_gobject_id | int | NO | -| hosted_by_gobject_id | int | NO | -| default_symbol_gobject_id | int | NO | -| default_display_gobject_id | int | NO | -| checked_in_package_id | int | NO | -| checked_out_package_id | int | NO | -| deployed_package_id | int | NO | -| configuration_version | int | NO | -| deployed_version | int | NO | -| hosting_tree_level | smallint | NO | -| mx_primitive_id | smallint | NO | -| parent_mx_primitive_id | smallint | NO | -| execution_group | smallint | NO | -| is_virtual | bit | NO | -| primitive_guid | uniqueidentifier | NO | -| runtime_handler_clsid | uniqueidentifier | YES | -| package_handler_clsid | uniqueidentifier | YES | -| major_version | int | NO | -| supports_dynamic_attributes | bit | NO | -| original_template_tagname | nvarchar(32) | NO | -| required_features | nvarchar(256) | YES | -| supported_features | nvarchar(256) | YES | -| category_id | smallint | NO | -| category_clsid | uniqueidentifier | YES | -| runtime_clsid | uniqueidentifier | YES | - diff --git a/gr/tags.JPG b/gr/tags.JPG deleted file mode 100644 index 8f534b0e1f5e90cf0ff1eb4d5d0d25ca2d03bf2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28675 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 XHd{7_sr!FHW&Zjt{y+Dke@y-d+>i%n diff --git a/runtimestatus.md b/runtimestatus.md deleted file mode 100644 index 66a9f2d..0000000 --- a/runtimestatus.md +++ /dev/null @@ -1,553 +0,0 @@ -# Plan: Galaxy Runtime Status (Platform + AppEngine Stopped/Started Detection) - -## Context - -Today the bridge has no operator-visible signal for "is Galaxy Platform X or AppEngine Y stopped or running?". The dashboard shows: - -- **MXAccess state** — one bit of truth about whether the bridge can talk to the local MxAccess runtime at all. -- **Data change dispatch rate** — aggregate throughput across every advised attribute. - -Neither catches the case an operator actually cares about: a single Platform or AppEngine in a multi-host Galaxy has stopped (operator stopped it from the IDE, the node crashed, network cut, process died, someone toggled OffScan for maintenance). The bridge keeps serving cached values, downstream OPC UA clients see stale reads, and nobody notices until somebody specifically goes looking at the affected equipment. - -Galaxy exposes `.ScanState` as a boolean system attribute on every deployed `$WinPlatform` **and** `$AppEngine`. `true` means the object is on scan and executing; anything else means not running. AppEngine state is independently observable through MxAccess (even a stopped Engine's parent Platform can still route the query) so a single probe mechanism covers both host types. - -The goal is to advise `.ScanState` for every deployed `$WinPlatform` and `$AppEngine`, surface per-host runtime state on the dashboard, drive a `Degraded` health check rule when any is down, and publish the state into the OPC UA address space so external clients can subscribe alongside the value data they already consume. - -## Design - -### Probe tag: `.ScanState` - -`ScanState` is a boolean system attribute on every deployed `$WinPlatform` and `$AppEngine`. The classification rule: - -``` -isRunning = status.Success && vtq.Value is bool b && b -``` - -Everything else → **Stopped**. The `ItemStatus` fields (`category`, `detail`) are still captured into `LastError` for operator diagnostics, but they don't branch the state machine. - -#### On-change delivery semantic - -MxAccess `AdviseSupervisory` delivers the current value at subscription time and then fires `OnDataChange` **only when the value changes**. `ScanState` is discrete — for a healthy host, the initial advise callback reports `true` and nothing follows until the state actually changes. There is no periodic heartbeat on the subscription. - -Implications: - -- **No starvation-based Running → Stopped transition.** A Running host will legitimately go minutes or hours without an update. The stale-threshold check for the Running state is dropped entirely. -- **Error callbacks drive the Running → Stopped transition.** MxAccess delivers a data-change callback with `ItemStatus[0].success == false` and `detail == 2 (MX_E_PlatformCommunicationError)` when a host becomes unreachable. We trust this signal — it's the broker's job to surface it, and in practice it fires quickly. -- **Stale threshold only applies to the Unknown state.** If a probe is advised but never receives a first callback (initial resolution failure, host never deployed, MxAccess routing broken), the Unknown → Stopped transition fires after `UnknownResolutionTimeoutSeconds`. This catches "the probe never came online" without tripping on healthy stable hosts. - -Subscription mechanics: - -- `AdviseSupervisory` on `.ScanState`. Supervisory variant avoids user-login requirements for bridge-owned probes — matches the pattern the node manager already uses for its own subscriptions. -- Probes are bridge-owned, not ref-counted against client subscriptions. They live for the lifetime of the address space between rebuilds. -- On rebuild, the probe set is diffed against the new host list and the minimum number of `AdviseSupervisory`/`Unadvise` calls are issued (see `Sync` in the probe manager). - -### Host discovery - -Galaxy Repository already has the data — we just need to surface it to the runtime layer. - -`hierarchy.sql` currently selects every deployed object where `template_definition.category_id IN (1, 3, 4, 10, 11, 13, 17, 24, 26)`. Category `1 = $WinPlatform` and `3 = $AppEngine` are already in the set. Add `template_definition.category_id` as a new column on the query so the repository loader can tag each `GalaxyObjectInfo` with its Galaxy category, and the probe manager can filter for categories 1 and 3. - -**Schema change:** add `CategoryId: int` to `GalaxyObjectInfo`, populated from `hierarchy.sql`. Small schema change, keeps the probe enumeration aligned with whatever the rest of the address space sees at each rebuild. - -### Runtime host state machine - -``` -┌─ Unknown ─┐ (initial state; advise issued, no callback yet) -│ │ -│ │ ScanState == true -│ ▼ -│ Running ◄───────────────────┐ -│ │ │ -│ │ │ ScanState == true -│ │ ScanState != true │ (recovery callback) -│ │ (false / error / │ -│ │ bad status) │ -│ ▼ │ -│ Stopped ──────────────────────┘ -│ -└─► Stopped (Unknown → Stopped after UnknownResolutionTimeoutSeconds - if no initial callback ever arrives) -``` - -Three states: - -- **Unknown** — probe advised but no callback yet. Initial state after bridge startup or a rebuild until the first `OnDataChange` for that host. If this state persists longer than `UnknownResolutionTimeoutSeconds` (default 15s), the manager's periodic check flips it to Stopped — captures the "probe never resolved" case. -- **Running** — last probe callback delivered `ScanState = true` with `ItemStatus[0].success == true`. Stays in this state until a callback changes it. No starvation-based timeout. -- **Stopped** — any of: - 1. Last probe callback had `ScanState != true` (explicit off-scan). - 2. Last probe callback had `ItemStatus[0].success == false` (unreachable host). - 3. Unknown state timed out (initial resolution never completed). - 4. Initial `AdviseSupervisory` reported `ResolutionStatus` of `invalidReference` or `noGalaxyRepository`. - -### MxAccess transport down → force Unknown - -When the local MxAccess client is not connected (`IMxAccessClient.State != ConnectionState.Connected`), every probe's transport is effectively offline regardless of the underlying host state. The probe manager **forces every entry to Unknown** in its snapshot output while MxAccess is disconnected. Rationale: - -- Telling the operator that all hosts are `Stopped` is misleading — the actual problem is the local transport, which the existing Connection panel already surfaces prominently. -- Unknown is the right semantic: we don't know the host state because we can't see them right now. -- When MxAccess reconnects, the broker re-delivers probe subscriptions and the state machine resumes normally. - -Implementation: `GetSnapshot()` checks `_client.State` and rewrites `State = Unknown` (leaving the underlying `_stateByProbe` map intact for when the transport comes back). `HealthCheckService` already rolls to Unhealthy via the MxAccess-not-connected rule before the runtime status rule fires, so this doesn't create a confusing health-rollup story. - -### New types - -All in `src/ZB.MOM.WW.LmxOpcUa.Host/Domain/`: - -```csharp -public enum GalaxyRuntimeState { Unknown, Running, Stopped } - -public sealed class GalaxyRuntimeStatus -{ - public string ObjectName { get; set; } = ""; // gobject.tag_name - public int GobjectId { get; set; } - public string Kind { get; set; } = ""; // "$WinPlatform" or "$AppEngine" - public GalaxyRuntimeState State { get; set; } - public DateTime? LastStateCallbackTime { get; set; } // UTC of most recent probe callback - public DateTime? LastStateChangeTime { get; set; } // UTC of last Running↔Stopped transition - public bool? LastScanState { get; set; } // last ScanState value; null before first update - public string? LastError { get; set; } // MxStatus.detail description when !success - public long GoodUpdateCount { get; set; } // callbacks where ScanState == true - public long FailureCount { get; set; } // callbacks where ScanState != true or !success -} -``` - -Why two timestamps (`LastStateCallbackTime` vs `LastStateChangeTime`): on-change-only delivery means they'll match for most entries, but a callback that arrives with a different error detail while the host is already Stopped updates the callback time and `LastError` without touching `LastStateChangeTime`. The dashboard's "Since" column (see Dashboard panel) uses `LastStateChangeTime` so operators see "Stopped since 08:17:02Z" regardless of how many intervening error callbacks have refined the diagnostic detail. - -Naming note: "Galaxy runtime" is the generic term covering both `$WinPlatform` and `$AppEngine` — the dashboard and config use this neutral phrasing so the feature doesn't look like it only covers Platforms. - -### Probe manager - -New class `MxAccess/GalaxyRuntimeProbeManager.cs`, owned by `LmxNodeManager`: - -```csharp -internal sealed class GalaxyRuntimeProbeManager : IDisposable -{ - public GalaxyRuntimeProbeManager( - IMxAccessClient client, - int unknownResolutionTimeoutSeconds, - Action onHostStopped, // invoked with GobjectId on Running → Stopped - Action onHostRunning); // invoked with GobjectId on Stopped → Running - - // Called after address-space build / rebuild. Adds probes for new hosts, - // removes them for hosts no longer in the hierarchy. Idempotent. - // Caller supplies the full hierarchy; the manager filters for category_id - // 1 ($WinPlatform) and 3 ($AppEngine). - // Blocks on sequential AddItem/AdviseSupervisory SDK calls — see wiring notes. - public void Sync(IReadOnlyList hierarchy); - - // Invoked by LmxNodeManager's OnTagValueChanged callback when the address - // matches a probe tag reference. Returns true when the event was consumed - // by a probe so the data-change dispatch queue can skip it. - public bool HandleProbeUpdate(string tagRef, Vtq vtq, MxStatusProxy status); - - // Called from the MxAccess connection monitor callback (MonitorIntervalSeconds - // cadence) to advance time-based transitions: - // 1. Unknown → Stopped when UnknownResolutionTimeoutSeconds has elapsed. - // 2. Nothing for Running — no starvation check (on-change-only semantics). - public void Tick(); - - // Snapshot respects MxAccess transport state — returns all Unknown when - // the transport is disconnected, regardless of the underlying per-host state. - public IReadOnlyList GetSnapshot(); - - public int ActiveProbeCount { get; } - - // Unadvise + RemoveItem on every active probe. Called from LmxNodeManager.Dispose - // before the MxAccess client teardown. Idempotent — safe to call multiple times. - public void Dispose(); -} -``` - -The two `Action` callbacks are how the probe manager triggers the subtree quality invalidation documented below — the owning `LmxNodeManager` passes references to its own `MarkHostVariablesBadQuality` and `ClearHostVariablesBadQuality` methods at construction time. The probe manager calls them synchronously on state transitions, from whichever thread delivered the probe callback (the MxAccess dispatch thread). The node manager methods acquire their own lock internally — the probe manager does not hold its own lock across the callback invocation to avoid inverted-lock-order deadlocks. - -Internals: - -- `Dictionary` keyed by probe tag reference (`.ScanState`). -- Reverse `Dictionary` from `GobjectId` to probe tag for `Sync` to diff against a fresh hierarchy. -- One lock guarding both maps. Operations are microsecond-scale. -- `Sync` filters `hierarchy` for `CategoryId == 1 || CategoryId == 3`, then compares the filtered set against the active probe set: - - Added hosts → `client.AddItem` + `AdviseSupervisory`; insert `GalaxyRuntimeStatus { State = Unknown }`. - - Removed hosts → `Unadvise` + `RemoveItem`; drop entry. - - Unchanged hosts → leave in place, preserving their state machine across the rebuild. -- `HandleProbeUpdate` is the per-callback entry point. It evaluates the `isRunning` predicate, updates `LastUpdateTime`, transitions state, logs at `Information` level on state changes only (not every tick), and stores the `ItemStatus` detail into `LastError` on failure. -- `Tick` runs at the existing dispatch thread cadence. For each Unknown entry, checks `LastUpdateTime == null && (now - _createdAt[id]) > unknownResolutionTimeoutSeconds` and flips to Stopped if so. Healthy Running entries are not touched. -- `GetSnapshot` short-circuits to "all Unknown" when `_client.State != ConnectionState.Connected`. - -### LmxNodeManager wiring - -`LmxNodeManager` constructs a `GalaxyRuntimeProbeManager` when `MxAccessConfiguration.RuntimeStatusProbesEnabled` is true. In `BuildAddressSpace` and the subtree rebuild path, after the existing loops complete, call `_probeManager.Sync(hierarchy)`. `Sync` blocks while it issues `AddItem` + `AdviseSupervisory` sequentially for each new host — for a galaxy with ~50 runtime hosts this adds roughly 500ms–1s to the address-space build on top of the existing several-second build time. Kept synchronous deliberately: the simpler correctness model is worth the startup hit, and `ActiveProbeCount` is guaranteed to be accurate the moment the build completes. - -Route the existing `OnTagValueChanged` callback through `_probeManager.HandleProbeUpdate` first — if it returns `true`, the event was consumed by a bridge-owned probe and the dispatch queue skips the normal variable-update path. - -**Tick() cadence — piggyback on the MxAccess connection monitor.** The dispatch thread wakes on `_dataChangeSignal`, which only fires when tag values change. In the degenerate case where no probe ever resolves (MxAccess routing broken, bad probe tag, etc.), the dispatch loop never wakes and the Unknown → Stopped timeout would never fire. To avoid adding a new thread or timer, hook `_probeManager.Tick()` into the callback path that the existing `MxAccess.MonitorIntervalSeconds` watcher already runs — the same cadence that drives the connection-level probe-tag staleness check. A single call site covers both. - -If the monitor is not accessible from `LmxNodeManager` during implementation (it lives at a different layer in the MxAccess client), fall back to Option A from the design discussion: change the dispatch loop's `WaitOne()` call to a timed `WaitOne(500ms)` so it wakes periodically regardless of data changes. Single-line change, but requires verifying no assumptions in the existing loop break from the periodic wake-ups. - -### Service shutdown — explicit probe cleanup - -The probe manager's `Sync` handles Unadvise on diff removal when a host leaves the hierarchy. Service shutdown is a separate path that needs explicit handling: when `LmxNodeManager` is disposed, the active probe subscriptions must be torn down before the MxAccess client is closed — otherwise we rely on the client's broader shutdown to cover supervisory subscriptions, which depends on disposal ordering and may or may not clean up cleanly. - -`GalaxyRuntimeProbeManager` implements `IDisposable`. `Dispose()` walks the active probe map, calls `Unadvise` + `RemoveItem` on each entry, and clears the maps. Idempotent — calling it twice is a no-op. `LmxNodeManager.Dispose` calls `_probeManager?.Dispose()` **before** the existing teardown steps that touch the MxAccess client. - -### Subtree quality invalidation on Stopped transition - -**Operational context for this section** — observed behavior from production: when an AppEngine or Platform goes OffScan, MxAccess fans out per-tag `OnDataChange` callbacks for every advised tag hosted by that runtime object, each carrying bad quality. Two symptoms result: - -1. **OPC UA client freeze** — the dispatch handler processes the flood in one cycle, pushes thousands of OPC UA value-change notifications to subscribed clients in one `Publish` response, and the client visibly stalls handling the volume. -2. **Incomplete quality flip** — some OPC UA variables retain their last good value with Good quality even after the host is down, either because the dispatch queue drops updates, or because some tags aren't in the subscribed set at the moment of the flood, or because of an edge case in the quality mapper. Operationally: clients read plausible-looking stale data from a dead host. - -The probe-driven Stopped transition is the authoritative, on-time signal we control. On that transition, the bridge proactively walks every OPC UA variable node hosted by the Stopped host and sets its `StatusCode` to `BadOutOfService`. This is independent of whether MxAccess also delivers per-tag bad-quality updates — the two signals are belt-and-suspenders for correctness. Even if the dispatch queue drops half the per-tag updates, the subtree walk guarantees the end state is uniformly Bad for every variable under the dead host. - -On the recovery `Stopped → Running` transition, the bridge walks the same set and clears the override — sets `StatusCode` back to `Good` so the cached values are visible again. Subsequent real MxAccess updates arrive on-change and overwrite value + status as normal. Trade-off: for a host that's been down a long time, some tags may show Good quality on a stale cached value for a short window after recovery, until MxAccess delivers the next on-change update for that tag. This matches existing bridge behavior for any slow-changing attribute and is preferable to leaving variables stuck at BadOutOfService indefinitely waiting for an update that may never come. - -**What's included in the "subtree"** — the set of variables whose owning Galaxy object is hosted (transitively) by the Stopped host. For AppEngines, this is every variable whose object's `host_gobject_id` chain reaches the Engine. For Platforms, it's every variable on every Engine hosted by the Platform, plus every object hosted directly on the Platform. This is **not** browse-tree containment — an object can live in one Area (browse parent) but be hosted by an Engine on a different Platform (runtime parent), and the host relationship is what determines the fate of its live data. - -Implementation plan for the host-to-variables mapping: - -1. Extend `hierarchy.sql` to return `gobject.host_gobject_id` as a new column if it exists. Verify during implementation — if the column is not present on this Galaxy schema version, fall back to `contained_by_gobject_id` as an approximation (less precise for edge cases where browse containment differs from runtime hosting, but sufficient for typical Galaxy topologies). -2. Extend `GalaxyObjectInfo` with `HostGobjectId: int`. -3. During `BuildAddressSpace`, as each variable is created, compute its owning host by walking `HostGobjectId` up the chain until hitting a `$WinPlatform` or `$AppEngine` (or reaching the root). Append the variable to a `Dictionary>` keyed by the host's `GobjectId`. -4. On `BuildSubtree` (incremental rebuild), the same logic runs for newly added variables. Variables that leave the hierarchy are removed from the map. The map lives next to `_nodeMap` on `LmxNodeManager`. - -New public methods on `LmxNodeManager`: - -```csharp -// Called by probe manager on Running → Stopped. Walks every variable hosted by -// gobjectId and sets its StatusCode to BadOutOfService. Safe to call multiple times. -// Does nothing when gobjectId has no hosted variables. -public void MarkHostVariablesBadQuality(int gobjectId); - -// Called by probe manager on Stopped → Running. Walks every variable hosted by -// gobjectId and resets StatusCode to Good. Values are left at whatever the last -// MxAccess-delivered value was; subsequent on-change updates will refresh them. -public void ClearHostVariablesBadQuality(int gobjectId); -``` - -Both methods acquire the standard node manager `Lock`, iterate the hosted list, set `StatusCode` + call `ClearChangeMasks(ctx, false)` per variable, and release the lock. The OPC UA subscription publisher picks up the change masks on its next tick and pushes notifications to subscribed clients — so operators see a single uniform quality flip per variable rather than two (one from our walk, one from the MxAccess per-tag delivery). - -### Dispatch suppression — deferred pending observation - -The subtree invalidation above addresses the **data-correctness** symptom (some variables not flipping to bad quality). The **client freeze** symptom is a separate problem: even if the quality state is correct, the bridge is still processing a thundering herd of per-tag bad-quality MxAccess callbacks through the dispatch queue, which in turn push thousands of OPC UA value-change notifications to subscribed clients. - -A stronger fix would be **dispatch suppression**: once the probe manager transitions a host to Stopped, filter out incoming MxAccess per-tag updates for any tag owned by that host before they hit the dispatch queue. The subtree walk has already captured the state; the redundant per-tag updates are pure noise. - -**This is deliberately NOT part of phase 1.** Reasons: - -- The subtree walk may make the freeze disappear entirely. If the dispatch queue processes the flood but the notifications it pushes are now duplicates of change masks the walk already set, the SDK may coalesce them into a single publish cycle and the client sees one notification batch rather than thousands. We want to observe whether this is the case before building suppression. -- If the freeze persists after subtree invalidation ships, we have a real measurement of the residual problem to inform the suppression design (which hosts, which tags, how much batching, whether to also coalesce at the OPC UA publisher level). -- The suppression path has a subtle failure mode: if the probe is briefly wrong (race where the probe says Stopped but the host actually recovered), we'd drop legitimate updates for a few seconds until the probe catches up. For an on-change-only probe this is bounded, but the plan should justify the trade-off against real observed data. - -Phase 2 decision gate: after shipping phase 1 and observing the post-subtree-walk behavior against a real AppEngine stop, decide whether dispatch suppression is still needed and design it against the real measurement. - -### OPC UA address space exposure - -Per-host status should be readable by OPC UA clients, not just the dashboard. Add child variable nodes under each `$WinPlatform` / `$AppEngine` object node in the address space. **All bridge-synthetic nodes use a `$` prefix** so they can never collide with user-defined attributes on extended templates: - -- `.$RuntimeState` (`String`) — `Unknown` / `Running` / `Stopped`. -- `.$LastCallbackTime` (`DateTime`) — most recent probe callback regardless of transition. -- `.$LastScanState` (`Boolean`) — last `ScanState` value received; null before first update. -- `.$LastStateChangeTime` (`DateTime`) — most recent Running↔Stopped transition, backs the dashboard "Since" column. -- `.$FailureCount` (`Int64`) -- `.$LastError` (`String`) — last non-success MxStatus detail, empty string when null. - -These read from the probe manager's snapshot (bridge-synthetic, no MxAccess round-trip) and are updated via `ChangeBits.Value` signalling when the state transitions. Read-only. - -Note: the underlying `.ScanState` Galaxy attribute will already appear in the address space via the normal hierarchy-build path, so downstream clients will see both the raw attribute (`ns=3;s=DevPlatform.ScanState`) and the synthesized state rollup (`ns=3;s=DevPlatform.$RuntimeState`). Intentional — the raw attribute is the ground truth, the rollup adds state-change timestamps and the Unknown/Running/Stopped trichotomy. - -Namespace placement: under the existing host object node in the Galaxy namespace (`ns=3`), browseable at `DevPlatform/$RuntimeState` etc. No new namespace needed. - -### Dashboard - -#### Runtime Status panel - -New `RuntimeStatusInfo` class on `StatusData`: - -```csharp -public class RuntimeStatusInfo -{ - public int Total { get; set; } - public int RunningCount { get; set; } - public int StoppedCount { get; set; } - public int UnknownCount { get; set; } - public List Hosts { get; set; } = new(); -} -``` - -Populated in `StatusReportService` via a new `LmxNodeManager.RuntimeStatuses` accessor. Renders between the Galaxy Info panel and the Historian panel. - -Panel color: -- **Green** — all hosts Running. -- **Yellow** — at least one Unknown, zero Stopped. -- **Red** — at least one Stopped. -- **Gray** — MxAccess disconnected (all hosts Unknown; the Connection panel is the primary signal). - -HTML layout: -``` -┌ Galaxy Runtime ───────────────────────────────────────────────────────┐ -│ 5 of 6 hosts running (3 platforms, 3 engines) │ -│ ┌─────────────────┬──────────────┬─────────┬──────────────────────┐ │ -│ │ Name │ Kind │ State │ Since │ │ -│ ├─────────────────┼──────────────┼─────────┼──────────────────────┤ │ -│ │ DevPlatform │ $WinPlatform │ Running │ 2026-04-13T08:15:02Z │ │ -│ │ DevAppEngine │ $AppEngine │ Running │ 2026-04-13T08:15:04Z │ │ -│ │ PlatformA │ $WinPlatform │ Running │ 2026-04-13T08:15:03Z │ │ -│ │ EngineA_1 │ $AppEngine │ Running │ 2026-04-13T08:15:05Z │ │ -│ │ EngineA_2 │ $AppEngine │ Stopped │ 2026-04-13T14:28:03Z │ │ -│ │ PlatformB │ $WinPlatform │ Running │ 2026-04-13T08:15:04Z │ │ -│ └─────────────────┴──────────────┴─────────┴──────────────────────┘ │ -└────────────────────────────────────────────────────────────────────────┘ -``` - -The "Since" column backs on `LastStateChangeTime` and its meaning depends on the row's current state: "Running since X" reads as "has been on scan since X", "Stopped since X" reads as "has been off scan since X". For Unknown rows, display "Advised since X" instead (the probe was registered at X but has not yet received its first callback). - -#### Subscriptions panel — break out bridge probe count - -The existing Subscriptions panel shows `Active: N` — the total advised-item count from `IMxAccessClient.ActiveSubscriptionCount`. After this ships, that number will include the bridge-owned runtime probes (one per Platform + one per AppEngine), which would look like a silent jump to operators watching for capacity planning purposes. - -Fix: expose a new `ActiveProbeSubscriptionCount` property on `LmxNodeManager` (wired from `GalaxyRuntimeProbeManager.ActiveProbeCount`) and render as a second line on the Subscriptions panel: - -``` -┌ Subscriptions ──────────────────────────────┐ -│ Active: 1247 │ -│ Probes: 6 (bridge-owned runtime status) │ -└──────────────────────────────────────────────┘ -``` - -The `Active` total continues to include probes (no subtraction) so the count still matches whatever MxAccess actually holds — the breakout line tells operators which slice is bridge-internal. - -### HealthCheckService rule - -New rule in `HealthCheckService.CheckHealth`: - -``` -Rule 2e: Any Galaxy runtime host in Stopped state → Degraded - - Yellow panel - - Message: "N of M hosts stopped: Host1, Host2" -``` - -Rationale: the bridge is still able to talk to the local MxAccess runtime and serve cached values for the hosts that are up, so this is `Degraded` rather than `Unhealthy`. A stopped host is recoverable — the operator fixes it and the probe automatically transitions back to `Running`. - -Rule ordering matters: this rule checks after the MxAccess-connected check (Rule 1), so when MxAccess is disconnected the service is Unhealthy on Rule 1 and the runtime-host rule never runs — avoids the confusing "MxAccess down AND Galaxy runtime degraded" double message. - -### Configuration - -New fields on `MxAccessConfiguration` (not a new config class — this is a runtime concern of the MxAccess bridge): - -```csharp -public class MxAccessConfiguration -{ - // ...existing fields... - - /// - /// Enables per-host runtime status probing via AdviseSupervisory on - /// <ObjectName>.ScanState for every deployed $WinPlatform - /// and $AppEngine. Default enabled when a deployed ArchestrA Platform - /// is present. Set false for bridges that don't need multi-host - /// visibility and want to minimize subscription count. - /// - public bool RuntimeStatusProbesEnabled { get; set; } = true; - - /// - /// Maximum seconds to wait for the initial probe callback before marking - /// an Unknown host as Stopped. Only applies to the Unknown → Stopped - /// transition; Running hosts do not time out (ScanState is delivered - /// on-change only, so a stable healthy host may go indefinitely without - /// a callback). Default 15s. - /// - public int RuntimeStatusUnknownTimeoutSeconds { get; set; } = 15; -} -``` - -No new top-level config section. Validator emits a warning if the timeout is shorter than 5 seconds (below the reasonable floor for MxAccess initial-resolution latency). - -## Critical Files - -### Modified -- `src/ZB.MOM.WW.LmxOpcUa.Host/Domain/GalaxyObjectInfo.cs` — add `CategoryId: int` and `HostGobjectId: int` -- `src/ZB.MOM.WW.LmxOpcUa.Host/GalaxyRepository/GalaxyRepositoryService.cs` — include `template_definition.category_id` and `gobject.host_gobject_id` in `HierarchySql` and the reader (falling back to `contained_by_gobject_id` if host column is unavailable) -- `gr/queries/hierarchy.sql` — same column additions (documentation query) -- `src/ZB.MOM.WW.LmxOpcUa.Host/Configuration/MxAccessConfiguration.cs` — add `RuntimeStatusProbesEnabled` + `RuntimeStatusUnknownTimeoutSeconds` -- `src/ZB.MOM.WW.LmxOpcUa.Host/OpcUa/LmxNodeManager.cs` — construct probe manager, wire `OnTagValueChanged` and the MxAccess monitor callback, build `_hostedVariables: Dictionary>` during address-space construction, expose `RuntimeStatuses` / `ActiveProbeSubscriptionCount` / `MarkHostVariablesBadQuality` / `ClearHostVariablesBadQuality` -- `src/ZB.MOM.WW.LmxOpcUa.Host/Status/StatusData.cs` — add `RuntimeStatusInfo`; add `ProbeSubscriptionCount` field on `SubscriptionInfo` -- `src/ZB.MOM.WW.LmxOpcUa.Host/Status/StatusReportService.cs` — populate from node manager, render Runtime Status panel + Probes line -- `src/ZB.MOM.WW.LmxOpcUa.Host/Status/HealthCheckService.cs` — new Rule 2e (after Rule 1 to avoid double-messaging when MxAccess is down) -- `src/ZB.MOM.WW.LmxOpcUa.Host/appsettings.json` — new MxAccess fields with defaults -- `src/ZB.MOM.WW.LmxOpcUa.Host/Configuration/ConfigurationValidator.cs` — timeout floor warning -- `docs/MxAccessBridge.md` — document the probe pattern and on-change semantics -- `docs/StatusDashboard.md` — add `RuntimeStatusInfo` field table and Probes line -- `docs/Configuration.md` — add the two new MxAccess fields - -### New -- `src/ZB.MOM.WW.LmxOpcUa.Host/Domain/GalaxyRuntimeStatus.cs` -- `src/ZB.MOM.WW.LmxOpcUa.Host/Domain/GalaxyRuntimeState.cs` -- `src/ZB.MOM.WW.LmxOpcUa.Host/MxAccess/GalaxyRuntimeProbeManager.cs` -- `tests/ZB.MOM.WW.LmxOpcUa.Tests/MxAccess/GalaxyRuntimeProbeManagerTests.cs` - -## Execution order - -1. **DTO + enum** — `GalaxyRuntimeState`, `GalaxyRuntimeStatus`. -2. **Hierarchy schema** — add `CategoryId` to `GalaxyObjectInfo`, extend `HierarchySql` to select `td.category_id` as a new column, update `GalaxyRepositoryService` reader. -3. **Config** — add the two new `MxAccessConfiguration` fields and validator rule. -4. **Probe manager class + unit tests (TDD)** — write `GalaxyRuntimeProbeManagerTests.cs` first. Fake `IMxAccessClient` with scripted `OnTagValueChanged` invocations, configurable `State`, and a fake clock. Exercise the full matrix in the test plan below. -5. **Ship tests green before touching node manager.** -6. **Host-to-variables mapping in node manager** — add `_hostedVariables: Dictionary>` populated during `BuildAddressSpace`. For each variable node, walk its owning object's `HostGobjectId` chain up to the nearest `$WinPlatform` or `$AppEngine` and append to that host's list. On rebuild (`BuildSubtree`), incrementally maintain the map. Expose `MarkHostVariablesBadQuality(int gobjectId)` and `ClearHostVariablesBadQuality(int gobjectId)` public methods that take the node manager `Lock`, iterate the hosted list, set/clear `StatusCode`, and call `ClearChangeMasks(ctx, false)` per variable. -7. **Node manager wiring** — construct `GalaxyRuntimeProbeManager`, pass `MarkHostVariablesBadQuality` / `ClearHostVariablesBadQuality` as its `onHostStopped` / `onHostRunning` callbacks, call `Sync` after `BuildAddressSpace` / rebuild, route `OnTagValueChanged` through `HandleProbeUpdate`, hook `Tick()` into the MxAccess connection-monitor callback path (fall back to timed `WaitOne(500ms)` on the dispatch loop if the monitor isn't reachable from the node manager). Add `RuntimeStatuses` and `ActiveProbeSubscriptionCount` accessors. Call `_probeManager?.Dispose()` from `LmxNodeManager.Dispose` **before** the existing MxAccess client teardown steps. -8. **OPC UA synthetic nodes** — under each `$WinPlatform` and `$AppEngine` node in BuildAddressSpace, add the six `$`-prefixed variables backed by lambdas that read from the probe manager snapshot. -9. **Dashboard** — `RuntimeStatusInfo` on `StatusData`, `BuildRuntimeStatusInfo` in `StatusReportService`, render Runtime Status panel, add Probes line to Subscriptions panel. Status tests asserting both. -10. **Health check** — new Rule 2e with test: Degraded when any host is stopped, message names the stopped hosts. -11. **Integration tests** — `LmxNodeManagerBuildTests` additions with a fake repository containing mixed `$WinPlatform` and `$AppEngine` hierarchy entries; verify `Sync` is called, synthetic nodes are created on both host types, `_hostedVariables` map is populated, and `MarkHostVariablesBadQuality` / `ClearHostVariablesBadQuality` flip status codes on the correct subset. -12. **Docs** — `MxAccessBridge.md`, `StatusDashboard.md`, `Configuration.md`. -13. **Deploy** — backup, deploy both instances, verify via dashboard. -14. **Live verification** — see Verification section below. - -## Test plan - -### `GalaxyRuntimeProbeManagerTests.cs` — unit tests with fake client + fake clock - -**State transitions** -- Fresh manager → empty snapshot. -- `Sync` with one Platform + one Engine → snapshot contains two entries in `Unknown`, `Kind` set correctly. -- First `ScanState = true` update → Unknown → Running, `LastUpdateTime` and `LastScanState = true` set, `GoodUpdateCount == 1`. -- Second `ScanState = true` update → still Running, counter increments. -- `ScanState = false` update → Running → Stopped, `LastScanState = false`, `FailureCount == 1`. -- `ItemStatus[0].success = false, detail = 2` update → Running → Stopped, `LastError` contains `MX_E_PlatformCommunicationError`. -- Null value delivered → Running → Stopped defensively, `LastError` explains null-value rejection. -- Recovery `ScanState = true` after Stopped → Stopped → Running, `LastStateChangeTime` updated, `LastError` cleared. -- Platform and AppEngine transitions behave identically (parameterized test). - -**Unknown resolution timeout** -- No callback + clock advances past timeout → Unknown → Stopped. -- Good update just before timeout → Unknown → Running (no subsequent Stopped). -- Good update after timeout already flipped Unknown → Stopped → Stopped → Running (recovery path still works). -- `Tick` on a Running entry with no recent update → still Running (no starvation check — this is the critical on-change-semantic guarantee). - -**MxAccess transport gating** -- Client `State = Disconnected` → `GetSnapshot` returns all entries with `State = Unknown` regardless of underlying state. -- Client flips Connected → Disconnected → underlying state preserved internally; snapshot reports Unknown. -- Client flips Disconnected → Connected → snapshot reflects underlying state again. -- Incoming `HandleProbeUpdate` while client is Disconnected → still updates the underlying state machine (so the snapshot is correct when transport comes back). - -**Sync diff behavior** -- Sync with new Platform → Advise called once, counter = 1. -- Sync with new Engine → Advise called once, counter = 1. -- Sync twice with same hosts → Advise called once total (idempotent on unchanged entries). -- Sync then Sync with a Platform removed → Unadvise called, snapshot loses entry. -- Sync with different host set → Advise for new, Unadvise for old, unchanged preserved. -- Sync filters out non-runtime categories (areas, user objects) — hierarchy with 10 mixed categories and 2 runtime hosts produces exactly 2 probes. - -**Event routing** -- `HandleProbeUpdate(probeAddr, ...)` → returns `true`, updates state. -- `HandleProbeUpdate(nonProbeAddr, ...)` → returns `false`, no state change. -- Concurrent `Sync` + `HandleProbeUpdate` under lock → no corruption (thread-safety smoke test). -- Callback arriving after Sync removed the entry → `HandleProbeUpdate` returns false (entry not found), no crash. - -**Counters** -- `ActiveProbeCount == 2` after Sync with 1 Platform + 1 Engine. -- `ActiveProbeCount` decrements when a host is removed via Sync. -- `ActiveProbeCount == 0` on a fresh manager with no Sync called yet. - -**Dispose** -- Dispose on a fresh manager → no-op, no Unadvise calls on the fake client. -- Dispose after Sync with 3 hosts → 3 Unadvise + 3 RemoveItem calls on the fake client. -- Dispose twice → second call is idempotent, no extra Unadvise calls. -- HandleProbeUpdate after Dispose → returns false defensively (no crash, no state change). -- Sync after Dispose → no-op or throws ObjectDisposedException (pick one; test documents whichever is chosen). - -**Subtree invalidation callbacks** -- Construct probe manager with spy callbacks tracking `(gobjectId, kind)` tuples for each call. -- Running → Stopped transition → `onHostStopped` invoked exactly once with the correct GobjectId, `onHostRunning` never called. -- Stopped → Running transition → `onHostRunning` invoked exactly once with the correct GobjectId, `onHostStopped` never called. -- Unknown → Running (initial callback) → no invocation of either callback (only Running↔Stopped transitions trigger them, not fresh Unknown→Running). -- Unknown → Stopped (via timeout) → `onHostStopped` invoked once. -- Multiple consecutive callbacks with `ScanState=true` while already Running → no extra `onHostRunning` invocations. -- Multiple consecutive error callbacks while already Stopped → no extra `onHostStopped` invocations. -- Callback throws exception → probe manager logs a warning, updates its internal state regardless, does not propagate. - -### `LmxNodeManagerBuildTests` additions - -- Build address space with a `$WinPlatform` in the fake hierarchy → probe manager receives a `Sync` call with one entry. -- Build address space with a mix (1 Platform + 2 AppEngines + 5 user objects) → probe manager Sync receives exactly 3 runtime hosts. -- Build + rebuild with different host set → probe manager's `Sync` called twice with correct diff. -- Address space contains synthetic `$RuntimeState` variable under each host object node. -- `ActiveProbeSubscriptionCount` reflects probe count after build. - -### Host-to-variables mapping + subtree invalidation tests - -- Build address space with 1 `$AppEngine` hosting 2 user objects with 3 attributes each → `_hostedVariables[engineId]` contains 6 variable nodes. -- Build address space with 1 `$WinPlatform` hosting 2 `$AppEngine`s, each hosting 3 user objects with 2 attributes each → `_hostedVariables[platformId]` contains the 2 Engine nodes + 12 attribute variables; `_hostedVariables[engineId]` contains its 6 attribute variables. (Platform and Engine entries both exist; a single variable can appear in both lists.) -- Rebuild with a different set → the map is rebuilt from scratch; old entries are released. -- `MarkHostVariablesBadQuality(engineId)` → every variable in `_hostedVariables[engineId]` has `StatusCode = BadOutOfService` after the call; variables hosted by other engines are unchanged. -- `ClearHostVariablesBadQuality(engineId)` → every variable in that host's list has `StatusCode = Good` after the call. -- `MarkHostVariablesBadQuality` on a GobjectId with no entry in the map → no-op, no crash. -- `MarkHostVariablesBadQuality` followed by a fresh MxAccess update on one of the variables → the update's Value + Status overwrites the forced Bad (confirms no "override layer" confusion; the simple StatusCode set is naturally overwritten by the normal dispatch path). -- `MarkHostVariablesBadQuality` acquires the node manager `Lock` (verify no deadlock when called from a thread that also needs the lock). - -### End-to-end subtree invalidation integration test - -- Fake repository with 1 Engine hosting 10 attributes. All on advise. All have some recent value with Good status. -- Simulate probe callback delivering `ScanState = false` for the Engine → probe manager flips to Stopped, invokes `onHostStopped`, which in turn walks the 10 variables and flips them to BadOutOfService. -- Assert all 10 variables now report StatusCode = BadOutOfService after a `client.Read` round-trip. -- Simulate probe callback delivering `ScanState = true` again → probe manager flips to Running, `onHostRunning` clears the override, all 10 variables now report StatusCode = Good. - -### `StatusReportServiceTests` additions - -- HTML contains `

Galaxy Runtime

` when at least one runtime host is present. -- HTML rendering distinguishes `$WinPlatform` and `$AppEngine` rows in the Kind column. -- JSON exposes `RuntimeStatus.Total`, `RuntimeStatus.RunningCount`, `RuntimeStatus.StoppedCount`, `RuntimeStatus.Hosts[]`. -- Subscriptions panel HTML contains a `Probes:` line when `ProbeSubscriptionCount > 0`. -- No Runtime Status panel when the fake repository has zero runtime hosts. -- When fake MxAccess client is `Disconnected`, all host rows render `Unknown` regardless of state passed in. - -### `HealthCheckServiceTests` additions - -- All hosts running → Healthy. -- One host stopped → Degraded, message mentions the stopped host name. -- All hosts stopped → Degraded (not Unhealthy — cached values still served). -- MxAccess disconnected + one host stopped → Unhealthy via Rule 1 (runtime status rule doesn't fire). - -## Verification - -1. `dotnet build` clean on both Host and plugin. -2. `dotnet test tests/ZB.MOM.WW.LmxOpcUa.Tests --filter "FullyQualifiedName~GalaxyRuntimeProbe|FullyQualifiedName~Status|FullyQualifiedName~HealthCheck"` → all pass. -3. Deploy to instance1 (default `RuntimeStatusProbesEnabled: true`, `RuntimeStatusUnknownTimeoutSeconds: 15`). Dashboard shows `Galaxy Runtime: 2 of 2 hosts running` (DevPlatform + DevAppEngine) immediately after startup, all green. Subscriptions panel shows `Probes: 2`. -4. Stop `DevAppEngine` from the IDE (SMC `SetToOffScan` or the engine's stop action, leaving its parent Platform running). Verify: - - Dashboard panel turns red within ~1s of the action. - - DevAppEngine row shows `Stopped` with the last good timestamp. - - DevPlatform row remains `Running` — confirms the engines are independently observable. - - Overall Health rolls up to `Degraded`. - - CLI `read ns=3;s=DevAppEngine.$RuntimeState` returns `"Stopped"`. - - Log has an `Information` line "Galaxy runtime DevAppEngine ($AppEngine) transitioned Running → Stopped". - - **Subtree invalidation**: CLI `read ns=3;s=TestMachine_001.MachineID` and any other tag under an object hosted by DevAppEngine returns status code `BadOutOfService` (or whatever specific code the Mark method uses). Every descendant tag, not just a sample — sweep-test via a browse + read across the whole address space. Operators also observe this on the dashboard Alarms / subscribed-variable reads if they're watching any particular value. - - **Client-freeze observation**: subscribe an OPC UA client to a handful of variables under DevAppEngine before step 4, then trigger the stop. Note whether the client handles the resulting notification batch cleanly (ideal) or visibly stalls (residual problem that dispatch suppression would need to address in phase 2). Document the observed behavior in the phase-2 decision gate for dispatch suppression. -5. Start `DevAppEngine` again (`SetToOnScan`). Verify: - - Dashboard flips back to green within ~1s. - - CLI read of `$RuntimeState` returns `"Running"`. - - Log has a "Galaxy runtime DevAppEngine ($AppEngine) transitioned Stopped → Running" line. - - **Subtree recovery**: descendant tags previously showing `BadOutOfService` now show `Good` status. Values may initially be stale (whatever was cached at stop time) until fresh on-change MxAccess updates arrive; this matches the design trade-off documented in the Subtree Quality Invalidation section. -6. Stop `DevPlatform` entirely (full platform stop). Verify: - - Both DevPlatform and DevAppEngine flip to `Stopped` (the Platform takes the Engine down with it). - - Log records both transitions. - - CLI reads of `$RuntimeState` for both hosts return `"Stopped"`. - - The underlying raw `ScanState` attribute reads may return BadCommunicationError — operator sees the distinction between the cached rollup and the live raw attribute. -7. Simulate MxAccess transport loss — e.g., stop the ArchestrA runtime on the local node or kill the probe connection. Verify: - - Every host row in the Runtime Status panel renders `Unknown` (not Stopped) while the Connection panel reports `Disconnected`. - - Overall Health is `Unhealthy` via Rule 1, NOT `Degraded` via Rule 2e (the rules should not double-message). - - After MxAccess reconnects, the runtime rows revert to their actual underlying states. -8. Deploy to instance2 with same config. Both instances should show consistent state since they observe the same local ArchestrA runtime. -9. Smoke-test: disable probes via `RuntimeStatusProbesEnabled: false`, restart, verify Runtime Status panel absent from HTML, `Probes:` line absent from Subscriptions panel, no probe subscriptions advised (log and `ActiveSubscriptionCount` delta) — backward compatibility path for deployments that don't want the feature. - -10. **Unresolvable-probe-tag behavior verification** — temporarily add a bogus tag to the probe set to discover how MxAccess surfaces resolution failures. The simplest way is to force the probe manager to advise a made-up `NoSuchPlatform_999.ScanState` reference during a test boot, then observe: - - Does MxAccess deliver a data-change callback with `ItemStatus[0].success = false` and a resolution-failure detail? If yes, the host row transitions Unknown → Stopped within ~1s via the error-callback path, and `LastError` carries the detail. Tighten the plan's language to say "MxAccess surfaces resolution failures as error callbacks" and optionally tighten `RuntimeStatusUnknownTimeoutSeconds` downward. - - Or does MxAccess silently drop the advise with no callback at all? If yes, the bogus host stays Unknown until `RuntimeStatusUnknownTimeoutSeconds` elapses, then flips to Stopped via the Unknown-timeout backstop. Tighten the plan's language to say "MxAccess does not surface resolution failures; the Unknown-timeout is the only detection path" and leave the default timeout as-is. - - Document the observed behavior in `docs/MxAccessBridge.md` alongside the probe pattern section so operators know which detection path their deployment relies on. - - Remove the bogus tag and restart before handing over. - -## Open questions (phase 2/3 scope — not blocking phase 1) - -1. **Dispatch suppression for Stopped hosts** (phase 2 decision gate) — once phase 1 ships with subtree invalidation, observe whether the client-freeze symptom persists. If it does, design dispatch suppression: filter MxAccess per-tag updates before they hit the dispatch queue when the owning host is Stopped. Requires a `tagRef → owning-host GobjectId` map (which `_hostedVariables` already implies, inverted). Trade-off is dropping legitimate updates during brief probe/reality mismatch windows. Decide after real measurement. - -2. **Should the probe manager expose transition events?** Synthetic OPC UA event notifier on each host object that fires when `$RuntimeState` transitions. Phase 2 stretch — operators get per-host polling via the dashboard panel today; events would let clients subscribe without polling. - -3. **Multi-node Galaxies** — Platform on a remote node shows up in the hierarchy but probes fire through the local MxAccess runtime's node. The probe semantics should still work because MxAccess routes inter-Platform queries transparently, but worth confirming during step 4 if the environment has a multi-node Galaxy. - -4. **Is `ScanState` writable?** Some Galaxy system attributes are writable via MxAccess (SetScan method on the object) which would let an operator start/stop a host through the OPC UA bridge. Phase 3 possibility — would require a gating security classification since it's a runtime control action, not a data write. diff --git a/service_info.md b/service_info.md deleted file mode 100644 index 0ef58c5..0000000 --- a/service_info.md +++ /dev/null @@ -1,932 +0,0 @@ -# Service Update Summary - -Updated service instance: `C:\publish\lmxopcua\instance1` - -Update time: `2026-03-25 12:54-12:55 America/New_York` - -Backup created before deploy: `C:\publish\lmxopcua\backups\20260325-125444` - -Configuration preserved: -- `C:\publish\lmxopcua\instance1\appsettings.json` was not overwritten. - -Deployed binary: -- `C:\publish\lmxopcua\instance1\ZB.MOM.WW.LmxOpcUa.Host.exe` -- Last write time: `2026-03-25 12:53:58` -- Size: `143360` - -Windows service: -- Name: `LmxOpcUa` -- Display name: `LMX OPC UA Server` -- Account: `LocalSystem` -- Status after update: `Running` -- Process ID after restart: `29236` - -Restart evidence: -- Service log file: `C:\publish\lmxopcua\instance1\logs\lmxopcua-20260325_004.log` -- Last startup line: `2026-03-25 12:55:08.619 -04:00 [INF] The LmxOpcUa service was started.` - -## CLI Verification - -Endpoint from deployed config: -- `opc.tcp://localhost:4840/LmxOpcUa` - -CLI used: -- `C:\Users\dohertj2\Desktop\lmxopcua\tools\opcuacli-dotnet\bin\Debug\net10.0\opcuacli-dotnet.exe` - -Commands run: - -```powershell -opcuacli-dotnet.exe connect -u opc.tcp://localhost:4840/LmxOpcUa -opcuacli-dotnet.exe read -u opc.tcp://localhost:4840/LmxOpcUa -n 'ns=1;s=MESReceiver_001.MoveInPartNumbers' -opcuacli-dotnet.exe read -u opc.tcp://localhost:4840/LmxOpcUa -n 'ns=1;s=MESReceiver_001.MoveInPartNumbers[]' -``` - -Observed results: -- `connect`: succeeded, server reported as `LmxOpcUa`. -- `read ns=1;s=MESReceiver_001.MoveInPartNumbers`: succeeded with good status `0x00000000`. -- `read ns=1;s=MESReceiver_001.MoveInPartNumbers[]`: failed with `BadNodeIdUnknown` (`0x80340000`). - ---- - -## Instance 2 (Redundant Secondary) - -Deployed: `2026-03-28` - -Deployment path: `C:\publish\lmxopcua\instance2` - -Configuration: -- `OpcUa.Port`: `4841` -- `OpcUa.ServerName`: `LmxOpcUa2` -- `OpcUa.ApplicationUri`: `urn:localhost:LmxOpcUa:instance2` -- `Dashboard.Port`: `8082` -- `MxAccess.ClientName`: `LmxOpcUa2` -- `Redundancy.Enabled`: `true` -- `Redundancy.Mode`: `Warm` -- `Redundancy.Role`: `Secondary` -- `Redundancy.ServerUris`: `["urn:localhost:LmxOpcUa:instance1", "urn:localhost:LmxOpcUa:instance2"]` - -Windows service: -- Name: `LmxOpcUa2` -- Display name: `LMX OPC UA Server (Instance 2)` -- Account: `LocalSystem` -- Endpoint: `opc.tcp://localhost:4841/LmxOpcUa` - -Instance 1 redundancy update (same date): -- `OpcUa.ApplicationUri`: `urn:localhost:LmxOpcUa:instance1` -- `Redundancy.Enabled`: `true` -- `Redundancy.Mode`: `Warm` -- `Redundancy.Role`: `Primary` -- `Redundancy.ServerUris`: `["urn:localhost:LmxOpcUa:instance1", "urn:localhost:LmxOpcUa:instance2"]` - -CLI verification: -``` -opcuacli-dotnet.exe redundancy -u opc.tcp://localhost:4840/LmxOpcUa - → Redundancy Mode: Warm, Service Level: 200, Application URI: urn:localhost:LmxOpcUa:instance1 - -opcuacli-dotnet.exe redundancy -u opc.tcp://localhost:4841/LmxOpcUa - → Redundancy Mode: Warm, Service Level: 150, Application URI: urn:localhost:LmxOpcUa:instance2 -``` - -Both instances report the same `ServerUriArray` and expose the same Galaxy namespace (`urn:ZB:LmxOpcUa`). - -## LDAP Authentication Update - -Updated: `2026-03-28` - -Both instances updated to use LDAP authentication via GLAuth. - -Configuration changes (both instances): -- `Authentication.AllowAnonymous`: `true` (anonymous can browse/read) -- `Authentication.AnonymousCanWrite`: `false` (anonymous writes blocked) -- `Authentication.Ldap.Enabled`: `true` -- `Authentication.Ldap.Host`: `localhost` -- `Authentication.Ldap.Port`: `3893` -- `Authentication.Ldap.BaseDN`: `dc=lmxopcua,dc=local` - -LDAP server: GLAuth v2.4.0 at `C:\publish\glauth\` (Windows service: `GLAuth`) - -Permission verification (instance1, port 4840): -``` -anonymous read → allowed -anonymous write → denied (BadUserAccessDenied) -readonly read → allowed -readonly write → denied (BadUserAccessDenied) -readwrite write → allowed -admin write → allowed -alarmack write → denied (BadUserAccessDenied) -bad password → denied (connection rejected) -``` - -## Alarm Notifier Chain Update - -Updated: `2026-03-28` - -Both instances updated with alarm event propagation up the notifier chain. - -Code changes: -- Alarm events now walk up the parent chain (`ReportEventUpNotifierChain`), reporting to every ancestor node -- `EventNotifier = SubscribeToEvents` is set on all ancestors of alarm-containing nodes (`EnableEventNotifierUpChain`) -- Removed separate `Server.ReportEvent` call (no longer needed — the walk reaches the root) - -No configuration changes required — alarm tracking was already enabled (`AlarmTrackingEnabled: true`). - -Verification (instance1, port 4840): -``` -alarms --node TestArea --refresh: - TestMachine_001.TestAlarm001 → visible (Severity=500, Retain=True) - TestMachine_001.TestAlarm002 → visible (Severity=500, Retain=True) - TestMachine_001.TestAlarm003 → visible (Severity=500, Retain=True) - TestMachine_002.TestAlarm001 → visible (Severity=500, Retain=True) - TestMachine_002.TestAlarm003 → visible (Severity=500, Retain=True) - -alarms --node DEV --refresh: - Same 5 alarms visible at DEV (grandparent) level -``` - -## Auth Consolidation Update - -Updated: `2026-03-28` - -Both instances updated to consolidate LDAP roles into OPC UA session roles (`RoleBasedIdentity.GrantedRoleIds`). - -Code changes: -- LDAP groups now map to custom OPC UA role NodeIds in `urn:zbmom:lmxopcua:roles` namespace -- Roles stored on session identity via `GrantedRoleIds` — no username-to-role side cache -- Permission checks use `GrantedRoleIds.Contains()` instead of username extraction -- `AnonymousCanWrite` behavior is consistent regardless of LDAP state -- Galaxy namespace moved from `ns=2` to `ns=3` (roles namespace is `ns=2`) - -No configuration changes required. - -Verification (instance1, port 4840): -``` -anonymous read → allowed -anonymous write → denied (BadUserAccessDenied, AnonymousCanWrite=false) -readonly write → denied (BadUserAccessDenied) -readwrite write → allowed -admin write → allowed -alarmack write → denied (BadUserAccessDenied) -bad password → rejected (connection failed) -``` - -## Granular Write Roles Update - -Updated: `2026-03-28` - -Both instances updated with granular write roles replacing the single ReadWrite role. - -Code changes: -- `ReadWrite` role replaced by `WriteOperate`, `WriteTune`, `WriteConfigure` -- Write permission checks now consider the Galaxy security classification of the target attribute -- `SecurityClassification` stored in `TagMetadata` for per-node lookup at write time - -GLAuth changes: -- New groups: `WriteOperate` (5502), `WriteTune` (5504), `WriteConfigure` (5505) -- New users: `writeop`, `writetune`, `writeconfig` -- `admin` user added to all groups (5502, 5503, 5504, 5505) - -Config changes (both instances): -- `Authentication.Ldap.ReadWriteGroup` replaced by `WriteOperateGroup`, `WriteTuneGroup`, `WriteConfigureGroup` - -Verification (instance1, port 4840, Operate-classified attributes): -``` -anonymous read → allowed -anonymous write → denied (AnonymousCanWrite=false) -readonly write → denied (no write role) -writeop write → allowed (WriteOperate matches Operate classification) -writetune write → denied (WriteTune doesn't match Operate) -writeconfig write → denied (WriteConfigure doesn't match Operate) -admin write → allowed (has all write roles) -``` - -## Historian SDK Migration - -Updated: `2026-04-06` - -Both instances updated to use the Wonderware Historian SDK (`aahClientManaged.dll`) instead of direct SQL queries for historical data access. - -Code changes: -- `HistorianDataSource` rewritten from `SqlConnection`/`SqlDataReader` to `ArchestrA.HistorianAccess` SDK -- Persistent connection with lazy connect and auto-reconnect on failure -- `HistorianConfiguration.ConnectionString` replaced with `ServerName`, `IntegratedSecurity`, `UserName`, `Password`, `Port` -- `HistorianDataSource` now implements `IDisposable`, disposed on service shutdown -- `ConfigurationValidator` validates Historian SDK settings at startup - -SDK DLLs deployed to both instances: -- `aahClientManaged.dll` (primary SDK, v2.0.0.0) -- `aahClient.dll`, `aahClientCommon.dll` (dependencies) -- `Historian.CBE.dll`, `Historian.DPAPI.dll`, `ArchestrA.CloudHistorian.Contract.dll` - -Configuration changes (both instances): -- `Historian.ConnectionString` removed -- `Historian.ServerName`: `"localhost"` -- `Historian.IntegratedSecurity`: `true` -- `Historian.Port`: `32568` -- `Historian.Enabled`: `true` (unchanged) - -Verification (instance1 startup log): -``` -Historian.Enabled=true, ServerName=localhost, IntegratedSecurity=true, Port=32568 -Historian.CommandTimeoutSeconds=30, MaxValuesPerRead=10000 -=== Configuration Valid === -LmxOpcUa service started successfully -``` - -## HistoryServerCapabilities and Continuation Points - -Updated: `2026-04-06` - -Both instances updated with OPC UA Part 11 spec compliance improvements. - -Code changes: -- `HistoryServerCapabilities` node populated under `ServerCapabilities` with all boolean capability properties -- `AggregateFunctions` folder populated with references to 7 supported aggregate functions -- `HistoryContinuationPointManager` added — stores remaining data when results exceed `NumValuesPerNode` -- `HistoryReadRawModified` and `HistoryReadProcessed` now return `ContinuationPoint` in `HistoryReadResult` for partial reads -- Follow-up requests with `ContinuationPoint` resume from stored state; invalid/expired points return `BadContinuationPointInvalid` - -No configuration changes required. - -Verification (instance1 startup log): -``` -HistoryServerCapabilities configured with 7 aggregate functions -LmxOpcUa service started successfully -``` - -## Remaining Historian Gaps Fix - -Updated: `2026-04-06` - -Both instances updated with remaining OPC UA Part 11 spec compliance fixes. - -Code changes: -- **Gap 4**: `HistoryReadRawModified` returns `BadHistoryOperationUnsupported` when `IsReadModified=true` -- **Gap 5**: `HistoryReadAtTime` override added with `ReadAtTimeAsync` using SDK `HistorianRetrievalMode.Interpolated` -- **Gap 8**: `HistoricalDataConfigurationState` child nodes added to historized variables (`Stepped=false`, `Definition="Wonderware Historian"`) -- **Gap 10**: `ReturnBounds` parameter handled — boundary `DataValue` entries with `BadBoundNotFound` inserted at StartTime/EndTime -- **Gap 11**: `StandardDeviation` aggregate added to client enum, mapper, CLI (aliases: `stddev`/`stdev`), and UI dropdown - -No configuration changes required. - -## Historical Event Access - -Updated: `2026-04-06` - -Both instances updated with OPC UA historical event access (Gap 7). - -Code changes: -- `HistorianDataSource.ReadEventsAsync` queries Historian event store via separate `HistorianConnectionType.Event` connection -- `LmxNodeManager.HistoryReadEvents` override maps `HistorianEvent` records to OPC UA `HistoryEventFieldList` entries -- `AccessHistoryEventsCapability` set to `true` when `AlarmTrackingEnabled` is true -- Event fields: EventId, EventType, SourceNode, SourceName, Time, ReceiveTime, Message, Severity - -No configuration changes required. All historian gaps (1-11) are now resolved. - -## Data Access Gaps Fix - -Updated: `2026-04-06` - -Both instances updated with OPC UA DA spec compliance fixes. - -Code changes: -- `ConfigureServerCapabilities()` populates `ServerCapabilities` node: `ServerProfileArray`, `LocaleIdArray`, `MinSupportedSampleRate`, continuation point limits, array/string limits, and 12 `OperationLimits` values -- `Server_ServerDiagnostics_EnabledFlag` set to `true` — SDK auto-tracks session/subscription counts -- `OnModifyMonitoredItemsComplete` override logs monitored item modifications - -No configuration changes required. All DA gaps (1-8) resolved. - -## Alarms & Conditions Gaps Fix - -Updated: `2026-04-06` - -Both instances updated with OPC UA Part 9 alarm spec compliance fixes. - -Code changes: -- Wired `OnConfirm`, `OnAddComment`, `OnEnableDisable`, `OnShelve`, `OnTimedUnshelve` handlers on each `AlarmConditionState` -- Shelving: `SetShelvingState()` manages `TimedShelve`, `OneShotShelve`, `Unshelve` state machine -- `ReportAlarmEvent` now populates `LocalTime` (timezone offset + DST) and `Quality` event fields -- Flaky `Monitor_ProbeDataChange_PreventsStaleReconnect` test fixed (increased stale threshold from 2s to 5s) - -No configuration changes required. All A&C gaps (1-10) resolved. - -## Security Gaps Fix - -Updated: `2026-04-06` - -Both instances updated with OPC UA Part 2/4/7 security spec compliance fixes. - -Code changes: -- `SecurityProfileResolver`: Added 4 modern AES profiles (`Aes128_Sha256_RsaOaep-Sign/SignAndEncrypt`, `Aes256_Sha256_RsaPss-Sign/SignAndEncrypt`) -- `OnImpersonateUser`: Added `X509IdentityToken` handling with CN extraction and role assignment -- `BuildUserTokenPolicies`: Advertises `UserTokenType.Certificate` when non-None security profiles are configured -- `OnCertificateValidation`: Enhanced logging with certificate thumbprint, subject, and expiry -- Authentication audit logging: `AUDIT:` prefixed log entries for success/failure with session ID and roles - -No configuration changes required. All security gaps (1-10) resolved. - -## Historian Plugin Runtime Load + Dashboard Health - -Updated: `2026-04-12 18:47-18:49 America/New_York` - -Both instances updated to the latest build. Brings in the runtime-loaded Historian plugin (`Historian/` subfolder next to the Host) and the status dashboard health surface for historian plugin + alarm-tracking misconfiguration. - -Backups created before deploy: -- `C:\publish\lmxopcua\backups\20260412-184713-instance1` -- `C:\publish\lmxopcua\backups\20260412-184713-instance2` - -Configuration preserved: -- `C:\publish\lmxopcua\instance1\appsettings.json` was not overwritten. -- `C:\publish\lmxopcua\instance2\appsettings.json` was not overwritten. - -Layout change: -- Flat historian interop DLLs removed from each instance root (`aahClient*.dll`, `ArchestrA.CloudHistorian.Contract.dll`, `Historian.CBE.dll`, `Historian.DPAPI.dll`). -- Historian plugin + interop DLLs now live under `\Historian\` (including `ZB.MOM.WW.LmxOpcUa.Historian.Aveva.dll`), loaded by `HistorianPluginLoader`. - -Deployed binary (both instances): -- `ZB.MOM.WW.LmxOpcUa.Host.exe` -- Last write time: `2026-04-12 18:46:22 -04:00` -- Size: `7938048` - -Windows services: -- `LmxOpcUa` — Running, PID `40176` -- `LmxOpcUa2` — Running, PID `34400` - -Restart evidence (instance1 `logs/lmxopcua-20260412.log`): -``` -2026-04-12 18:48:02.968 -04:00 [INF] Historian.Enabled=true, ServerName=localhost, IntegratedSecurity=true, Port=32568 -2026-04-12 18:48:02.971 -04:00 [INF] === Configuration Valid === -2026-04-12 18:48:09.658 -04:00 [INF] Historian plugin loaded from C:\publish\lmxopcua\instance1\Historian\ZB.MOM.WW.LmxOpcUa.Historian.Aveva.dll -2026-04-12 18:48:13.691 -04:00 [INF] LmxOpcUa service started successfully -``` - -Restart evidence (instance2 `logs/lmxopcua-20260412.log`): -``` -2026-04-12 18:49:08.152 -04:00 [INF] Historian.Enabled=true, ServerName=localhost, IntegratedSecurity=true, Port=32568 -2026-04-12 18:49:08.155 -04:00 [INF] === Configuration Valid === -2026-04-12 18:49:14.744 -04:00 [INF] Historian plugin loaded from C:\publish\lmxopcua\instance2\Historian\ZB.MOM.WW.LmxOpcUa.Historian.Aveva.dll -2026-04-12 18:49:18.777 -04:00 [INF] LmxOpcUa service started successfully -``` - -CLI verification (via `dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Client.CLI`): -``` -connect opc.tcp://localhost:4840/LmxOpcUa → Server: LmxOpcUa -connect opc.tcp://localhost:4841/LmxOpcUa → Server: LmxOpcUa2 -redundancy opc.tcp://localhost:4840/LmxOpcUa → Warm, ServiceLevel=200, urn:localhost:LmxOpcUa:instance1 -redundancy opc.tcp://localhost:4841/LmxOpcUa → Warm, ServiceLevel=150, urn:localhost:LmxOpcUa:instance2 -``` - -Both instances report the same `ServerUriArray` and the primary advertises the higher ServiceLevel, matching the prior redundancy baseline. - -## Endpoints Panel on Dashboard - -Updated: `2026-04-13 08:46-08:50 America/New_York` - -Both instances updated with a new `Endpoints` panel on the status dashboard surfacing the opc.tcp base addresses, active OPC UA security profiles (mode + policy name + full URI), and user token policies. - -Code changes: -- `StatusData.cs` — added `EndpointsInfo` / `SecurityProfileInfo` DTOs on `StatusData`. -- `OpcUaServerHost.cs` — added `BaseAddresses`, `SecurityPolicies`, `UserTokenPolicies` runtime accessors reading `ApplicationConfiguration.ServerConfiguration` live state. -- `StatusReportService.cs` — builds `EndpointsInfo` from the host and renders a new panel with a graceful empty state when the server is not started. - -No configuration changes required. - -Verification (instance1 @ `http://localhost:8085/`): -``` -Base Addresses: opc.tcp://localhost:4840/LmxOpcUa -Security Profiles: None / None / http://opcfoundation.org/UA/SecurityPolicy#None -User Token Policies: Anonymous, UserName -``` - -Verification (instance2 @ `http://localhost:8086/`): -``` -Base Addresses: opc.tcp://localhost:4841/LmxOpcUa -Security Profiles: None / None / http://opcfoundation.org/UA/SecurityPolicy#None -User Token Policies: Anonymous, UserName -``` - -## Template-Based Alarm Object Filter - -Updated: `2026-04-13 09:39-09:43 America/New_York` - -Both instances updated with a new configurable alarm object filter. When `OpcUa.AlarmFilter.ObjectFilters` is non-empty, only Galaxy objects whose template derivation chain matches a pattern (and their containment-tree descendants) contribute `AlarmConditionState` nodes. When the list is empty, the current unfiltered behavior is preserved (backward-compatible default). - -Backups created before deploy: -- `C:\publish\lmxopcua\backups\20260413-093900-instance1` -- `C:\publish\lmxopcua\backups\20260413-093900-instance2` - -Deployed binary (both instances): -- `ZB.MOM.WW.LmxOpcUa.Host.exe` -- Last write time: `2026-04-13 09:38:46 -04:00` -- Size: `7951360` - -Windows services: -- `LmxOpcUa` — Running, PID `40900` -- `LmxOpcUa2` — Running, PID `29936` - -Code changes: -- `gr/queries/hierarchy.sql` — added recursive CTE on `gobject.derived_from_gobject_id` and a new `template_chain` column (pipe-delimited, innermost template first). -- `Domain/GalaxyObjectInfo.cs` — added `TemplateChain: List` populated from the new SQL column. -- `GalaxyRepositoryService.cs` — reads the new column and splits into `TemplateChain`. -- `Configuration/AlarmFilterConfiguration.cs` (new) — `List ObjectFilters`; entries may themselves be comma-separated. Attached to `OpcUaConfiguration.AlarmFilter`. -- `Configuration/ConfigurationValidator.cs` — logs the effective filter and warns if patterns are configured while `AlarmTrackingEnabled == false`. -- `Domain/AlarmObjectFilter.cs` (new) — compiles wildcard patterns (`*` only) to case-insensitive regexes with Galaxy `$` prefix normalized on both sides; walks the hierarchy top-down with cycle defense; returns a `HashSet` of included gobject IDs plus `UnmatchedPatterns` for startup warnings. -- `OpcUa/LmxNodeManager.cs` — constructor accepts the filter; the two alarm-creation loops (`BuildAddressSpace` full build and the subtree rebuild path) both call `ResolveAlarmFilterIncludedIds(sorted)` and skip any object not in the resolved set. New public properties expose filter state to the dashboard: `AlarmFilterEnabled`, `AlarmFilterPatternCount`, `AlarmFilterIncludedObjectCount`. -- `OpcUa/OpcUaServerHost.cs`, `OpcUa/LmxOpcUaServer.cs`, `OpcUaService.cs`, `OpcUaServiceBuilder.cs` — plumbing to construct and thread the filter from `appsettings.json` down to the node manager. -- `Status/StatusData.cs` + `Status/StatusReportService.cs` — `AlarmStatusInfo` gains `FilterEnabled`, `FilterPatternCount`, `FilterIncludedObjectCount`; a filter summary line renders in the Alarms panel when the filter is active. - -Tests: -- 36 new unit tests in `tests/.../Domain/AlarmObjectFilterTests.cs` covering pattern parsing, wildcard semantics, regex escaping, Galaxy `$` normalization, template-chain matching, subtree propagation, set semantics, orphan/cycle defense, and `UnmatchedPatterns` tracking. -- 5 new integration tests in `tests/.../Integration/AlarmObjectFilterIntegrationTests.cs` spinning up a real `LmxNodeManager` via `OpcUaServerFixture` and asserting `AlarmConditionCount`/`AlarmFilterIncludedObjectCount` under various filters. -- 1 new Status test verifying JSON exposes the filter counters. -- Full suite: **446/446 tests passing** (no regressions). - -Configuration change: both instances have `OpcUa.AlarmFilter.ObjectFilters: []` (filter disabled, unfiltered alarm tracking preserved). - -Live verification against instance1 Galaxy (filter temporarily set to `"TestMachine"`): -``` -2026-04-13 09:41:31 [INF] OpcUa.AlarmTrackingEnabled=true, AlarmFilter.ObjectFilters=[TestMachine] -2026-04-13 09:41:42 [INF] Alarm filter: 42 of 49 objects included (1 pattern(s)) -Dashboard Alarms panel: Tracking: True | Conditions: 60 | Active: 4 - Filter: 1 pattern(s), 42 object(s) included -``` - -Final configuration restored to empty filter. Dashboard confirms unfiltered behavior on both endpoints: -``` -instance1 @ http://localhost:8085/ → Conditions: 60 | Active: 4 (no filter line) -instance2 @ http://localhost:8086/ → Conditions: 60 | Active: 4 (no filter line) -``` - -Filter syntax quick reference (documented in `AlarmFilterConfiguration.cs` XML-doc): -- `*` is the only wildcard (glob-style; zero or more characters). -- Matching is case-insensitive and ignores the Galaxy leading `$` template prefix on both the pattern and the stored chain entry, so operators write `TestMachine*` not `$TestMachine*`. -- Each entry may contain comma-separated patterns for convenience (e.g., `"TestMachine*, Pump_*"`). -- Empty list → filter disabled → current unfiltered behavior. -- Match semantics: an object is included when any template in its derivation chain matches any pattern, and the inclusion propagates to all descendants in the containment hierarchy. Each object is evaluated once regardless of how many patterns or ancestors match. - -## Historian Runtime Health Surface - -Updated: `2026-04-13 10:44-10:52 America/New_York` - -Both instances updated with runtime historian query instrumentation so the status dashboard can detect silent query degradation that the load-time `PluginStatus` cannot catch. - -Backups: -- `C:\publish\lmxopcua\backups\20260413-104406-instance1` -- `C:\publish\lmxopcua\backups\20260413-104406-instance2` - -Code changes: -- `Host/Historian/HistorianHealthSnapshot.cs` (new) — DTO with `TotalQueries`, `TotalSuccesses`, `TotalFailures`, `ConsecutiveFailures`, `LastSuccessTime`, `LastFailureTime`, `LastError`, `ProcessConnectionOpen`, `EventConnectionOpen`. -- `Host/Historian/IHistorianDataSource.cs` — added `GetHealthSnapshot()` interface method. -- `Historian.Aveva/HistorianDataSource.cs` — added `_healthLock`-guarded counters, `RecordSuccess()` / `RecordFailure(path)` helpers called at every terminal site in all four read methods (raw, aggregate, at-time, events). Error messages carry a `raw:` / `aggregate:` / `at-time:` / `events:` prefix so operators can tell which SDK call is broken. -- `Host/OpcUa/LmxNodeManager.cs` — exposes `HistorianHealth` property that proxies to `IHistorianDataSource.GetHealthSnapshot()`. -- `Host/Status/StatusData.cs` — added 9 new fields on `HistorianStatusInfo`. -- `Host/Status/StatusReportService.cs` — `BuildHistorianStatusInfo()` populates the new fields from the node manager; panel color gradient: green → yellow (1-4 consecutive failures) → red (≥5 consecutive or plugin unloaded). Renders `Queries: N (Success: X, Failure: Y) | Consecutive Failures: Z`, `Process Conn: open/closed | Event Conn: open/closed`, plus `Last Success:` / `Last Failure:` / `Last Error:` lines when applicable. -- `Host/Status/HealthCheckService.cs` — new Rule 2b2: `Degraded` when `ConsecutiveFailures >= 3`. Threshold chosen to avoid flagging single transient blips. - -Tests: -- 5 new unit tests in `HistorianDataSourceLifecycleTests` covering fresh zero-state, single failure, multi-failure consecutive increment, cross-read-path counting, and error-message-carries-path. -- Full suite: 16/16 plugin tests, 447/447 host tests passing. - -Live verification on instance1: -``` -Before any query: - Queries: 0 (Success: 0, Failure: 0) | Process Conn: closed | Event Conn: closed -After TestMachine_001.TestHistoryValue raw read: - Queries: 1 (Success: 1, Failure: 0) | Process Conn: open - Last Success: 2026-04-13T14:45:18Z -After aggregate hourly-average over 24h: - Queries: 2 (Success: 2, Failure: 0) -After historyread against an unknown node id (bad tag): - Queries: 2 (counter unchanged — rejected at node-lookup before reaching the plugin; correct) -``` - -JSON endpoint `/api/status` carries all 9 new fields with correct types. Both instances deployed; instance1 `LmxOpcUa` PID 33824, instance2 `LmxOpcUa2` PID 30200. - -## Historian Read-Only Cluster Support - -Updated: `2026-04-13 11:25-12:00 America/New_York` - -Both instances updated with Wonderware Historian read-only cluster failover. Operators can supply an ordered list of historian cluster nodes; the plugin iterates them on each fresh connect and benches failed nodes for a configurable cooldown window. Single-node deployments are preserved via the existing `ServerName` field. - -Backups: -- `C:\publish\lmxopcua\backups\20260413-112519-instance1` -- `C:\publish\lmxopcua\backups\20260413-112519-instance2` - -Code changes: -- `Host/Configuration/HistorianConfiguration.cs` — added `ServerNames: List` (defaults to `[]`) and `FailureCooldownSeconds: int` (defaults to 60). `ServerName` preserved as fallback when `ServerNames` is empty. -- `Host/Historian/HistorianClusterNodeState.cs` (new) — per-node DTO: `Name`, `IsHealthy`, `CooldownUntil`, `FailureCount`, `LastError`, `LastFailureTime`. -- `Host/Historian/HistorianHealthSnapshot.cs` — extended with `ActiveProcessNode`, `ActiveEventNode`, `NodeCount`, `HealthyNodeCount`, `Nodes: List`. -- `Historian.Aveva/HistorianClusterEndpointPicker.cs` (new, internal) — pure picker with injected clock, thread-safe via lock, BFS-style `GetHealthyNodes()` / `MarkFailed()` / `MarkHealthy()` / `SnapshotNodeStates()`. Nodes iterate in configuration order; failed nodes skip until cooldown elapses; the cumulative `FailureCount` and `LastError` are retained across recovery for operator diagnostics. -- `Historian.Aveva/HistorianDataSource.cs` — new `ConnectToAnyHealthyNode(type)` method iterates picker candidates, clones `HistorianConfiguration` per attempt with the candidate as `ServerName`, and returns the first successful `(Connection, Node)` tuple. `EnsureConnected` and `EnsureEventConnected` both call it. `HandleConnectionError` and `HandleEventConnectionError` now mark the active node failed in the picker before nulling. `_activeProcessNode` / `_activeEventNode` track the live node for the dashboard. Both silos (process + event) share a single picker instance so a node failure on one immediately benches it for the other. -- `Host/Status/StatusData.cs` — added `NodeCount`, `HealthyNodeCount`, `ActiveProcessNode`, `ActiveEventNode`, `Nodes` to `HistorianStatusInfo`. -- `Host/Status/StatusReportService.cs` — Historian panel renders `Process Conn: open ()` badges and a cluster table (when `NodeCount > 1`) showing each node's state, cooldown expiry, failure count, and last error. Single-node deployments render a compact `Node: ` line. -- `Host/Status/HealthCheckService.cs` — new Rule 2b3: `Degraded` when `NodeCount > 1 && HealthyNodeCount < NodeCount`. Lets operators alert on a partially-failed cluster even while queries are still succeeding via the remaining nodes. -- `Host/Configuration/ConfigurationValidator.cs` — logs the effective node list and `FailureCooldownSeconds` at startup, validates that `FailureCooldownSeconds >= 0`, warns when `ServerName` is set alongside a non-empty `ServerNames`. - -Tests: -- `HistorianClusterEndpointPickerTests.cs` — 19 unit tests covering config parsing, ordered iteration, cooldown expiry, zero-cooldown mode, mark-healthy clears, cumulative failure counting, unknown-node safety, concurrent writers (thread-safety smoke test). -- `HistorianClusterFailoverTests.cs` — 6 integration tests driving `HistorianDataSource` via a scripted `FakeHistorianConnectionFactory`: first-node-fails-picks-second, all-nodes-fail, second-call-skips-cooled-down-node, single-node-legacy-behavior, picker-order-respected, shared-picker-across-silos. -- Full plugin suite: 41/41 tests passing. Host suite: 446/447 (1 pre-existing flaky MxAccess monitor test passes on retry). - -Live verification on instance1 (cluster = `["does-not-exist-historian.invalid", "localhost"]`, `FailureCooldownSeconds=30`): - -**Failover cycle 1** (fresh picker state, both nodes healthy): -``` -2026-04-13 11:27:25.381 [WRN] Historian node does-not-exist-historian.invalid failed during connect attempt; trying next candidate -2026-04-13 11:27:25.910 [INF] Historian SDK connection opened to localhost:32568 -``` -- historyread returned 1 value successfully (`Queries: 1 (Success: 1, Failure: 0)`). -- Dashboard: panel yellow, `Cluster: 1 of 2 nodes healthy`, bad node `cooldown` until `11:27:55Z`, `Process Conn: open (localhost)`. - -**Cooldown expiry**: -- At 11:29 UTC, the cooldown window had elapsed. Panel back to green, both nodes healthy, but `does-not-exist-historian.invalid` retains `FailureCount=1` and `LastError` as history. - -**Failover cycle 2** (service restart to drop persistent connection): -``` -2026-04-13 14:00:39.352 [WRN] Historian node does-not-exist-historian.invalid failed during connect attempt; trying next candidate -2026-04-13 14:00:39.885 [INF] Historian SDK connection opened to localhost:32568 -``` -- historyread returned 1 value successfully on the second restart cycle — proves the picker re-admits a cooled-down node and the whole failover cycle repeats cleanly. - -**Single-node restoration**: -- Changed instance1 back to `"ServerNames": []`, restarted. Dashboard renders `Node: localhost` (no cluster table), panel green, backward compat verified. - -Final configuration: both instances running with empty `ServerNames` (single-node mode). `LmxOpcUa` PID 31064, `LmxOpcUa2` PID 15012. - -Operator configuration shape: -```json -"Historian": { - "Enabled": true, - "ServerName": "localhost", // ignored when ServerNames is non-empty - "ServerNames": ["historian-a", "historian-b"], - "FailureCooldownSeconds": 60, - ... -} -``` - -## Galaxy Runtime Status Probes + Subtree Quality Invalidation - -Updated: `2026-04-13 15:28-16:19 America/New_York` - -Both instances updated with per-host Galaxy runtime status tracking ($WinPlatform + $AppEngine), proactive subtree quality invalidation when a host transitions to Stopped, and an OPC UA Read short-circuit so operators can no longer read stale-Good cached values from a dead runtime host. - -This ships the feature described in the `runtimestatus.md` plan file. Addresses the production issue reported earlier: "when an AppEngine is set to scan off, LMX updates are received for every tag, causing OPC UA client freeze and sometimes not all OPC UA tags are set to bad quality." - -Backups: -- `C:\publish\lmxopcua\backups\20260413-152824-instance1` -- `C:\publish\lmxopcua\backups\20260413-152824-instance2` - -Deployed binary (both instances): -- `ZB.MOM.WW.LmxOpcUa.Host.exe` — commit `98ed6bd` -- Two incremental deploys during verification: 15:28 (initial), 15:52 (Read-handler patch), 16:06 (dispatch-thread deadlock fix) - -Windows services: -- `LmxOpcUa` — Running, PID `29528` -- `LmxOpcUa2` — Running, PID `30684` - -### Code changes — what shipped - -**New config** — `MxAccessConfiguration`: -- `RuntimeStatusProbesEnabled: bool` (default `true`) — enables `.ScanState` probing for every deployed `$WinPlatform` and `$AppEngine`. -- `RuntimeStatusUnknownTimeoutSeconds: int` (default `15`) — only applies to the Unknown → Stopped transition; running hosts never time out because `ScanState` is delivered on-change only. - -**New hierarchy columns** — `hierarchy.sql` and `GalaxyObjectInfo`: -- `CategoryId: int` — populated from `template_definition.category_id` (1 = $WinPlatform, 3 = $AppEngine). -- `HostedByGobjectId: int` — populated from `gobject.hosted_by_gobject_id` (the actual column name on this Galaxy schema; the plan document's guess of `host_gobject_id` was wrong). Walked up to find each variable's nearest Platform/Engine ancestor. - -**New domain types** — `Host/Domain/`: -- `GalaxyRuntimeState` enum (`Unknown` / `Running` / `Stopped`). -- `GalaxyRuntimeStatus` DTO with callback/state-change timestamps, `LastScanState`, `LastError`, cumulative counters. - -**New probe manager** — `Host/MxAccess/GalaxyRuntimeProbeManager.cs`: -- Pure manager, no SDK leakage. `AdviseSupervisory`s `.ScanState` for every runtime host on `SyncAsync`. -- State predicate: `isRunning = vtq.Quality.IsGood() && vtq.Value is bool b && b`. Everything else is Stopped. -- `GetSnapshot()` forces every entry to `Unknown` when the MxAccess transport is disconnected — prevents misleading "every host stopped" display when the actual problem is the transport. -- `Tick()` only advances Unknown → Stopped on the configured timeout; Running hosts never time out (on-change delivery semantic). -- `IsHostStopped(gobjectId)` — used by the Read-path short-circuit; uses underlying state directly (not the snapshot force-unknown rewrite) so a transport outage doesn't double-flag reads. -- `Dispose()` unadvises every active probe before MxAccess teardown. - -**New hosted-variables map** — `LmxNodeManager`: -- `_hostedVariables: Dictionary>` — host gobject_id → list of every descendant variable, populated during `BuildAddressSpace` by walking each variable's `HostedByGobjectId` chain up to the nearest Platform/Engine. A variable hosted by an Engine inside a Platform appears in BOTH lists. -- `_hostIdsByTagRef: Dictionary>` — reverse index used by the Read short-circuit, populated alongside `_hostedVariables`. -- Public `MarkHostVariablesBadQuality(int gobjectId)` — walks `_hostedVariables[gobjectId]`, sets `StatusCode = BadOutOfService` on each, calls `ClearChangeMasks(ctx, false)` to push through the OPC UA publisher. -- Public `ClearHostVariablesBadQuality(int gobjectId)` — inverse, resets to `Good` on recovery. - -**OPC UA Read short-circuit** — `LmxNodeManager.Read`: -- Before the normal `_mxAccessClient.ReadAsync(tagRef)` round-trip, check `IsTagUnderStoppedHost(tagRef)`. If true, return a `DataValue { StatusCode = BadOutOfService, Value = cachedVar?.Value }` directly. Covers both direct Read requests AND OPC UA monitored-item sampling, which both flow through this override. - -**Deadlock fix — `_pendingHostStateChanges` queue**: -- First draft invoked `MarkHostVariablesBadQuality` synchronously from the probe callback. MxAccess delivers `OnDataChange` on the STA thread; the callback took the node manager `Lock`. Meanwhile any worker thread inside `Read` could hold `Lock` and wait on a pending `ReadAsync` that needed the STA thread — **classic STA deadlock** (first real deploy hung in ~30s). -- Fix: probe transitions are enqueued on `ConcurrentQueue<(int GobjectId, bool Stopped)>` and the dispatch thread drains the queue inside its existing 100ms `WaitOne` loop. The dispatch thread takes `Lock` naturally without STA involvement, so no cycle. Live verified with the IDE OffScan/OnScan cycle after the fix. - -**Dashboard** — `Host/Status/`: -- New `RuntimeStatusInfo` DTO + "Galaxy Runtime" panel between Galaxy Info and Historian. Shows total/running/stopped/unknown counts plus a per-host table with Name / Kind / State / Since / Last Error columns. Panel color: green (all Running), yellow (some Unknown, none Stopped), red (any Stopped), gray (MxAccess disconnected forces every row to Unknown). -- Subscriptions panel gets a new `Probes: N (bridge-owned runtime status)` line when non-zero. -- `HealthCheckService` Rule 2e: `Degraded` when any host is Stopped, ordered after Rule 1 (MxAccess transport) to avoid double-messaging when the transport is the root cause. - -### Tests -- **24** new `GalaxyRuntimeProbeManagerTests`: state transitions (Unknown/Running/Stopped/recovery), unknown-resolution timeout, transport gating, sync diff, dispose, callback exception safety, `IsHostStopped` for Read-path short-circuit (Unknown/Running/Stopped/recovery/unknown-id/transport-disconnected-contract). -- Full Host suite: **471/471** tests passing. No regressions. - -### Live end-to-end verification (today, against real IDE OffScan action) - -**Baseline** (before OffScan, dashboard at 15:44:00): -``` -Galaxy Runtime: green, 2 of 2 hosts running -DevAppEngine $AppEngine Running 2026-04-13T19:29:12.9475357Z -DevPlatform $WinPlatform Running 2026-04-13T19:29:12.9345208Z -TestMachine_001.MachineID → Status 0x00000000 (Good), value "admin_test" -``` - -**After operator Set OffScan on DevAppEngine in IDE** (log at 15:44:25): -``` -15:44:25.554 Galaxy runtime DevAppEngine.ScanState transitioned Running → Stopped (ScanState = false (OffScan)) -15:44:25.557 Marked 3971 variable(s) BadOutOfService for stopped host gobject_id=1043 -``` -Dashboard: red panel, `1 of 2 hosts running (1 stopped, 0 unknown)`. Health: `Degraded — Galaxy runtime has 1 of 2 host(s) stopped: DevAppEngine`. Critical: 3ms from probe callback to subtree walk complete. - -**Read during stop — found bug #1** (Read handler bypassed cached state): -- Initial deploy: `TestMachine_001.MachineID` still read `0x00000000` Good with a post-stop source time from MxAccess. Revealed that `LmxNodeManager.Read` calls `_mxAccessClient.ReadAsync()` directly and never consults the in-memory `BaseDataVariableState.StatusCode` we set during the walk. -- Fix: `IsTagUnderStoppedHost` short-circuit in Read override. After patch: `[808D0000] BadOutOfService` on all three test tags. - -**Read during stop — found bug #2** (deadlock): -- After shipping the Read patch, the service hung on the next OffScan. HTTP listener accepted connections but never responded, and service shutdown stuck at STOP_PENDING for 15+ seconds until manually killed. -- Diagnosis: the probe callback fires `HandleProbeUpdate` → `MarkHostVariablesBadQuality` → acquires `Lock` on the STA thread. Meanwhile the dispatch thread can sit inside `Read` holding `Lock` and waiting for an STA-routed `ReadAsync`. Circular wait. -- Fix: enqueue probe transitions onto `ConcurrentQueue` and drain on the dispatch thread where `Lock` acquisition is safe. Second deploy resolved the hang. - -**A/B verification** (instance1 patched, instance2 not yet): -| Instance | `TestMachine_001.MachineID` | -|---|---| -| `LmxOpcUa` (patched) | `0x808D0000` BadOutOfService ✅ | -| `LmxOpcUa2` (old) | `0x00000000` Good, stale ❌ | - -Clean A/B confirmed the Read patch is required; instance2 subsequently updated to match. - -**Recovery** (operator Set OnScan on DevAppEngine, log at 16:10:05): -``` -16:10:05.129 Galaxy runtime DevAppEngine.ScanState transitioned → Running -16:10:05.130 Cleared bad-quality override on 3971 variable(s) for recovered host gobject_id=1043 -``` -Dashboard: back to green, `DevAppEngine` Running with new `Since = 20:10:05.129Z`. All three test tags back to `0x00000000` Good with fresh source timestamps. 1ms from probe callback to subtree clear. - -### Client freeze observation — phase 2 decision gate - -The original production issue had two symptoms: (1) incomplete quality flip and (2) OPC UA client freeze. The subtree walk + Read short-circuit fixes (1) definitively. For (2), there's still a pending dispatch-queue flood of per-tag MxAccess callbacks that MxAccess fans out when a host stops — the bridge doesn't currently drop them. We **deliberately did not** ship dispatch suppression in this pass, on the grounds that the subtree walk may coalesce notifications sufficiently at the SDK publisher level to resolve the freeze on its own. The verification against the live Galaxy with no OPC UA clients subscribed doesn't tell us one way or the other — the next subscribed-client test against a real stop will be the deciding measurement. If the client still freezes after the walk, phase 2 adds pre-dispatch filtering for tags under Stopped hosts. - -### What's deferred - -- **Synthetic OPC UA child nodes** (`$RuntimeState`, `$LastCallbackTime`, etc.) under each host object. Dashboard + health surface give operators visibility today; the OPC UA synthetic nodes are a follow-up. -- **Dispatch suppression** — gated on observing whether the subtree walk alone resolves the client freeze in production. -- **Documentation updates** — the `docs/` guides (`MxAccessBridge.md`, `StatusDashboard.md`, `Configuration.md`, `HistoricalDataAccess.md`) still describe the pre-runtime-status behavior. Need a consolidated doc pass covering this feature plus the historian cluster + health surface updates from earlier today. - -## Stability Review Fixes 2026-04-14 - -Code changes only — **not yet deployed** to the instance1/instance2 services. Closes all four residual findings from `docs/stability-review-20260413.md`; the document was green on shipped features but flagged latent defects that degraded the stability guarantees the runtime-status feature relies on. Deploy procedure at the end of this section. - -### Findings closed - -**Finding 1 (High) — Probe rollback on subscribe failure.** -`GalaxyRuntimeProbeManager.SyncAsync` pre-populated `_byProbe` / `_probeByGobjectId` before awaiting `SubscribeAsync`. When the advise call threw, the catch block logged a warning but left the phantom entry in place; `Tick()` later transitioned it from Unknown to Stopped after `RuntimeStatusUnknownTimeoutSeconds`, firing `_onHostStopped` and walking the subtree of a host that was never actually advised. In a codebase where the same probe manager also drives the Read-path short-circuit and subtree quality invalidation (the 2026-04-13 feature), a false-negative here fans out into hundreds of BadOutOfService flags on live variables. Fix: promote `toSubscribe` to `List<(int GobjectId, string Probe)>` so the catch path can reacquire `_lock` and remove both dictionaries. The rollback compares against the captured probe string before removing so a concurrent resync cannot accidentally delete a legitimate re-add. - -**Finding 2 (Medium) — Surface dashboard bind failure.** -`StatusWebServer.Start()` already returned `bool`, but `OpcUaService.Start()` ignored it, so a failed bind (port in use, permissions) was invisible at the service level. Fix: capture the return value, on `false` log a Warning (`Status dashboard failed to bind on port {Port}; service continues without dashboard`), dispose the unstarted instance, and set a new `OpcUaService.DashboardStartFailed` property. Degraded mode — matches the established precedent for other optional startup subsystems (MxAccess connect, Galaxy DB connect, initial address space build). - -**Finding 3 (Medium) — Bounded timeouts on sync-over-async.** -Seven sync-over-async `.GetAwaiter().GetResult()` sites in `LmxNodeManager` (rebuild probe sync, Read, Write, HistoryReadRaw/Processed/AtTime/Events) blocked the OPC UA stack thread without an outer bound. Inner `MxAccessClient.ReadAsync` / `WriteAsync` already apply per-call `CancelAfter`, but `SubscribeAsync`, `SyncAsync`, and the historian reads did not — and the pattern itself is a stability risk regardless of inner behavior. Fix: new `SyncOverAsync.WaitSync(task, timeout, operation)` helper + two new config fields `MxAccess.RequestTimeoutSeconds=30` and `Historian.RequestTimeoutSeconds=60`. Every sync-over-async site now wraps the task in `WaitSync`, catches `TimeoutException` explicitly, and maps to `StatusCodes.BadTimeout` (or logs a warning and continues in the rebuild case — probe sync is advisory). `ConfigurationValidator` rejects `RequestTimeoutSeconds < 1` for both and warns when operators set the outer bound below the inner read/write / command timeout. - -**Finding 4 (Low) — Track fire-and-forget subscribes.** -Alarm auto-subscribe, subtree alarm auto-subscribe, and transferred-subscription restore all called `_mxAccessClient.SubscribeAsync(...).ContinueWith(..., OnlyOnFaulted)` with no tracking, so shutdown raced pending subscribes and ordering was impossible to reason about. Fix: new `TrackBackgroundSubscribe(tag, context)` helper in `LmxNodeManager` that stashes the task in `_pendingBackgroundSubscribes` (a `ConcurrentDictionary` with a monotonic `Interlocked.Increment` id), and a continuation that removes the entry and logs faults with the supplied context. `Dispose(bool)` drains the dictionary with `Task.WaitAll(snapshot, 5s)` after stopping the dispatch thread — bounded so shutdown cannot stall on a hung backend, and logged at Info so operators can see the drain count. - -### Code changes - -- `src/ZB.MOM.WW.LmxOpcUa.Host/MxAccess/GalaxyRuntimeProbeManager.cs` — `toSubscribe` carries gobject id; catch path rolls back both dictionaries under `_lock`, with concurrent-overwrite guard. -- `src/ZB.MOM.WW.LmxOpcUa.Host/OpcUaService.cs` — capture `StatusWeb.Start()` return; `DashboardStartFailed` internal property; dispose unstarted instance on failure. -- `src/ZB.MOM.WW.LmxOpcUa.Host/Utilities/SyncOverAsync.cs` (new) — `WaitSync(Task, TimeSpan, string)` and non-generic overload with inner-exception unwrap. -- `src/ZB.MOM.WW.LmxOpcUa.Host/Configuration/MxAccessConfiguration.cs` — `RequestTimeoutSeconds: int = 30`. -- `src/ZB.MOM.WW.LmxOpcUa.Host/Configuration/HistorianConfiguration.cs` — `RequestTimeoutSeconds: int = 60`. -- `src/ZB.MOM.WW.LmxOpcUa.Host/Configuration/ConfigurationValidator.cs` — logs both new values, rejects `< 1`, warns on inner/outer misorder. -- `src/ZB.MOM.WW.LmxOpcUa.Host/OpcUa/LmxNodeManager.cs` — constructor takes the two new timeout values (with defaults); seven sync-over-async call sites wrapped in `SyncOverAsync.WaitSync` + `TimeoutException → BadTimeout` catch; `TrackBackgroundSubscribe` helper; `_pendingBackgroundSubscribes` dictionary + `_backgroundSubscribeCounter`; `DrainPendingBackgroundSubscribes()` in `Dispose`; three fire-and-forget sites replaced with helper calls. -- `src/ZB.MOM.WW.LmxOpcUa.Host/OpcUa/LmxOpcUaServer.cs` — constructor plumbing for the two new timeouts. -- `src/ZB.MOM.WW.LmxOpcUa.Host/OpcUa/OpcUaServerHost.cs` — accepts `HistorianConfiguration`, threads both timeouts through to `LmxOpcUaServer`. - -### Tests - -- `tests/.../MxAccess/GalaxyRuntimeProbeManagerTests.cs` — 3 new tests: `Sync_SubscribeThrows_DoesNotLeavePhantomEntry`, `Sync_SubscribeThrows_TickDoesNotFireStopCallback`, `Sync_SubscribeSucceedsAfterRetry_AppearsInSnapshot`. Use the existing `FakeMxAccessClient.SubscribeException` hook — no helper changes needed. -- `tests/.../Status/StatusWebServerTests.cs` — 1 new test: `Start_WhenPortInUse_ReturnsFalse`. Grabs a port with a throwaway `HttpListener`, tries to start `StatusWebServer` on the same port, asserts `Start()` returns `false`. -- `tests/.../Wiring/OpcUaServiceDashboardFailureTests.cs` (new) — 1 test: `Start_DashboardPortInUse_ContinuesInDegradedMode`. Builds a full `OpcUaService` with `FakeMxProxy` + `FakeGalaxyRepository`, binds the dashboard port externally, starts the service, asserts `ServerHost != null`, `DashboardStartFailed == true`, `StatusWeb == null`. -- `tests/.../Utilities/SyncOverAsyncTests.cs` (new) — 7 tests covering happy path, never-completing task → TimeoutException with operation name, faulted task → inner exception unwrap, null-task arg check. -- `tests/.../Configuration/ConfigurationLoadingTests.cs` — 3 new tests: `Validator_MxAccessRequestTimeoutZero_ReturnsFalse`, `Validator_HistorianRequestTimeoutZero_ReturnsFalse`, `Validator_DefaultRequestTimeouts_AreSensible`. - -**Test results:** full suite **486/486** passing. First run hit a single transient failure in `ChangeDetectionServiceTests.ChangedTimestamp_TriggersAgain` (pre-existing timing-sensitive test — poll interval 1s with 500ms + 1500ms sleeps races under load); the test passes on retry and is unrelated to these changes. The 15 new tests added by this pass all green on both runs. - -### Documentation updates - -- `docs/MxAccessBridge.md` — Runtime-status section gains a new point 5 documenting the subscribe-failure rollback; new "Request Timeout Safety Backstop" section describing the outer `RequestTimeoutSeconds` bound. -- `docs/HistoricalDataAccess.md` — Config class snippet and property table updated with `RequestTimeoutSeconds`. -- `docs/ServiceHosting.md` — Step 12 (startup sequence) documents the degraded-mode dashboard policy and the new `DashboardStartFailed` flag. -- `docs/Configuration.md` — `MxAccess.RequestTimeoutSeconds` (30s) and `Historian.RequestTimeoutSeconds` (60s) added to both the property tables and the `appsettings.json` full example. -- `docs/StatusDashboard.md` — New subsection "Dashboard start failures are non-fatal" with the log grep operators should use. - -### Deploy plan (not yet executed) - -This is a code-only change; the built binary has not been copied to `C:\publish\lmxopcua\instance1` / `instance2` yet. When deploying, follow the procedure from the 2026-04-13 runtime-status deploy (service_info.md:572-680): - -1. Backup `C:\publish\lmxopcua\instance1` and `instance2` to `backups\20260414--instance{1,2}`. Preserve each `appsettings.json`. -2. Build the Host project in Release and copy `ZB.MOM.WW.LmxOpcUa.Host.exe` (and any changed DLLs) to both instance roots. The Historian plugin layout at `\Historian\` is unchanged. -3. Restart the `LmxOpcUa` and `LmxOpcUa2` Windows services. -4. In the startup log for each instance, verify the new config echoes appear: - - `MxAccess.RuntimeStatusProbesEnabled=..., RuntimeStatusUnknownTimeoutSeconds=15s, RequestTimeoutSeconds=30s` - - `Historian.CommandTimeoutSeconds=30, MaxValuesPerRead=10000, FailureCooldownSeconds=60, RequestTimeoutSeconds=60` - - `=== Configuration Valid ===` - - `LmxOpcUa service started successfully` -5. CLI smoke test on both endpoints (matches the 2026-03-25 baseline at service_info.md:370-376): - - `opcuacli-dotnet.exe connect -u opc.tcp://localhost:4840/LmxOpcUa` - - `opcuacli-dotnet.exe connect -u opc.tcp://localhost:4841/LmxOpcUa` - - `opcuacli-dotnet.exe redundancy -u opc.tcp://localhost:4840/LmxOpcUa` → ServiceLevel=200 (primary) - - `opcuacli-dotnet.exe redundancy -u opc.tcp://localhost:4841/LmxOpcUa` → ServiceLevel=150 (secondary) -6. Runtime-status regression check (the most sensitive thing these fixes could break): repeat the IDE OffScan / OnScan cycle documented at service_info.md:630-669. Dashboard at `http://localhost:8085/` must go red on OffScan, green on OnScan; `TestMachine_001.MachineID` must flip between `0x808D0000 BadOutOfService` and `0x00000000 Good` at each transition with the same sub-100ms latency as the original deploy. -7. Record PIDs and live verification results in a follow-up section of this file (`## Stability Review Fixes 2026-04-14 — Deploy`), matching the layout conventions from earlier entries. - -### Finding 1 manual regression check - -Before the regression test landed, the only way to exercise the bug in production was to temporarily revoke the MxAccess user's probe subscription permission or point the probe manager at a non-existent host. After the fix, the same scenarios should leave `GetSnapshot()` empty (no phantom entries) and the dashboard Galaxy Runtime panel should read `0 of N hosts` rather than `0 running, N stopped`. The three new `GalaxyRuntimeProbeManagerTests` cover this deterministically via `FakeMxAccessClient.SubscribeException` so a future regression is caught at CI time. - -### Risk notes - -- **Timeout floor discipline.** The two new `RequestTimeoutSeconds` values have conservative defaults (30s MxAccess, 60s Historian). Setting them too low would cause spurious `BadTimeout` errors on a slow-but-healthy backend. `ConfigurationValidator` rejects `< 1` and warns below inner timeouts so misconfiguration is visible at startup. -- **Abandoned tasks on timeout.** `SyncOverAsync.WaitSync` does not cancel the underlying task — it runs to completion on the thread pool and is abandoned. This is acceptable because MxAccess / Historian clients are shared singletons whose background work does not capture request-scoped state. -- **Background subscribe drain window.** 5 seconds is enough for healthy subscribes to settle but not long enough to stall shutdown if MxAccess is hung. If drain times out, shutdown continues — this is intentional. -- **Probe rollback concurrency.** The catch path reacquires `_lock` after `await`. A concurrent `SyncAsync` may have re-added the same gobject under a new probe name; the code compares against the captured probe string before removing, so a legitimate re-add is not clobbered. - -## Stability Review Fixes 2026-04-14 — Deploy - -Updated: `2026-04-14 00:40-00:43 America/New_York` - -Both instances redeployed with the stability-review fixes documented above. Closes all four findings from `docs/stability-review-20260413.md` on the live services. - -Backups: -- `C:\publish\lmxopcua\backups\20260414-003948-instance1` — pre-deploy `ZB.MOM.WW.LmxOpcUa.Host.exe` (7,997,952 bytes) + `appsettings.json` -- `C:\publish\lmxopcua\backups\20260414-003948-instance2` — pre-deploy `ZB.MOM.WW.LmxOpcUa.Host.exe` (7,997,952 bytes) + `appsettings.json` - -Configuration preserved: -- Both `appsettings.json` were not overwritten. The two new fields (`MxAccess.RequestTimeoutSeconds`, `Historian.RequestTimeoutSeconds`) inherit their defaults from the binary (30s and 60s respectively). Operators can opt into explicit values by editing `appsettings.json`; defaults are logged at startup regardless. - -Deployed binary (both instances): -- `ZB.MOM.WW.LmxOpcUa.Host.exe` -- Last write time: `2026-04-14 00:40:48 -04:00` -- Size: `7,986,688` (down 11,264 bytes from the previous build — three fire-and-forget `.ContinueWith` blocks were replaced with a single `TrackBackgroundSubscribe` helper) - -Pre-deploy state note: both services were STOPPED when the deploy started (`sc.exe query` reported `WIN32_EXIT_CODE=1067`), but two host processes were still alive (`tasklist` showed PID 34828 holding instance1 and PID 27036 holding instance2). The zombies held open file handles on both exes, so the Windows SCM's "STOPPED" state was lying — the previous Services were still running out-of-band of the SCM. The zombie processes were terminated with `taskkill //F` before copying the new binary. This is a one-shot clean-up: the new deploy does not require the same. - -Windows services: -- `LmxOpcUa` — Running, PID `32884` -- `LmxOpcUa2` — Running, PID `40796` - -Restart evidence (instance1 `logs/lmxopcua-20260414.log`): -``` -2026-04-14 00:40:55.759 -04:00 [INF] MxAccess.RuntimeStatusProbesEnabled=true, RuntimeStatusUnknownTimeoutSeconds=15s, RequestTimeoutSeconds=30s -2026-04-14 00:40:55.791 -04:00 [INF] Historian.CommandTimeoutSeconds=30, MaxValuesPerRead=10000, FailureCooldownSeconds=60, RequestTimeoutSeconds=60 -2026-04-14 00:40:55.794 -04:00 [INF] === Configuration Valid === -2026-04-14 00:41:02.406 -04:00 [INF] Historian plugin loaded from C:\publish\lmxopcua\instance1\Historian\ZB.MOM.WW.LmxOpcUa.Historian.Aveva.dll -2026-04-14 00:41:06.870 -04:00 [INF] LmxOpcUa service started successfully -``` - -Restart evidence (instance2 `logs/lmxopcua-20260414.log`): -``` -2026-04-14 00:40:56.812 -04:00 [INF] MxAccess.RuntimeStatusProbesEnabled=true, RuntimeStatusUnknownTimeoutSeconds=15s, RequestTimeoutSeconds=30s -2026-04-14 00:40:56.847 -04:00 [INF] Historian.CommandTimeoutSeconds=30, MaxValuesPerRead=10000, FailureCooldownSeconds=60, RequestTimeoutSeconds=60 -2026-04-14 00:40:56.850 -04:00 [INF] === Configuration Valid === -2026-04-14 00:41:07.805 -04:00 [INF] Historian plugin loaded from C:\publish\lmxopcua\instance2\Historian\ZB.MOM.WW.LmxOpcUa.Historian.Aveva.dll -2026-04-14 00:41:12.008 -04:00 [INF] LmxOpcUa service started successfully -``` - -The two new `RequestTimeoutSeconds` values are visible in both startup traces, confirming the new configuration plumbing reached `ConfigurationValidator`. Startup latency (config-valid → service-started): instance1 ~11.1s, instance2 ~15.2s — within the normal envelope for the Historian plugin load sequence. - -CLI verification (via `dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Client.CLI`): - -``` -connect opc.tcp://localhost:4840/LmxOpcUa → Server: LmxOpcUa, Security: None, Connection successful -connect opc.tcp://localhost:4841/LmxOpcUa → Server: LmxOpcUa2, Security: None, Connection successful -redundancy opc.tcp://localhost:4840/LmxOpcUa → Warm, ServiceLevel=200, urn:localhost:LmxOpcUa:instance1 -redundancy opc.tcp://localhost:4841/LmxOpcUa → Warm, ServiceLevel=150, urn:localhost:LmxOpcUa:instance2 -read opc.tcp://localhost:4840/LmxOpcUa -n 'ns=3;s=MESReceiver_001.MoveInPartNumbers' - → Value: System.String[] - → Status: 0x00000000 - → Source: 2026-04-14T04:43:46.2267096Z -``` - -Primary advertises ServiceLevel 200, secondary advertises 150 — redundancy baseline preserved. End-to-end data flow is healthy: the Read on `MESReceiver_001.MoveInPartNumbers` returns Good quality with a fresh source timestamp, confirming MxAccess is connected and the address space is populated. Note that the namespace is `ns=3` now, not the `ns=1` listed in the 2026-03-25 baseline at the top of this file — the auth-consolidation deploy on 2026-03-28 moved the Galaxy namespace to `ns=3` and that move has carried through every deploy since. The top-of-file `ns=1` CLI example should be treated as historical. - -### CLI tooling note - -The earlier service_info.md entry referenced `tools/opcuacli-dotnet/bin/Debug/net10.0/opcuacli-dotnet.exe`. That binary does not exist on the current checkout; the CLI lives at `src/ZB.MOM.WW.LmxOpcUa.Client.CLI/` and must be invoked via `dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Client.CLI`. The README / `docs/Client.CLI.md` should be the source of truth going forward. - -### Runtime-status regression check - -**Not performed in this deploy.** The runtime-status subtree-walk / Read-short-circuit regression check from service_info.md:630-669 requires an operator to flip a `$AppEngine` OffScan in the AVEVA IDE and observe the dashboard + Read behavior, which needs a real operator session. The automated CLI smoke test above does not exercise the probe-manager callback path. - -The code changes in this deploy are defensive and do not alter the runtime-status feature's control flow except in one place (subscribe rollback, which only triggers when `SubscribeAsync` throws). The 471/471 baseline on the probe manager tests plus the three new rollback regression tests give high confidence that the runtime-status behavior is preserved. If a human operator runs the IDE OffScan/OnScan cycle and observes an anomaly, the fix is most likely isolated to `GalaxyRuntimeProbeManager.SyncAsync` — see Finding 1 above — and can be reverted by restoring `C:\publish\lmxopcua\backups\20260414-003948-instance{1,2}\ZB.MOM.WW.LmxOpcUa.Host.exe`. - -## Galaxy Platform Scope Filter - -Updated: `2026-04-16 00:21-00:27 America/New_York` - -Both instances updated with a new `GalaxyRepository.Scope` configuration flag that controls whether the OPC UA server loads the entire Galaxy or only objects hosted by the local platform. Reduces address space size, MXAccess subscription count, and memory footprint on multi-node Galaxy deployments. - -Backups: -- `C:\publish\lmxopcua\backups\20260416-002120-instance1` -- `C:\publish\lmxopcua\backups\20260416-002120-instance2` - -Configuration preserved: -- Both `appsettings.json` updated with new fields only (`Scope`, `PlatformName`). All existing settings preserved. - -Deployed binary (both instances): -- `ZB.MOM.WW.LmxOpcUa.Host.exe` -- Last write time: `2026-04-16 00:23 -04:00` -- Size: `7,993,344` - -Windows services: -- `LmxOpcUa` — Running, PID `15204` -- `LmxOpcUa2` — Running, PID `9544` - -### Code changes - -- `Configuration/GalaxyScope.cs` (new) — enum: `Galaxy` (default, all deployed objects), `LocalPlatform` (only objects hosted by the local platform's subtree). -- `Domain/PlatformInfo.cs` (new) — DTO mapping `platform.platform_gobject_id` to `platform.node_name`. -- `Configuration/GalaxyRepositoryConfiguration.cs` — added `Scope: GalaxyScope` (default `Galaxy`) and `PlatformName: string?` (optional override for `Environment.MachineName`). -- `GalaxyRepository/PlatformScopeFilter.cs` (new) — stateless C# filter applied after the existing SQL queries (preserves `GR-006: const string, no dynamic SQL` convention). Algorithm: (1) resolve the local platform's `gobject_id` via a new `PlatformLookupSql` query against the `platform` table, (2) collect all AppEngine hosts under that platform, (3) include all objects hosted by any host in the set, (4) walk `ParentGobjectId` chains upward to retain ancestor areas for a connected browse tree. -- `GalaxyRepository/GalaxyRepositoryService.cs` — added `PlatformLookupSql` const query, `GetPlatformsAsync()` method, post-query filtering in `GetHierarchyAsync`/`GetAttributesAsync` with cached `_scopeFilteredGobjectIds` for cross-method consistency. -- `Configuration/ConfigurationValidator.cs` — logs `Scope` and effective `PlatformName` at startup. - -### Configuration - -New fields in `GalaxyRepository` section of `appsettings.json`: - -```json -"GalaxyRepository": { - "Scope": "Galaxy", - "PlatformName": null -} -``` - -- `Scope`: `"Galaxy"` (default) loads all deployed objects. `"LocalPlatform"` filters to the local platform only. -- `PlatformName`: When null, uses `Environment.MachineName`. Set explicitly to target a specific platform by hostname. - -Both instances deployed with `"Scope": "Galaxy"` (full Galaxy, backward-compatible default). - -### Tests - -8 new unit tests in `PlatformScopeFilterTests.cs`: -- Two-platform Galaxy filtering (platform A, platform B) -- Case-insensitive node name matching -- No matching platform → empty result -- Ancestor area inclusion for connected tree -- Area exclusion when no local descendants -- Attribute filtering by gobject_id set -- Original order preservation - -Full suite: **494/494** tests passing (8 new, 0 regressions). - -### Live verification - -**LocalPlatform scope test** (instance1, temporarily set to `"Scope": "LocalPlatform"`): -``` -Startup log: - GalaxyRepository.Scope="LocalPlatform", PlatformName=DESKTOP-6JL3KKO - GalaxyRepository.PlatformName not set — using Environment.MachineName 'DESKTOP-6JL3KKO' - GetHierarchyAsync returned 49 objects - GetPlatformsAsync returned 1 platform(s) - Scope filter targeting platform 'DESKTOP-6JL3KKO' (gobject_id=1042) - Scope filter retained 3 of 49 objects for platform 'DESKTOP-6JL3KKO' - GetAttributesAsync returned 4206 attributes (extended=true) - Scope filter retained 386 of 4206 attributes - Address space built: 2 objects, 386 variables, 386 tag references, 0 alarm tags, 2 runtime hosts - -CLI browse ZB: - DEV → DevAppEngine, DevPlatform (only local platform subtree) - TestArea, TestArea2 → absent (filtered out) - -CLI read DEV.ScanState: - Value: True, Status: 0x00000000 (Good) -``` - -**Galaxy scope comparison** (instance2, `"Scope": "Galaxy"`): -``` -CLI browse ZB/DEV: - DevAppEngine, DevPlatform, TestArea, TestArea2 (full Galaxy) -``` - -**Galaxy scope restored** (instance1, set back to `"Scope": "Galaxy"`): -``` -CLI browse ZB/DEV: - DevAppEngine, DevPlatform, TestArea, TestArea2 (full Galaxy restored) -``` - -**Redundancy baseline preserved** (both instances): -``` -instance1 → Warm, ServiceLevel=200, urn:localhost:LmxOpcUa:instance1 -instance2 → Warm, ServiceLevel=150, urn:localhost:LmxOpcUa:instance2 -``` - -## Notes - -The service deployment and restart succeeded. The live CLI checks confirm the endpoint is reachable and that the array node identifier has changed to the bracketless form. The array value on the live service still prints as blank even though the status is good, so if this environment should have populated `MoveInPartNumbers`, the runtime data path still needs follow-up investigation.