Name

global.UpdateSetPublisher

Description

This Script UpdateSetPublisher is developed as part of Pattern Export functionality We are exporting only changed data Example 1. var publisher = new UpdateSetPublisher( My Test UpdateSet name ); 2. var publisher = new UpdateSetPublisher(); // Use the current UpdateSet //Pass single table with one or multiple records var gr = GlideRecord( sa_pattern ); gr.query(); publisher.publishSingle(gr); //Pass single table with one or multiple records var gr1 = GlideRecord( sa_pattern ); gr1.query(); var gr2 = GlideRecord( sa_pattern_extension ); gr2.query(); publisher.publishMultiple( gr1, gr2 );

Script

var UpdateSetPublisher = Class.create();
UpdateSetPublisher.prototype = {
  initialize: function(newUpdateSetName, logger) {
      this.updateSetName = newUpdateSetName;
      this.logger = logger;
      this.api = new UpdateSetAPI();
      if (newUpdateSetName !== null && newUpdateSetName !== undefined) {
          this.originUpdateSetId = this.api.getCurrentUpdateSetID();
          this.api.insertUpdateSetAsCurrent(newUpdateSetName);
          this.logger.log('UpdateSet: ' + newUpdateSetName + ' set as current');
      }

      this.isForcePublish = false;
      this.manager = new GlideUpdateManager2();
      this.countOfPublishedRecords = 0;
      this.updateSetId = this.api.getCurrentUpdateSetID();

      this.updateSetArray = {};
      this.updateSetArray['global'] = this.updateSetId;
  },

  complete: function() {
      this.api.completeUpdateSet(this.updateSetId);
  },

  accomplish: function() {

      if (this.originUpdateSetId !== undefined) {
          /* Restore the previous UpdateSet to be a current*/
          new GlideUpdateSet().set(this.originUpdateSetId);
          this.logger.log('Original UpdateSet is set to current');
      } else
          this.logger.error('Failed to set original UpdateSet as current');
  },

  getUpdateSetId: function() {
      return this.updateSetId;
  },

  publishMultiple: function(tables, skipLog, isReference, aRef, bRef) {
      for (var currentTableIndex in tables) {
          var currentTable = tables[currentTableIndex];
          this.publishSingle(currentTable, skipLog, isReference, aRef, bRef);
      }
  },

  publishSingle: function(table, skipLog, isReference, aRef, bRef) {
      this._publish(table, skipLog, isReference, aRef, bRef);
  },

  _publish: function(gr, skipLog, isReference, aRef, bRef) {
      if (gr === null)
          return;
      var tableName = gr.getTableName();

      while (gr.next()) {
          if (!this._isRecordExist(gr) && !this.isForcePublish) {
              this.manager.saveRecord(gr);
              if (skipLog === undefined || (skipLog !== undefined && skipLog === false)) {
                  if (isReference === undefined || (isReference !== undefined && isReference === false))
                      this.logger.log('Exporting record: [' + tableName + '] ' + gr.getDisplayValue());
                  else
                      this.logger.log('Exporting record: [' + tableName + '] Reference: ' + gr.getElement(aRef).getDisplayValue() + '->' + gr.getElement(bRef).getDisplayValue());
              }
              this.countOfPublishedRecords++;
          }
      } 
  },

  _isRecordExist: function(gr) {
      var upGr = new GlideRecord('sys_update_xml');
      upGr.addQuery('name', gr.getTableName() + '_' + gr.sys_id);
      upGr.addQuery('update_set', this.updateSetId);
      upGr.query();
      return upGr.hasNext();
  },

  getCountOfPublishedRecords: function() {
      return this.countOfPublishedRecords;
  },

  __publish: function(gr) {
      var upGr = new GlideRecord('sys_update_xml');
      upGr.addQuery('name', this.manager.getUpdateName(gr));
      upGr.addQuery('update_set', this.updateSetId);
      upGr.query();
      if (upGr.hasNext())
          return;
      upGr.initialize();
      upGr.setValue('category', 'customer');
      upGr.setValue('name', this.manager.getUpdateName(gr));
      upGr.setValue('update_domain', 'global');
      var targetName;
      if (gr.name)
          targetName = gr.name;
      else
          targetName = gr.sys_id;

      upGr.setValue('target_name', targetName);
      upGr.setValue('update_set', updateSetId);
      upGr.setValue('payload', gs.unloadRecordToXML(gr, false));
      upGr.setValue('action', 'INSERT_OR_UPDATE');
      var descriptor = GlideTableDescriptor.get(gr.getTableName());
      upGr.setValue('type', descriptor.getLabel());
      upGr.insert();
  },

  splitUpdateSetScopes: function() {
      var updatesetGr = new GlideRecord('sys_update_xml');
      updatesetGr.addQuery('update_set', this.updateSetId);
      updatesetGr.query();
      while (updatesetGr.next()) {
          var application = updatesetGr.application;
          if (application == 'global')
              continue;
          this.createUpdateSetIfNotExist(this.updateSetName, application);
          updatesetGr.setValue('update_set', this.updateSetArray[application]);
          updatesetGr.update();
      }
  },

  createUpdateSetIfNotExist: function(name, appId) {
      if (gs.nil(this.updateSetArray[appId])) {
          var gr = new GlideRecord('sys_update_set');
          gr.initialize();
          gr.name = name + '_' + appId;
          gr.application = appId;
          gr.parent = this.updateSetArray['global'];
          var sysID = gr.insert();
          this.updateSetArray[appId] = sysID;
      }
  },
  
  type: 'UpdateSetPublisher'
};


/*Static function for delete */
UpdateSetPublisher.deleteAllUpdateSets = function(baseUpdatesetSysId) {
  var updateSetList = [];
  var ugr = new GlideRecord("sys_remote_update_set");
  ugr.addQuery("sys_id", baseUpdatesetSysId);
  ugr.query();
  if (ugr.next()) {
      //remote_sys_id and remote_base_sys_id provide the necessary references to parent and child update sets in the batch.
      updateSetList.push(ugr.remote_sys_id);
      updateSetList.push(ugr.remote_base_update_set);
  }

  var gr = new GlideRecord('sys_update_xml');
  gr.addQuery('update_set', updateSetList);
  gr.setWorkflow(false);
  gr.deleteMultiple();

  var gr2 = new GlideRecord('sys_remote_update_set');
  gr2.addQuery('remote_base_update_set', updateSetList);
  gr2.query();
  gr2.setWorkflow(false);
  gr2.deleteMultiple();

  var gr3 = new GlideRecord('sys_update_set');
  gr3.addQuery('base_update_set', updateSetList);
  gr3.query();
  gr3.setWorkflow(false);
  gr3.deleteMultiple();
};

Sys ID

d2633059934203008a2e35bb357ffbf7

Offical Documentation

Official Docs: