Caché Recent Upgrade Checklists
Caché 2014.1 Upgrade Checklist
[Back] [Next]
   
Server:docs1
Instance:LATEST
User:UnknownUser
 
-
Go to:
Search:    

Purpose
The purpose of this section is to highlight those features of Caché 2014.1 that, because of their difference in this version, affect the administration, operation, or development activities of existing systems.
Those customers upgrading their applications from earlier releases are strongly urged to read the upgrade checklist for the intervening versions as well. This document addresses only the differences between 2013.1 and 2014.1.

The upgrade instructions listed at the beginning of this document apply to this version.
Administrators
This section contains information of interest to those who are familiar with administering prior versions of Caché and wish to learn what is new or different in this area for version 2014.1. The items listed here are brief descriptions. In most cases, more complete descriptions are available elsewhere in the documentation.
Version Interoperability
A table showing the interoperability of recent releases is now part of the Supported Platforms document.
Management Portal Changes
Numerous changes have been made in the Management Portal for this release both to accommodate new features and to reorganize the existing material to make it easier to use. Among the more prominent changes are the addition of pages to assist with database mirroring and the separation of roles.
Operational Changes
This section details changes that have an effect on the way the system operates.
Extent Support Removed
In version 10.1, InterSystems announced that support for database extents was deprecated. In this version, support for extents has been removed altogether.
Those customers who still have systems employing database extents and who wish to upgrade to this release, must consolidate their existing databases down to a single cache.dat file. There are two options for this:
  1. Before upgrading to this release, run the GBLOCKCOPY routine to copy the data from the database and its extents into a single new database.
    In this case, the database can be converted and used to replace the existing database. It can be configured and tested prior to the upgrade. This is especially helpful if the database is to be mounted at system startup.
  2. After upgrade, manually consolidate the database using the cdbmerge utility program.
    In this instance, Caché will refuse to mount the database, even if it configured for mount-at-startup. Only after conversion will it be in a format suitable for use.
Option 1 allows for advance preparation and testing prior to the upgrading to this version. Option 2 is provided in case older databases need to be accessed after the system is upgraded.
Support For 2KB Databases Removed
Over the last several releases, support for 2KB databases has been incrementally restricted. InterSystems urged users with 2KB database to convert them to 8KB databases.
Beginning with this release, 2KB databases can no longer be mounted at all, and are therefore no longer supported. If you have 2KB databases that need to be converted, you may do so using Caché version 2011.1 or earlier; the conversion can be performed prior to upgrading from these versions, or using a separately installed Caché instance.
Cannot Move Security Exports To Earlier Releases
User security exports from 2014.1 are incompatible with 2013.1 due to the introduction of the "AccountNeverExpires" and "PasswordNeverExpires" fields. If an import to 2013.1 is attempted, the user records are skipped. Deleting these fields in the security export will allow the import of the XML into 2013. The user data will have to be manually transferred.
Change In Memory Usage For XML Processing
In this release, the XML reader now uses local variables for storing its information; previously, it used process-private globals. This results in both a performance improvement and an additional demand on memory. Depending on the sizes of XML documents read, the maximum process private memory may need to be increased to avoid fatal errors.
The current suggested per-process memory is 256MB (it may be set to less than this is upgrading from much earlier releases). See the information accompanying the configuration file parameter, bbsiz, the $ZSTORAGE special variable, and the technical article on Caché Process Virtual Memory for further information.
%SYS.System.WriteToConsoleLog() Defaults To UTF-8
String messages sent to cconsole.log via %SYS.System.WriteToConsoleLog() are now encoded in UTF-8. This applies to all systems, 8-bit and Unicode. Customers who have applications that parse cconsole.log need to modify those application to account for the multi-byte possibilities.
Messages containing only ASCII characters ($CODE < 128) are not affected. Characters with $CODE >= 128 (even those from Latin1, such as “é”) are translated to a sequence of 2 or more bytes. The file, cconsole.log, is still byte-oriented, but in order to correctly display UTF-8 encoded characters, a suitable text editor or terminal emulator should be used.
%SYS.System.WriteToConsoleLog() is the method replacement for $ZU(9, "", message).
Error In Saving SQL Persistent Data Containing Collections Of Objects
Beginning with version 2011.1, if an SQL-enabled class had a property which was a collection (list or array) of objects, the collection was saved in an incorrect format. It must be corrected before the object can be opened successfully.
To permit access the collection in this version of Caché,
Added Scripting Restrictions
This version of Caché imposes additional requirements on user scripts. First, you can no longer specify an implied namespace on the command line when running a routine in application mode using the -U switch. If you wish to specify a namespace, it must be defined in the CPF file.
Second, Caché now checks the startup code so that, if the user is trying to execute a routine in application mode, the user must have USE access to the service they are trying to run under. The service is one of: %Service_Console, %Service_Terminal, %Service_Telnet, or %Service_ComPort.
Note:
The roles %Developer and %Manager have all these resources defined as part of the role. In a locked down installation, the %Operator role does not have these services defined.
If the user has created custom roles which do not include these services, and the services are not public, the user must make these services Public, or add them to the individual roles.
Debugging Requires Write Access
A user who wishes to debug routines or methods originating in the CACHESYS database must have write access to the database. Otherwise, stepping, breakpoints, and watchpoints will be disabled while execution is in the routine.
Behavioral Changes For ccontrol stop
Beginning in this release, a command of “ccontrol stop –nofailover” issued to a non-primary mirror member will be ignored. In prior releases, it would cancel any pending shutdown of that member.
Terminal IO Escape Processing Change
The low-level processing for terminal input examines one character at a time. This processing has been changed so that it will no longer terminate input if a character designated as an input-terminator characters occurs as part of a terminal escape sequence.
Disallow //page.csp As Valid Application
In the CSP application matching code the URL format:
//servername/subdirectory/page.csp
allows one to specify a virtual server using the “//servername” format. In pror releases, this also matched a URL such as “//page.csp”. This is incorrect and has been fixed in this version. The “/page.csp” is valid and can match the “/” application (if one is defined) but “//page.csp” will no longer produce a valid match.
Correct Error In Global Mapping
A re-work of the global mapping routines in 2011.1 introduced an error which allowed a user to enter global mapping ranges in the management portal that overlapped. For example, the following mappings try to map part of the ^X global out of the USER namespace into the SAMPLES database; but they are illegal because they overlap
^X(1):(10) --->SAMPLES
^X(5):(20) --->SAMPLES
When the illegal mapping was activated, the first mapping was ignored, and the second mapping used. In the example, only ^X(5):(20) would be mapped, and ^X(1):(5) would remain in the default database for the namespace, USER. In this case, Caché would write an error message to the cconsole.log file:
09/16/13-10:23:22:195 (9664) 2 Discarding subscript mapping (1):(10) mapping overlaps
                               with a prior mapping global ^X namespace USER
