/*
* Copyright 2006-2023 www.anyline.org
*
* Licensed 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.anyline.data.adapter.init;
import org.anyline.adapter.DataReader;
import org.anyline.adapter.DataWriter;
import org.anyline.adapter.EntityAdapter;
import org.anyline.adapter.KeyAdapter;
import org.anyline.data.adapter.DriverActuator;
import org.anyline.data.adapter.DriverAdapter;
import org.anyline.data.cache.PageLazyStore;
import org.anyline.data.entity.Join;
import org.anyline.data.listener.DDListener;
import org.anyline.data.listener.DMListener;
import org.anyline.data.metadata.TypeMetadataAlias;
import org.anyline.data.param.Config;
import org.anyline.data.param.ConfigParser;
import org.anyline.data.param.ConfigStore;
import org.anyline.data.param.init.DefaultConfigStore;
import org.anyline.data.prepare.*;
import org.anyline.data.prepare.auto.TablePrepare;
import org.anyline.data.prepare.auto.init.DefaultTablePrepare;
import org.anyline.data.prepare.auto.init.DefaultTextPrepare;
import org.anyline.data.prepare.auto.init.VirtualTablePrepare;
import org.anyline.data.prepare.text.TextPrepare;
import org.anyline.data.run.*;
import org.anyline.data.runtime.DataRuntime;
import org.anyline.data.util.CommandParser;
import org.anyline.data.util.DataSourceUtil;
import org.anyline.entity.*;
import org.anyline.entity.authorize.Privilege;
import org.anyline.entity.authorize.Role;
import org.anyline.entity.authorize.User;
import org.anyline.entity.generator.GeneratorConfig;
import org.anyline.entity.generator.PrimaryGenerator;
import org.anyline.exception.AnylineException;
import org.anyline.exception.CommandException;
import org.anyline.exception.CommandQueryException;
import org.anyline.exception.CommandUpdateException;
import org.anyline.metadata.*;
import org.anyline.metadata.graph.EdgeTable;
import org.anyline.metadata.graph.VertexTable;
import org.anyline.metadata.refer.MetadataFieldRefer;
import org.anyline.metadata.refer.MetadataReferHolder;
import org.anyline.metadata.type.DatabaseType;
import org.anyline.metadata.type.TypeMetadata;
import org.anyline.metadata.type.init.StandardTypeMetadata;
import org.anyline.proxy.CacheProxy;
import org.anyline.proxy.ConvertProxy;
import org.anyline.proxy.EntityAdapterProxy;
import org.anyline.proxy.InterceptorProxy;
import org.anyline.util.*;
import org.anyline.util.regular.Regular;
import org.anyline.util.regular.RegularUtil;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.*;
/**
* SQL生成 子类主要实现与分页相关的SQL 以及delimiter
*/
public abstract class AbstractDriverAdapter implements DriverAdapter {
protected DMListener dmListener;
protected DDListener ddListener;
protected PrimaryGenerator primaryGenerator;
protected DriverActuator actuator;
protected DMListener getListener() {
return dmListener;
}
public void setListener(DMListener listener) {
this.dmListener = listener;
}
public DMListener getDMListener() {
return this.dmListener;
}
public void setListener(DDListener listener) {
this.ddListener = listener;
}
public DDListener getDDListener() {
return this.ddListener;
}
public void setGenerator(PrimaryGenerator generator) {
this.primaryGenerator = generator;
}
public PrimaryGenerator getPrimaryGenerator() {
return primaryGenerator;
}
protected String delimiterFr = "";
protected String delimiterTo = "";
//拼写兼容 下划线空格兼容
protected static Map<String, String> spells = new HashMap<>();
protected Map<Class<?>, MetadataFieldRefer> refers = new HashMap<>();
//根据名称定位数据类型
protected LinkedHashMap<String, TypeMetadata> alias = new LinkedHashMap();
static {
for(StandardTypeMetadata type: StandardTypeMetadata.values()) {
String name = type.name().toUpperCase();//变量名
String standard = type.getName().toUpperCase(); //标准SQL类型名
spells.put(name, standard);
if(name.contains(" ")) {
spells.put(name.replace(" ", "_"), standard);
}
if(name.contains("_")) {
spells.put(name.replace("_", " "), standard);
}
if(standard.contains(" ")) {
spells.put(standard.replace(" ", "_"), standard);
}
if(standard.contains("_")) {
spells.put(standard.replace("_", " "), standard);
}
}
}
@Override
public void setActuator(DriverActuator actuator) {
this.actuator = actuator;
}
@Override
public DriverActuator getActuator() {
return actuator;
}
@Override
public String getDelimiterFr() {
return this.delimiterFr;
}
@Override
public String getDelimiterTo() {
return this.delimiterTo;
}
@Override
public void setDelimiter(String delimiter) {
if(BasicUtil.isNotEmpty(delimiter)) {
delimiter = delimiter.replaceAll("\\s","");
if(delimiter.length() == 1) {
this.delimiterFr = delimiter;
this.delimiterTo = delimiter;
}else{
this.delimiterFr = delimiter.substring(0,1);
this.delimiterTo = delimiter.substring(1,2);
}
}
}
/**
* 对应的兼容模式,有些数据库会兼容oracle或pg,需要分别提供两个JDBCAdapter或者直接依赖oracle/pg的adapter
* 参考DefaultJDBCAdapterUtil定位adapter的方法
* @return DatabaseType
*/
@Override
public DatabaseType compatible() {
return null;
}
public AbstractDriverAdapter() {
//当前数据库支持的数据类型,子类根据情况覆盖
for(StandardTypeMetadata type: StandardTypeMetadata.values()) {
reg(type, type.config());
List<DatabaseType> dbs = type.databaseTypes();
for(DatabaseType db:dbs) {
if(db == this.type()) {
//column type支持当前db
alias(type.getName(), type);
alias(type.name(), type);
break;
}
}
}
MetadataReferHolder.reg(type(), TypeMetadata.CATEGORY.CHAR, new TypeMetadata.Refer(0, 1, 1));
MetadataReferHolder.reg(type(), TypeMetadata.CATEGORY.TEXT, new TypeMetadata.Refer(1, 1, 1));
MetadataReferHolder.reg(type(), TypeMetadata.CATEGORY.BOOLEAN, new TypeMetadata.Refer( 1,1, 1));
MetadataReferHolder.reg(type(), TypeMetadata.CATEGORY.BYTES, new TypeMetadata.Refer(0, 1, 1));
MetadataReferHolder.reg(type(), TypeMetadata.CATEGORY.BLOB, new TypeMetadata.Refer(1,1,1));
MetadataReferHolder.reg(type(), TypeMetadata.CATEGORY.INT, new TypeMetadata.Refer(1, 1, 1));
MetadataReferHolder.reg(type(), TypeMetadata.CATEGORY.FLOAT, new TypeMetadata.Refer(1, 0, 0));
MetadataReferHolder.reg(type(), TypeMetadata.CATEGORY.DATE, new TypeMetadata.Refer(1, 1, 1));
MetadataReferHolder.reg(type(), TypeMetadata.CATEGORY.TIME, new TypeMetadata.Refer(1, 1, 1));
MetadataReferHolder.reg(type(), TypeMetadata.CATEGORY.DATETIME, new TypeMetadata.Refer( 1, 1, 1));
MetadataReferHolder.reg(type(), TypeMetadata.CATEGORY.TIMESTAMP, new TypeMetadata.Refer(1, 1, 1));
MetadataReferHolder.reg(type(), TypeMetadata.CA