protected CFCrmMemoDataBuff unpackMemoDataResultSetToBuff(ResultSet resultSet)
      throws SQLException {
    final String S_ProcName = "unpackMemoDataResultSetToBuff";
    int idxcol = 1;
    CFCrmMemoDataBuff buff = schema.getFactoryMemoData().newBuff();
    {
      String colString = resultSet.getString(idxcol);
      if (resultSet.wasNull()) {
        buff.setCreatedByUserId(null);
      } else if ((colString == null) || (colString.length() <= 0)) {
        buff.setCreatedByUserId(null);
      } else {
        buff.setCreatedByUserId(UUID.fromString(colString));
      }
      idxcol++;

      colString = resultSet.getString(idxcol);
      if (resultSet.wasNull()) {
        buff.setCreatedAt(null);
      } else if ((colString == null) || (colString.length() <= 0)) {
        buff.setCreatedAt(null);
      } else {
        buff.setCreatedAt(CFCrmMSSqlSchema.convertTimestampString(colString));
      }
      idxcol++;
      colString = resultSet.getString(idxcol);
      if (resultSet.wasNull()) {
        buff.setUpdatedByUserId(null);
      } else if ((colString == null) || (colString.length() <= 0)) {
        buff.setUpdatedByUserId(null);
      } else {
        buff.setUpdatedByUserId(UUID.fromString(colString));
      }
      idxcol++;

      colString = resultSet.getString(idxcol);
      if (resultSet.wasNull()) {
        buff.setUpdatedAt(null);
      } else if ((colString == null) || (colString.length() <= 0)) {
        buff.setUpdatedAt(null);
      } else {
        buff.setUpdatedAt(CFCrmMSSqlSchema.convertTimestampString(colString));
      }
      idxcol++;
    }
    buff.setRequiredTenantId(resultSet.getLong(idxcol));
    idxcol++;
    buff.setRequiredMemoId(resultSet.getLong(idxcol));
    idxcol++;
    buff.setRequiredContactId(resultSet.getLong(idxcol));
    idxcol++;
    buff.setRequiredMemo(resultSet.getString(idxcol));
    idxcol++;
    buff.setRequiredRevision(resultSet.getInt(idxcol));
    return (buff);
  }
  public void startElement(String uri, String localName, String qName, Attributes attrs)
      throws SAXException {
    try {
      // Common XML Attributes
      String attrId = null;
      String attrRevision = null;
      // MemoData Attributes
      String attrTenantId = null;
      String attrMemoId = null;
      String attrContactId = null;
      String attrMemo = null;
      String attrCreatedAt = null;
      String attrCreatedBy = null;
      String attrUpdatedAt = null;
      String attrUpdatedBy = null;
      // Attribute Extraction
      String attrLocalName;
      int numAttrs;
      int idxAttr;
      final String S_ProcName = "startElement";
      final String S_LocalName = "LocalName";

      assert qName.equals("RspnMemoDataCreated");

      CFCrmXMsgRspnHandler xmsgRspnHandler = (CFCrmXMsgRspnHandler) getParser();
      if (xmsgRspnHandler == null) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "getParser()");
      }

      ICFCrmSchemaObj schemaObj = xmsgRspnHandler.getSchemaObj();
      if (schemaObj == null) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "getParser().getSchemaObj()");
      }

      // Extract Attributes
      numAttrs = attrs.getLength();
      for (idxAttr = 0; idxAttr < numAttrs; idxAttr++) {
        attrLocalName = attrs.getLocalName(idxAttr);
        if (attrLocalName.equals("Id")) {
          if (attrId != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrId = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("Revision")) {
          if (attrRevision != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrRevision = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("CreatedAt")) {
          if (attrCreatedAt != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrCreatedAt = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("CreatedBy")) {
          if (attrCreatedBy != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrCreatedBy = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("UpdatedAt")) {
          if (attrUpdatedAt != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrUpdatedAt = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("UpdatedBy")) {
          if (attrUpdatedBy != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrUpdatedBy = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("TenantId")) {
          if (attrTenantId != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrTenantId = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("MemoId")) {
          if (attrMemoId != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrMemoId = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("ContactId")) {
          if (attrContactId != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrContactId = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("Memo")) {
          if (attrMemo != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrMemo = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("schemaLocation")) {
          // ignored
        } else {
          throw CFLib.getDefaultExceptionFactory()
              .newUnrecognizedAttributeException(
                  getClass(), S_ProcName, getParser().getLocationInfo(), attrLocalName);
        }
      }

      // Ensure that required attributes have values
      if ((attrTenantId == null) || (attrTenantId.length() <= 0)) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "TenantId");
      }
      if ((attrMemoId == null) || (attrMemoId.length() <= 0)) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "MemoId");
      }
      if ((attrContactId == null) || (attrContactId.length() <= 0)) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "ContactId");
      }
      if (attrMemo == null) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "Memo");
      }
      if ((attrRevision == null) || (attrRevision.length() <= 0)) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "Revision");
      }

      // Save named attributes to context
      CFLibXmlCoreContext curContext = getParser().getCurContext();

      // Convert string attributes to native Java types

      long natTenantId = Long.parseLong(attrTenantId);

      long natMemoId = Long.parseLong(attrMemoId);

      long natContactId = Long.parseLong(attrContactId);

      String natMemo = attrMemo;

      int natRevision = Integer.parseInt(attrRevision);
      UUID createdBy = null;
      if (attrCreatedBy != null) {
        createdBy = UUID.fromString(attrCreatedBy);
      }
      Calendar createdAt = null;
      if (attrCreatedAt != null) {
        createdAt = CFLibXmlUtil.parseTimestamp(attrCreatedAt);
      }
      UUID updatedBy = null;
      if (attrUpdatedBy != null) {
        updatedBy = UUID.fromString(attrUpdatedBy);
      }
      Calendar updatedAt = null;
      if (attrUpdatedAt != null) {
        updatedAt = CFLibXmlUtil.parseTimestamp(attrUpdatedAt);
      }
      // Instantiate a buffer for the parsed information
      ICFCrmMemoDataObj obj = (ICFCrmMemoDataObj) schemaObj.getMemoDataTableObj().newInstance();
      CFCrmMemoDataBuff dataBuff = obj.getMemoDataBuff();
      dataBuff.setRequiredTenantId(natTenantId);
      dataBuff.setRequiredMemoId(natMemoId);
      dataBuff.setRequiredContactId(natContactId);
      dataBuff.setRequiredMemo(natMemo);
      dataBuff.setRequiredRevision(natRevision);
      if (createdBy != null) {
        dataBuff.setCreatedByUserId(createdBy);
      }
      if (createdAt != null) {
        dataBuff.setCreatedAt(createdAt);
      }
      if (updatedBy != null) {
        dataBuff.setUpdatedByUserId(updatedBy);
      }
      if (updatedAt != null) {
        dataBuff.setUpdatedAt(updatedAt);
      }
      obj.copyBuffToPKey();
      ICFCrmMemoDataObj realized = (ICFCrmMemoDataObj) obj.realize();
      xmsgRspnHandler.setLastObjectProcessed(realized);
    } catch (RuntimeException e) {
      throw new RuntimeException(
          "Near "
              + getParser().getLocationInfo()
              + ": Caught and rethrew "
              + e.getClass().getName()
              + " - "
              + e.getMessage(),
          e);
    } catch (Error e) {
      throw new Error(
          "Near "
              + getParser().getLocationInfo()
              + ": Caught and rethrew "
              + e.getClass().getName()
              + " - "
              + e.getMessage(),
          e);
    }
  }
  public void updateMemoData(CFSecurityAuthorization Authorization, CFCrmMemoDataBuff Buff) {
    final String S_ProcName = "updateMemoData";
    if ("MMOD".equals(Buff.getClassCode())
        && (!schema.isTenantUser(Authorization, Buff.getRequiredTenantId(), "UpdateMemoData"))) {
      throw CFLib.getDefaultExceptionFactory()
          .newRuntimeException(
              getClass(),
              S_ProcName,
              "Permission denied -- User not part of TSecGroup UpdateMemoData");
    }
    try {
      Connection cnx = schema.getCnx();
      long TenantId = Buff.getRequiredTenantId();
      long MemoId = Buff.getRequiredMemoId();
      long ContactId = Buff.getRequiredContactId();
      String Memo = Buff.getRequiredMemo();
      int Revision = Buff.getRequiredRevision();
      CFCrmMemoDataPKey pkey = schema.getFactoryMemoData().newPKey();
      pkey.setRequiredTenantId(Buff.getRequiredTenantId());
      pkey.setRequiredMemoId(Buff.getRequiredMemoId());
      CFCrmMemoDataBuff readBuff = lockBuff(Authorization, pkey);
      if (readBuff == null) {
        throw CFLib.getDefaultExceptionFactory()
            .newStaleCacheDetectedException(
                getClass(),
                S_ProcName,
                "Attempted to update record which could not be locked/found",
                schema.getLowerDbSchemaName() + "..memodata",
                pkey);
      }
      int oldRevision = readBuff.getRequiredRevision();
      if (oldRevision != Revision) {
        throw CFLib.getDefaultExceptionFactory()
            .newCollisionDetectedException(getClass(), S_ProcName, Buff);
      }
      int newRevision = Revision + 1;
      String sql =
          "UPDATE "
              + schema.getLowerDbSchemaName()
              + "..MemoData "
              + "SET "
              + "tenantid = ?"
              + ", "
              + "memoid = ?"
              + ", "
              + "contactid = ?"
              + ", "
              + "memo = ?"
              + ", "
              + "updatedby = ?, "
              + "updatedat = sysdatetime() "
              + ", revision = ? "
              + " WHERE "
              + "tenantid = ? "
              + "AND "
              + "memoid = ? "
              + "AND "
              + "revision = ? ";
      if (stmtUpdateByPKey == null) {
        stmtUpdateByPKey = cnx.prepareStatement(sql);
      }
      int argIdx = 1;

      stmtUpdateByPKey.setLong(argIdx++, TenantId);
      stmtUpdateByPKey.setLong(argIdx++, MemoId);
      stmtUpdateByPKey.setLong(argIdx++, ContactId);
      stmtUpdateByPKey.setString(argIdx++, Memo);
      stmtUpdateByPKey.setString(argIdx++, Authorization.getSecUserId().toString());
      stmtUpdateByPKey.setInt(argIdx++, newRevision);
      stmtUpdateByPKey.setLong(argIdx++, TenantId);
      stmtUpdateByPKey.setLong(argIdx++, MemoId);
      stmtUpdateByPKey.setInt(argIdx++, Revision);
      ;
      int rowsAffected = stmtUpdateByPKey.executeUpdate();
      if (rowsAffected != 1) {
        throw CFLib.getDefaultExceptionFactory()
            .newRuntimeException(
                getClass(),
                S_ProcName,
                "Expected 1 row to be affected by update, not " + rowsAffected);
      }
      Buff.setRequiredRevision(newRevision);
      String sqlAuditUpdated =
          "INSERT INTO "
              + schema.getLowerDbSchemaName()
              + "..MemoData_h( auditclusterid, "
              + " auditsessionid, "
              + " auditstamp"
              + ", "
              + "tenantid"
              + ", "
              + "memoid"
              + ", "
              + "contactid"
              + ", "
              + "memo"
              + ", "
              + " revision, "
              + " auditaction ) "
              + "SELECT ?, ?, sysdatetime()"
              + ", "
              + "mmod.tenantid"
              + ", "
              + "mmod.memoid"
              + ", "
              + "mmod.contactid"
              + ", "
              + "mmod.memo"
              + ", "
              + " mmod.revision, "
              + " 1 "
              + "FROM "
              + schema.getLowerDbSchemaName()
              + "..MemoData AS mmod "
              + " WHERE "
              + "mmod.tenantid = ? "
              + "AND mmod.memoid = ? ";
      if (stmtAuditUpdatedByPKey == null) {
        stmtAuditUpdatedByPKey = cnx.prepareStatement(sqlAuditUpdated);
      }
      argIdx = 1;
      stmtAuditUpdatedByPKey.setLong(argIdx++, Authorization.getSecClusterId());
      stmtAuditUpdatedByPKey.setString(argIdx++, Authorization.getSecSessionId().toString());
      stmtAuditUpdatedByPKey.setLong(argIdx++, TenantId);
      stmtAuditUpdatedByPKey.setLong(argIdx++, MemoId);
      int rowsAudited = stmtAuditUpdatedByPKey.executeUpdate();
      if (rowsAudited != 1) {
        throw CFLib.getDefaultExceptionFactory()
            .newRuntimeException(
                getClass(),
                S_ProcName,
                "Expected 1 row to be affected by audit via insert-selected, not " + rowsAffected);
      }
    } catch (SQLException e) {
      throw CFLib.getDefaultExceptionFactory().newDbException(getClass(), S_ProcName, e);
    }
  }
  public void createMemoData(CFSecurityAuthorization Authorization, CFCrmMemoDataBuff Buff) {
    final String S_ProcName = "createMemoData";
    if ("MMOD".equals(Buff.getClassCode())
        && (!schema.isTenantUser(Authorization, Buff.getRequiredTenantId(), "CreateMemoData"))) {
      throw CFLib.getDefaultExceptionFactory()
          .newRuntimeException(
              getClass(),
              S_ProcName,
              "Permission denied -- User not part of TSecGroup CreateMemoData");
    }
    if (!schema.isTransactionOpen()) {
      throw CFLib.getDefaultExceptionFactory()
          .newUsageException(getClass(), S_ProcName, "Transaction not open");
    }
    try {
      Connection cnx = schema.getCnx();
      long TenantId = Buff.getRequiredTenantId();
      long MemoId = Buff.getRequiredMemoId();
      long ContactId = Buff.getRequiredContactId();
      String Memo = Buff.getRequiredMemo();
      int Revision = 1;
      String sql =
          "INSERT INTO "
              + schema.getLowerDbSchemaName()
              + "..MemoData( "
              + "forcesynclock, "
              + "createdby, "
              + "createdat, "
              + "updatedby, "
              + "updatedat, "
              + "tenantid, "
              + "memoid, "
              + "contactid, "
              + "memo"
              + ", revision )"
              + "VALUES ( "
              + "0, "
              + " ?, "
              + " getdate(), "
              + " ?, "
              + " getdate(), "
              + "?"
              + ", "
              + "?"
              + ", "
              + "?"
              + ", "
              + "?"
              + ", "
              + "1 )";
      if (stmtCreateByPKey == null) {
        stmtCreateByPKey = cnx.prepareStatement(sql);
      }
      int argIdx = 1;
      stmtCreateByPKey.setString(argIdx++, Authorization.getSecUserId().toString());
      stmtCreateByPKey.setString(argIdx++, Authorization.getSecUserId().toString());
      stmtCreateByPKey.setLong(argIdx++, TenantId);
      stmtCreateByPKey.setLong(argIdx++, MemoId);
      stmtCreateByPKey.setLong(argIdx++, ContactId);
      stmtCreateByPKey.setString(argIdx++, Memo);
      int rowsAffected = stmtCreateByPKey.executeUpdate();
      if (rowsAffected != 1) {
        throw CFLib.getDefaultExceptionFactory()
            .newRuntimeException(
                getClass(),
                S_ProcName,
                "Expected 1 row to be affected by insert, not " + rowsAffected);
      }
      Buff.setRequiredRevision(Revision);
      String sqlAuditCreated =
          "INSERT INTO "
              + schema.getLowerDbSchemaName()
              + "..MemoData_h( auditclusterid, "
              + " auditsessionid, "
              + " auditstamp"
              + ", "
              + "tenantid"
              + ", "
              + "memoid"
              + ", "
              + "contactid"
              + ", "
              + "memo"
              + ", "
              + " revision, "
              + " auditaction ) "
              + "SELECT ?, ?, sysdatetime()"
              + ", "
              + "mmod.tenantid"
              + ", "
              + "mmod.memoid"
              + ", "
              + "mmod.contactid"
              + ", "
              + "mmod.memo"
              + ", "
              + " mmod.revision, "
              + " 0"
              + "FROM "
              + schema.getLowerDbSchemaName()
              + "..MemoData AS mmod "
              + " WHERE "
              + "mmod.tenantid = ? "
              + "AND mmod.memoid = ? ";
      if (stmtAuditCreatedByPKey == null) {
        stmtAuditCreatedByPKey = cnx.prepareStatement(sqlAuditCreated);
      }
      argIdx = 1;
      stmtAuditCreatedByPKey.setLong(argIdx++, Authorization.getSecClusterId());
      stmtAuditCreatedByPKey.setString(argIdx++, Authorization.getSecSessionId().toString());
      stmtAuditCreatedByPKey.setLong(argIdx++, TenantId);
      stmtAuditCreatedByPKey.setLong(argIdx++, MemoId);
      int rowsAudited = stmtAuditCreatedByPKey.executeUpdate();
      if (rowsAudited != 1) {
        throw CFLib.getDefaultExceptionFactory()
            .newRuntimeException(
                getClass(),
                S_ProcName,
                "Expected 1 row to be affected by audit via insert-selected, not " + rowsAffected);
      }

    } catch (SQLException e) {
      throw CFLib.getDefaultExceptionFactory().newDbException(getClass(), S_ProcName, e);
    }
  }