Package org.apache.derby.impl.sql.catalog

Source Code of org.apache.derby.impl.sql.catalog.SYSTRIGGERSRowFactory

/*

   Derby - Class org.apache.derby.impl.sql.catalog.SYSTRIGGERSRowFactory

   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.

*/

package org.apache.derby.impl.sql.catalog;

import org.apache.derby.iapi.types.DataTypeDescriptor;
import org.apache.derby.iapi.types.DataValueDescriptor;
import org.apache.derby.iapi.types.SQLChar;
import org.apache.derby.iapi.types.SQLVarchar;
import org.apache.derby.iapi.types.TypeId;

import org.apache.derby.iapi.types.TypeId;

import org.apache.derby.iapi.types.DataValueFactory;
import org.apache.derby.iapi.types.RowLocation;

import org.apache.derby.iapi.sql.dictionary.CatalogRowFactory;
import org.apache.derby.iapi.sql.dictionary.DataDescriptorGenerator;
import org.apache.derby.iapi.sql.dictionary.DataDictionary;
import org.apache.derby.iapi.sql.dictionary.SystemColumn;
import org.apache.derby.iapi.sql.dictionary.TriggerDescriptor;
import org.apache.derby.iapi.sql.dictionary.TupleDescriptor;

import org.apache.derby.iapi.sql.execute.ExecIndexRow;
import org.apache.derby.iapi.sql.execute.ExecRow;
import org.apache.derby.iapi.sql.execute.ExecutionFactory;

import org.apache.derby.iapi.error.StandardException;

import org.apache.derby.iapi.services.monitor.Monitor;
import org.apache.derby.catalog.ReferencedColumns;
import org.apache.derby.catalog.types.ReferencedColumnsDescriptorImpl;
import org.apache.derby.catalog.UUID;
import org.apache.derby.iapi.services.uuid.UUIDFactory;

import org.apache.derby.iapi.services.sanity.SanityManager;
import org.apache.derby.iapi.types.SQLTimestamp;
import java.sql.Timestamp;

/**
* Factory for creating a SYSTRIGGERS row.
*
*
* @version 0.1
*/

public class SYSTRIGGERSRowFactory extends CatalogRowFactory
{
  static  final  String  TABLENAME_STRING = "SYSTRIGGERS";

  /* Column #s for sysinfo (1 based) */
  public  static  final  int    SYSTRIGGERS_TRIGGERID = 1;
  public  static  final  int    SYSTRIGGERS_TRIGGERNAME = 2;
  public  static  final  int    SYSTRIGGERS_SCHEMAID = 3;
  public  static  final  int    SYSTRIGGERS_CREATIONTIMESTAMP = 4;
  public  static  final  int    SYSTRIGGERS_EVENT = 5;
  public  static  final  int    SYSTRIGGERS_FIRINGTIME = 6;
  public  static  final  int    SYSTRIGGERS_TYPE = 7;
  public  static  final  int    SYSTRIGGERS_STATE = TriggerDescriptor.SYSTRIGGERS_STATE_FIELD;
  public  static  final  int    SYSTRIGGERS_TABLEID = 9;
  public  static  final  int    SYSTRIGGERS_WHENSTMTID = 10;
  public  static  final  int    SYSTRIGGERS_ACTIONSTMTID = 11;
  public  static  final  int    SYSTRIGGERS_REFERENCEDCOLUMNS = 12;
  public  static  final  int    SYSTRIGGERS_TRIGGERDEFINITION = 13;
  public  static  final  int    SYSTRIGGERS_REFERENCINGOLD = 14;
  public  static  final  int    SYSTRIGGERS_REFERENCINGNEW = 15;
  public  static  final  int    SYSTRIGGERS_OLDREFERENCINGNAME = 16;
  public  static  final  int    SYSTRIGGERS_NEWREFERENCINGNAME = 17;

  public  static  final  int    SYSTRIGGERS_COLUMN_COUNT = SYSTRIGGERS_NEWREFERENCINGNAME;

  public  static final int    SYSTRIGGERS_INDEX1_ID = 0;
  public  static final int    SYSTRIGGERS_INDEX2_ID = 1;
  public  static final int    SYSTRIGGERS_INDEX3_ID = 2;

  private static final int[][] indexColumnPositions =
  {
    {SYSTRIGGERS_TRIGGERID},
    {SYSTRIGGERS_TRIGGERNAME, SYSTRIGGERS_SCHEMAID},
    {SYSTRIGGERS_TABLEID, SYSTRIGGERS_CREATIONTIMESTAMP}
  };

  private  static  final  boolean[]  uniqueness = {
                             true,
                             true,
                             false,
                                                   };

  private  static  final  String[]  uuids =
  {
     "c013800d-00d7-c025-4809-000a0a411200"  // catalog UUID
    ,"c013800d-00d7-c025-480a-000a0a411200"  // heap UUID
    ,"c013800d-00d7-c025-480b-000a0a411200"  // SYSTRIGGERS_INDEX1
    ,"c013800d-00d7-c025-480c-000a0a411200"  // SYSTRIGGERS_INDEX2
    ,"c013800d-00d7-c025-480d-000a0a411200"  // SYSTRIGGERS_INDEX3
  };

  /////////////////////////////////////////////////////////////////////////////
  //
  //  CONSTRUCTORS
  //
  /////////////////////////////////////////////////////////////////////////////
  public  SYSTRIGGERSRowFactory(UUIDFactory uuidf, ExecutionFactory ef, DataValueFactory dvf,
                                  boolean convertIdToLower)
  {
    super(uuidf,ef,dvf,convertIdToLower);
    initInfo(SYSTRIGGERS_COLUMN_COUNT, TABLENAME_STRING,
         indexColumnPositions,  uniqueness, uuids);
  }

  /////////////////////////////////////////////////////////////////////////////
  //
  //  METHODS
  //
  /////////////////////////////////////////////////////////////////////////////
  /**
   * Make a SYSTRIGGERS row.
   *
   * @return  Row suitable for inserting into SYSTRIGGERS.
   *
   * @exception   StandardException thrown on failure
   */

  public ExecRow makeRow(TupleDescriptor td, TupleDescriptor parent)
    throws StandardException
  {
    DataTypeDescriptor    dtd;
    ExecRow            row;
    DataValueDescriptor    col;
    String          name = null;
    UUID          uuid = null
    UUID          suuid = null;      // schema 
    UUID          tuuid = null;      // referenced table 
    UUID          actionSPSID = null;    // action sps uuid string
    UUID          whenSPSID = null;    // when clause sps uuid string
    Timestamp        createTime = null;
    String          event = null;
    String          time = null;
    String          type = null;
    String          enabled = null;
    String          triggerDefinition = null;
    String          oldReferencingName = null;
    String          newReferencingName = null;
    ReferencedColumns rcd = null;
    boolean          referencingOld = false;
    boolean          referencingNew = false;

    if (td != null)
    {
      TriggerDescriptor triggerDescriptor = (TriggerDescriptor)td;
      name = triggerDescriptor.getName();
      uuid = triggerDescriptor.getUUID();
      suuid = triggerDescriptor.getSchemaDescriptor().getUUID();
      createTime = triggerDescriptor.getCreationTimestamp();
      // for now we are assuming that a trigger can only listen to a single event
      event = triggerDescriptor.listensForEvent(TriggerDescriptor.TRIGGER_EVENT_UPDATE) ? "U" :
          triggerDescriptor.listensForEvent(TriggerDescriptor.TRIGGER_EVENT_DELETE) ? "D" : "I";
      time = triggerDescriptor.isBeforeTrigger() ? "B" : "A";
      type = triggerDescriptor.isRowTrigger() ? "R" : "S";
      enabled = triggerDescriptor.isEnabled() ? "E" : "D";
      tuuid = triggerDescriptor.getTableDescriptor().getUUID();
      int[] refCols = triggerDescriptor.getReferencedCols();
      rcd = (refCols != null) ? new
        ReferencedColumnsDescriptorImpl(refCols) : null;

      actionSPSID =  triggerDescriptor.getActionId();
      whenSPSID =  triggerDescriptor.getWhenClauseId();
      triggerDefinition = triggerDescriptor.getTriggerDefinition();
      referencingOld = triggerDescriptor.getReferencingOld();
      referencingNew = triggerDescriptor.getReferencingNew();
      oldReferencingName = triggerDescriptor.getOldReferencingName();
      newReferencingName = triggerDescriptor.getNewReferencingName();
    }

    /* Build the row to insert */
    row = getExecutionFactory().getValueRow(SYSTRIGGERS_COLUMN_COUNT);

    /* 1st column is TRIGGERID */
    row.setColumn(1, new SQLChar((uuid == null) ? null : uuid.toString()));

    /* 2nd column is TRIGGERNAME */
    row.setColumn(2, new SQLVarchar(name));

    /* 3rd column is SCHEMAID */
    row.setColumn(3, new SQLChar((suuid == null) ? null : suuid.toString()));

    /* 4th column is CREATIONTIMESTAMP */
    row.setColumn(4, dvf.getDataValue(createTime));

    /* 5th column is EVENT */
    row.setColumn(5, new SQLChar(event));

    /* 6th column is FIRINGTIME */
    row.setColumn(6, new SQLChar(time));

    /* 7th column is TYPE */
    row.setColumn(7, new SQLChar(type));

    /* 8th column is STATE */
    row.setColumn(8, new SQLChar(enabled));

    /* 9th column is TABLEID */
    row.setColumn(9, new SQLChar((tuuid == null) ? null : tuuid.toString()));

    /* 10th column is WHENSTMTID */
    row.setColumn(10, new SQLChar((whenSPSID == null) ? null : whenSPSID.toString()));

    /* 11th column is ACTIONSTMTID */
    row.setColumn(11, new SQLChar((actionSPSID == null) ? null : actionSPSID.toString()));

    /* 12th column is REFERENCEDCOLUMNS
     *  (user type org.apache.derby.catalog.ReferencedColumns)
     */
    row.setColumn(12, dvf.getDataValue(rcd));

    /* 13th column is TRIGGERDEFINITION */
    row.setColumn(13, dvf.getLongvarcharDataValue(triggerDefinition));

    /* 14th column is REFERENCINGOLD */
    row.setColumn(14, dvf.getDataValue(referencingOld));

    /* 15th column is REFERENCINGNEW */
    row.setColumn(15, dvf.getDataValue(referencingNew));

    /* 16th column is OLDREFERENCINGNAME */
    row.setColumn(16, new SQLVarchar(oldReferencingName));

    /* 17th column is NEWREFERENCINGNAME */
    row.setColumn(17, new SQLVarchar(newReferencingName));

    return row;
  }


  ///////////////////////////////////////////////////////////////////////////
  //
  //  ABSTRACT METHODS TO BE IMPLEMENTED BY CHILDREN OF CatalogRowFactory
  //
  ///////////////////////////////////////////////////////////////////////////

  /**
   * Make an  Tuple Descriptor out of a SYSTRIGGERS row
   *
   * @param row           a SYSTRIGGERS row
   * @param parentTupleDescriptor  unused
   * @param dd           dataDictionary
   *
   * @return  a  descriptor equivalent to a SYSTRIGGERS row
   *
   * @exception   StandardException thrown on failure
   */
  public TupleDescriptor buildDescriptor
  (
    ExecRow          row,
    TupleDescriptor      parentTupleDescriptor,
    DataDictionary       dd
  ) throws StandardException
  {
    DataValueDescriptor    col;
    String          name;
    char          theChar;
    String          uuidStr;
    String          triggerDefinition;
    String          oldReferencingName;
    String          newReferencingName;
    UUID          uuid; 
    UUID          suuid;          // schema 
    UUID          tuuid;          // referenced table 
    UUID          actionSPSID = null;    // action sps uuid string
    UUID          whenSPSID = null;    // when clause sps uuid string
    Timestamp        createTime;
    int            eventMask = 0;
    boolean          isBefore;
    boolean          isRow;
    boolean          isEnabled;
    boolean          referencingOld;
    boolean          referencingNew;
    ReferencedColumns rcd;
    TriggerDescriptor    descriptor;
    DataDescriptorGenerator  ddg = dd.getDataDescriptorGenerator();

    if (SanityManager.DEBUG)
    {
      SanityManager.ASSERT(row.nColumns() == SYSTRIGGERS_COLUMN_COUNT,
                 "Wrong number of columns for a SYSTRIGGERS row");
    }

    // 1st column is TRIGGERID (UUID - char(36))
    col = row.getColumn(1);
    uuidStr = col.getString();
    uuid = getUUIDFactory().recreateUUID(uuidStr);

    // 2nd column is TRIGGERNAME (varchar(128))
    col = row.getColumn(2);
    name = col.getString();

    // 3rd column is SCHEMAID (UUID - char(36))
    col = row.getColumn(3);
    uuidStr = col.getString();
    suuid = getUUIDFactory().recreateUUID(uuidStr);

    // 4th column is CREATIONTIMESTAMP (TIMESTAMP)
    col = row.getColumn(4);
    createTime = (Timestamp) col.getObject();

    // 5th column is EVENT (char(1))
    col = row.getColumn(5);
    theChar = col.getString().charAt(0);
    switch (theChar)
    {
      case 'U':
            eventMask = TriggerDescriptor.TRIGGER_EVENT_UPDATE;
            break;

      case 'I':
            eventMask = TriggerDescriptor.TRIGGER_EVENT_INSERT;
            break;

      case 'D':
            eventMask = TriggerDescriptor.TRIGGER_EVENT_DELETE;
            break;

      default:
          if (SanityManager.DEBUG
          {
            SanityManager.THROWASSERT("bad event mask: "+theChar);
          }
    }
   
    // 6th column is FIRINGTIME (char(1))
    isBefore = getCharBoolean(row.getColumn(6), 'B', 'A');

    // 7th column is TYPE (char(1))
    isRow = getCharBoolean(row.getColumn(7), 'R', 'S');

    // 8th column is STATE (char(1))
    isEnabled = getCharBoolean(row.getColumn(8), 'E', 'D');

    // 9th column is TABLEID (UUID - char(36))
    col = row.getColumn(9);
    uuidStr = col.getString();
    tuuid = getUUIDFactory().recreateUUID(uuidStr);

    // 10th column is WHENSTMTID (UUID - char(36))
    col = row.getColumn(10);
    uuidStr = col.getString();
    if (uuidStr != null)
      whenSPSID = getUUIDFactory().recreateUUID(uuidStr);

    // 11th column is ACTIONSTMTID (UUID - char(36))
    col = row.getColumn(11);
    uuidStr = col.getString();
    if (uuidStr != null)
      actionSPSID = getUUIDFactory().recreateUUID(uuidStr);

    // 12th column is REFERENCEDCOLUMNS user type org.apache.derby.catalog.ReferencedColumns
    col = row.getColumn(12);
    rcd = (ReferencedColumns) col.getObject();

    // 13th column is TRIGGERDEFINITION (longvarhar)
    col = row.getColumn(13);
    triggerDefinition = col.getString();

    // 14th column is REFERENCINGOLD (boolean)
    col = row.getColumn(14);
    referencingOld = col.getBoolean();

    // 15th column is REFERENCINGNEW (boolean)
    col = row.getColumn(15);
    referencingNew = col.getBoolean();

    // 16th column is REFERENCINGNAME (varchar(128))
    col = row.getColumn(16);
    oldReferencingName = col.getString();

    // 17th column is REFERENCINGNAME (varchar(128))
    col = row.getColumn(17);
    newReferencingName = col.getString();

    descriptor = new TriggerDescriptor(
                  dd,
                  dd.getSchemaDescriptor(suuid, null),
                  uuid,
                  name,
                  eventMask,
                  isBefore,
                  isRow,
                  isEnabled,
                  dd.getTableDescriptor(tuuid),
                  whenSPSID,
                  actionSPSID,
                  createTime,
                  (rcd == null) ? (int[])null : rcd.getReferencedColumnPositions(),
                  triggerDefinition,
                  referencingOld,
                  referencingNew,
                  oldReferencingName,
                  newReferencingName
                  );

    return descriptor;
  }

     
  /**
   * Builds a list of columns suitable for creating this Catalog.
   * The last column, the serialized statement, is not added
   * to the column list.  This is done deliberately to make it
   * a 'hidden' column -- one that is not visible to customers,
   * but is visible to the system.
   *
   *
   * @return array of SystemColumn suitable for making this catalog.
   */
  public SystemColumn[] buildColumnList()
  {
    SystemColumn[]  columnList = new SystemColumn[SYSTRIGGERS_COLUMN_COUNT];

    // describe columns
    columnList[SYSTRIGGERS_TRIGGERID-1] = new SystemColumnImpl
              convertIdCase( "TRIGGERID"),      // name
              SYSTRIGGERS_TRIGGERID,  // column number
              0,          // precision
              0,          // scale
              false,        // nullability
              "CHAR",        // dataType
              true,        // built-in type
              36          // maxLength
                      );

    columnList[SYSTRIGGERS_TRIGGERNAME-1] =
          new SystemColumnImpl(    // SQL IDENTIFIER
              convertIdCase( "TRIGGERNAME"),      // column name
              SYSTRIGGERS_TRIGGERNAME,  // column number
              false        // nullability
              );

    columnList[SYSTRIGGERS_SCHEMAID-1] = new SystemColumnImpl
              convertIdCase( "SCHEMAID"),        // name
              SYSTRIGGERS_SCHEMAID,  // column number
              0,          // precision
              0,          // scale
              false,        // nullability
              "CHAR",        // dataType
              true,        // built-in type
              36          // maxLength
                      );

    columnList[SYSTRIGGERS_CREATIONTIMESTAMP-1] =
          new SystemColumnImpl(   
              convertIdCase( "CREATIONTIMESTAMP"),    // name
              SYSTRIGGERS_CREATIONTIMESTAMP,  // column number
              0,              // precision
              0,              // scale
              false,            // nullability
              "TIMESTAMP",        // dataType
              true,            // built-in type
              TypeId.TIMESTAMP_MAXWIDTH  // maxLength
                      );

    columnList[SYSTRIGGERS_EVENT-1] =
          new SystemColumnImpl(   
              convertIdCase( "EVENT"),      // name
              SYSTRIGGERS_EVENT,  // column number
              0,          // precision
              0,          // scale
              false,        // nullability
              "CHAR",        // dataType
              true,        // built-in type
              1          // maxLength
                      );

    columnList[SYSTRIGGERS_FIRINGTIME-1] =
          new SystemColumnImpl(   
              convertIdCase( "FIRINGTIME"),    // name
              SYSTRIGGERS_FIRINGTIME, // column number
              0,          // precision
              0,          // scale
              false,        // nullability
              "CHAR",        // dataType
              true,        // built-in type
              1          // maxLength
                      );

    columnList[SYSTRIGGERS_TYPE-1] =
          new SystemColumnImpl(   
              convertIdCase( "TYPE"),        // name
              SYSTRIGGERS_TYPE,  // column number
              0,          // precision
              0,          // scale
              false,        // nullability
              "CHAR",        // dataType
              true,        // built-in type
              1          // maxLength
                      );

    columnList[SYSTRIGGERS_STATE-1] =
          new SystemColumnImpl(   
              convertIdCase( "STATE"),      // name
              SYSTRIGGERS_STATE,// column number
              0,          // precision
              0,          // scale
              false,        // nullability
              "CHAR",        // dataType
              true,        // built-in type
              1          // maxLength
                      );

