All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.anyline.data.jdbc.mssql.MSSQL2000Adapter Maven / Gradle / Ivy

/*
 * 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.jdbc.mssql;

import org.anyline.annotation.Component;
import org.anyline.data.jdbc.adapter.JDBCAdapter;
import org.anyline.data.param.ConfigStore;
import org.anyline.data.run.Run;
import org.anyline.data.run.SimpleRun;
import org.anyline.data.runtime.DataRuntime;
import org.anyline.entity.*;
import org.anyline.entity.generator.PrimaryGenerator;
import org.anyline.metadata.Column;
import org.anyline.metadata.Schema;
import org.anyline.metadata.Table;
import org.anyline.metadata.refer.MetadataFieldRefer;
import org.anyline.proxy.EntityAdapterProxy;
import org.anyline.util.BasicUtil;
import org.anyline.util.ConfigTable;

import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;

/**
 * 2000(8.0)及以下版本
 */
@Component("anyline.data.jdbc.adapter.mssql2000")
public class MSSQL2000Adapter extends MSSQLAdapter implements JDBCAdapter {

    public String version() {return "2000";}

    /**
     * 验证运行环境与当前适配器是否匹配
* 默认不连接只根据连接参数
* 只有同一个种区分不同版本(如mmsql2000/mssql2005)或不同模式(如kingbase的oracle/pg模式)时才需要单独实现 * @param runtime 运行环境主要包含驱动适配器 数据源或客户端 * @param compensate 是否补偿匹配,第一次失败后,会再匹配一次,第二次传入true * @return boolean */ @Override public boolean match(DataRuntime runtime, String feature, String adapterKey, boolean compensate) { //直接调用顶层方式 不要调用2005的match boolean chk = super.exeMatch(runtime, feature, adapterKey, compensate); if(chk) { String version = runtime.getVersion(); if (null != version && version.contains(".")) { version = version.split("\\.")[0]; double v = BasicUtil.parseDouble(version, 0d); if(ConfigTable.IS_LOG_ADAPTER_MATCH) { log.debug("[adapter match][SQL Server版本检测][result:{}][runtime version:{}][adapter:{}]", false, version, this.getClass()); } if (v < 9.0) { return true; } } } return false; } /** * 查询SQL * Run 反转调用 * @param run run * @return String */ @Override public String mergeFinalQuery(DataRuntime runtime, Run run) { StringBuilder builder = new StringBuilder(); String cols = run.getQueryColumn(); PageNavi navi = run.getPageNavi(); String sql = run.getBaseQuery(); OrderStore orders = run.getOrderStore(); long first = 0; long last = 0; String order = ""; if(null != orders) { order = orders.getRunText(getDelimiterFr()+getDelimiterTo()); } if(null != navi) { first = navi.getFirstRow(); last = navi.getLastRow(); } if(first == 0 && null != navi) { // top builder.append("SELECT TOP ").append(last+1).append(" "+cols+" FROM(\n"); builder.append(sql).append("\n) AS _TAB_O \n"); builder.append(order); return builder.toString(); } if(null == navi) { builder.append(sql).append("\n").append(order); }else{ // 分页 long rows = navi.getPageRows(); if(rows * navi.getCurPage() > navi.getTotalRow()) { // 最后一页不足10条 rows = navi.getTotalRow() % navi.getPageRows(); } String asc = order; String desc = order.replace("ASC",""); desc = desc.replace("DESC","ASC"); desc = desc.replace("","DESC"); builder.append("SELECT "+cols+" FROM (\n "); builder.append("SELECT TOP ").append(rows).append(" * FROM (\n"); builder.append("SELECT TOP ").append(navi.getPageRows()*navi.getCurPage()).append(" * "); builder.append(" FROM (" + sql + ") AS T0 ").append(asc).append("\n"); builder.append(") AS T1 ").append(desc).append("\n"); builder.append(") AS T2").append(asc); } return builder.toString(); } /** * 根据DataSet创建批量INSERT RunPrepare * 2000版本单独处理 insert into tab(nm) select 1 union all select 2 * @param runtime 运行环境主要包含驱动适配器 数据源或客户端 * @param run 最终待执行的命令和参数(如JDBC环境中的SQL) * @param dest 表 如果不提供表名则根据data解析, 表名可以事实前缀<数据源名>表示切换数据源 * @param set 集合 * @param columns 需插入的列 */ @Override public void fillInsertContent(DataRuntime runtime, Run run, Table dest, DataSet set, ConfigStore configs, LinkedHashMap columns) { //2000及以下 StringBuilder builder = run.getBuilder(); if(null == builder) { builder = new StringBuilder(); run.setBuilder(builder); } LinkedHashMap pks = null; PrimaryGenerator generator = checkPrimaryGenerator(type(), dest.getName()); if(null != generator) { pks = set.getRow(0).getPrimaryColumns(); columns.putAll(pks); } builder.append("INSERT INTO "); name(runtime, builder, dest); builder.append("("); boolean start = true; for(Column column:columns.values()) { if(!start) { builder.append(", "); } start = false; String key = column.getName(); delimiter(builder, key); } builder.append(")"); boolean el = ConfigStore.IS_AUTO_CHECK_EL_VALUE(configs); int dataSize = set.size(); for(int i=0; i columns) { StringBuilder builder = run.getBuilder(); if(null == builder) { builder = new StringBuilder(); run.setBuilder(builder); } if(list instanceof DataSet) { DataSet set = (DataSet) list; this.fillInsertContent(runtime, run, dest, set, columns); return; } PrimaryGenerator generator = checkPrimaryGenerator(type(), dest.getName()); LinkedHashMap pks = null; if(null != generator) { Object entity = list.iterator().next(); pks = EntityAdapterProxy.primaryKeys(entity.getClass()); columns.putAll(pks); } builder.append("INSERT INTO "); name(runtime, builder, dest); builder.append("("); boolean start = true; for(Column column:columns.values()) { if(!start) { builder.append(", "); } start = false; String key = column.getName(); delimiter(builder, key); } builder.append(")\n "); int dataSize = list.size(); int idx = 0; boolean el = ConfigTable.IS_AUTO_CHECK_EL_VALUE; for(Object obj:list) { builder.append("\n SELECT "); /* if(obj instanceof DataRow) { DataRow row = (DataRow)obj; if (row.hasPrimaryKeys() && BasicUtil.isEmpty(row.getPrimaryValue())) { createPrimaryValue(row, type(), dest.getName().replace(getDelimiterFr(), "").replace(getDelimiterTo(), ""), row.getPrimaryKeys(), null); } insertValue(template, run, row, true, false, false, keys); }else{*/ boolean create = EntityAdapterProxy.createPrimaryValue(obj, pks); if(!create && null != generator) { generator.create(obj, type(), dest.getName().replace(getDelimiterFr(), "").replace(getDelimiterTo(), ""), pks, null); //createPrimaryValue(obj, type(), dest.getName().replace(getDelimiterFr(), "").replace(getDelimiterTo(), ""), null, null); } builder.append(insertValue(runtime, run, obj, idx==0,true, true, false, false, el, columns)); // } if(idx buildQueryTablesRun(DataRuntime runtime, boolean greedy, Table query, int types, ConfigStore configs) throws Exception { List runs = new ArrayList<>(); Run run = new SimpleRun(runtime, configs); runs.add(run); StringBuilder builder = run.getBuilder(); builder.append("SELECT M.*, SCHEMA_NAME(M.SCHEMA_ID) AS TABLE_SCHEMA, F.VALUE AS TABLE_COMMENT FROM SYS.TABLES AS M \n"); builder.append("LEFT JOIN SYS.EXTENDED_PROPERTIES AS F ON M.OBJECT_ID = F.MAJOR_ID AND F.MINOR_ID=0 \n"); configs.and("SCHEMA_NAME(M.SCHEMA_ID)", query.getSchemaName()); configs.and(Compare.LIKE_SIMPLE,"M.NAM", query.getName()); //SYS.TABLES 中没有视图不需要过滤视图 return runs; } /** * Table[结果集封装]
* Table 属性与结果集对应关系 * @return MetadataFieldRefer */ @Override public MetadataFieldRefer initTableFieldRefer() { return super.initTableFieldRefer(); } /** * 创建表完成后追加表备注, 创建过程能添加备注的不需要实现与comment(DataRuntime runtime, StringBuilder builder, Table meta)二选一实现 * @param table 表 * @return sql * @throws Exception 异常 */ public List buildAppendCommentRun(DataRuntime runtime, Table table) throws Exception { List runs = new ArrayList<>(); String comment = table.getComment(); if(BasicUtil.isNotEmpty(comment)) { Run run = new SimpleRun(runtime); runs.add(run); StringBuilder builder = run.getBuilder(); builder.append("EXEC sp_addextendedproperty "); builder.append("'MS_Description', "); builder.append("N'").append(comment).append("', "); builder.append("'USER', "); builder.append("'").append(table.getSchemaName()).append("', "); builder.append("'TABLE', "); builder.append("'").append(table.getName()).append("'"); } return runs; } @Override public List buildChangeCommentRun(DataRuntime runtime, Table table) throws Exception { List runs = new ArrayList<>(); String comment = table.getComment(); if(BasicUtil.isNotEmpty(comment)) { Run run = new SimpleRun(runtime); runs.add(run); StringBuilder builder = run.getBuilder(); builder.append("EXEC sp_updateextendedproperty "); builder.append("'MS_Description', "); builder.append("N'").append(comment).append("', "); builder.append("'USER', "); builder.append("'").append(table.getSchema()).append("', "); builder.append("'TABLE', "); builder.append("'").append(table.getName()).append("'"); } return runs; } /** * 创建表完成后追加表备注, 创建过程能添加备注的不需要实现与comment(DataRuntime runtime, StringBuilder builder, Table meta)二选一实现 * @param column 列 * @return sql * @throws Exception 异常 */ public List buildAppendCommentRun(DataRuntime runtime, Column column) throws Exception { List runs = new ArrayList<>(); String comment = column.getComment(); if(BasicUtil.isNotEmpty(comment)) { Run run = new SimpleRun(runtime); runs.add(run); StringBuilder builder = run.getBuilder(); Schema schema = column.getSchema(); if(BasicUtil.isEmpty(schema)) { schema = column.getTable(true).getSchema(); } builder.append("EXEC sp_addextendedproperty "); builder.append("'MS_Description', "); builder.append("N'").append(comment).append("', "); builder.append("'USER', "); builder.append("'").append(schema.getName()).append("', "); builder.append("'TABLE', "); builder.append("'").append(column.getTableName(true)).append("', "); builder.append("'COLUMN', "); builder.append("'").append(column.getName()).append("'"); } return runs; } /** * 修改备注 * -- 字段加注释 * EXEC sys.sp_addextendedproperty @name=N'MS_Description' *, @value=N'注释内容' *, @level0type=N'SCHEMA' *, @level0name=N'dbo' *, @level1type=N'TABLE' *, @level1name=N'表名' *, @level2type=N'COLUMN' *, @level2name=N'字段名' * * @param column 列 * @return String */ @Override public List buildChangeCommentRun(DataRuntime runtime, Column column, boolean slice) throws Exception { List runs = new ArrayList<>(); String comment = null; if(null != column.getUpdate()) { comment = column.getUpdate().getComment(); }else { comment = column.getComment(); } if(BasicUtil.isNotEmpty(comment)) { Run run = new SimpleRun(runtime); runs.add(run); StringBuilder builder = run.getBuilder(); Schema schema = column.getSchema(); if(BasicUtil.isEmpty(schema)) { schema = column.getTable(true).getSchema(); } builder.append("EXEC sp_updateextendedproperty "); builder.append("'MS_Description', "); builder.append("N'").append(comment).append("', "); builder.append("'USER', "); builder.append("'").append(schema.getName()).append("', "); builder.append("'TABLE', "); builder.append("'").append(column.getTableName(true)).append("', "); builder.append("'COLUMN', "); builder.append("'").append(column.getName()).append("'"); } return runs; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy