/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/

/* -*-C++-*-
 *****************************************************************************
 *
 * File:         CmpSeabaseDDLinitraf.cpp
 * Description:  Implements initialize trafodion
 *
 *
 * Created:     
 * Language:     C++
 *
 *
 *****************************************************************************
 */

#include "CmpSeabaseDDLincludes.h"

enum InitTrafSteps {
  IT_NO_CHANGE      = -1,
  IT_START          = 0,
  IT_VERIFY_USER,
  IT_VERSION_CHECK,
  IT_TDDL_TRUNCATE,
  IT_START_XN,
  IT_CREATE_MD_TABLES,
  IT_UPDATE_MD_TABLES,
  IT_CREATE_SCHEMA_OBJECTS,
  IT_CREATE_MD_VIEWS,
  IT_CREATE_REPOS,
  IT_CREATE_LIBRARIES,
  IT_CREATE_PRIVMGR_REPOS,
  IT_CREATE_LIBMGR,
  IT_STEP_FAILED,
  IT_ABORT_XN,
  IT_FAILED,
  IT_DONE,
};


static void initDWS(CmpDDLwithStatusInfo *dws)
{
  dws->setBlackBoxLen(0);
  dws->setBlackBox(NULL);
  dws->setComputeST(FALSE);
  dws->setComputeET(FALSE);
  dws->setReturnET(FALSE);
}
  
static void setValuesInDWS(
     CmpDDLwithStatusInfo *dws,
     Lng32 nextStep,
     const char * msg = NULL, 
     Lng32 subStep = 0, NABoolean isEndStep = FALSE,
     NABoolean computeST = FALSE, 
     NABoolean computeET = FALSE, 
     NABoolean returnET = FALSE,
     NABoolean done = FALSE)
{
  if (msg)
    dws->setMsg(msg);
  if (nextStep != IT_NO_CHANGE)
    dws->setStep(nextStep);
  if (subStep >= 0)
    dws->setSubstep(subStep);
  dws->setEndStep(isEndStep);
  
  if (computeST)
    dws->setComputeST(computeST);
  if (computeET)
    dws->setComputeET(computeET);
  if (returnET)
    dws->setReturnET(computeET);
  
  if (done)
    dws->setDone(TRUE);
}

short CmpSeabaseDDL::initTrafMD(CmpDDLwithStatusInfo *dws)
{
  Lng32 cliRC = 0;

  initDWS(dws);

  while (1) // exit via return from within the while loop
    {
      switch (dws->step())
        {
        case IT_START:
          {
            setValuesInDWS(dws, IT_VERIFY_USER,
                           "Initialize Trafodion: Started",
                           0, TRUE);

            return 0;
          }
          break;

        case IT_VERIFY_USER:
          {
           switch (dws->subStep())
              {
              case 0:
                {
                  setValuesInDWS(dws, IT_NO_CHANGE, 
                                 "Verify User: Started", 1, FALSE,
                                 TRUE);
                  
                  return 0;
                }
                break;

              case 1:
                {
                  // verify user is authorized
                  if (!ComUser::isRootUserID())
                    {
                      //*CmpCommon::diags() << DgSqlCode(CAT_NOT_AUTHORIZED);
                      
                      setValuesInDWS(dws, IT_NO_CHANGE,
                                     "  Current user is not authorized to Initialize Trafodion. Must be Root to perform this operation.", 2, FALSE);

                      return 0;
                    }
                  
                  CmpCommon::diags()->clear();

                  setValuesInDWS(dws, IT_VERSION_CHECK,
                                 "Verify User: Completed", 0, TRUE,
                                 FALSE, TRUE, TRUE);
                  return 0;
                } // case 1
                break;

              case 2:
                {
                  setValuesInDWS(dws, IT_FAILED, 
                                 "Verify User: Failed", 0, TRUE,
                                 FALSE, TRUE, TRUE);

                  return 0;
                }
                break;

              } // switch
          }
          break;

        case IT_VERSION_CHECK:
          {
            Lng32 hbaseErrNum = 0;
            NAString hbaseErrStr;
            
            ExpHbaseInterface * ehi = allocEHI();
            if (ehi == NULL)
              {
                setValuesInDWS(dws, IT_FAILED, NULL,
                               0, TRUE);

                break;
              }

           switch (dws->subStep())
              {
              case 0:
                {
                  setValuesInDWS(dws, IT_NO_CHANGE,
                                 "Version Check: Started", 1, FALSE,
                                 TRUE);

                  return 0;
                }
                break;

              case 1:
                {
                  // check if traf is already initialized
                  Lng32 errNum = validateVersions(&ActiveSchemaDB()->getDefaults(), ehi,
                                                  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                                                  &hbaseErrNum, &hbaseErrStr);
                  deallocEHI(ehi); 
                  if (errNum == 0)
                    {
                      CmpCommon::context()->setIsUninitializedSeabase(FALSE);
                      
                      // add warning 1392 to indicate that traf is already init.
                      // This is needed as installer checks for this error code to
                      // determine if traf is initialized.
                      *CmpCommon::diags() << DgSqlCode(TRAF_ALREADY_INITIALIZED);
                      
                      // Metadata is initialized
                      setValuesInDWS(dws, IT_NO_CHANGE,
                                     "  Trafodion is already initialized on this system.",
                                     2, FALSE);

                      return 0;
                    }
                  
                  CmpCommon::context()->setIsUninitializedSeabase(TRUE);
                  CmpCommon::context()->uninitializedSeabaseErrNum() = errNum;
                  CmpCommon::context()->hbaseErrNum() = hbaseErrNum;
                  CmpCommon::context()->hbaseErrStr() = hbaseErrStr;
                  
                  // Return any other error besides uninitialized traf error.
                  if (errNum != -TRAF_NOT_INITIALIZED)
                    {
                      // add returned error nums as warnings.
                      // It will show why init traf failed.
                      if (errNum == -TRAF_HBASE_ACCESS_ERROR)
                        *CmpCommon::diags() << DgSqlCode(-errNum)
                                            << DgInt0(hbaseErrNum)
                                            << DgString0(hbaseErrStr);
                      else
                        *CmpCommon::diags() << DgSqlCode(-errNum);
                      
                      char msgBuf[1000];
                      sprintf(msgBuf, "  Error %d returned. See error details for further action.", -errNum);
                      
                      setValuesInDWS(dws, IT_NO_CHANGE, msgBuf, 3, FALSE);

                      return 0;
                    }
                  
                  CmpCommon::diags()->clear();

                  setValuesInDWS(dws, IT_TDDL_TRUNCATE, 
                                 "Version Check: Completed",
                                 0, TRUE, 
                                 FALSE, TRUE, TRUE);

                  return 0;
                } // case 1
                break;

              case 2:
                {
                  setValuesInDWS(dws, IT_DONE,
                                 "Version Check: Completed",
                                 0, TRUE, 
                                 FALSE, TRUE, TRUE);

                  return 0;
                }
                break;

              case 3:
                {
                  setValuesInDWS(dws, IT_FAILED, "Version Check: Failed",
                                 0, TRUE, 
                                 FALSE, TRUE, TRUE);

                  return 0;
                }
                break;

              } // switch
          }
          break;

        case IT_TDDL_TRUNCATE:
          {
            ExpHbaseInterface * ehi = allocEHI();
            if (ehi == NULL)
              {
                setValuesInDWS(dws, IT_FAILED);
                               
                break;
              }

            // truncate DTM table TDDL.
            // Do not do this operation under a dtm transaction.
            // See file core/sqf/src/seatrans/hbase-trx/src/main/java/org/apache/hadoop/hbase/client/transactional/TmDDL.java
            // Keep the name TRAFODION._DTM_.TDDL and col fam "tddlcf" in sync with
            // that file.
            HbaseStr tddlTable;
            const NAString tddlNAS("TRAFODION._DTM_.TDDL");
            tddlTable.val = (char*)tddlNAS.data();
            tddlTable.len = tddlNAS.length();
            if (ehi->exists(tddlTable) == -1) // exists
              {
                ehi->truncate(tddlTable, TRUE, TRUE);
              }

            deallocEHI(ehi); 

            setValuesInDWS(dws, IT_START_XN);
          }
          break;

        case IT_START_XN:
          {
            if (dws->getDDLXns())
              {
                ExeCliInterface cliInterface(STMTHEAP, 0, NULL, 
                                             CmpCommon::context()->sqlSession()->getParentQid());

                NABoolean xnWasStartedHere = FALSE;
                if (beginXnIfNotInProgress(&cliInterface, xnWasStartedHere))
                  {
                    setValuesInDWS(dws, IT_FAILED);
                    break;
                  }
                dws->setXnStarted(TRUE);
              }

            setValuesInDWS(dws, IT_CREATE_MD_TABLES);
          }
          break;

        case IT_CREATE_MD_TABLES:
          {
            switch (dws->subStep())
              {
              case 0:
                {
                  setValuesInDWS(dws, IT_NO_CHANGE,
                                 "Create Metadata Tables: Started", 1, FALSE,
                                 TRUE, FALSE, FALSE);
                  return 0;
                }
                break;

              case 1:
                {
                  ExpHbaseInterface * ehi = allocEHI();
                  if (ehi == NULL)
                    {
                      setValuesInDWS(dws, IT_STEP_FAILED,
                                     "Create Metadata Tables: Failed", 0, TRUE,
                                     FALSE, TRUE, TRUE);

                      return 0;
                    }

                  Lng32 numTables = sizeof(allMDtablesInfo) / sizeof(MDTableInfo);
                  const char* sysCat = 
                    ActiveSchemaDB()->getDefaults().getValue(SEABASE_CATALOG);

                  // create hbase physical objects
                  for (Lng32 i = 0; i < numTables; i++)
                    {
                      const MDTableInfo &mdti = allMDtablesInfo[i];
                      
                      HbaseStr hbaseObject;
                      NAString hbaseObjectStr(sysCat);
                      hbaseObjectStr += ".";
                      hbaseObjectStr += SEABASE_MD_SCHEMA;
                      hbaseObjectStr += ".";
                      hbaseObjectStr += mdti.newName;
                      hbaseObject.val = (char*)hbaseObjectStr.data();
                      hbaseObject.len = hbaseObjectStr.length();
                      if (createHbaseTable(ehi, &hbaseObject, SEABASE_DEFAULT_COL_FAMILY, NULL,
                                           0, 0, NULL,
                                           FALSE, dws->getDDLXns()) == -1)
                        {
                          deallocEHI(ehi); 

                          setValuesInDWS(dws, IT_STEP_FAILED,
                                         "Create Metadata Tables: Failed", 
                                         0, TRUE,
                                         FALSE, TRUE, TRUE);

                          return 0;
                        }
                      
                    } // for
                  
                  deallocEHI(ehi); 
                  ehi = NULL;
                  
                  setValuesInDWS(dws, IT_UPDATE_MD_TABLES,
                                 "Create Metadata Tables: Completed", 
                                 0, TRUE,
                                 FALSE, TRUE, TRUE);

                  return 0;
                }
                break;

              } // switch
          }
          break;

        case IT_UPDATE_MD_TABLES:
          {
            switch (dws->subStep())
              {
              case 0:
                {
                  setValuesInDWS(dws, IT_NO_CHANGE,
                                 "Update Metadata Tables: Started", 1, FALSE,
                                 TRUE, FALSE, FALSE);
                  
                  return 0;
                }
                break;

              case 1:
                {
                  ExeCliInterface cliInterface(STMTHEAP, 0, NULL, 
                                               CmpCommon::context()->sqlSession()->getParentQid());

                  cliRC = cliInterface.holdAndSetCQD("traf_bootstrap_md_mode", "ON");
                  if (cliRC < 0)
                    {
                      setValuesInDWS(dws, IT_STEP_FAILED,
                                     "Update Metadata Tables: Failed", 0, TRUE,
                                     FALSE, TRUE, TRUE);
                      
                      return 0;
                    }
                  
                  Int64 objectFlags = 0;
                  Int64 schemaUID = -1;  

                  const char* sysCat = 
                    ActiveSchemaDB()->getDefaults().getValue(SEABASE_CATALOG);
                  
                  // Create Seabase metadata schema
                  schemaUID = -1;
                  if (updateSeabaseMDObjectsTable(&cliInterface,sysCat,SEABASE_MD_SCHEMA,
                                                  SEABASE_SCHEMA_OBJECTNAME,
                                                  COM_PRIVATE_SCHEMA_OBJECT,"Y",SUPER_USER,
                                                  SUPER_USER,objectFlags, schemaUID))
                    {
                      setValuesInDWS(dws, IT_STEP_FAILED,
                                     "Update Metadata Tables: Failed", 0, TRUE,
                                     FALSE, TRUE, TRUE);

                      return 0;
                    }
                  
                  // update MD with information about metadata objects
                  Lng32 numTables = sizeof(allMDtablesInfo) / sizeof(MDTableInfo);
                  for (Lng32 i = 0; i < numTables; i++)
                    {
                      const MDTableInfo &mdti = allMDtablesInfo[i];
                      MDDescsInfo &mddi = CmpCommon::context()->getTrafMDDescsInfo()[i];
                      
                      if (mdti.isIndex)
                        continue;
                      
                      Int64 objUID = -1;
                      if (updateSeabaseMDTable(&cliInterface, 
                                               sysCat, SEABASE_MD_SCHEMA, mdti.newName,
                                               COM_BASE_TABLE_OBJECT,
                                               "Y",
                                               mddi.tableInfo,
                                               mddi.numNewCols,
                                               mddi.newColInfo,
                                               mddi.numNewKeys,
                                               mddi.newKeyInfo,
                                               mddi.numIndexes,
                                               mddi.indexInfo,
                                               objUID))
                        {
                          setValuesInDWS(dws, IT_STEP_FAILED,
                                         "Update Metadata Tables: Failed", 0, TRUE,
                                         FALSE, TRUE, TRUE);
                          
                          return 0;
                        }
                      
                    } // for
                  
                  // update metadata with metadata indexes information
                  for (Lng32 i = 0; i < numTables; i++)
                    {
                      const MDTableInfo &mdti = allMDtablesInfo[i];
                      MDDescsInfo &mddi = CmpCommon::context()->getTrafMDDescsInfo()[i];
                      
                      if (NOT mdti.isIndex)
                        continue;
                      
                      ComTdbVirtTableTableInfo * tableInfo = 
                        new(STMTHEAP) ComTdbVirtTableTableInfo[1];
                      
                      tableInfo->tableName = NULL;
                      tableInfo->createTime = 0;
                      tableInfo->redefTime = 0;
                      tableInfo->objUID = 0;
                      tableInfo->objOwnerID = SUPER_USER;
                      tableInfo->schemaOwnerID = SUPER_USER;
                      tableInfo->isAudited = 1;
                      tableInfo->validDef = 1;
                      tableInfo->hbaseCreateOptions = NULL;
                      tableInfo->numSaltPartns = 0;
                      tableInfo->rowFormat = COM_UNKNOWN_FORMAT_TYPE;
                      tableInfo->objectFlags = 0;
                      
                      Int64 objUID = -1;
                      if (updateSeabaseMDTable(&cliInterface, 
                                               sysCat, SEABASE_MD_SCHEMA, mdti.newName,
                                               COM_INDEX_OBJECT,
                                               "Y",
                                               tableInfo,
                                               mddi.numNewCols,
                                               mddi.newColInfo,
                                               mddi.numNewKeys,
                                               mddi.newKeyInfo,
                                               0, NULL,
                                               objUID))
                        {
                          setValuesInDWS(dws, IT_STEP_FAILED,
                                         "Update Metadata Tables: Failed", 0, TRUE,
                                         FALSE, TRUE, TRUE);                          
                          return 0;
                        }
                    } // for
                  
                  
                  
                  updateSeabaseVersions(&cliInterface, sysCat);
                  updateSeabaseAuths(&cliInterface, sysCat);
                  
                  CmpCommon::context()->setIsUninitializedSeabase(FALSE);
                  CmpCommon::context()->uninitializedSeabaseErrNum() = 0;

                  setValuesInDWS(dws, IT_CREATE_SCHEMA_OBJECTS,
                                 "Update Metadata Tables: Completed", 0, TRUE,
                                 FALSE, TRUE, TRUE);

                  return 0;
                } // case 1
              } // switch
          }
          break;

        case IT_CREATE_SCHEMA_OBJECTS:
          {
           switch (dws->subStep())
              {
              case 0:
                {
                  setValuesInDWS(dws, IT_NO_CHANGE,
                                 "Create Schema Objects: Started", 1, FALSE,
                                 TRUE, FALSE, FALSE);

                  return 0;
                }
                break;

              case 1:
                {
                  ExeCliInterface cliInterface(STMTHEAP, 0, NULL, 
                                               CmpCommon::context()->sqlSession()->getParentQid());

                  if (createDefaultSystemSchema(&cliInterface))
                    {
                      setValuesInDWS(dws, IT_STEP_FAILED,
                                     "Create Schema Objects: Failed", 0, TRUE,
                                     FALSE, TRUE, TRUE);

                      return 0;
                    }
    
                  if (createSchemaObjects(&cliInterface))
                    {
                      setValuesInDWS(dws, IT_STEP_FAILED,
                                     "Create Schema Objects: Failed", 0, TRUE,
                                     FALSE, TRUE, TRUE);

                      return 0;
                    }
                  
                  setValuesInDWS(dws, IT_CREATE_MD_VIEWS,
                                 "Create Schema Objects: Completed", 0, TRUE,
                                 FALSE, TRUE, TRUE);
                  
                  return 0;
                } // case 1
              } // switch
          }
          break;

        case IT_CREATE_MD_VIEWS:
          {
            switch (dws->subStep())
              {
              case 0:
                {
                  setValuesInDWS(dws, IT_NO_CHANGE,
                                 "Create Metadata Views: Started", 1, FALSE,
                                 TRUE, FALSE, FALSE);
  
                  return 0;
                }
                break;

              case 1:
                {
                  ExeCliInterface cliInterface(STMTHEAP, 0, NULL, 
                                               CmpCommon::context()->sqlSession()->getParentQid());

                  if (createMetadataViews(&cliInterface))
                    {
                      setValuesInDWS(dws, IT_STEP_FAILED,
                                     "Create Metadata Views: Failed", 0, TRUE,
                                     FALSE, TRUE, TRUE);

                      return 0;
                    }
                  
                  // If this is a MINIMAL initialization, don't create the 
                  // repository or privilege manager tables. 
                  // (This happens underneath an upgrade, for example, 
                  // because the repository and privilege manager tables
                  // already exist and we will later upgrade them.)
                  setValuesInDWS(dws, 
                                 (dws->getMinimalInitTraf() ? IT_CREATE_LIBMGR : IT_CREATE_REPOS),
                                 "Create Metadata Views: Completed", 
                                 0, TRUE,
                                 FALSE, TRUE, TRUE);

                  return 0;
                } // case
              } // switch
          }
          break;

        case IT_CREATE_REPOS:
          {
            switch (dws->subStep())
              {
              case 0:
                {
                  setValuesInDWS(dws, IT_NO_CHANGE,
                                 "Create Repository Tables: Started", 1, FALSE,
                                 TRUE, FALSE, FALSE);

                  return 0;
                }
                break;

              case 1:
                {
                  ExeCliInterface cliInterface(STMTHEAP, 0, NULL, 
                                               CmpCommon::context()->sqlSession()->getParentQid());

                  if (createRepos(&cliInterface))
                    {
                      setValuesInDWS(dws, IT_STEP_FAILED,
                                     "Create Repository Tables: Failed", 0, TRUE,
                                     FALSE, TRUE, TRUE);
                      return 0;
                    }

                  setValuesInDWS(dws, IT_CREATE_LIBRARIES,
                                 "Create Repository Tables: Completed", 0, TRUE,
                                 FALSE, TRUE, TRUE);

                  return 0;
                } // case 1
              } // switch
          }
          break;
        case IT_CREATE_LIBRARIES:
          {
            switch (dws->subStep())
              {
              case 0:
                {
                  setValuesInDWS(dws, IT_NO_CHANGE,
                                 "Create Libraries Tables: Started", 1, FALSE,
                                 TRUE, FALSE, FALSE);

                  return 0;
                }
                break;

              case 1:
                {
                  ExeCliInterface cliInterface(STMTHEAP, 0, NULL, 
                                               CmpCommon::context()->sqlSession()->getParentQid());

                  if (createLibrariesObject(&cliInterface))
                    {
                      setValuesInDWS(dws, IT_STEP_FAILED,
                                     "Create Libraries Tables: Failed", 0, TRUE,
                                     FALSE, TRUE, TRUE);
                      return 0;
                    }
                  // update SPJ info
                  // Note that this is not an existing jar file, the class
                  // loader will attempt to load the class from the CLASSPATH if
                  // it can't find this jar
                  NAString installJar(getenv("TRAF_HOME"));
                  installJar += "/export/lib/trafodion-sql-currversion.jar";
                  const char* sysCat = 
                    ActiveSchemaDB()->getDefaults().getValue(SEABASE_CATALOG);
                  if (updateSeabaseMDSPJ(&cliInterface, sysCat, SEABASE_MD_SCHEMA, 
                                         SEABASE_VALIDATE_LIBRARY,
                                         installJar.data(),SUPER_USER,SUPER_USER,
                                         &seabaseMDValidateRoutineInfo,
                                         sizeof(seabaseMDValidateRoutineColInfo) / sizeof(ComTdbVirtTableColumnInfo),
                                         seabaseMDValidateRoutineColInfo))
                    {
                      setValuesInDWS(dws, IT_STEP_FAILED,
                                     "Update MDSPJ : Failed", 0, TRUE,
                                     FALSE, TRUE, TRUE);                      

                      return 0;
                    }
                  setValuesInDWS(dws, IT_CREATE_PRIVMGR_REPOS,
                                 "Create Libraries Tables: Completed", 0, TRUE,
                                 FALSE, TRUE, TRUE);

                  return 0;
                } // case 1
              } // switch
          }
          break;
        case IT_CREATE_PRIVMGR_REPOS:
          {
            switch (dws->subStep())
              {
              case 0:
                {
                  setValuesInDWS(dws, IT_NO_CHANGE,
                                 "Create PrivMgr Tables: Started", 1, FALSE,
                                 TRUE, FALSE, FALSE);
                  return 0;
                }
                break;
                
              case 1:
                {
                  ExeCliInterface cliInterface(STMTHEAP, 0, NULL, 
                                               CmpCommon::context()->sqlSession()->getParentQid());

                  if (createPrivMgrRepos(&cliInterface, dws->getDDLXns()))
                    {
                      setValuesInDWS(dws, IT_STEP_FAILED,
                                     "Create PrivMgr Tables: Failed", 0, TRUE,
                                     FALSE, TRUE, TRUE);
                      return 0;
                    }
                  
                  setValuesInDWS(dws, IT_CREATE_LIBMGR,
                                 "Create PrivMgr Tables: Completed", 0, TRUE,
                                 FALSE, TRUE, TRUE);

                  return 0;
                } // case 1
              } // switch
          }
          break;

        case IT_CREATE_LIBMGR:
          {
            switch (dws->subStep())
              {
              case 0:
                {
                  setValuesInDWS(dws, IT_NO_CHANGE,
                                 "Create Library Manager: Started", 1, FALSE,
                                 TRUE, FALSE, FALSE);

                  return 0;
                }
                break;
                
              case 1:
                {
                  ExeCliInterface cliInterface(STMTHEAP, 0, NULL, 
                                               CmpCommon::context()->sqlSession()->getParentQid());

                  if (createSeabaseLibmgr (&cliInterface))
                    {   
                      setValuesInDWS(dws, IT_STEP_FAILED,
                                     "Create Library Manager: Failed", 0, TRUE,
                                     FALSE, TRUE, TRUE);
 
                      return 0;
                    }
                  
                  cliRC = cliInterface.restoreCQD("traf_bootstrap_md_mode");

                  setValuesInDWS(dws, IT_DONE,
                                 "Create Library Manager: Completed", 0, TRUE,
                                 FALSE, TRUE, TRUE);

                  return 0;
                } // case 1
              } // switch
          }
          break;

        case IT_STEP_FAILED:
          {
            setValuesInDWS(dws, (dws->xnStarted() ? IT_ABORT_XN : IT_FAILED));

            break;
          }
          break;

        case IT_ABORT_XN:
          {
            switch (dws->subStep())
              {
              case 0:
                {
                  setValuesInDWS(dws, IT_NO_CHANGE,
                                 "Abort Transaction: Started", 1, FALSE,
                                 TRUE, FALSE, FALSE);
  
                  return 0;
                }
                break;

              case 1:
                {
                  ExeCliInterface cliInterface(STMTHEAP, 0, NULL, 
                                               CmpCommon::context()->sqlSession()->getParentQid());
                  
                  NABoolean xnWasStartedHere = dws->xnStarted();
                  endXnIfStartedHere(&cliInterface, xnWasStartedHere, -1);
                  dws->setXnStarted(xnWasStartedHere);
                  
                  setValuesInDWS(dws, IT_FAILED,
                                 "Abort Transaction: Completed", 0, TRUE,
                                 FALSE, TRUE, TRUE);

                  return 0;
                }
                break;
              } // switch
          }
          break;

        case IT_FAILED:
          {
            setValuesInDWS(dws, IT_START,
                           "Initialize Trafodion: Failed", 0, FALSE,
                           FALSE, TRUE, TRUE, TRUE);
            
            return -1;
          }
          break;
          
        case IT_DONE:
          {
            ExeCliInterface cliInterface(STMTHEAP, 0, NULL, 
                                         CmpCommon::context()->sqlSession()->getParentQid());
  
            NABoolean xnWasStartedHere = dws->xnStarted();
            endXnIfStartedHere(&cliInterface, xnWasStartedHere, 0);
            dws->setXnStarted(xnWasStartedHere);

            setValuesInDWS(dws, IT_START,
                           "Initialize Trafodion: Completed", 0, FALSE,
                           FALSE, TRUE, TRUE, TRUE);

	    return 0;
          }   
          break;
        } // switch
    } // while

  return 0;
}