    columnList[SYSTRIGGERS_TABLEID-1] =
          new SystemColumnImpl
              convertIdCase( "TABLEID"),      // name
              SYSTRIGGERS_TABLEID,  // column number
              0,          // precision
              0,          // scale
              false,        // nullability
              "CHAR",        // dataType
              true,        // built-in type
              36          // maxLength
                      );

    columnList[SYSTRIGGERS_WHENSTMTID-1] =
          new SystemColumnImpl
              convertIdCase( "WHENSTMTID"),        // name
              SYSTRIGGERS_WHENSTMTID,    // column number
              0,              // precision
              0,              // scale
              true,            // nullability
              "CHAR",            // dataType
              true,            // built-in type
              36              // maxLength
                      );

    columnList[SYSTRIGGERS_ACTIONSTMTID-1] =
          new SystemColumnImpl
              convertIdCase( "ACTIONSTMTID"),        // name
              SYSTRIGGERS_ACTIONSTMTID,  // column number
              0,              // precision
              0,              // scale
              true,            // nullability
              "CHAR",            // dataType
              true,            // built-in type
              36              // maxLength
                      );

    columnList[SYSTRIGGERS_REFERENCEDCOLUMNS-1] =
          new SystemColumnImpl(   
              convertIdCase( "REFERENCEDCOLUMNS"),      // name
              SYSTRIGGERS_REFERENCEDCOLUMNS,  // column number
              0,                // precision
              0,                // scale
              true,              // nullability
              "org.apache.derby.catalog.ReferencedColumns"//datatype
              false,              // built-in type
              DataTypeDescriptor.MAXIMUM_WIDTH_UNKNOWN // maxLength
                      );

    columnList[SYSTRIGGERS_TRIGGERDEFINITION-1] =
          new SystemColumnImpl
              convertIdCase( "TRIGGERDEFINITION"),        // name
              SYSTRIGGERS_TRIGGERDEFINITION,  // column number
              0,              // precision
              0,              // scale
              true,            // nullability
              "LONG VARCHAR",      // dataType
              true,        // built-in type
              Integer.MAX_VALUE  // maxLength
                      );

    columnList[SYSTRIGGERS_REFERENCINGOLD-1] =
          new SystemColumnImpl(   
              convertIdCase( "REFERENCINGOLD"),      // name
              SYSTRIGGERS_REFERENCINGOLD,// column number
              0,          // precision
              0,          // scale
              true,        // nullability
              "BOOLEAN",      // dataType
              true,        // built-in type
              1          // maxLength
                      );

    columnList[SYSTRIGGERS_REFERENCINGNEW-1] =
          new SystemColumnImpl(   
              convertIdCase( "REFERENCINGNEW"),      // name
              SYSTRIGGERS_REFERENCINGNEW,// column number
              0,          // precision
              0,          // scale
              true,        // nullability
              "BOOLEAN",      // dataType
              true,        // built-in type
              1          // maxLength
                      );

    columnList[SYSTRIGGERS_OLDREFERENCINGNAME-1] =
          new SystemColumnImpl(    // SQL IDENTIFIER
              convertIdCase( "OLDREFERENCINGNAME"),      // column name
              SYSTRIGGERS_OLDREFERENCINGNAME,  // column number
              true        // nullability
              );

    columnList[SYSTRIGGERS_NEWREFERENCINGNAME-1] =
          new SystemColumnImpl(    // SQL IDENTIFIER
              convertIdCase( "NEWREFERENCINGNAME"),      // column name
              SYSTRIGGERS_NEWREFERENCINGNAME,  // column number
              true        // nullability
              );

    return  columnList;
  }

  // a little helper
  private boolean getCharBoolean(DataValueDescriptor col, char trueValue, char falseValue) throws StandardException
  {
    char theChar = col.getString().charAt(0);
    if (theChar == trueValue)
    {
      return true;
    }
    else if (theChar == falseValue)
    {
      return false;
    }
    else
    {
      if (SanityManager.DEBUG)
        SanityManager.THROWASSERT("bad char value "+theChar);
   
      return true;
    }
  }
}
TOP

Related Classes of org.apache.derby.impl.sql.catalog.SYSTRIGGERSRowFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.