Name

sn_appauthor.ExternalScopeConfigFinder

Description

No description available

Script

var ExternalScopeConfigFinder = Class.create();
ExternalScopeConfigFinder.prototype = {
  initialize: function() {
  },
  
  find: function(sys_app) {
  	
  	return findUpdates(sys_app);
  	
  	function findUpdates(sys_app) {
  		var updates = [];
  		
  		try {
  			var scopeTables = findScopeTables(sys_app);
  			var sysMetadataChildren = findMetadataReferencingTables();
  			while(next(sysMetadataChildren)) {
  				var tableName = sysMetadataChildren.name;
  				var columnName = sysMetadataChildren.element;
  				
  				var externalConfig = findExternalConfig(tableName, columnName, sys_app, scopeTables);
  				while(next(externalConfig)) {
  					updates.push({
  						sys_id: externalConfig.getValue('sys_id'),
  						sys_class_name: externalConfig.getValue('sys_class_name'),
  						sys_name: externalConfig.getValue('sys_name'),
  						external_table_name: externalConfig.getValue(columnName),
  						sys_update_name: externalConfig.getValue('sys_update_name')
  					});
  				}
  			}
  			
  			return updates;
  		} catch(e) {
  			gs.error('Error finding external scope configuration', e);
  			return [];
  		}
  	}
  	
  	function findScopeTables(sys_app) {
  		var tblQuery = new GlideRecord('sys_db_object');
  		tblQuery.addQuery('sys_scope', sys_app.getUniqueValue());
  		query(tblQuery);
  		
  		var tableIdsNames = [];
  		while(next(tblQuery)) {
  			var sysId = tblQuery.getValue('sys_id');
  			var name = tblQuery.getValue('name');
  			tableIdsNames.push(sysId);
  			tableIdsNames.push(name);
  		}
  		return tableIdsNames;
  	}
  	
  	function findMetadataReferencingTables() {
  		// retrieve all tables that extend sys_metadata and reference a table
  		var internalTypes = ['table, table_name'];
  		var sysMetadataChildren = new GlideRecord('sys_dictionary');
  		sysMetadataChildren.addQuery('internal_type', 'IN', internalTypes);
  		var sysDbObjectJoin = sysMetadataChildren.addJoinQuery('sys_db_object', 'name', 'name');
  		sysDbObjectJoin.addCondition('super_class.name', 'sys_metadata');
  		
  		var tables = {};
  		query(sysMetadataChildren);
  		return sysMetadataChildren;
  	}
  	
  	function findExternalConfig(tableName, columnName, sys_app, scopeTables) {
  		var tableRecord = new GlideRecord(tableName);
  		tableRecord.addQuery('sys_scope', sys_app.getUniqueValue());
  		tableRecord.addQuery(columnName, 'NOT IN', scopeTables);
  		//necessary to eliminate artifacts from TPP dictionary cloning
  		if (tableName == 'sys_dictionary' || tableName == 'sys_documentation')
  			tableRecord.addNotNullQuery('sys_update_name');
  		query(tableRecord);
  		return tableRecord;
  	}
  	
  	function query(record) {
  		if (typeof record.query == 'function')
  			record.query();
  		else if (typeof record._query == 'function')
  			record._query();
  	}
  	
  	function next(record) {
  		return (typeof record.next == 'function' && record.next()) || (typeof record._next == 'function' && record._next());
  	}
  },
  
  type: 'ExternalScopeConfigFinder'
};

Sys ID

c62bfba15b801200cadc853291f91add

Offical Documentation

Official Docs: