shardingsphere-operator/pkg/distsql/ast/encrypt_rdl_ast.go (338 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 ast
import (
"fmt"
"strings"
)
// Define Create Encrypt Rule AST
type CreateEncryptRule struct {
IfNotExists *IfNotExists
EncryptRuleDefinition *EncryptRuleDefinition
AllEncryptRuleDefinition []*EncryptRuleDefinition
}
func (createEncryptRule *CreateEncryptRule) ToString() string {
var ifNotExists string
var allEncryptRuleDefinitionList []string
if createEncryptRule.IfNotExists != nil {
ifNotExists = createEncryptRule.IfNotExists.ToString()
}
if createEncryptRule.AllEncryptRuleDefinition != nil {
for _, encryptRuleDefinition := range createEncryptRule.AllEncryptRuleDefinition {
if encryptRuleDefinition != nil {
allEncryptRuleDefinitionList = append(allEncryptRuleDefinitionList, encryptRuleDefinition.ToString())
}
}
}
return fmt.Sprintf("CREATE ENCRYPT RULE%s %s;", ifNotExists, strings.Join(allEncryptRuleDefinitionList, ","))
}
type AlterEncryptRule struct {
EncryptRuleDefinition *EncryptRuleDefinition
AllEncryptRuleDefinitionList []*EncryptRuleDefinition
}
func (alterEncryptRule *AlterEncryptRule) ToString() string {
var encryptRuleDefinition string
var encryptRuleDefinitionList []string
if alterEncryptRule.EncryptRuleDefinition != nil {
encryptRuleDefinition = alterEncryptRule.EncryptRuleDefinition.ToString()
}
if alterEncryptRule.AllEncryptRuleDefinitionList != nil {
for _, encryptRuleDefinition := range alterEncryptRule.AllEncryptRuleDefinitionList {
encryptRuleDefinitionList = append(encryptRuleDefinitionList, encryptRuleDefinition.ToString())
}
}
return fmt.Sprintf("ALTER ENCRYPT RULE %s %s;", encryptRuleDefinition, strings.Join(encryptRuleDefinitionList, ","))
}
type DropEncryptRule struct {
IfExists *IfExists
AllTableName []*CommonIdentifier
}
func (dropEncryptRule *DropEncryptRule) ToString() string {
var (
ifExists string
allTableName []string
)
if dropEncryptRule.IfExists != nil {
ifExists = dropEncryptRule.IfExists.ToString()
}
if dropEncryptRule.AllTableName != nil {
for _, tableName := range dropEncryptRule.AllTableName {
allTableName = append(allTableName, tableName.ToString())
}
}
return fmt.Sprintf("DROP ENCRYPT RULE %s %s;", ifExists, strings.Join(allTableName, ","))
}
type IfExists struct {
IfExists string
}
func (ifExists *IfExists) ToString() string {
return ifExists.IfExists
}
type EncryptRuleDefinition struct {
TableName *CommonIdentifier
ResourceDefinition *ResourceDefinition
EncryptColumnDefinition *EncryptColumnDefinition
AllEncryptColumnDefinition []*EncryptColumnDefinition
QueryWithCipherColumn *QueryWithCipherColumn
}
func (encryptRuleDefinition *EncryptRuleDefinition) ToString() string {
var (
tableName string
resourceDefinition string
queryWithCipherColumn string
encryptColumnDefinition string
allEncryptColumnDefinition []string
)
if encryptRuleDefinition.TableName != nil {
tableName = encryptRuleDefinition.TableName.ToString()
}
if encryptRuleDefinition.ResourceDefinition != nil {
resourceDefinition = encryptRuleDefinition.ResourceDefinition.ToString()
}
if encryptRuleDefinition.EncryptColumnDefinition != nil {
encryptColumnDefinition = encryptRuleDefinition.EncryptColumnDefinition.ToString()
}
if encryptRuleDefinition.AllEncryptColumnDefinition != nil {
for _, rd := range encryptRuleDefinition.AllEncryptColumnDefinition {
allEncryptColumnDefinition = append(allEncryptColumnDefinition, rd.ToString())
}
}
if encryptRuleDefinition.QueryWithCipherColumn != nil {
queryWithCipherColumn = fmt.Sprintf(",QUERY_WITH_CIPHER_COLUMN=%s", encryptRuleDefinition.QueryWithCipherColumn.ToString())
}
return fmt.Sprintf("%s (%sCOLUMNS(%s%s)%s)",
tableName,
resourceDefinition,
encryptColumnDefinition,
strings.Join(allEncryptColumnDefinition, ","),
queryWithCipherColumn)
}
type IfNotExists struct {
IfNotExists string
}
func (ifNotExists IfNotExists) ToString() string {
return ifNotExists.IfNotExists
}
type ResourceDefinition struct {
ResourceName *CommonIdentifier
}
func (resourceDefinition *ResourceDefinition) ToString() string {
if resourceDefinition.ResourceName != nil {
return fmt.Sprintf("RESOURCE=%s", resourceDefinition.ResourceName.ToString())
}
return ""
}
type EncryptColumnDefinition struct {
ColumnDefinition *ColumnDefinition
PlainColumnDefinition *PlainColumnDefinition
CipherColumnDefinition *CipherColumnDefinition
AssistedQueryColumnDefinition *AssistedQueryColumnDefinition
LikeQueryColumnDefinition *LikeQueryColumnDefinition
EncryptAlgorithm *EncryptAlgorithm
AssistedQueryAlgorithm *AssistedQueryAlgorithm
LikeQueryAlgorithm *LikeQueryAlgorithm
QueryWithCipherColumn *QueryWithCipherColumn
}
func (encryptColumnDefinition *EncryptColumnDefinition) ToString() string {
var (
plainColumnDefinition string
cipherColumnDefinition string
assistedQueryColumnDefinition string
likeQueryColumnDefinition string
assistedQueryAlgorithm string
likeQueryAlgorithm string
queryWithCipherColumn string
)
if encryptColumnDefinition.PlainColumnDefinition != nil {
plainColumnDefinition = fmt.Sprintf(",%s", encryptColumnDefinition.PlainColumnDefinition.ToString())
}
if encryptColumnDefinition.CipherColumnDefinition != nil {
cipherColumnDefinition = encryptColumnDefinition.CipherColumnDefinition.ToString()
}
if encryptColumnDefinition.AssistedQueryColumnDefinition != nil {
assistedQueryColumnDefinition = fmt.Sprintf(",%s", encryptColumnDefinition.AssistedQueryColumnDefinition.ToString())
}
if encryptColumnDefinition.LikeQueryAlgorithm != nil {
likeQueryColumnDefinition = fmt.Sprintf(",%s", encryptColumnDefinition.LikeQueryAlgorithm.ToString())
}
if encryptColumnDefinition.AssistedQueryAlgorithm != nil {
assistedQueryAlgorithm = fmt.Sprintf(",%s", encryptColumnDefinition.AssistedQueryAlgorithm.ToString())
}
if encryptColumnDefinition.LikeQueryAlgorithm != nil {
likeQueryAlgorithm = fmt.Sprintf(",%s", encryptColumnDefinition.LikeQueryAlgorithm.ToString())
}
if encryptColumnDefinition.QueryWithCipherColumn != nil {
queryWithCipherColumn = fmt.Sprintf(",QUERY_WITH_CIPHER_COLUMN=%s", encryptColumnDefinition.QueryWithCipherColumn.ToString())
}
return fmt.Sprintf("(%s%s,%s%s%s,%s%s%s%s)",
encryptColumnDefinition.ColumnDefinition.ToString(),
plainColumnDefinition,
cipherColumnDefinition,
assistedQueryColumnDefinition,
likeQueryColumnDefinition,
encryptColumnDefinition.EncryptAlgorithm.ToString(),
assistedQueryAlgorithm,
likeQueryAlgorithm,
queryWithCipherColumn)
}
type ColumnDefinition struct {
ColumnName *CommonIdentifier
DataType *DataType
}
func (columnDefinition *ColumnDefinition) ToString() string {
var dataType string
if columnDefinition.DataType != nil {
dataType = fmt.Sprintf(",DATA_TYP=%s", columnDefinition.DataType.ToString())
}
return fmt.Sprintf("NAME=%s%s", columnDefinition.ColumnName.ToString(), dataType)
}
type PlainColumnDefinition struct {
PlainColumnName *CommonIdentifier
DataType *DataType
}
func (plainColumnDefinition *PlainColumnDefinition) ToString() string {
var (
plainColumnName string
dataType string
)
if plainColumnDefinition.PlainColumnName != nil {
plainColumnName = fmt.Sprintf("PLAIN=%s", plainColumnDefinition.PlainColumnName.ToString())
}
if plainColumnDefinition.DataType != nil {
dataType = plainColumnDefinition.DataType.ToString()
}
return fmt.Sprintf("PLAIN = %s, PLAIN_DATA_TYPE = %s", plainColumnName, dataType)
}
type CipherColumnDefinition struct {
CipherColumnName *CommonIdentifier
DataType *DataType
}
func (cipherColumnDefinition *CipherColumnDefinition) ToString() string {
var dataType string
if cipherColumnDefinition.DataType != nil {
dataType = fmt.Sprintf(",CIPHER_DATA_TYPE=%s", dataType)
}
return fmt.Sprintf("CIPHER=%s%s", cipherColumnDefinition.CipherColumnName.ToString(), dataType)
}
type AssistedQueryColumnDefinition struct {
AssistedQueryColumnName *CommonIdentifier
DataType *DataType
}
func (assistedQueryColumnDefinition *AssistedQueryColumnDefinition) ToString() string {
var dataType string
if assistedQueryColumnDefinition.DataType != nil {
dataType = fmt.Sprintf(",ASSISTED_QUERY_DATA_TYPE=%s", assistedQueryColumnDefinition.DataType.ToString())
}
return fmt.Sprintf("ASSISTED_QUERY_COLUMN=%s%s", assistedQueryColumnDefinition.AssistedQueryColumnName.ToString(), dataType)
}
type LikeQueryColumnDefinition struct {
LikeQueryColumnName *CommonIdentifier
DataType *DataType
}
func (likeQueryColumnDefinition *LikeQueryColumnDefinition) ToString() string {
var dataType string
if likeQueryColumnDefinition.DataType != nil {
dataType = fmt.Sprintf(", LIKE_QUERY_DATA_TYPE=%s", likeQueryColumnDefinition.DataType.ToString())
}
return fmt.Sprintf("LIKE_QUERY_COLUMN=%s%s", likeQueryColumnDefinition.LikeQueryColumnName.ToString(), dataType)
}
type EncryptAlgorithm struct {
AlgorithmDefinition *AlgorithmDefinition
}
func (encryptAlgorithm *EncryptAlgorithm) ToString() string {
return fmt.Sprintf("ENCRYPT_ALGORITHM(%s)", encryptAlgorithm.AlgorithmDefinition.ToString())
}
type AssistedQueryAlgorithm struct {
AlgorithmDefinition *AlgorithmDefinition
}
func (assistedQueryAlgorithm *AssistedQueryAlgorithm) ToString() string {
return assistedQueryAlgorithm.AlgorithmDefinition.ToString()
}
type AlgorithmDefinition struct {
AlgorithmTypeName *AlgorithmTypeName
PropertiesDefinition *PropertiesDefinition
}
func (algorithmDefinition AlgorithmDefinition) ToString() string {
var propertiesDefinition string
if algorithmDefinition.PropertiesDefinition != nil {
propertiesDefinition = fmt.Sprintf(",%s", algorithmDefinition.PropertiesDefinition.ToString())
}
return fmt.Sprintf("TYPE(NAME=%s%s)", algorithmDefinition.AlgorithmTypeName.ToString(), propertiesDefinition)
}
type PropertiesDefinition struct {
Properties *Properties
}
func (propertiesDefinition *PropertiesDefinition) ToString() string {
if propertiesDefinition.Properties != nil {
return fmt.Sprintf("PROPERTIES(%s)", propertiesDefinition.Properties.ToString())
}
return ""
}
type Properties struct {
Properties []*Property
}
func (properties *Properties) ToString() (sql string) {
for _, property := range properties.Properties {
sql += property.ToString()
}
return
}
type LikeQueryAlgorithm struct {
AlgorithmDefinition *AlgorithmDefinition
}
func (likeQueryAlgorithm *LikeQueryAlgorithm) ToString() (sql string) {
if likeQueryAlgorithm.AlgorithmDefinition != nil {
sql += likeQueryAlgorithm.ToString()
}
return
}
type QueryWithCipherColumn struct {
QueryWithCipherColumn string
}
func (queryWithAlgorithm *QueryWithCipherColumn) ToString() string {
return queryWithAlgorithm.QueryWithCipherColumn
}
type CommonIdentifier struct {
Identifier string
}
func (commonIdentifier *CommonIdentifier) ToString() string {
return commonIdentifier.Identifier
}
type Property struct {
Key string
Literal *Literal
}
func (property *Property) ToString() string {
if property.Literal != nil {
return fmt.Sprintf("%s=%s", property.Key, property.Literal.ToString())
}
return ""
}
type Literal struct {
Literal string
}
func (literal *Literal) ToString() string {
return literal.Literal
}
type BuildinAlgorithmTypeName struct {
AlgorithmTypeName string
}
func (buildinAlgorithmTypeName *BuildinAlgorithmTypeName) ToString() string {
return buildinAlgorithmTypeName.AlgorithmTypeName
}
type DataType struct {
String string
}
func (dataType *DataType) ToString() string {
return dataType.String
}
type AlgorithmTypeName struct {
BuildinAlgorithmTypeName *BuildinAlgorithmTypeName
String string
}
func (algorithmTypeName *AlgorithmTypeName) ToString() string {
switch {
case algorithmTypeName.BuildinAlgorithmTypeName != nil:
return algorithmTypeName.BuildinAlgorithmTypeName.ToString()
case algorithmTypeName.String != "":
return algorithmTypeName.String
}
return ""
}