shardingsphere-operator/pkg/distsql/visitor/encrypt_rdl.go (328 lines of code) (raw):
/*
* 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 visitor
import (
"fmt"
"github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/pkg/distsql/ast"
parser "github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/pkg/distsql/visitor_parser/encrypt"
)
type EncryptVisitor struct {
parser.BaseRDLStatementVisitor
}
func (v *EncryptVisitor) VisitCreateEncryptRule(ctx *parser.CreateEncryptRuleContext) *ast.CreateEncryptRule {
stmt := &ast.CreateEncryptRule{}
if ctx.IfNotExists() != nil {
stmt.IfNotExists = v.VisitIfNotExists(ctx.IfNotExists().(*parser.IfNotExistsContext))
}
if ctx.EncryptRuleDefinition(0) != nil {
stmt.EncryptRuleDefinition = v.VisitEncryptRuleDefinition(ctx.EncryptRuleDefinition(0).(*parser.EncryptRuleDefinitionContext))
}
if ctx.AllEncryptRuleDefinition() != nil {
for _, r := range ctx.AllEncryptRuleDefinition() {
if r != nil {
stmt.AllEncryptRuleDefinition = append(stmt.AllEncryptRuleDefinition, v.VisitEncryptRuleDefinition(r.(*parser.EncryptRuleDefinitionContext)))
}
}
}
return stmt
}
func (v *EncryptVisitor) VisitIfNotExists(ctx *parser.IfNotExistsContext) *ast.IfNotExists {
return &ast.IfNotExists{
IfNotExists: fmt.Sprintf("%s %s %s", ctx.IF().GetText(), ctx.NOT().GetText(), ctx.EXISTS().GetText()),
}
}
func (v *EncryptVisitor) VisitIfExists(ctx *parser.IfExistsContext) *ast.IfExists {
return &ast.IfExists{
IfExists: fmt.Sprintf("%s %s", ctx.IF().GetText(), ctx.EXISTS().GetText()),
}
}
func (v *EncryptVisitor) VisitAlterEncryptRule(ctx *parser.AlterEncryptRuleContext) *ast.AlterEncryptRule {
stmt := &ast.AlterEncryptRule{}
if ctx.AllEncryptRuleDefinition() != nil {
for _, encryptRuleDefinition := range ctx.AllEncryptRuleDefinition() {
stmt.AllEncryptRuleDefinitionList = append(stmt.AllEncryptRuleDefinitionList, v.VisitEncryptRuleDefinition(encryptRuleDefinition.(*parser.EncryptRuleDefinitionContext)))
}
}
return stmt
}
func (v *EncryptVisitor) VisitDropEncryptRule(ctx *parser.DropEncryptRuleContext) *ast.DropEncryptRule {
stmt := &ast.DropEncryptRule{}
if ctx.IfExists() != nil {
stmt.IfExists = v.VisitIfExists(ctx.IfExists().(*parser.IfExistsContext))
}
if ctx.AllTableName() != nil {
for _, tableName := range ctx.AllTableName() {
stmt.AllTableName = append(stmt.AllTableName, v.VisitTableName(tableName.(*parser.TableNameContext)))
}
}
return stmt
}
func (v *EncryptVisitor) VisitEncryptRuleDefinition(ctx *parser.EncryptRuleDefinitionContext) *ast.EncryptRuleDefinition {
stmt := &ast.EncryptRuleDefinition{}
if ctx.TableName() != nil {
stmt.TableName = v.VisitTableName(ctx.TableName().(*parser.TableNameContext))
}
if ctx.ResourceDefinition() != nil {
stmt.ResourceDefinition = v.VisitResourceDefinition(ctx.ResourceDefinition().(*parser.ResourceDefinitionContext))
}
// if ctx.EncryptColumnDefinition(0) != nil {
// stmt.EncryptColumnDefinition = v.VisitEncryptColumnDefinition(ctx.EncryptColumnDefinition(0).(*parser.EncryptColumnDefinitionContext))
// }
if ctx.AllEncryptColumnDefinition() != nil {
for _, column := range ctx.AllEncryptColumnDefinition() {
stmt.AllEncryptColumnDefinition = append(stmt.AllEncryptColumnDefinition, v.VisitEncryptColumnDefinition(column.(*parser.EncryptColumnDefinitionContext)))
}
}
if ctx.QueryWithCipherColumn() != nil {
stmt.QueryWithCipherColumn = v.VisitQueryWithCipherColumn(ctx.QueryWithCipherColumn().(*parser.QueryWithCipherColumnContext))
}
return stmt
}
func (v *EncryptVisitor) VisitQueryWithCipherColumn(ctx *parser.QueryWithCipherColumnContext) *ast.QueryWithCipherColumn {
stmt := &ast.QueryWithCipherColumn{}
switch {
case ctx.TRUE() != nil:
stmt.QueryWithCipherColumn = ctx.TRUE().GetText()
case ctx.FALSE() != nil:
stmt.QueryWithCipherColumn = ctx.FALSE().GetText()
}
return stmt
}
func (v *EncryptVisitor) VisitEncryptColumnDefinition(ctx *parser.EncryptColumnDefinitionContext) *ast.EncryptColumnDefinition {
stmt := &ast.EncryptColumnDefinition{}
if ctx.ColumnDefinition() != nil {
stmt.ColumnDefinition = v.VisitColumnDefinition(ctx.ColumnDefinition().(*parser.ColumnDefinitionContext))
}
if ctx.PlainColumnDefinition() != nil {
stmt.PlainColumnDefinition = v.VisitPlainColumnDefinition(ctx.PlainColumnDefinition().(*parser.PlainColumnDefinitionContext))
}
if ctx.CipherColumnDefinition() != nil {
stmt.CipherColumnDefinition = v.VisitCipherColumnDefinition(ctx.CipherColumnDefinition().(*parser.CipherColumnDefinitionContext))
}
if ctx.AssistedQueryColumnDefinition() != nil {
stmt.AssistedQueryColumnDefinition = v.VisitAssistedQueryColumnDefinition(ctx.AssistedQueryColumnDefinition().(*parser.AssistedQueryColumnDefinitionContext))
}
if ctx.LikeQueryColumnDefinition() != nil {
stmt.LikeQueryColumnDefinition = v.VisitLikeQueryColumnDefinition(ctx.LikeQueryColumnDefinition().(*parser.LikeQueryColumnDefinitionContext))
}
if ctx.EncryptAlgorithm() != nil {
stmt.EncryptAlgorithm = v.VisitEncryptAlgorithm(ctx.EncryptAlgorithm().(*parser.EncryptAlgorithmContext))
}
if ctx.AssistedQueryAlgorithm() != nil {
stmt.AssistedQueryAlgorithm = v.VisitAssistedQueryAlgorithm(ctx.AssistedQueryAlgorithm().(*parser.AssistedQueryAlgorithmContext))
}
if ctx.LikeQueryAlgorithm() != nil {
stmt.LikeQueryAlgorithm = v.VisitLikeQueryAlgorithm(ctx.LikeQueryAlgorithm().(*parser.LikeQueryAlgorithmContext))
}
if ctx.QueryWithCipherColumn() != nil {
stmt.QueryWithCipherColumn = v.VisitQueryWithCipherColumn(ctx.QueryWithCipherColumn().(*parser.QueryWithCipherColumnContext))
}
return stmt
}
func (v *EncryptVisitor) VisitPlainColumnDefinition(ctx *parser.PlainColumnDefinitionContext) *ast.PlainColumnDefinition {
stmt := &ast.PlainColumnDefinition{}
if ctx.PlainColumnName() != nil {
stmt.PlainColumnName = v.VisitPlainColumnName(ctx.PlainColumnName().(*parser.PlainColumnNameContext))
}
if ctx.DataType() != nil {
stmt.DataType = v.VisitDataType(ctx.DataType().(*parser.DataTypeContext))
}
return stmt
}
func (v *EncryptVisitor) VisitPlainColumnName(ctx *parser.PlainColumnNameContext) *ast.CommonIdentifier {
stmt := &ast.CommonIdentifier{}
if ctx.IDENTIFIER_() != nil {
stmt.Identifier = ctx.IDENTIFIER_().GetText()
}
return stmt
}
func (v *EncryptVisitor) VisitCipherColumnDefinition(ctx *parser.CipherColumnDefinitionContext) *ast.CipherColumnDefinition {
stmt := &ast.CipherColumnDefinition{}
if ctx.CipherColumnName() != nil {
stmt.CipherColumnName = v.VisitCipherColumnName(ctx.CipherColumnName().(*parser.CipherColumnNameContext))
}
if ctx.DataType() != nil {
stmt.DataType = v.VisitDataType(ctx.DataType().(*parser.DataTypeContext))
}
return stmt
}
func (v *EncryptVisitor) VisitCipherColumnName(ctx *parser.CipherColumnNameContext) *ast.CommonIdentifier {
stmt := &ast.CommonIdentifier{}
if ctx.IDENTIFIER_() != nil {
stmt.Identifier = ctx.IDENTIFIER_().GetText()
}
return stmt
}
func (v *EncryptVisitor) VisitAssistedQueryColumnDefinition(ctx *parser.AssistedQueryColumnDefinitionContext) *ast.AssistedQueryColumnDefinition {
stmt := &ast.AssistedQueryColumnDefinition{}
if ctx.AssistedQueryColumnName() != nil {
stmt.AssistedQueryColumnName = v.VisitAssistedQueryColumnName(ctx.AssistedQueryColumnName().(*parser.AssistedQueryColumnNameContext))
}
if ctx.DataType() != nil {
stmt.DataType = v.VisitDataType(ctx.DataType().(*parser.DataTypeContext))
}
return stmt
}
func (v *EncryptVisitor) VisitAssistedQueryColumnName(ctx *parser.AssistedQueryColumnNameContext) *ast.CommonIdentifier {
stmt := &ast.CommonIdentifier{}
if ctx.IDENTIFIER_() != nil {
stmt.Identifier = ctx.IDENTIFIER_().GetText()
}
return stmt
}
func (v *EncryptVisitor) VisitLikeQueryColumnDefinition(ctx *parser.LikeQueryColumnDefinitionContext) *ast.LikeQueryColumnDefinition {
stmt := &ast.LikeQueryColumnDefinition{}
if ctx.LikeQueryColumnName() != nil {
stmt.LikeQueryColumnName = v.VisitLikeQueryColumnName(ctx.LikeQueryColumnName().(*parser.LikeQueryColumnNameContext))
}
if ctx.DataType() != nil {
stmt.DataType = v.VisitDataType(ctx.DataType().(*parser.DataTypeContext))
}
return stmt
}
func (v *EncryptVisitor) VisitLikeQueryColumnName(ctx *parser.LikeQueryColumnNameContext) *ast.CommonIdentifier {
stmt := &ast.CommonIdentifier{}
if ctx.IDENTIFIER_() != nil {
stmt.Identifier = ctx.IDENTIFIER_().GetText()
}
return stmt
}
func (v *EncryptVisitor) VisitAssistedQueryAlgorithm(ctx *parser.AssistedQueryAlgorithmContext) *ast.AssistedQueryAlgorithm {
stmt := &ast.AssistedQueryAlgorithm{}
if ctx.AlgorithmDefinition() != nil {
stmt.AlgorithmDefinition = v.VisitAlgorithmDefinition(ctx.AlgorithmDefinition().(*parser.AlgorithmDefinitionContext))
}
return stmt
}
func (v *EncryptVisitor) VisitLikeQueryAlgorithm(ctx *parser.LikeQueryAlgorithmContext) *ast.LikeQueryAlgorithm {
stmt := &ast.LikeQueryAlgorithm{}
if ctx.AlgorithmDefinition() != nil {
stmt.AlgorithmDefinition = v.VisitAlgorithmDefinition(ctx.AlgorithmDefinition().(*parser.AlgorithmDefinitionContext))
}
return stmt
}
func (v *EncryptVisitor) VisitEncryptAlgorithm(ctx *parser.EncryptAlgorithmContext) *ast.EncryptAlgorithm {
stmt := &ast.EncryptAlgorithm{}
if ctx.AlgorithmDefinition() != nil {
stmt.AlgorithmDefinition = v.VisitAlgorithmDefinition(ctx.AlgorithmDefinition().(*parser.AlgorithmDefinitionContext))
}
return stmt
}
func (v *EncryptVisitor) VisitColumnDefinition(ctx *parser.ColumnDefinitionContext) *ast.ColumnDefinition {
stmt := &ast.ColumnDefinition{}
if ctx.ColumnName() != nil {
stmt.ColumnName = v.VisitColumnName(ctx.ColumnName().(*parser.ColumnNameContext))
}
if ctx.DataType() != nil {
stmt.DataType = v.VisitDataType(ctx.DataType().(*parser.DataTypeContext))
}
return stmt
}
func (v *EncryptVisitor) VisitColumnName(ctx *parser.ColumnNameContext) *ast.CommonIdentifier {
stmt := &ast.CommonIdentifier{}
if ctx.IDENTIFIER_() != nil {
stmt.Identifier = ctx.IDENTIFIER_().GetText()
}
return stmt
}
func (v *EncryptVisitor) VisitDataType(ctx *parser.DataTypeContext) *ast.DataType {
stmt := &ast.DataType{}
if ctx.STRING_() != nil {
stmt.String = ctx.STRING_().GetText()
}
return stmt
}
func (v *EncryptVisitor) VisitResourceDefinition(ctx *parser.ResourceDefinitionContext) *ast.ResourceDefinition {
stmt := &ast.ResourceDefinition{}
if ctx.ResourceName() != nil {
stmt.ResourceName = v.VisitResourceName(ctx.ResourceName().(*parser.ResourceNameContext))
}
return stmt
}
func (v *EncryptVisitor) VisitResourceName(ctx *parser.ResourceNameContext) *ast.CommonIdentifier {
stmt := &ast.CommonIdentifier{}
if ctx.IDENTIFIER_() != nil {
stmt.Identifier = ctx.IDENTIFIER_().GetText()
}
return stmt
}
// nolint
func (v *EncryptVisitor) VisitLiteral(ctx *parser.LiteralContext) *ast.Literal {
stmt := &ast.Literal{}
switch {
case ctx.STRING_() != nil:
stmt.Literal = ctx.STRING_().GetText()
case ctx.MINUS_() != nil:
stmt.Literal = ctx.MINUS_().GetText()
case ctx.INT_() != nil:
stmt.Literal = ctx.INT_().GetText()
case ctx.TRUE() != nil:
stmt.Literal = ctx.TRUE().GetText()
case ctx.FALSE() != nil:
stmt.Literal = ctx.FALSE().GetText()
}
return stmt
}
func (v *EncryptVisitor) VisitAlgorithmDefinition(ctx *parser.AlgorithmDefinitionContext) *ast.AlgorithmDefinition {
stmt := &ast.AlgorithmDefinition{}
if ctx.AlgorithmTypeName() != nil {
stmt.AlgorithmTypeName = v.VisitAlgorithmTypeName(ctx.AlgorithmTypeName().(*parser.AlgorithmTypeNameContext))
}
if ctx.PropertiesDefinition() != nil {
stmt.PropertiesDefinition = v.VisitPropertiesDefinition(ctx.PropertiesDefinition().(*parser.PropertiesDefinitionContext))
}
return stmt
}
func (v *EncryptVisitor) VisitAlgorithmTypeName(ctx *parser.AlgorithmTypeNameContext) *ast.AlgorithmTypeName {
stmt := &ast.AlgorithmTypeName{}
switch {
case ctx.STRING_() != nil:
stmt.String = ctx.STRING_().GetText()
case ctx.BuildinAlgorithmTypeName() != nil:
stmt.BuildinAlgorithmTypeName = v.VisitBuildinAlgorithmTypeName(ctx.BuildinAlgorithmTypeName().(*parser.BuildinAlgorithmTypeNameContext))
}
return stmt
}
func (v *EncryptVisitor) VisitBuildinAlgorithmTypeName(ctx *parser.BuildinAlgorithmTypeNameContext) *ast.BuildinAlgorithmTypeName {
stmt := &ast.BuildinAlgorithmTypeName{}
switch {
case ctx.MD5() != nil:
stmt.AlgorithmTypeName = ctx.MD5().GetText()
case ctx.AES() != nil:
stmt.AlgorithmTypeName = ctx.AES().GetText()
case ctx.RC4() != nil:
stmt.AlgorithmTypeName = ctx.RC4().GetText()
case ctx.SM3() != nil:
stmt.AlgorithmTypeName = ctx.SM3().GetText()
case ctx.SM4() != nil:
stmt.AlgorithmTypeName = ctx.SM4().GetText()
case ctx.CHAR_DIGEST_LIKE() != nil:
stmt.AlgorithmTypeName = ctx.CHAR_DIGEST_LIKE().GetText()
}
return stmt
}
func (v *EncryptVisitor) VisitPropertiesDefinition(ctx *parser.PropertiesDefinitionContext) *ast.PropertiesDefinition {
stmt := &ast.PropertiesDefinition{}
if ctx.Properties() != nil {
stmt.Properties = v.VisitProperties(ctx.Properties().(*parser.PropertiesContext))
}
return stmt
}
func (v *EncryptVisitor) VisitProperties(ctx *parser.PropertiesContext) *ast.Properties {
stmt := &ast.Properties{}
for _, p := range ctx.AllProperty() {
stmt.Properties = append(stmt.Properties, v.VisitProperty(p.(*parser.PropertyContext)))
}
return stmt
}
func (v *EncryptVisitor) VisitProperty(ctx *parser.PropertyContext) *ast.Property {
stmt := &ast.Property{}
if ctx.STRING_() != nil {
stmt.Key = ctx.STRING_().GetText()
}
if ctx.Literal() != nil {
stmt.Literal = v.VisitLiteral(ctx.Literal().(*parser.LiteralContext))
}
return stmt
}
func (v *EncryptVisitor) VisitTableName(ctx *parser.TableNameContext) *ast.CommonIdentifier {
stmt := &ast.CommonIdentifier{}
if ctx.IDENTIFIER_() != nil {
stmt.Identifier = ctx.IDENTIFIER_().GetText()
}
return stmt
}