Those customers upgrading from a version after 2011.1 and who map globals or routines should check the cconsole.log for the given message. You can also verify that there are no global mapping overlaps by executing:
Set Status=##Class(Config.CPF).Validate(<CPFFile>)
on the CPF file of the system they are going to upgrade. They should check using this version of the system when they perform the validation. Alternatively, you can use the CPF validator in the WRC. If there are overlapping mappings in the CPF file, they will be displayed.
The actual mapping being activated and used by the system can be show by using this routine entry point in the %SYS namespace on your existing system:
Do SHOW^%NSP("USER") 
Important:
If you have detected that you have one or more overlapping mappings, you must remove the mappings which overlap (and are discarded) before you upgrade. If you do not do this, the upgrade will fail, and you will see the overlap messages in the cconsole.log file.
If this happens, you can simply edit the cache.cpf file, remove the duplicate mappings, and then re-install. After the installation finishes, you can adjust any data locations or mappings desired.
Added Prompts In ^SECURITY
When using ^SECURITY to create a new application in the security tables, two new prompts have been added:
These prompts already existed in the management portal, but were missing from the routine. If there are any customer scripts which call ^SECURITY and feed it input, the customer will have to update the script.
Change Default Character Set For 8–Bit Installations
Unicode installations of Caché use UTF-8 encoding for their default page responses while 8–bit Caché installations previously defaulted to using the current locale encoding for CSP pages, e.g. iso-8859-1. As of this release, the default for 8–bit Caché installations will also be UTF-8.
The reason for changing this is due to how CSP form POST and URL encoding works in browsers: all URLs are expected to be UTF-8 encoded and then URL encoded. The server cannot determine if the data comes from a CSP form POST or from a URL link so it cannot correctly convert the data back into characters.
Change Default for CSP Parameter: GZIP Compression
In this version, the default setting for the “GZIP Compression” parameter is now set to “Enabled” for all Application Paths.
Enforce Naming Of All File Types Or Paths Served By CSP
By default, the current CSP Gateway, in the absence of any other configuration directives, will automatically recognize and process files of the following types: “csp”, “cls”, “zen”, “cxw”.
This change enforces a configuration policy through which all files processed by CSP must either be listed in a “CSPFileTypes” directive, or the hosting path enabled using a “CSP On” statement. In previous versions, the above file types were recognized for all web server paths and, as a result, could result in incorrect requests being routed to the CSP engine.
Note:
This applies to Apache v2.0 and later.
Add Specific Permission Requirements For CSP Pages
Using the newly added security parameter, SECURITYRESOURCE, you will need to hold specific permissions to view or execute some system classes, namely:
Class Name Permissions
%Studio.SourceControl.UI %Development:USE
%CSP.StudioTemplateInsert %Development:USE
%CSP.StudioTemplateSuper %Development:USE
%Monitor.Adaptor <empty>; supplied in subclasses
%Monitor.System %Admin_Manage:USE, %Admin_Operate:USE, %Developer:USE
%BI_AnalyzerGrid %BI_LegacyAccess:USE
%BI_CSPsuper %BI_LegacyAccess:USE
%BI_Chart %BI_LegacyAccess:USE
%BI_ChartCus %BI_LegacyAccess:USE
%BI_ChartLgnd %BI_LegacyAccess:USE
%BI_DashboardGrid %BI_LegacyAccess:USE
%BI_EchoClass %BI_LegacyAccess:USE
%BI_ExcelExport %BI_LegacyAccess:USE
%BI_SMSmsg %BI_LegacyAccess:USE
%BI_SVGCtxtMenu %BI_LegacyAccess:USE
%BI_TestSVG %BI_LegacyAccess:USE
%BI_VennSVG %BI_LegacyAccess:USE
%BI_WebChartList %BI_LegacyAccess:USE
%BI_WebCtxtMenu %BI_LegacyAccess:USE
%BI_WebDashboardE %BI_LegacyAccess:USE
%BI_WebEditQueryCom %BI_LegacyAccess:USE
%BI_WebList %BI_LegacyAccess:USE
%BI_WebReporter2 %BI_LegacyAccess:USE
%BI_WebRoleMtns %BI_LegacyAccess:USE
%BI_WebSCMod %BI_LegacyAccess:USE
%BI_WebTranslation %BI_LegacyAccess:USE
%BI_WordExport %BI_LegacyAccess:USE
%BI_webPreference %BI_LegacyAccess:USE
Platform-specific Items
This section holds items of interest to users of specific platforms.
8–Bit Caché Systems Default To UTF8
Previously, all Unicode Caché installations had the default CSP page use UTF-8 encoding, but 8-bit Caché installations used a default of the current locale encoding, for example, ISO-8859-1. In this release, 8-bit Caché installs also use UTF-8.
The reason for changing this is how form POST and URLl encoding works in browsers; all URLs are expected to be UTF-8 encoded and then URLurl encoded. But form POST will encode using the charset of the page before URL encoding the data.
This means the server cannot determine if the data comes from a form POST or from a URL link (at least not consistently due to things like form POST that uses method="get"), so it cannot correctly convert the data back into characters.
Important:
Sites where this is not an issue can restore the previous behavior by issuing the command
Set ^%SYS("CSP", "8BitLocaleCharset") = 1
Windows
Changes To Callin Kernel
If you are upgrading to this version, and have an application that depends on your own linking of the callin kernel, you must change the file, shdir.c, recompile it, and then relink callin in order for that application to execute. Specifically, you must add the statement
const char exeinfo[]="User";
before recompiling. Failure to do so will result in an unresolved symbol, _exeinfo, at link time.
Launcher Now Automatically Starts At End Of Unattended Install
In this release, the “launcher”, csystray.exe (also known as the “cube”) will be started automatically at the end of an unattended installation process. In preceding releases, it had to be started manually.
The old behavior can be restored by setting the newly-added property, ISCSTARTLAUNCHER, to "0" in the unattended install.
UNIX®
CSP Gateway Change
The CSP Gateway installation for Apache on UNIX® now uses the “CSPFileTypes” directive instead of “AddHandler csp-handler-sa” in all places AddHandler was used before. This affects regular UNIX®, CSP Gateway standalone, RPM and DMG installs.
cstat Options Change
Beginning with this release, only the owner of the instance may run cstat specifying -u[1, 2, 4, 8].
SUSE Linux 12 Linker Change Affects Light C++ Binding
A change in the linker on SUSE 12 systems prevents Light C++ binding applications from building. The SUSE 12 linker now requires application makefiles to explicitly specify dependent libraries of other libraries with which they link, even if those other libraries specified the dependent libraries when they were linked. In this case, libcachet.so depends on libpthread.so, so starting with SUSE 12 Linux, both libraries must be explicitly specified. Therefore, one of the following changes is needed to successfully build the application:
  1. Add –lpthread to the library specifications in the ld or g++ command line in the makefile used to build the application. For example, if using a makefile based on one of the Master.mak files installed with Light C++ Binding sample applications, change the line:
    CACHETLIB = -L$(CACHETPATH) -lcachet 
    to
    CACHETLIB = -L$(CACHETPATH) -lcachet –lpthread
  2. Set the environment variable MULTITHREADED to 1 in the environment in which make is invoked. In the Bourne shell, the syntax is:
    export MULTITHREADED=1
Either option resolves the issue; they do not conflict with each other, so both options can be used together.
OpenVMS
REST Services Unavailable
In this release, the support for REST Services announced in the Release Notes is unavailable on OpenVMS. Attempts to use it will result in <UNIMPLEMENTED> errors.
Developers
This section contains information of interest to those who have designed, developed and maintained applications running on prior versions of Caché.
The items listed here are brief descriptions. In most cases, more complete descriptions are available elsewhere in the documentation.
Routine Changes
^MIRROR Interface And Behavioral Changes
Option 2 (“Mirror Management”) of the top-level selections has been enhanced. The new menu choices are:
  1. Add mirrored database
  2. Remove mirrored database
  3. Activate or Catchup mirrored database
  4. Change No Failover State
  5. Try to make this the primary
  6. Connect to Mirror
  7. Disconnect from Mirror
  8. Modify Database Size Field(s)
  9. Force this node to become the primary
  10. Promote Async DR member to Failover member
  11. Demote Backup member to Async DR member
  12. Mark an inactive database as caught up
  13. n/a
  14. Pause dejournaling for a database
Items #1, #2, #3, and #14 now include a multi-selection feature and filtered displays. Items #8 and #12 are enhanced with filtered display only.
The multi-selection feature allows you to select multiple databases from the given list. With a filtered display, only databases that are appropriate for the specified task are displayed, when the user presses “?”. For example, when the user chooses to “add mirrored database”, only journaled and non-mirrored databases are displayed.
^PROFILE Permission Requirements Added
Beginning with this release, any user who desires to run ^PROFILE must be a member of the %All role.
Class Changes
Class Deletions
The following classes were present in the previous version and have been removed in this release
Class Component Deletions
The following class components have been moved or removed in this version from the class where they were previously found.
Class Type Name(s)
%CSP.UI.Portal.Config.Advanced method DrawAfterCreatePage, DrawLocatorExtra, doBrowse, doRemoteBrowse, onPopupAction
parameter PAGENAME
property LocatorParent
%CSP.UI.Portal.Config.AdvancedTable method DrawAfterCreatePage, UpdateDetails, burstUpdateHandler, clearMessage, updateMsg
property ConfigTypes, ConfigValues, SelectedType, SingleSubject
%CSP.UI.Portal.Config.Cluster property Category
%CSP.UI.Portal.Config.Compatibility property Category
%CSP.UI.Portal.Config.Device method DrawAfterCreatePage, GetPropertyList, cancelItem, saveItem
%CSP.UI.Portal.Config.Devices method DrawAfterCreatePage, GetPropertyList, SaveData, UpdateDetails
property SingleSubject
%CSP.UI.Portal.Config.Memory property Category
%CSP.UI.Portal.Config.SQLDataType method UpdateDetails, saveItem
%CSP.UI.Portal.Config.SQLDataTypes method DrawAfterCreatePage
%CSP.UI.Portal.Config.Startup property Category
%CSP.UI.Portal.Config.ValueEditor method saveItem
property pValue
%CSP.UI.Portal.DatabaseTemplate method DisplayError, doClose
%CSP.UI.Portal.Databases method Dismount
%CSP.UI.Portal.Dialog.Compile method updateoptFlags
%CSP.UI.Portal.Dialog.EncAddAdmin method isValid
%CSP.UI.Portal.Dialog.Resource property HasSecurity
%CSP.UI.Portal.Dialog.Service property CSPLink, SERVICENAME, ServicesLink
%CSP.UI.Portal.Dialog.ServiceConnections property SERVICENAME
%CSP.UI.Portal.EncryptionCreate method isValid
%CSP.UI.Portal.EncryptionDatabase method isValid
%CSP.UI.Portal.EncryptionManage property lblClose
%CSP.UI.Portal.EncryptionManaged method isValid
%CSP.UI.Portal.GlobalList property EditGlobalURL
%CSP.UI.Portal.JDBCGatewayServer property LogFile, Port
%CSP.UI.Portal.Journal method cancelItem, doRemoteBrowse, saveItem, valueChanged
property valueModified
%CSP.UI.Portal.License.Utils method EvalResult
%CSP.UI.Portal.Mappings method CreateRS, ExecuteRS, ResetRows, SetTempRow, cancelMapping, editMappingD, editMappingE, saveMapping
property ID1, ID2, changesMade, msgLeavingPage
%CSP.UI.Portal.MemoryStartup property AutoRtnMem, OldAutoMode, OldRtnMem
%CSP.UI.Portal.Mirror.Dialog.SSL method saveSetting
property msgPassword
%CSP.UI.Portal.Mirror.Utils method doClose, onPopupAction, onloadHandler, resetMsg, showMsg
%CSP.UI.Portal.NLS method CopyDescription, ExportDescription
property EditURL, msgConfirmDelete, msgConfirmInstall, msgExportFileName, msgSelectLocale, msgSelectTable, msgSelectTableName
%CSP.UI.Portal.NLSEdit method AddIOTable, DrawHelpText
%CSP.UI.Portal.ObjectGateway method cancelSetting, saveSetting
%CSP.UI.Portal.ObjectGatewayStart method doDone
%CSP.UI.Portal.ObjectGatewayStop method doDone
%CSP.UI.Portal.ObjectSettings method doClose, validate
%CSP.UI.Portal.PKI method doClose, showErrMsg
%CSP.UI.Portal.ProcessDetails property DashboardPage
%CSP.UI.Portal.RemoteDatabases method doNew
%CSP.UI.Portal.SQL.Home method DrawStatementCell
%CSP.UI.Portal.SQL.QButtons.IndexAnalyzer method doGather
%CSP.UI.Portal.SSL method cancelSetting, saveSetting
property msgPage2, msgPage3, msgPassword, msgType0, msgType1
%CSP.UI.Portal.Shadow method cancelItem, doRemoteBrowse, editMapping, saveItem
%CSP.UI.Portal.Shadows property HideColumns
%CSP.UI.Portal.TaskInfo property DashboardPage, currTab
%CSP.UI.Portal.ViewLog property pageURL
%CSP.UI.Portal.X509Credential method cancelSetting, saveSetting
%CSP.UI.Portal.iKnow.Dialog.AddDomainConfig property MaxJobsAllowed
%CSP.UI.Portal.iKnow.Settings property MaxJobsAllowed
%CSP.UI.System.ExpResultPage method MirrorDB
%CSP.UI.System.ExpResultPane method DrawMirrorDB
%CSP.UI.System.SecurityAdvisorPane property ISREADONLY
%CSP.Util.AutoPage method GetEMSDetailPane, GetEMSServerDetailPane, GetEMSTitlePane, GetReadOnlyEMSDetailPane, GetReadOnlyEMSServerDetailPane
%DeepSee.UI.Architect method HasOwner, LastSavedTime
property SavedTime, isLocked, msgLock, msgLock1
%DeepSee.UI.Dialog.PivotEditRule property defRange
%DeepSee.UI.standardPage property isModified
%DeepSee.UserPortal.DashboardViewer property isModified
%FileMan.MappedField property FILE
%FileMan.MappedFile property Classname, FIELDS, FKeys, Indices, MapTimestamp, Maps, SOCClasses, Tablename, Triggers
%SQL.Manager.Catalog method GetCachedQueryInfo, GetCalcTableExtentSize, GetCurrentTableExtentSize, GetTableInfo, SetFieldSelectivity, SetTableExtentSize
property CachedQueryInfo, CachedQueryTable, CachedQueryTree, Constraints, FieldCalcSelectivity, FieldCurrentSelectivity, Fields, Indices, NamespacesWithXdbcErrors, ProcedureInfo, Procedures, ProceduresTree, QueryHistory, RWList, SQLCODEList, Schemas, SchemasOnly, Tables, TablesOnly, TablesTree, Triggers, ViewFields, ViewInfo, ViewInfo2, ViewsOnly, ViewsTree, XdbcErrors
%WebStress.Machines.Generators property SecurityCheck
%ZEN.Component.abstractPage method fireOnLoadEvent
%ZEN.Report.RenderServer method RenderServerExists
property ByRenderServer
%ZEN.Report.reportPage method GenerateStream
%ZEN.SVGComponent.chart method addCommas
%iKnow.Configuration property MaxConceptLength
%iKnow.Queries.SentenceQAPI method GetHighlighted
%iKnow.Queries.SentenceWSAPI method GetHighlighted
%iKnow.UI.AbstractPortal method GetUrlForDomain, updateDomainClient
%iKnow.ont.TableManager method findSUI
Config.Cluster parameter EMSCHANGEBIT
Config.ComPorts parameter EMSCHANGEBIT
Config.ConfigFile parameter EMSCHANGEBIT
Config.Conversions parameter EMSCHANGEBIT
Config.Databases parameter EMSCHANGEBIT
Config.Debug parameter EMSCHANGEBIT
Config.DeviceSubTypes parameter EMSCHANGEBIT
Config.Devices parameter EMSCHANGEBIT
Config.ECP parameter EMSCHANGEBIT
Config.ECPServers parameter EMSCHANGEBIT
Config.IO parameter EMSCHANGEBIT
Config.Journal parameter EMSCHANGEBIT
Config.LicenseServers parameter EMSCHANGEBIT
Config.MagTapes parameter EMSCHANGEBIT
Config.MapGlobals parameter EMSCHANGEBIT
Config.MapMirrors parameter EMSCHANGEBIT
Config.MapPackages parameter EMSCHANGEBIT
Config.MapRoutines parameter EMSCHANGEBIT
Config.MapShadows parameter EMSCHANGEBIT
Config.MirrorAsyncMemberAuthorizedIDs parameter EMSCHANGEBIT
Config.MirrorAsyncMemberSources parameter EMSCHANGEBIT
Config.MirrorMember parameter EMSCHANGEBIT
Config.Mirrors parameter EMSCHANGEBIT
Config.Miscellaneous parameter EMSCHANGEBIT
Config.Monitor parameter EMSCHANGEBIT
Config.NLS.Locales parameter EMSCHANGEBIT
Config.NLS.SubTables parameter EMSCHANGEBIT
Config.NLS.Tables parameter EMSCHANGEBIT
Config.Namespaces parameter EMSCHANGEBIT
Config.SQL parameter EMSCHANGEBIT
Config.Shadows parameter EMSCHANGEBIT
Config.SqlSysDatatypes parameter EMSCHANGEBIT
Config.SqlUserDatatypes parameter EMSCHANGEBIT
Config.Startup parameter EMSCHANGEBIT
Config.Telnet parameter EMSCHANGEBIT
Config.config parameter EMSCHANGEBIT
Ens.Enterprise.Portal.MsgBankViewer parameter SessionTraceColumn
Journal.Restore method Monitor
SYS.Database method FileCompactUpdateBSB, IntegrityClose, IntegrityExecute, IntegrityFetch
SYS.Mirror method GetFailoverMemberStatusEMS
Security.SSLConfigs property ListEMS
Method Return Changes
The following methods have different return values in this version of Caché:
Method Signature Changes
The following methods have different signatures in this version of Caché:
Class Name Method Name(s)
%CPT.JS.BuildCPT %OnNew
%CSP.Page EscapeURL, UnescapeURL
%CSP.UI.Portal.Config.ValueEditor DrawAfterCreatePage, SaveData
%CSP.UI.Portal.DatabaseFreespaceCompact GetFreeSpace, validate
%CSP.UI.Portal.Databases filterChanged
%CSP.UI.Portal.Dialog.Compile updateFlags
%CSP.UI.Portal.Dialog.DBActions Mount
%CSP.UI.Portal.Dialog.DBMirrorAdd SaveDataMulti
%CSP.UI.Portal.Dialog.LicenseActivate Activate, DrawCurrent, PrepareActivate
%CSP.UI.Portal.Dialog.Resource SaveData
%CSP.UI.Portal.Dialog.SQLView SaveData
%CSP.UI.Portal.Dialog.Service SaveData
%CSP.UI.Portal.Dialog.ServiceConnections AddIP
%CSP.UI.Portal.EMS InitializeForm
%CSP.UI.Portal.EncryptionCreate SaveData
%CSP.UI.Portal.EncryptionDatabase ActivateKey, DeactivateKey, SaveStartup, doDeactivate
%CSP.UI.Portal.JDBCGatewayServer SaveJDBCSettings
%CSP.UI.Portal.Journal SaveData, doBrowse
%CSP.UI.Portal.License.Utils DrawLicense
%CSP.UI.Portal.Mappings CancelChanges, DeleteItem, Init, SaveChanges, editMapping
%CSP.UI.Portal.Mirror.JoinAsync validateConnect
%CSP.UI.Portal.Mirror.JoinFailover validateConnect
%CSP.UI.Portal.NLS CopyNow, DeleteNow, GetLocaleDesc, GetLocaleDescription, ReloadDefault, changedDefault, changedLocale, tablenameChanged, tabletypeChanged
%CSP.UI.Portal.NLSEdit ArrayToString, DrawIntTables, RemoveIOTables, SaveBasics, SaveFormats, SaveIODefaults, SaveIOTables, SaveIntTables, SaveInternalDefaults, SaveStrings
%CSP.UI.Portal.Resources Delete
%CSP.UI.Portal.SQL.Home GetCQs, SaveFilter, prepareProp
%CSP.UI.Portal.SQL.QButtons.IndexAnalyzer PrepareAnalysis
%CSP.UI.Portal.SQL.QButtons.RuntimeStats PrepareShowPlan
%CSP.UI.Portal.SQL.Utils SQLExecuteQuery
%CSP.UI.Portal.Shadow DeleteMap, SaveData
%CSP.UI.Portal.Shadows DeleteData, deleteItem
%CSP.UI.Portal.Template showMsg, validateRequired
%CSP.UI.Portal.X509Credential SaveData
%CSP.UI.Portal.iKnow.Dialog.AddDomainConfig SaveDomain
%CSP.UI.System.ExpResultPage CopyMapsFrom
%Collection.ListOfDT DisplayToLogical, LogicalToDisplay
%Collection.MV.ListOfDT DisplayToLogical, LogicalToDisplay
%DeepSee.Component.pivotTable %CreateResultSet, GetItemSpec, allClick, allClickPivot, cbClick, cbClickPivot, getFilterForCells, getLabel, startQueryTimer
%DeepSee.Component.searchBox dateFromHorolog
%DeepSee.Dashboard.Utils %GetMemberDimensionType
%DeepSee.Query.query %LookupCalculatedMember
%DeepSee.Report.UI.reportPreviewer GenerateDataSet, GeneratePresentationReport
%DeepSee.ResultSet %PrepareMDX
%DeepSee.TaskMaster %DequeueTask, %ExecuteTask, %QueueTask
%DeepSee.UI.Dialog.CubeBuild BuildCube
%DeepSee.UI.Dialog.FieldList GetSQLNames
%DeepSee.UserLibrary.Utils %Import
%DeepSee.UserPortal.DashboardViewer dashboardEventHandler
%DeepSee.UserPortal.standardPage updateCompanyCell
%DeepSee.Utils %ProcessFact
%Library.CacheCollection CollectionToDisplay, DisplayToCollection
%Library.IProcedureContext %Next
%Library.Persistent %OnBeforeBuildIndices, %OnBeforePurgeIndices
%Library.RoutineMgr getUserDocument
%SYS.Journal.File GetPrev
%SYSTEM.iKnow CreateDomainTables
%Studio.SourceControl.ISC BaselineExport, BaselineExportItem
%Studio.SourceControl.Interface SourceControlClassGet, SourceControlClassSet, SourceControlCreate
%WebStress.Record Run
%XML.Node ReplaceElement
%XML.SAX.Parser ParseStream
%ZEN.Auxiliary.jsonProvider submitContent
%ZEN.Component.tablePane showDateSelector
%ZEN.Report.Display.COSChart.cchart getSelectedStyle, getXLabelText, getYLabelText
%ZEN.Report.group DumpCalls, GetXMLFromCall
%ZEN.SVGComponent.chart getSelectedStyle, getXLabelText, getYLabelText, setProperty
%ZEN.Utils %GetIncludeDirectory, %GetPhysicalIncludeDirectory, %GetUserIncludeDirectory
%iKnow.DeepSee.BaseKPI BuildCurrentFilter, BuildCurrentFilterStatic
%iKnow.Matching.DictionaryAPI GetItemCount
%iKnow.Metrics.MetricAPI GetValue
%iKnow.Metrics.MetricQAPI GetValue
%iKnow.Metrics.MetricWSAPI GetValue
%iKnow.Queries.EntityQAPI GetOccurrenceCountByDomain, IsAttributed
%iKnow.Queries.MetadataQAPI GetMetaSpreadByEntities, GetMetaSpreadByEntityIds, GetMetaSpreadInternal
%iKnow.UI.LoadingWizard CreateConfig
%iKnow.ont.Matcher BestMatch, getSynonyms
%iKnow.ont.Matcher2 findPartialMatch
Ens.Host OnGetConnections
Ens.Rule.Upgrade ConvertOne
Ens.Rule.Utils GetPropertyTree
Security.Users Create
%Library.Persistent Defines New Trigger Names
The class, %Library.Persistent, now defines three new trigger names: %OBJJRNIU, %OBJJRND, and %OBJGUID.
Previously, these triggers were generated during class compilation and were similarly named, but the compiler took steps to avoid name collisions. Now, the new trigger names are statically defined; if they conflict with user-defined names, the names in the applications must be changed.
Single-Property Key Index Correction
A change introduced in version 2011.1 caused the value stored in a key index to contain only the ID value; the value should have contained the ID value and the value of %%CLASSNAME. In this release, the error is now fixed, but all affected classes must be recompiled and their indexes rebuilt.
The list of indexes impacted by this bug can be produced by running this query:
SELECT
    ci.parent, ci.name
FROM
    %Dictionary.CompiledIndex AS ci
JOIN
    %Dictionary.CompiledIndex AS oi
    ON
        oi.parent=ci.origin
        AND
         oi.name=ci.name
    WHERE
        oi.idkey <> 1
        AND
        ci.type = 'key'
        AND
        NOT
            (oi.parent->final = 1 AND oi.parent->super %STARTSWITH '%Library.Persistent')
        AND
            (
                SELECT count(*)
                FROM %Dictionary.CompiledIndexProperty
                WHERE parent = oi.%ID
            )
            = 1
This query will produce one row for each index in each of the classes where it is inherited, starting with the first class that extends %Library.Persistent. It is only necessary to rebuild the index in the first class in a class hierarchy as that will automatically force rebuilding in subclasses.
Add Certificate And DNS Name Checking To %Net.HttpRequest
In this version, when connecting to a SSL/TLS secured web server, the %Net.HttpRequest class will default to checking that the certificate server name matches the DNS name. This is part of RFC 2818, and is used to prevent “man-in-the-middle” attacks. This change can, however, result in a situation where the connection attempt reports errors connecting to a server that previously had been accessed successfully.
Note:
This checking can be disabled by setting the SSLCheckServerIdentity property to zero.
%SYS.PTools.SQLStats.Export() Changes
In this release, the format of the file written by this class has changed, specifically,
Update %SYS.Task To Permit Activity By Async Mirror Members
In prior releases, the MirrorStatus property in %SYS.Task did not allow async mirror members to run Tasks. In this release, the meaning of the 3 status options has been changed to:
  1. Primary
  2. Non-Primary
  3. Any
This allows async (and backup) members to run tasks under option 2 or 3.
Change To Interpretation of REQUIRED & IDENTITY
In previous versions, an attempt to store a class with a property whose definition included both REQUIRED and IDENTITY would not succeed if the user did not define a value for the property. This is no longer true beginning with this release.
Now, Caché will assign a value automatically if no value is provided. The assignment happens during INSERT and the IDENTITY property cannot be changed after that time. This automatic value assignment satisfies the REQUIRED constraint so the compiler will no longer check the REQUIRED (NOT NULL) constraint for the IDENTITY property.
It is unusual for both IDENTITY and REQUIRED to be true for the same property but some SQL migrations include a NOT NULL constraint on the IDENTITY property. In this case, the new behavior now allows objects whose IDENTITY property has not yet been assigned to pass validation successfully; the old behavior would cause %ValidateObject to fail, even though a valid value would be assigned when the object is saved.
Journal.Restore.Monitor() Removed
The Monitor method of the Journal.Restore class should no longer be used. Instead, applications should call MONITOR^JRNRESTF() instead.
Class Compiler Changes
This version of Caché continues the work begun in earlier releases of improving the class compiler. The changes that may require changes to applications are detailed in this section.
REQUIRED Constraint Now Fully Enforced
REQUIRED constraints on serial objects are now enforced. Any property whose type class is a %Library.SerialObject and is defined as REQUIRED will fail to save if that property is null. Prior to this change REQUIRED constraints on such properties were not enforced.
This change can also cause objects that once saved to no longer save without error if the referenced serial object is modified or swizzled.
New Class Parameter Added
Beginning with this release, Caché will add a new class property when a class is compiled. The parameter is named %RandomSig and consists of a 20-byte random value recomputed on every class compile.
Always Rerun Parameter Generator Methods In Subclasses
You can define a parameter to be an expression evaluated at compile time of the class using syntax like this:
Parameter CompileTime = { $HOROLOG };
This will insert the $HOROLOG value into the parameter when the class is compiled. However, if you create a subclass and compile this, Caché was just inheriting the superclasses parameter value rather than rerunning the expression generator code and inserting the $HOROLOG value of the subclass compile. Method generators are always rerun on subclasses and now expression generators are as well.
Maximum Limit On Index Name
Beginning in this release, the maximum length of an index name is 170 minus the length of the fully-qualified class name.
Language Binding Changes
Add Support For Named Parameters In .NET CacheProvider
This release adds support for the use of named parameters in SQL statements SELECT, INSERT, UPDATE and DELETE. Named parameters are now identified by having “@” as a prefix for the parameter name. The “@” is used in both the statement and to create the named parameter.
Named parameters do not need to be added to the CacheParameterCollection in any particular order. When a Prepare(), ExecuteReader(), ExecuteNonQuery(), the @Parameternames in the statement are identified. They must be defined by the time the statement is executed. For example,
Set SELECT = "SELECT *"
Set FROM = "FROM Sample.Person"
Set WHERE = "WHERE  id<@highnumber and id>@lownumber and id=@number"
CacheCommand cmd = new CacheCommand((SELECT _ FROM _ WHERE), conn);

 cmd.Parameters.Add(new CacheParameter("@LowNumber", 2));
 cmd.Parameters.Add(new CacheParameter("@Number", 6));
 cmd.Parameters.Add(new CacheParameter("@HighNumber", 9));

 CacheDataReader reader = cmd.ExecuteReader();
Note:
This change should have no effect on applications unless they were using an “@” parameter name in their queries; these are now reserved for named parameter use.
CacheActiveX Uses Server Locale For BSTR Conversions
In prior releases, conversions involving BSTRs (Basic, or Binary STRings) used the locale of the thread doing the conversion. Now it uses the locale of the server.
TCP/IP Connections Now Uses Connection Timeout
In prior versions, the initial attempt to establish a TCP/IP connection used a timeout of 30 seconds, regardless of the value of ConnectionTimeout. This release changes that behavior to use the value specified by ConnectionTimeout.
SQL Changes
Change Handling Of SQLCODE And %msg In Dynamic SQL
The local variable, SQLCODE, is used to report the status of executing an SQL statement. When a dynamic statement is prepared, this local variable was inadvertently being set by %Prepare. The correct way for %Prepare is to report its result is to return a %Status value. In this release, SQLCODE is not changed by %Prepare and the only indication of success or failure is the returned %Status value.
Note:
In addition to %Prepare, %SQL.Statement supports prepare(). The prepare() method can be called directly by the user. It accepts the same arguments as %Prepare but instead of reporting a %Status value, prepare() will throw an exception if an error is encountered. The exception object can report the status as an SQLCODE value.
Changes To SQL Privilege Handling For Mapped Tables (Classes)
When an SQL table is created, the owner is automatically granted all permissions on the table. Previously, however, if that table was mapped to multiple namespaces those permissions were not propagated to the other namespaces. Similarly, the deletion of a table did not remove the permissions in the other namespaces where the table was mapped.
This release corrects both of those issues: the owner has all SQL permissions in each namespace to which the table is mapped; and, those permissions are removed in each namespace when the table is deleted.
Change To Calling SQL Function In SQL Statement
User-defined SQL functions called from SQL statements are now executed from within try/catch constructs. If the function encounters an error, it will reported as the new SQL error code: -149, “SQL Function encountered an error”. In this instance, the variable %msg will contain information regarding the error encountered in the SQL Function.
Changes To Selectivity Processing To Handle Outliers
Tunetable now looks for the case where a field value occurs much more frequently than other field values. In such cases, a separate selectivity will be computed for this value, along with a selectivity for “typical” values.
The default selectivity is always used for construction of the query plan unless consideration of the outlier value is requested. If the outlier value is not NULL, (for example, a Massachusetts company with many records containing 'MA'), then in some cases it will be necessary to suppress literal substitution to inform the query processor that the outlier value should be considered. To do this, put the outlier value in double parentheses (('MA')) when used in the Where clause. This syntax is necessary for Dynamic Queries, and for queries written outside of Caché that are sent in using ODBC/JDBC. It is not necessary for class queries, embedded SQL, or queries in a view.
Note:
There may be some significant changes in selectivity, producing changes in plans. Despite this net benefit, some applications may need to override the default plans or use hints to get desired plans.
Corrections To ROUND With Scaling Factor Of Zero
In prior versions, SQL columns computing the ROUND function with a SCALE of 0 would not produce the correct SCALE value when the ROUND column came from a subquery or view and the query was run in DISPLAY mode. For example,
SELECT a FROM (SELECT {fn ROUND(Age, 0)} a FROM Sample.Person)
would return a value with a scale of 2 instead of 0 when selected in DISPLAY mode.
Change To LISTBUILD Function
The SQL $LISTBUILD function has been changed so it is now compatible with the Objectscript $LISTBUILD function, especially where null arguments are involved. For example, the SQL phrase
SELECT $LISTBUILD('a',,,,) ...
where the last element was empty previously produced a list of 4 elements. Now it correctly results ina 5-element list. Similarly, the phrase
SELECT $LISTBUILD(1,) ...
previously produced a 2-element list equivalent to the Objectscript function
$LISTBUILD(1, "")
while now it correctly results in a list with a NULL second element.
Caution:
Applications that depend on the specific formats of lists with missing or null elements may have to be changed.
Dynamic SQL Now Updates %SQLCODE
The result of successfully executing a CALL statement is a special dynamic statement result object referred to as the “context object”. The context object has two implicit properties: one is the result set sequence (RSS); the other is the implied cursor.
If the called procedure did not return any result sets, then the RSS is empty; invoking %Next() will simply return 0. If there is at least one result set in the RSS, the first call to %Next() will cause the first result set in the RSS to be bound to the implied cursor and the first row from that result set will be retrieved. If no rows are found then %Next() simply returns 0 and %SQLCODE will be 100.
Since accessing the implied procedure cursor sets the value of %SQLCODE and %Message it is important that the caller check %SQLCODE for an error condition after executing the call statement and before accessing the RSS. If an error is reported by the CALL then it is up to the user to decide whether or not to continue processing any result sets that might be in the RSS.
%TSQL.Manager Deprecated
Beginning with this version, %TSQL.Manager is deprecated, and will be removed in some future release. Files containing TSQL statements can be run using DDLImport() method of the %SYSTEM.SQL class or the SQL Shell.
iKnow Changes
Move System-Level Defaults To Namespace Level
From this release onward, the scope of system-level defaults move to the namespace level. “System-wide” parameters defined in prior releases will be re-registered in all namespaces containing iKnow data when upgraded to this release. Namespaces without iKnow data at the time of upgrade and namespaces created afterwards now need parameter defaults set manually (see %iKnow.Domain.SetParameter and %iKnow.Domain.GetParameter).
Important:
An upgrade overwrites the SAMPLES namespace which by default does not contain iKnow domains. Therefore, former system-level defaults will not be registered as namespace-level defaults in SAMPLES.
Standardize Case-Sensitivity Of Element Names
This release makes most of the element names used by iKnow case-insensitive. In previous releases, the names used for Domains, Configurations, and User Dictionaries were insensitive to case. Now the names for Matching Dictionaries, Metrics, Blacklists, and Metadata fields are also.
This leaves only “external” references – Dictionary Item URIs and external ID components (group name and local reference) – as the only "names" still case-sensitive. This is because these names may be driven by external naming conventions.
Compatibility with prior versions and upgrading from these should not result in any issues, unless multiple elements within the same domain had names that only differed in capitalization.
Web Services And SOAP Changes
Web Service Test Page Requires %Development Resource
Beginning in this release, the web service test page requires %Development:Use resource to run.
XML Schema Reader And WSDL Reader Support 189-Character Properties
In this release, the maximum length of property name supported by Caché is extended to 180 characters; preiously, it had been 32. This means that running the wizard for an XSD with type and/or element names longer than 32 characters will result in different property names than the earlier run.
Note:
Note that property names used as arguments are still restricted to 31 characters because of the Caché limit of 31 characters for variable names.
Changes In Handling Aggregates in DeepSee and Zen Reporting
In previous releases, when the runtime mode was “display” (the default), the XML data returned from a query would be formatted according to the locale. However, when a Zen or DeepSee Report employed aggregates, the calculation of these aggregates used operators that assumed the data was in US-English format. This produced unexpected results. For example, 1,23 and 1,31 when summed in a European locale would produce 2.
Now the calculation of aggregates is locale-sensitive. Assume the locale is a European one; when the run time mode is display, the "numbers" will first be translated to "US-English" format, so they will work in the arithmetic calculations that use Caché arithmetic operators. When the calculations complete, the results will be translated back to the European format.
Note:
Only aggregates, their display and calculation are affected by this change. It is highly unlikely that applications exist which depend on the previous behavior. Nonetheless, it is an incompatible change.
MultiValue Changes
Improved Management Of CHAINed Stack
In prior versions, procs that called MVBasic programs that themselves CHAINed procs would leave the prior proc context on the stack. This was an incompatibility with legacy systems. If the call tree was deep enough, this would eventually cause an abort with a stack full. This version detects that condition and removes the prior proc context.
The goal is to allow only one level of proc execution at each execute level to replicate the behavior on legacy systems. However, there are situations when procs are mixed with paragraphs were this is not practical and the layer will not be removed.
Customer who have written their applications to take advantage of the previous behavior will see failures in this version.
MV Spooler Change For SP-FQDELETE And SP-START
If you run SP-FQDELETE or SP-START on a printer form queue, and that form queue already has a lock on it (implying a despool process is active), then the new message will be similar to
[882] Error. Unable to take a lock on form queue 'QNAME'.
There appears to be a lock already set by process id 14032.
You need to stop the form queue before you can perform this operation.
So if you are testing for the success or failure of SP-START or SP-FQDELETE by doing EXECUTE ... CAPTURING, then the screen output that is captured might differ from what was presented in prior releases.
BASIC And MVBASIC Changes
$DEFINE And EQUATE No Longer Apply To Global Names
The preprocessor can not distinguish between a global name and an exponentiation operator with no white space before the exponent. Thus, beginning in this release, no substitution will be done for the exponent local variable in this example:
EQU FOO TO EXP
CRT NUM^FOO
To get substitution, there must be white space after the operator, such as in
EQU FOO TO EXP
CRT NUM^  FOO
Note:
An alternaitve is to use the “**” operator for exponentiation instead of the “^” operator.
SELECT File With FSELECT Copies File
Anyone using UniData emulation or the FSELECT option who also depends on the
SELECT <filevar>
statement NOT copying the <filevar> contents when the Select List is created will see a change in behavior.
Previously, when the MVBasic compiler translates a “SELECT <filevar>” statement, the newly created Select List is a direct reference to the file variable and does not contain a copy of the file contents. Any write to <filevar> will immediately change the contents of the previously selected Select List. This does not happen for a “SSELECT <filevar>” where the newly created, sorted Select List contains a copy of the indices from the file referenced by <filevar>.
In this new release, a “SELECT <filevar>” statement with $OPTIONS FSELECT turned on will create a Select List containing a copy of indices in the referenced file. Change to the <filevar> file contents will not affect a previously selected Select List of that file providing $OPTIONS FSELECT was enabled when the SELECT statement was compiled. The UniData emulation mode enables FSELECT by default, but all other emulations default to FSELECT being disabled.
To restore the previous behavior, execute a “$OPTIONS -FSELECT” statement in the routine containing the SELECT statement.
Check For Duplicate GLOBAL Symbols
Previously, the MVBasic compiler allowed a name to be defined more than once in the same DIM statement. Now such statement will generate a compile-time error message and the redundant symbol definition must be removed from the DIM statement.
Note:
The compiler does allow a name to be defined more than once in separate DIM statements providing the name as never been defined in a global scope (such as a COMMON name.)
Additional Error Return: <ROUTINE TOO COMPLEX>
It is possible that complexity of the source program exceeds the space in preallocated stacks internal to the compiler. Previously, these compilations gave a <STACK> error. In order to better explain these compilation failures the compiler will now give the <ROUTINE TOO COMPLEX> error and it will also report the source line being processed when the excessive complexity was detected.
Anyone who might be detecting the ERASTACK value in the error parameter returned from $COMPILE may now have to instead look for the ERTOOCOMPLEX value in order to detect a too complex compilation. If $COMPILE is called without an error parameter then ERASTACK is still signaled.
xDBC Changes
Null Columns Now Report Length And Precision As 1 Instead of 0
Caché now reports a precision and length of 1 for a NULL literal column to xDBC for the column metadata. Previously, Caché reported the length/precision as 0, but that caused issues with at least one client application.
Automatic Conversion Of Long Strings To Streams Removed
It previous versions, applications could ask that literal strings longer than 16K to be automatically converted to character streams. While this supported INSERTs and UPDATEs, queries never supported streams in this way for literal values.
Now that Caché supports long strings in ODBC, the previous functionality is no longer needed. Applications that need to support huge literal string values in SQL statements should make sure that Caché has long strings turned on.
DeepSee Changes
Change to MDX Functions When Referring to Date-Part-Based Levels
This release changes the behavior of PREVMEMBER, NEXTMEMBER, and other functions when they are used with members of levels that are based on date parts. As background, there are two general kinds of time levels:
For date-part-based levels, the level has a fixed number of members (January to December, for example). When used with a member at the start or end of this set, a function such as PREVMEMBER now returns null. For example:
SELECT [BirthD].[January].PREVMEMBER ON 1 FROM patients


                                          *
This result is correct, because the January member refers to records related to January in all years, and it is not meaningful to access records “earlier” than that.
In previous releases, the engine would have returned the records for December.
Change to PREVMEMBER and NEXTMEMBER Functions When Referring to Null Members
This release changes the behavior of PREVMEMBER and NEXTMEMBER so that these functions now return null when used with the null member of a level.
In previous releases, in both cases, the engine would have returned the records for the first non-null member of the same parent.
Editing Quality Measure Requires IE9
Beginning with this release, if the user chooses to edit the Quality Measures of DeepSee Tools using Internet Explorer, a version at or above IE9 is required.
Cube Manager Package Name Changed
This release changes the package name of the DeepSee cube manager from DeepSee.CubeMgr to DeepSee.CubeManager. Existing applications that reference classes in this package will need to be changed.
Visual Report Security Checks
In this version, specifying data sources now requires both the proper license and %Development:USE privilege. In addition, formating a DeepSee Visual Report requires both the proper license and %Deepsee_ReportBuilder:USE privilege.
Import Restriction On Legacy Zen Reports
In this release, you can only import data schema from a legacy Zen Report if that reportdefinition section <group> definition tags. Report definitions lacking <group> tags (such as those that use <call> or COS callbacks to gather their data) do not provide the information needed for DeepSee Visual Report to interface properly to the report, and are not suitable sources for this particular data collection builder screen.
Zen Report Variable Substitution Disallowed
Zen reports follows the convention of question marks used as placeholders in SQL WHERE clauses for parameters to be mapped later. DeepSee Visual Report uses #(expression)# syntax to inject the parameters directly into the clause (this is done to simplify the visual editor and hide the syntax structure of the underlying XData).
Starting in this release, DeepSee Visual Report both blocks the entry of the question mark as a keystroke as it is being entered and pops up an alert box suggesting the use of the #( )# syntax.
CSP Changes
CSP Session Support For REST
By default, the REST support introduced in this version takes out a license slot per request. This means that if you have a low license count (or no license), you are limited by the CSP grace period of 5 seconds. If you run out of license units, you will get a 503 HTTP response. You can avoid this by using CSP sessions, even though this (strictly speaking) violates the spirit of REST.
You enable CSP sessions by setting the UseSession parameter to 1 in your class definition and recompiling. The server will generate the CSPSESSION cookie and expects it to be returned in subsequent requests. This means you have to manage the CSPSESSION cookie manually if not using a browser. Tools such as CURL provide that facility with command line parameters but its also manageable in code.
Important:
The name of the parameter which affects CSP session use has changed from EndSession to UseSession and its sense has changed as well; specify 1 to use sessions, and 0 to not.
New SECURITYRESOURCE Parameter Added
In this release, the %CSP.Page class defines a new parameter called SECURITYRESOURCE. This is a comma-delimited list of system resources and associated permissions. A user must hold the specified permissions on all of the specified resources in order to view this page or invoke any of its server-side methods from the client. The format of each item in the list is:
Resource[:Permission]
Permission is optional, and defaults to USE if not supplied. If it is supplied, it should be one of USE, READ or WRITE.
You can also specify OR grouping using the “|”character, so “R1,R2|R3,R3|R4” means you must have resource R1, and one of R2 or R3, and one of R3 or R4. So if you have R1,R3 it will pass, if you have R1,R4 it will not as it does not meet the R2|R3 condition. (The “|” (or) condition takes precedence over the “,” (and) condition.
Do Not Store Cookies With Long Names
If the browser sends over an invalid cookie value where the key name is longer than 510 characters, Caché will skip attempting to set this into the %request.Cookies array because the array cannot handle subscript lengths this long.
Variables Used In OnSessionStart CSP Session Event Callback
In a prior release, the CSP event callback logic was changed and all session event callbacks protected any variables the user created in the callback were cleaned up to avoid exposing them in the main page logic. This change of behavior on OnStartSession callback affected several existing applications.
In this release, the previous behavior can be enabled by
Do $SYSTEM.CSP.SetConfig("ProtectOnStartSessionCallback", 0)
which will turn off the exclusive NEW in the OnStartSession event callback so public variables set here can be seen in the CSP page code.
Zen Changes
Changes To tablePane Component Functionality
If your application uses Zen components that generate queries (anything that inherits from querySource, such as tablePane) and you have not set up SQL privileges on your system, then it is possible for a client application to generate a query from the wrong table. This is now prevented by setting ZENENCRYPT=1 for the tableName property of the querySource class. This causes the table name to be encrypted when shipped to the client and prevents the client from modifying it.
Applications that rely on setting the tableName property in JavaScript will no longer work and will throw an <ENCRYPT> or similar error. The showQuery property, a diagnostic aid for displaying the current query, in tablePane and dataCombo is also now encrypted.
Additional Zen Component Security Changes
To further secure the queries automatically generated by Zen components, such as tablePane and dataCombo, Zen now prevents client logic from modifying generated queries in undesirable ways.
Empty Cell Values No Longer Show Default Value
Cells that have no value no longer default to using the ChoiceColumn value; empty fields are now left blank. Their display is controlled by the value of the Zen dataCombo attribute, “showEmpty”.
Zen Reports Changes
Class Attributes Inherited By Child Table Elements
In this release, table elements such as <tr>, <th> and <td> now inherit the class attribute values from their containing element. In previous release, the attribute values were ignored.