MINI MINI MANI MO
<?xml version="1.0"?>
<!--
Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
NAME
kustbls.xsl
DESCRIPTION
Convert mdapi TABLESPACE_T document to TABLESPACE document (SXML)
MODIFIED MM/DD/YY
tbhukya 05/26/17 - Bug 26075370:lost write protection in undo tablespace
jjanosik 05/05/17 - Bug 25239237: handle suspend lost write protection
jjanosik 03/20/17 - Bug 25238495: fix encryption check
tbhukya 02/03/17 - Bug 25468408: Double quote tablespace group name
tbhukya 01/13/17 - Bug 25372491: encryption for tablespace converted
from offline to online
drosash 05/12/16 - Bug 23245222: change RIM for LEAF
tbhukya 12/24/15 - RTI 18868579: Use CellMemory
tbhukya 11/10/15 - Bug 21747321: Add element TFSTATUS
tbhukya 09/22/15 - Bug 21816026: Offline shadow, undo tablespace
tbhukya 09/08/15 - Bug 21769074: Support encryption with temp,
undo tablespaces
tbhukya 08/04/15 - Rti 17738685: Use FLAGS2 for lost write protection
rapayne 06/02/15 - Bug 21147617: extended inMemory DISTRIBUTE support
to include FOR SERVICE attribute.
tbhukya 05/11/15 - Bug 20980538: Add LOST_WRITE_PROTECTION element
rapayne 02/20/15 - local temporary tblsp support.
rapayne 02/20/14 - bug 18155007: add INMEMORY support.
rapayne 06/15/11 - lrg 5665517: fix xmlns violation.
rapayne 10/24/09 - bug 8714709: add READ_ONLY and ENCRYPT nodes if applicable.
lbarton 07/10/09 - bug 8494344: archive compression
lbarton 01/17/08 - Bug 6724820: table compression
lbarton 11/29/06 - fix IS_OMF test
lbarton 02/20/06 - bug 4752442: BIGFILE
htseng 24/10/05 - fix MINIMUM_EXTENT
sdavidso 08/29/05 - handle OMF datafiles in tablespaces
remove non-functional REUSE handling
htseng 25/01/05 - Initial version
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://xmlns.oracle.com/ku">
<!-- Top level imports -->
<xsl:import href="kusstorg.xsl"/>
<xsl:import href="kuscommc.xsl"/>
<!-- Top-level parameters -->
<xsl:param name="SEGMENT_ATTRIBUTES">1</xsl:param>
<xsl:param name="STORAGE">1</xsl:param>
<xsl:param name="VERSION">9999999999</xsl:param>
<!-- *******************************************************************
Template: TABLESPACE_T - top-level template for TABLESPACE.
This template puts out
- the opening TABLESPACE element (with xmlns and version attributes)
- optional BIGFILE element
- TYPE element
- NAME element
- datafile list
then calls one of
- DoUndoTS
- DoPermanentTS
- DoTemporaryTS
******************************************************************** -->
<xsl:template match="TABLESPACE_T">
<xsl:element name="TABLESPACE" namespace="http://xmlns.oracle.com/ku">
<xsl:attribute name="version">1.0</xsl:attribute>
<xsl:if test="(FLAGS mod 512)>=256">
<xsl:element name="BIGFILE"/>
</xsl:if>
<xsl:variable name="BigFile" select="(FLAGS mod 512)>=256"/>
<xsl:variable name="LWProtect" select="(FLAGS2 mod 2097152) >= 1048576"/>
<xsl:choose>
<xsl:when test="CONTENTS = 0">
<xsl:choose>
<xsl:when test="(FLAGS mod 32) >= 16">
<xsl:element name="TYPE">UNDO</xsl:element>
<xsl:call-template name="TSName"/>
<xsl:call-template name="DatafileList">
<xsl:with-param name="BlkSize" select="BLOCKSIZE"/>
</xsl:call-template>
<xsl:call-template name="DoUndoTS">
<xsl:with-param name="BlkSize" select="BLOCKSIZE"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:element name="TYPE">PERMANENT</xsl:element>
<xsl:call-template name="TSName"/>
<xsl:call-template name="DatafileList">
<xsl:with-param name="BlkSize" select="BLOCKSIZE"/>
<xsl:with-param name="BigFile" select="$BigFile"/>
</xsl:call-template>
<xsl:choose>
<!-- Generate lost write protection for a bigfile tablespace-->
<xsl:when test="$BigFile=1 and $LWProtect=1">
<xsl:if test="STATUS = 2">
<xsl:element name="OFFLINE"/>
</xsl:if>
<xsl:element name="LOST_WRITE_PROTECTION"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="DoPermanentTS">
<xsl:with-param name="BlkSize" select="BLOCKSIZE"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:element name="TYPE">TEMPORARY</xsl:element>
<!-- LOCAL TEMPORARY tablespace flags are defined in ktt3.h -->
<!-- Define a quick flag to designate Local Temp Tblsp type if
applicable:
0 - not a local temp tbsp
1 - FOR ALL
2 - FOR LEAF
-->
<xsl:variable name="LTT_type">
<xsl:choose>
<xsl:when test="FLAGS2 and
((FLAGS2 mod (4194304*2))>=4194304)">1</xsl:when>
<xsl:when test="FLAGS2 and
((FLAGS2 mod (32768*2))>=32768)">2</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$VERSION>=1202000000 and FLAGS2 and
(FLAGS2 mod 65536)>=32768">
<xsl:element name="LOCAL">
<xsl:choose>
<xsl:when test="$LTT_type=1">ALL</xsl:when>
<xsl:when test="$LTT_type=2">LEAF</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:if>
<xsl:call-template name="TSName"/>
<xsl:if test="$LTT_type !=2">
<xsl:call-template name="DatafileList">
<xsl:with-param name="BlkSize" select="BLOCKSIZE"/>
<xsl:with-param name="BigFile" select="$BigFile"/>
</xsl:call-template>
</xsl:if>
<xsl:call-template name="DoTemporaryTS">
<xsl:with-param name="BlkSize" select="BLOCKSIZE"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<!-- *******************************************************************
Template: TSName - emit tablespace name
Current node: TABLESPACE_T
******************************************************************** -->
<xsl:template name="TSName">
<xsl:element name="NAME">
<xsl:value-of select="NAME"/>
</xsl:element>
</xsl:template>
<!-- *******************************************************************
Template: DatafileList
Current node: TABLESPACE_T
Parameters:
BlkSize - value of BLOCKSIZE
******************************************************************** -->
<xsl:template name="DatafileList">
<xsl:param name="BlkSize">0</xsl:param>
<xsl:param name="BigFile">0</xsl:param>
<xsl:element name="DATAFILE_LIST">
<xsl:for-each select="FILESPEC/FILESPEC_ITEM">
<xsl:element name="DATAFILE_LIST_ITEM">
<xsl:call-template name="DoDataFile">
<xsl:with-param name="BlkSize" select="$BlkSize"/>
<xsl:with-param name="BigFile" select="$BigFile"/>
</xsl:call-template>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
<!-- *******************************************************************
Template: DoPermanentTS
Current node:
This template puts out
- MINIMUM_EXTENT
- BLOCKSIZE
- FORCE_LOGGING
- DEFAULT table_compression storage
- OFFLINE
- extent_management_clause
- segment_management_clause
- FLASHBACK_OFF
Parameters:
BlkSize - value of BLOCKSIZE
******************************************************************** -->
<xsl:template name="DoPermanentTS">
<xsl:param name="BlkSize">0</xsl:param>
<xsl:if test="(FLAGS mod 4) = 0 and DFLMINLEN !=0">
<xsl:element name="MINIMUM_EXTENT">
<xsl:value-of select="DFLMINLEN * $BlkSize"/>
</xsl:element>
</xsl:if>
<xsl:element name="BLOCKSIZE">
<xsl:value-of select="$BlkSize"/>
</xsl:element>
<xsl:element name="LOGGING">
<xsl:choose>
<xsl:when test="(DFLOGGING mod 2) = 0">
<xsl:text>N</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>Y</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
<xsl:if test="(DFLOGGING mod 4) >= 2">
<xsl:element name="FORCE_LOGGING"/>
</xsl:if>
<xsl:element name="DEFAULT">
<xsl:call-template name="DoTSCompress">
<xsl:with-param name="Compress" select="FLAGS"/>
<xsl:with-param name="Compress2" select="FLAGS2"/>
</xsl:call-template>
<xsl:if test="$VERSION>=1202000000">
<xsl:call-template name="DoCellMemory">
<xsl:with-param name="CellMemory" select="FLAGS2"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="(FLAGS mod 4) = 0">
<!-- STORAGE clause not valid for user-managed tablespace -->
<xsl:call-template name="StorageClause">
<xsl:with-param name="StorageNode" select="."/>
<xsl:with-param name="BlkSize" select="$BlkSize"/>
</xsl:call-template>
</xsl:if>
<!-- inmemory columnar - compress, priority, duplicate, distribute flags
ts$.flags in rdbms/src/server/space/if/ktt3.h
#define KTT_IMC_ENABLED ((ub8)0x1 00000000) /* IMC enabled or not */
#define KTT_IMC_MIRRORMAP ((ub8)0x2 00000000) /* IMC mirror or map */
#define KTT_IMC_LEVEL1 ((ub8)0x4 00000000) /* IMC comp level flag 1 */
#define KTT_IMC_PRELOAD ((ub8)0x8 00000000) /* IMC ondemand or preload */
#define KTT_IMC_MAPBY1 ((ub8)0x10 00000000) /* IMC map by flag 1 */
#define KTT_IMC_MAPBY2 ((ub8)0x20 00000000) /* IMC map by flag 2 */
#define KTT_IMC_LEVEL2 ((ub8)0x40 00000000) /* IMC comp level flag 2 */
#define KTT_IMC_LEVEL3 ((ub8)0x80 00000000) /* IMC comp level flag 3 */
#define KTT_IMC_LEVEL4 ((ub8)0x100 00000000) /* IMC comp level flag 4 */
#define KTT_IMC_NOTENABLED ((ub8)0x200 00000000) /* IMC explicitly disabled*/
#define KTT_IMC_DUPLICATE1 ((ub8)0x400 00000000) /* IMC duplicate */
#define KTT_IMC_DUPLICATE2 ((ub8)0x800 00000000) /* IMC duplicate */
#define KTT_IMC_PL_LOW ((ub8)0x1000 00000000) /* PriLevel:LOW */
#define KTT_IMC_PL_MEDIUM ((ub8)0x2000 00000000) /* PriLevel:MED */
#define KTT_IMC_PL_HIGH ((ub8)0x3000 00000000) /* PriLevel:HIGH */
#define KTT_IMC_PL_CRITICAL ((ub8)0x4000 00000000) /* PriLevel:CRITICAL */-->
<xsl:variable name="IMCsegflag">
<xsl:choose>
<xsl:when test="$VERSION>=1202000000 and FLAGS2">
<xsl:value-of select="FLAGS2"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="floor(FLAGS div 4294967296)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="Priority" select="floor($IMCsegflag div 4096) mod 8"/>
<xsl:variable name="Enabled" select="($IMCsegflag) mod 2"/>
<xsl:variable name="MirrorMap" select="floor($IMCsegflag div 2) mod 2"/>
<xsl:variable name="Level1" select="floor($IMCsegflag div 4) mod 2"/>
<xsl:variable name="Preload" select="floor($IMCsegflag div 8) mod 2"/>
<xsl:variable name="MapBy12" select="floor($IMCsegflag div 16) mod 4"/>
<xsl:variable name="Level234" select="floor($IMCsegflag div 64) mod 8"/>
<xsl:variable name="Disabled" select="floor($IMCsegflag div 512) mod 2"/>
<xsl:call-template name="xDoInMemory">
<xsl:with-param name="InMemory">
<xsl:choose>
<xsl:when test="$Enabled = 1">
<xsl:text>1</xsl:text>
</xsl:when>
<xsl:when test="$Disabled = 1">
<xsl:text>2</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>0</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
<xsl:with-param name="Priority">
<xsl:choose>
<xsl:when test="$Preload=1">
<xsl:choose>
<xsl:when test="$Priority=0">
<xsl:text>0</xsl:text>
</xsl:when>
<xsl:when test="$Priority=1">
<xsl:text>1</xsl:text>
</xsl:when>
<xsl:when test="$Priority=2">
<xsl:text>2</xsl:text>
</xsl:when>
<xsl:when test="$Priority=3">
<xsl:text>4</xsl:text>
</xsl:when>
<xsl:when test="$Priority=4">
<xsl:text>6</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>5</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:text>0</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
<xsl:with-param name="Compression" select="($Level234*2)+$Level1"/>
<xsl:with-param name="Distribute" select="($MapBy12*2)+$MirrorMap"/>
<xsl:with-param name="Duplicate" select="floor($IMCsegflag div 1024) mod 4"/>
<xsl:with-param name="ServiceName">
<xsl:if test="FLAGS2 and (FLAGS2 mod (268435456*2))>=268435456">
<xsl:choose>
<xsl:when test="SVCFLAGS=1">
<xsl:text>DEFAULT</xsl:text>
</xsl:when>
<xsl:when test="SVCFLAGS=2">
<xsl:text>NONE</xsl:text>
</xsl:when>
<xsl:when test="SVCFLAGS=3">
<xsl:text>ALL</xsl:text>
</xsl:when>
<xsl:when test="SVCFLAGS=4">
<xsl:value-of select="SVCNAME"/>
</xsl:when>
<xsl:otherwise>DEFAULT</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:with-param>
</xsl:call-template>
</xsl:element>
<xsl:choose>
<xsl:when test="STATUS = 2">
<xsl:element name="OFFLINE"/>
</xsl:when>
<xsl:when test="STATUS = 4">
<xsl:element name="READ_ONLY"/>
</xsl:when>
<xsl:when test="(FLAGS2 mod 1073741824)>=536870912">
<xsl:element name="ENABLE_LOST_WRITE_PROTECTION"/>
</xsl:when>
<xsl:when test="(FLAGS2 mod 2147483648)>=1073741824">
<xsl:element name="SUSPEND_LOST_WRITE_PROTECTION"/>
</xsl:when>
</xsl:choose>
<!-- ENCRYPTION -->
<xsl:if test="(FLAGS mod 32768) >= 16384">
<xsl:element name="ENCRYPT">
<xsl:if test="ENCRYPTIONALG">
<xsl:element name="ENCRYPTIONALG">
<xsl:value-of select="ENCRYPTIONALG"/>
</xsl:element>
</xsl:if>
</xsl:element>
</xsl:if>
<!-- extent_management_clause-->
<xsl:call-template name="ExtentManagement">
<xsl:with-param name="BlkSize" select="$BlkSize"/>
</xsl:call-template>
<!-- segment_management_clause -->
<xsl:if test="BITMAPPED != 0">
<xsl:element name="SEGMENT_SPACE_MANAGEMENT">
<xsl:choose>
<xsl:when test="((FLAGS mod 64) >= 32)">
<xsl:text>AUTO</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>MANUAL</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:if>
<!-- How to detect FLASHBACK OFF? -->
</xsl:template>
<!-- *******************************************************************
Template: DoUndoTS
This template puts out
- extent_management_clause
- RETENTION_GUARANTEE
Parameters:
BlkSize - value of BLOCKSIZE
******************************************************************** -->
<xsl:template name="DoUndoTS">
<xsl:param name="BlkSize">0</xsl:param>
<xsl:if test="STATUS=2">
<xsl:element name="OFFLINE"/>
</xsl:if>
<xsl:element name="BLOCKSIZE">
<xsl:value-of select="$BlkSize"/>
</xsl:element>
<!-- Lost write protection -->
<xsl:choose>
<xsl:when test="(FLAGS2 mod 1073741824)>=536870912">
<xsl:element name="ENABLE_LOST_WRITE_PROTECTION"/>
</xsl:when>
<xsl:when test="(FLAGS2 mod 2147483648)>=1073741824">
<xsl:element name="SUSPEND_LOST_WRITE_PROTECTION"/>
</xsl:when>
</xsl:choose>
<!-- extent_management_clause-->
<xsl:call-template name="ExtentManagement">
<xsl:with-param name="BlkSize" select="$BlkSize"/>
</xsl:call-template>
<!-- ENCRYPTION -->
<xsl:if test="((FLAGS mod 32768) >= 16384) and $VERSION>=1202000000">
<xsl:element name="ENCRYPT">
<xsl:if test="ENCRYPTIONALG">
<xsl:element name="ENCRYPTIONALG">
<xsl:value-of select="ENCRYPTIONALG"/>
</xsl:element>
</xsl:if>
</xsl:element>
</xsl:if>
<xsl:if test="(FLAGS mod 1024) >= 512">
<xsl:element name="RETENTION_GUARANTEE"/>
</xsl:if>
</xsl:template>
<!-- *******************************************************************
Template: DoTemporaryTS
This template puts out
- tablespace_group_clause
- extent_management_clause
Parameters:
BlkSize - value of BLOCKSIZE
******************************************************************** -->
<xsl:template name="DoTemporaryTS">
<xsl:param name="BlkSize">0</xsl:param>
<xsl:if test="string-length(GROUPNAME)!=0">
<xsl:element name="TABLESPACE_GROUP">
<xsl:call-template name="QuotedName">
<xsl:with-param name="NameNode" select="GROUPNAME"/>
</xsl:call-template>
</xsl:element>
</xsl:if>
<!-- extent_management_clause-->
<xsl:element name="EXTENT_MANAGEMENT">
<xsl:element name="TYPE">
<xsl:text>LOCAL</xsl:text>
</xsl:element>
<xsl:element name="ALLOCATION_TYPE">
<xsl:text>UNIFORM</xsl:text>
</xsl:element>
<xsl:element name="SIZE">
<xsl:value-of select="DFLINIT * $BlkSize"/>
</xsl:element>
</xsl:element>
<!-- ENCRYPTION -->
<xsl:if test="((FLAGS mod 32768) >= 16384) and $VERSION>=1202000000">
<xsl:element name="ENCRYPT">
<xsl:if test="ENCRYPTIONALG">
<xsl:element name="ENCRYPTIONALG">
<xsl:value-of select="ENCRYPTIONALG"/>
</xsl:element>
</xsl:if>
</xsl:element>
</xsl:if>
</xsl:template>
<!-- *******************************************************************
Template: DoDataFile
Current node: FILESPEC_ITEM
This template puts out
- NAME
- SIZE
- autoextend_clause
Parameters:
BlkSize - value of BLOCKSIZE
******************************************************************** -->
<xsl:template name="DoDataFile">
<xsl:param name="BlkSize">0</xsl:param>
<xsl:param name="BigFile">0</xsl:param>
<!-- IS_OMF is not necessarily in the document -->
<xsl:choose>
<xsl:when test="IS_OMF!=0"/>
<xsl:otherwise>
<xsl:element name="NAME">
<xsl:value-of select="FNAME"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
<xsl:element name="SIZE">
<xsl:choose>
<!-- for BIGFILES pick up RESIZE value -->
<xsl:when test="$BigFile='1' and RESIZE !=0">
<xsl:value-of select="RESIZE * $BlkSize"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="FSIZE * $BlkSize"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
<!-- autoextend_clause -->
<xsl:if test="MAXEXTEND > 0">
<xsl:element name="AUTOEXTEND">
<xsl:element name="NEXT">
<xsl:value-of select="INC * $BlkSize"/>
</xsl:element>
<xsl:element name="MAXSIZE">
<xsl:choose>
<xsl:when test="(MAXEXTEND * $BlkSize) > 2147483647">
<xsl:value-of select="floor((MAXEXTEND * $BlkSize) div 1048576)"/>
<xsl:text>M</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="MAXEXTEND * $BlkSize"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:element>
</xsl:if>
<!--Generate temp tablespace file status as OFFLINE -->
<xsl:if test="../../CONTENTS = 1 and (TFSTATUS mod 4)<2">
<xsl:element name="TFSTATUS">
<xsl:text>OFFLINE</xsl:text>
</xsl:element>
</xsl:if>
</xsl:template>
<!-- *******************************************************************
Template: ExtentManagement - emit EXTENT_MANAGEMENT element
Current node: TABLESPACE_T
Parameters:
BlkSize - value of BLOCKSIZE
******************************************************************** -->
<xsl:template name="ExtentManagement">
<xsl:param name="BlkSize">0</xsl:param>
<xsl:element name="EXTENT_MANAGEMENT">
<xsl:element name="TYPE">
<xsl:choose>
<xsl:when test="BITMAPPED = 0">
<xsl:text>DICTIONARY</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>LOCAL</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
<xsl:choose>
<xsl:when test="(FLAGS mod 4) = 2">
<xsl:element name="ALLOCATION_TYPE">
<xsl:text>UNIFORM</xsl:text>
</xsl:element>
<xsl:element name="SIZE">
<xsl:value-of select="DFLINIT * $BlkSize"/>
</xsl:element>
</xsl:when>
<xsl:when test="(FLAGS mod 2) = 1">
<xsl:element name="ALLOCATION_TYPE">
<xsl:text>AUTOALLOCATE</xsl:text>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
OHA YOOOO