From 34395a4fff7f0b8c1692f4971201ae55abc914ae Mon Sep 17 00:00:00 2001
From: lzq <2495532633@qq.com>
Date: Tue, 2 Dec 2025 09:04:37 +0800
Subject: [PATCH] 1
---
z-doc/pdma/njzscloud-dispose.pdma | 14521 ++++++++++++++++++++++++++++
1 file changed, 14521 insertions(+)
create mode 100644 z-doc/pdma/njzscloud-dispose.pdma
diff --git a/z-doc/pdma/njzscloud-dispose.pdma b/z-doc/pdma/njzscloud-dispose.pdma
new file mode 100644
index 0000000..a9a2527
--- /dev/null
+++ b/z-doc/pdma/njzscloud-dispose.pdma
@@ -0,0 +1,14521 @@
+{
+ "id": "E268FF1C-0171-4BED-94BF-973DD8D729BB",
+ "profile": {
+ "version": "0.0.2",
+ "global": {
+ "dbDialects": [
+ {
+ "defKey": "MySQL",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "mysql-connector-j-8.3.0.jar",
+ "jdbcReferDriver": "com.mysql.cj.jdbc.Driver",
+ "jdbcReferUrl": "jdbc:mysql://[ip]:[port]/[dbname]?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC",
+ "tableCreate": "DROP TABLE IF EXISTS {{=it.defKey}};\r\nCREATE TABLE {{=it.defKey}}\r\n(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\r\n {{=field.defKey}} {{=field.dbDataType}}{{?field.dataLen>0}}{{='('}}{{=field.dataLen}}{{?field.numScale>0}}{{=','}}{{=field.numScale}}{{?}}{{=')'}}{{?}} {{= field.defaultValue ? 'DEFAULT' + ' ' + field.defaultValue : '' }} {{= field.notNull ? 'NOT NULL' : 'NULL' }} {{= field.autoIncrement ? 'AUTO_INCREMENT' : '' }} COMMENT '{{=field.intro.length > 0? field.defName + ';' + field.intro : field.defName}}'{{= index < it.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{~}}\r\n{{? pkList.length >0 }}\r\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i 0}}\nALTER TABLE {{= tableKey }} ADD PRIMARY KEY ({{~indexFields:field:i}}`{{= field.defKey }}`{{= i < indexFields.length-1 ? ',' : '' }}{{~}});\n{{?}}\n{{?}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}ALTER TABLE {{= tableKey }} COMMENT '{{=it.func.strJoin(defName, intro, \";\", true)}}'; {{?}}\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{= schemaName }}{{=it.defKey}} RENAME TO {{= schemaName }}{{=defKey}};{{?}}\n",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};",
+ "columnCreate": "{{\r\n let fieldsUpdate = it.fieldsUpdate;\r\n const computeLenAndNum = (dataLen, numScale, maxDataLen, maxNumScale) => {\r\n if(!dataLen || dataLen <= 0) {\r\n return '';\r\n }\r\n let currentDataLen = dataLen, currentNumScale = numScale;\r\n if(dataLen >= maxDataLen) {\r\n currentDataLen = maxDataLen;\r\n }\r\n if(!numScale || numScale <= 0) {\r\n return `(${currentDataLen},0)`;\r\n }\r\n if(currentNumScale > maxNumScale) {\r\n currentNumScale = maxNumScale\r\n }\r\n if(currentNumScale > currentDataLen && currentDataLen <= maxNumScale) {\r\n currentNumScale = currentDataLen;\r\n }\r\n return `(${currentDataLen},${currentNumScale})`;\r\n };\r\n const computeDefaultValue = (field) => {\r\n const { defaultValue, dbDataType, primaryKey } = field;\r\n if(!defaultValue) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase().endsWith('BLOB') || \r\n dbDataType.toUpperCase().endsWith('GEOMETRY') || \r\n dbDataType.toUpperCase().endsWith('TEXT') || \r\n dbDataType.toUpperCase().endsWith('JSON')) {\r\n return '';\r\n } else if(dbDataType.toUpperCase() === 'ENUM' ||\r\n dbDataType.toUpperCase() === 'SET') {\r\n return ` DEFAULT \"${defaultValue}\"`;\r\n } else {\r\n return ` DEFAULT ${defaultValue}`;\r\n }\r\n };\r\n const computeDatatype = (field) => {\r\n const { dbDataType, dataLen, numScale, defaultValue } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase() === 'VARCHAR' ||\r\n dbDataType.toUpperCase() === 'NVARCHAR' ||\r\n dbDataType.toUpperCase() === 'VARBINARY') {\r\n return `${dbDataType}(${dataLen ? dataLen : 128})`;\r\n } else if(dbDataType.toUpperCase() === 'DATE' ||\r\n dbDataType.toUpperCase() === 'YEAR' ||\r\n dbDataType.toUpperCase() === 'TINYTEXT' ||\r\n dbDataType.toUpperCase() === 'MEDIUMTEXT' ||\r\n dbDataType.toUpperCase() === 'LONGTEXT' ||\r\n dbDataType.toUpperCase() === 'TINYBLOB' ||\r\n dbDataType.toUpperCase() === 'MEDIUMBLOB' ||\r\n dbDataType.toUpperCase() === 'LONGBLOB' ||\r\n dbDataType.toUpperCase() === 'BOOLEAN' ||\r\n dbDataType.toUpperCase() === 'FLOAT' ||\r\n dbDataType.toUpperCase() === 'INT' ||\r\n dbDataType.toUpperCase() === 'JSON' ) {\r\n return dbDataType;\r\n } else if(dbDataType.toUpperCase() === 'ENUM' ||\r\n dbDataType.toUpperCase() === 'SET' ) {\r\n return `${dbDataType}(${defaultValue})`;\r\n } else if(dbDataType.toUpperCase() === 'TIME' ||\r\n dbDataType.toUpperCase() === 'DATETIME' ||\r\n dbDataType.toUpperCase() === 'TIMESTAMP') {\r\n return `${dbDataType}${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'DOUBLE') {\r\n return `${dbDataType}${computeLenAndNum(dataLen, numScale, 255, 30)}`;\r\n } else if(dbDataType.toUpperCase() === 'DECIMAL') {\r\n return `${dbDataType}${computeLenAndNum(dataLen, numScale, 65, 30)}`;\r\n } else if(dataLen && dataLen > 0) {\r\n return `${dbDataType}(${dataLen})`;\r\n }\r\n return `${dbDataType}`;\r\n };\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~fieldsUpdate:field:index}}\r\nALTER TABLE {{= tableKey }} ADD COLUMN `{{=field.defKey}}` {{=computeDatatype(field)}} {{= field.notNull ? 'NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT ' : '' }}{{= computeDefaultValue(field)}} {{? field.defName || field.intro }} COMMENT '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}'{{?}};\r\n{{~}}\r\n",
+ "columnUpdate": "{{ \r\n let fieldsUpdate = it.fieldsUpdate;\r\n const computeLenAndNum = (dataLen, numScale, maxDataLen, maxNumScale) => {\r\n if(!dataLen || dataLen <= 0) {\r\n return '';\r\n }\r\n let currentDataLen = dataLen, currentNumScale = numScale;\r\n if(dataLen >= maxDataLen) {\r\n currentDataLen = maxDataLen;\r\n }\r\n if(!numScale || numScale <= 0) {\r\n return `(${currentDataLen},0)`;\r\n }\r\n if(currentNumScale > maxNumScale) {\r\n currentNumScale = maxNumScale\r\n }\r\n if(currentNumScale > currentDataLen && currentDataLen <= maxNumScale) {\r\n currentNumScale = currentDataLen;\r\n }\r\n return `(${currentDataLen},${currentNumScale})`;\r\n };\r\n const computeDefaultValue = (field) => {\r\n const { defaultValue, primaryKey } = field;\r\n const dbDataType = field.dbDataType ? field.dbDataType : '';\r\n if(!defaultValue) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase().endsWith('BLOB') || \r\n dbDataType.toUpperCase().endsWith('GEOMETRY') || \r\n dbDataType.toUpperCase().endsWith('TEXT') || \r\n dbDataType.toUpperCase().endsWith('JSON')) {\r\n return '';\r\n } else if(dbDataType.toUpperCase() === 'ENUM' ||\r\n dbDataType.toUpperCase() === 'SET') {\r\n return `DEFAULT \"${defaultValue}\"`;\r\n } else {\r\n return `DEFAULT ${defaultValue}`;\r\n }\r\n };\r\n const computeDatatype = (field) => {\r\n const { dataLen, numScale, defaultValue } = field;\r\n const dbDataType = field.dbDataType ? field.dbDataType : '';\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase() === 'VARCHAR' ||\r\n dbDataType.toUpperCase() === 'NVARCHAR' ||\r\n dbDataType.toUpperCase() === 'VARBINARY') {\r\n return `${dbDataType}(${dataLen ? dataLen : 128})`;\r\n } else if(dbDataType.toUpperCase() === 'DATE' ||\r\n dbDataType.toUpperCase() === 'YEAR' ||\r\n dbDataType.toUpperCase() === 'TINYTEXT' ||\r\n dbDataType.toUpperCase() === 'MEDIUMTEXT' ||\r\n dbDataType.toUpperCase() === 'LONGTEXT' ||\r\n dbDataType.toUpperCase() === 'TINYBLOB' ||\r\n dbDataType.toUpperCase() === 'MEDIUMBLOB' ||\r\n dbDataType.toUpperCase() === 'LONGBLOB' ||\r\n dbDataType.toUpperCase() === 'BOOLEAN' ||\r\n dbDataType.toUpperCase() === 'FLOAT' ||\r\n dbDataType.toUpperCase() === 'INT' ||\r\n dbDataType.toUpperCase() === 'JSON' ) {\r\n return dbDataType;\r\n } else if(dbDataType.toUpperCase() === 'ENUM' ||\r\n dbDataType.toUpperCase() === 'SET' ) {\r\n return `${dbDataType}(${defaultValue})`;\r\n } else if(dbDataType.toUpperCase() === 'TIME' ||\r\n dbDataType.toUpperCase() === 'DATETIME' ||\r\n dbDataType.toUpperCase() === 'TIMESTAMP') {\r\n return `${dbDataType}${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'DOUBLE') {\r\n return `${dbDataType}${computeLenAndNum(dataLen, numScale, 255, 30)}`;\r\n } else if(dbDataType.toUpperCase() === 'DECIMAL') {\r\n return `${dbDataType}${computeLenAndNum(dataLen, numScale, 65, 30)}`;\r\n } else if(dataLen && dataLen > 0) {\r\n return `${dbDataType}(${dataLen})`;\r\n }\r\n return `${dbDataType}`;\r\n };\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~fieldsUpdate:field:index}}\r\n{{ \r\n let nextPrimaryKey = field.baseUpdate.next.primaryKey;\r\n let prePrimaryKey = field.baseUpdate.pre.primaryKey;\r\n let preDefKey = field.baseUpdate.pre.defKey;\r\n let updateKeys = field.baseUpdate.updateKeys.split(',');\r\n}}\r\n{{? updateKeys.includes('primaryKey') && updateKeys.includes('defaultValue')}}\r\nALTER TABLE {{= tableKey }} ALTER COLUMN `{{=field.defKey}}` SET DEFAULT {{=field.defaultValue}};\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defKey' || item === 'dbDataType' || item === 'dataLen' || item === 'numScale' || item === 'intro' || item === 'defName' || item === 'notNull' || item === 'autoIncrement') }}\r\nALTER TABLE {{= tableKey }} {{? updateKeys.includes('defKey')}}CHANGE `{{=preDefKey}}` `{{=field.defKey}}` {{??}} MODIFY COLUMN `{{=field.defKey}}` {{?}} {{=computeDatatype(field)}} {{= field.notNull ? 'NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT ' : '' }} {{= computeDefaultValue(field)}}{{? field.defName || field.intro }} COMMENT '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}'{{?}};\r\n{{?}}\r\n{{~}}\r\n",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\nALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}} {{?}}INDEX `{{=row.defKey}}` ON {{= tableKey }} (\r\n {{~row.fields:field:idx}}\r\n `{{=field.fieldDefKey}}` {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n){{? row.defName || row.intro }}COMMENT '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}'{{?}};\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n let updateKeys = row.baseUpdate.updateKeys.split(',');\n let preDefKey = row.baseUpdate.pre.defKey;\n}}\nALTER TABLE {{= tableKey }}\nDROP INDEX {{? updateKeys.includes('defKey')}}`{{=preDefKey}}` {{??}} `{{=row.defKey}}`{{?}}, \nADD {{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}} {{?}} INDEX `{{=row.defKey}}`(\n {{~row.fields:field:idx}}\n `{{=field.fieldDefKey}}` {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n){{? row.defName || row.intro }}COMMENT '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}'{{?}};\n{{~}}",
+ "indexDelete": "{{\r\n let indexesUpdate = it.indexesUpdate; \r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~indexesUpdate:index:i}}\r\nALTER TABLE {{= tableKey }} DROP INDEX {{=index.defKey}};\r\n{{~}}",
+ "metaTableQuery": "SELECT\r\n null AS id,\r\n table_name AS def_key,\r\n table_comment AS def_name,\r\n table_schema AS schema_name\r\nFROM\r\n information_schema.tables\r\nWHERE table_type = 'BASE TABLE'\r\n and table_schema in (:schemaName)",
+ "metaColumnQuery": "SELECT\n table_schema as schema_name,\n table_name AS tbl_def_key,\n ordinal_position as order_value,\n column_name AS def_key,\n column_comment AS def_name,\n '' AS intro,\n data_type AS db_data_type,\n IF(data_type = column_type or data_type = 'decimal', IF(data_type = 'decimal', CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(COLUMN_TYPE, '(', -1), ',', 1) AS UNSIGNED), NULL),character_maximum_length) AS data_len,\n IF(data_type = column_type or data_type = 'decimal', IF(data_type = 'decimal', CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(COLUMN_TYPE, ',', -1), ')', 1) AS UNSIGNED), NULL), numeric_scale ) AS num_scale,\n IF(column_key = 'PRI', 1, 0 ) AS primary_key,\n IF(is_nullable = 'YES', 0, 1 ) AS not_null,\n IF(extra = 'AUTO_INCREMENT', 1, 0 ) AS auto_increment,\n column_default AS default_value\nFROM\n information_schema.COLUMNS\nWHERE\n table_schema in (:schemaName)\n and CONCAT(table_schema, '.', table_name) in (:sysTableNames)\nORDER BY\n table_schema ASC,\n table_name ASC,\n ordinal_position ASC",
+ "metaIndexQuery": "SELECT INDEX_SCHEMA AS SCHEMA_NAME,\r\n TABLE_NAME AS TBL_DEF_KEY,\r\n COLUMN_NAME AS COL_DEF_KEY,\r\n INDEX_COMMENT AS DEF_NAME,\r\n COMMENT AS INTRO,\r\n IF (NON_UNIQUE = 1, 'NORMAL', 'UNIQUE') AS TYPE,\r\n SEQ_IN_INDEX AS ORDER_VALUE,\r\n IF (COLLATION = 'A', 'ASC', 'DESC') AS SORT_TYPE,\r\n INDEX_NAME AS DEF_KEY FROM information_schema.STATISTICS\r\nWHERE INDEX_SCHEMA IN (:schemaName) AND CONCAT(INDEX_SCHEMA, '.', TABLE_NAME) IN (:sysTableNames) AND INDEX_NAME != 'PRIMARY'\r\nORDER BY INDEX_SCHEMA,TBL_DEF_KEY, DEF_KEY, ORDER_VALUE",
+ "metaQueryCharset": null,
+ "orderValue": 0,
+ "isEnabled": 1,
+ "id": "BPMCJTYLY2UAC"
+ },
+ {
+ "defKey": "Oracle",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "ojdbc6-11.2.0.4.jar",
+ "jdbcReferDriver": "oracle.jdbc.driver.OracleDriver",
+ "jdbcReferUrl": "jdbc:oracle:thin:@//[ip]:[port]/helowin",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\nBEGIN\r\n EXECUTE IMMEDIATE 'DROP TABLE {{= tableKey }}';\r\nEXCEPTION\r\n WHEN OTHERS THEN\r\n IF SQLCODE != -942 THEN -- Table does not exist error\r\n RAISE;\r\n END IF;\r\nEND;\r\n/\r\n\r\nCREATE TABLE {{= tableKey }} (\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\r\n {{=field.defKey}} {{=field.dbDataType}}{{? \r\n field.dbDataType?.toUpperCase() === 'VARCHAR2'\r\n }} ({{=field.dataLen ? field.dataLen : 128}}) {{??\r\n field.dbDataType?.toUpperCase() === 'TIMESTAMP'\r\n }} {{? field.dataLen }} {{? field.dataLen >= 0 && field.dataLen <= 9}} ({{=field.dataLen}}) {{??}} (6) {{?}} {{?? }} (6) {{?}} {{??\r\n field.dbDataType?.toUpperCase() === 'INTEGER' ||\r\n field.dbDataType?.toUpperCase() === 'BINARY_DOUBLE' ||\r\n field.dbDataType?.toUpperCase() === 'DATE' ||\r\n field.dbDataType?.toUpperCase() === 'CLOB' ||\r\n field.dbDataType?.toUpperCase() === 'LONG' ||\r\n field.dbDataType?.toUpperCase() === 'NCLOB' ||\r\n field.dbDataType?.toUpperCase() === 'BLOB' \r\n }} {{??\r\n field.dbDataType?.toUpperCase() === 'FLOAT'\r\n }} {{? field.dataLen && field.dataLen >= 1 && field.dataLen <= 126}} ({{=field.dataLen}}) {{?}} {{?? \r\n field.dbDataType?.toUpperCase() === 'DECIMAL' ||\r\n field.dbDataType?.toUpperCase() === 'NUMBER' \r\n }}{{? field.dataLen && field.dataLen >= 1 && field.dataLen <= 38}}{{? field.numScale && field.numScale >= -84 && field.numScale <= 127}}({{=field.dataLen}},{{=field.numScale}}){{??}}({{=field.dataLen}}) {{?}}{{?}}{{?? \r\n field.dataLen && field.dataLen >= 0\r\n }}({{=field.dataLen}}){{?}}{{= field.autoIncrement ? '' : '' }}{{? field.defaultValue }} DEFAULT {{=field.defaultValue}} {{?}}{{=field.notNull?'NOT NULL' : '' }}{{= index < it.fields.length-1 ? ',' : ( pkList.length > 0 ? ',' : '' ) }} {{~}}\r\n{{? pkList.length > 0 }} \r\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i < pkList.length-1 ? ',' : '' }}{{~}})\r\n{{?}}\r\n);\r\n\r\n{{? it.defName || it.intro }} \r\nCOMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}';\r\n{{?}}\r\n\r\n{{~it.fields:field:index}}\r\n{{? field.defName || field.intro }}\r\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}\r\n$blankline",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let defName = it.baseUpdate.next.defName;\r\n let intro = it.baseUpdate.next.intro;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? isPrimaryKeyModified }}\r\nALTER TABLE {{= tableKey }} DROP PRIMARY KEY;\r\n{{? indexFields && indexFields.length > 0}}\r\nALTER TABLE {{= tableKey }} ADD CONSTRAINT {{=it.defKey}}_PRIMARY_KEY PRIMARY KEY ({{~indexFields:field:i}}{{= field.defKey }}{{= i < indexFields.length-1 ? ',' : '' }}{{~}});\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\r\nCOMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(defName, intro, \";\", true)}}'; \r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defKey') }}\r\nALTER TABLE {{= tableKey }} RENAME TO {{=defKey}};\r\n{{?}}",
+ "tableDelete": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\nBEGIN\r\n EXECUTE IMMEDIATE 'DROP TABLE {{= tableKey }}';\r\nEXCEPTION\r\n WHEN OTHERS THEN\r\n IF SQLCODE != -942 THEN -- Table does not exist error\r\n RAISE;\r\n END IF;\r\nEND;",
+ "columnCreate": "{{\r\n let fieldsUpdate = it.fieldsUpdate;\r\n const computeDataLen = (dataLen, maxDataLen, defaultDataLen) => {\r\n if(!dataLen) {\r\n return defaultDataLen;\r\n }\r\n if(dataLen >= 0 && dataLen <= maxDataLen) {\r\n return dataLen;\r\n }\r\n return defaultDataLen;\r\n \r\n };\r\n const computeDatatype = (field) => {\r\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase() === 'VARCHAR2') {\r\n return `${dbDataType} (${dataLen ? dataLen : 128})`;\r\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP') {\r\n return `${dbDataType} (${computeDataLen(dataLen, 9, 6)})`;\r\n } else if(dbDataType.toUpperCase() === 'INTEGER' ||\r\n dbDataType.toUpperCase() === 'BINARY_DOUBLE' ||\r\n dbDataType.toUpperCase() === 'DATE' ||\r\n dbDataType.toUpperCase() === 'CLOB' ||\r\n dbDataType.toUpperCase() === 'LONG' ||\r\n dbDataType.toUpperCase() === 'NCLOB' ||\r\n dbDataType.toUpperCase() === 'BLOB') {\r\n return dbDataType;\r\n } else if(dbDataType.toUpperCase() === 'FLOAT') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 126) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'DECIMAL' ||\r\n dbDataType.toUpperCase() === 'NUMBER') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 38) ? ((numScale && numScale >= -84 && numScale <= 127) ? `(${dataLen},${numScale})` : `(${dataLen})`) : ''}`; \r\n } else if(dataLen && dataLen >= 0) {\r\n return `${dbDataType} (${dataLen})`\r\n }\r\n return dbDataType;\r\n \r\n };\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~fieldsUpdate:field:index}}\r\n{{\r\n const finalDataType = computeDatatype(field);\r\n}}\r\nALTER TABLE {{= tableKey }} ADD {{= field.defKey }} {{= finalDataType }}{{? field.defaultValue}} DEFAULT {{=field.defaultValue}} {{?}}{{? field.notNull}} NOT NULL{{?}};\r\n{{? field.defName || field.intro }}\r\nCOMMENT ON COLUMN {{= tableKey }}.{{= field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}",
+ "columnUpdate": "{{\r\n let fieldsUpdate = it.fieldsUpdate;\r\n let updateIndexData = it.updateIndexData;\r\n const computeDataLen = (dataLen, maxDataLen, defaultDataLen) => {\r\n if(!dataLen) {\r\n return defaultDataLen;\r\n }\r\n if(dataLen >= 0 && dataLen <= maxDataLen) {\r\n return dataLen;\r\n }\r\n return defaultDataLen;\r\n \r\n };\r\n const computeDatatype = (field) => {\r\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase() === 'VARCHAR2') {\r\n return `${dbDataType} (${dataLen ? dataLen : 128})`;\r\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP') {\r\n return `${dbDataType} (${computeDataLen(dataLen, 9, 6)})`;\r\n } else if(dbDataType.toUpperCase() === 'INTEGER' ||\r\n dbDataType.toUpperCase() === 'BINARY_DOUBLE' ||\r\n dbDataType.toUpperCase() === 'DATE' ||\r\n dbDataType.toUpperCase() === 'CLOB' ||\r\n dbDataType.toUpperCase() === 'LONG' ||\r\n dbDataType.toUpperCase() === 'NCLOB' ||\r\n dbDataType.toUpperCase() === 'BLOB') {\r\n return dbDataType;\r\n } else if(dbDataType.toUpperCase() === 'FLOAT') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 126) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'DECIMAL' ||\r\n dbDataType.toUpperCase() === 'NUMBER') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 38) ? ((numScale && numScale >= -84 && numScale <= 127) ? `(${dataLen},${numScale})` : `(${dataLen})`) : ''}`; \r\n } else if(dataLen && dataLen >= 0) {\r\n return `${dbDataType} (${dataLen})`\r\n }\r\n return dbDataType;\r\n \r\n };\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~updateIndexData:updateIndex:index}}\r\n{{? updateIndex?.fieldsUpdate?.length > 0 }}\r\nBEGIN\r\n EXECUTE IMMEDIATE 'DROP INDEX {{= schemaName }}{{= updateIndex?.defKey }}';\r\nEXCEPTION\r\n WHEN OTHERS THEN\r\n IF SQLCODE!= -1418 THEN -- Index does not exist error\r\n RAISE;\r\n END IF;\r\nEND;\r\n{{?}}\r\n{{~}}\r\n{{~fieldsUpdate:field:index}}\r\n{{\r\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n const finalDataType = computeDatatype(field);\r\n const preDefKey = field?.baseUpdate?.pre?.defKey;\r\n const nextDefKey = field?.baseUpdate?.next?.defKey;\r\n}}\r\n{{? updateKeys.includes('defKey') }}\r\nALTER TABLE {{= tableKey }} RENAME COLUMN {{= preDefKey}} TO {{= nextDefKey}};\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale') }}\r\nALTER TABLE {{= tableKey }} MODIFY {{=field.defKey}} {{=finalDataType}};\r\n{{?}}\r\n{{? updateKeys.includes('notNull') }}\r\nALTER TABLE {{= tableKey }} MODIFY {{=field.defKey}} {{? field.notNull }} NOT NULL {{??}} NULL {{?}};\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\r\nCOMMENT ON COLUMN {{= tableKey }}.{{= field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{?}}\r\n{{? updateKeys.includes('defaultValue') }}\r\nALTER TABLE {{= tableKey }} MODIFY {{=field.defKey}} DEFAULT {{=field.defaultValue}};\r\n{{?}}\r\n{{~}}",
+ "columnDelete": "{{\r\n let fieldsUpdate = it.fieldsUpdate;\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~fieldsUpdate:field:index}}\r\nALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};\r\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}} {{?}} INDEX {{=row.defKey}} ON {{= tableKey }} (\r\n {{~row.fields:field:idx}}\r\n -- {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{=field.fieldDefKey}} {{='ASC'}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{?}}\r\n{{~}}",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nBEGIN\n EXECUTE IMMEDIATE 'DROP INDEX {{= schemaName }}{{? preDefKey}}{{= preDefKey}}{{??}}{{=row.defKey}}{{?}}';\nEXCEPTION\n WHEN OTHERS THEN\n IF SQLCODE!= -1418 THEN -- Index does not exist error\n RAISE;\n END IF;\nEND;\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}} {{?}} INDEX {{=row.defKey}} ON {{= tableKey }} (\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\r\n let indexesUpdate = it.indexesUpdate; \r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~indexesUpdate:row:i}}\r\nBEGIN\r\n EXECUTE IMMEDIATE 'DROP INDEX {{= schemaName }}{{=row.defKey}}';\r\nEXCEPTION\r\n WHEN OTHERS THEN\r\n IF SQLCODE!= -1418 THEN -- Index does not exist error\r\n RAISE;\r\n END IF;\r\nEND;\r\n{{~}}",
+ "metaTableQuery": "SELECT\n\t\t'' as id,\n t.table_name AS def_key,\n c.comments AS def_name,\n t.OWNER AS schema_name\nFROM all_tables t left join all_tab_comments c on t.OWNER=c.OWNER and t.TABLE_NAME=c.TABLE_NAME\nwhere t.OWNER in (:schemaName) order by def_key",
+ "metaColumnQuery": "SELECT\n col.owner AS schema_name,\n\tcol.table_name AS tbl_def_key,\n\tcol.column_id AS order_value,\n\tcol.column_name AS def_key,\n\tclc.comments AS def_name,\n\t'' AS intro,\n\tcol.data_type AS db_data_type,\n\tnvl(col.data_precision,col.data_length) AS data_len,\n\tcol.data_scale AS num_scale,\n\tdecode(col.nullable,'Y',0,1) AS not_null,\n\tCASE WHEN cc.constraint_name IS NOT NULL THEN 1 ELSE 0 END AS primary_key,\n\t'' AS auto_increment,\n\tcol.data_default AS default_value\nFROM\n\tall_tab_columns col LEFT JOIN all_col_comments clc ON col.OWNER = clc.OWNER AND col.table_name = clc.table_name AND col.column_name = clc.column_name \n\t LEFT JOIN (all_cons_columns cc JOIN all_constraints cs ON cc.constraint_name = cs.constraint_name AND cc.owner = cs.owner and cs.constraint_type = 'P') on col.owner=cc.owner and col.table_name=cc.table_name and col.column_name = cc.column_name\nWHERE\n\tcol.owner in (:schemaName)\n\tAND CONCAT(CONCAT(col.owner, '.') , col.table_name) in (:sysTableNames)\nORDER BY\n\tcol.owner ASC, col.table_name ASC,col.column_id ASC ",
+ "metaIndexQuery": "SELECT i.owner AS schema_name,\r\n i.table_name AS TBL_DEF_KEY,\r\n ic.column_name AS COL_DEF_KEY,\r\n DATA_DEFAULT AS VIRTUAL_COL_DEF_KEY,\r\n i.index_name AS DEF_KEY,\r\n CASE\r\n WHEN i.uniqueness = 'UNIQUE' THEN 'UNIQUE'\r\n ELSE 'NORMAL'\r\n END AS TYPE,\r\n CASE\r\n WHEN ic.descend = 'DESC' THEN 'DESC'\r\n ELSE 'ASC'\r\n END AS SORT_TYPE,\r\n ic.column_position AS ORDER_VALUE,\r\n NULL AS INTRO -- Oracle does not have a direct equivalent for INDEX_COMMENT\r\nFROM all_indexes i\r\n LEFT JOIN all_ind_columns ic ON i.index_name = ic.index_name AND i.table_name = ic.table_name\r\n LEFT JOIN ALL_TAB_COLS co ON (co.table_name = i.table_name AND co.column_name = ic.column_name)\r\nWHERE i.owner in (:schemaName)\r\n AND CONCAT(CONCAT(i.owner, '.') , i.table_name) IN (:sysTableNames)\r\n AND co.owner in (:schemaName)\r\n -- AND NULLABLE = 'Y'\r\n AND GENERATED = 'N'--是否是自动生成\r\nORDER BY i.owner, i.table_name, i.index_name, ic.column_position",
+ "metaQueryCharset": null,
+ "orderValue": 1,
+ "isEnabled": 0,
+ "id": "BPMCJTYLY0UAC"
+ },
+ {
+ "defKey": "PostgreSQL",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "postgresql-42.7.3.jar",
+ "jdbcReferDriver": "org.postgresql.Driver",
+ "jdbcReferUrl": "jdbc:postgresql://[ip]:[port]/[dbname]",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n\r\n const dataTypeArray = [\r\n 'INT2',\r\n 'INT4',\r\n 'INT',\r\n 'INT8',\r\n 'SERIAL2',\r\n 'SERIAL4',\r\n 'SERIAL8',\r\n 'FLOAT4',\r\n 'FLOAT8',\r\n 'MONEY',\r\n 'TEXT',\r\n 'BYTEA',\r\n 'BOOLEAN',\r\n 'JSONB',\r\n 'JSON',\r\n 'DATE'\r\n ];\r\n\r\n function getDataType(field) {\r\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(autoIncrement) {\r\n return dbDataType.toUpperCase() === 'INT8' ? 'BIGSERIAL' : 'SERIAL';\r\n }\r\n if(dataTypeArray.includes(dbDataType.toUpperCase())) {\r\n return dbDataType;\r\n }\r\n if(dbDataType.toUpperCase() === 'DECIMAL') {\r\n if(dataLen && dataLen >= 1 && dataLen <= 1000) {\r\n if(numScale && numScale >= 0 && numScale <= dataLen) {\r\n return `${dbDataType}(${dataLen},${numScale})`;\r\n } else {\r\n return `${dbDataType}(${dataLen})`;\r\n }\r\n }\r\n return dbDataType;\r\n }\r\n if(dataLen && dataLen >= 0) {\r\n return `${dbDataType}(${dataLen})`;\r\n }\r\n return dbDataType;\r\n }\r\n\r\n function getConstraints(field) {\r\n let constraints = '';\r\n if (field.notNull) {\r\n constraints += ' NOT NULL';\r\n }\r\n if (field.defaultValue) {\r\n constraints += ` DEFAULT ${field.defaultValue}`;\r\n }\r\n return constraints;\r\n }\r\n}}\r\n\r\nDROP TABLE IF EXISTS {{= tableKey }};\r\n\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}{{=field.defKey}} {{= getDataType(field) }}{{= getConstraints(field) }}{{= index < it.fields.length-1 || pkList.length>0 ? ',' : '' }}\r\n{{~}}\r\n{{? pkList.length > 0 }} PRIMARY KEY ({{= pkList.join(',')}}){{?}}\r\n);\r\n\r\n{{~it.fields:field:index}}\r\n{{? field.defName || field.intro }}\r\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}\r\n\r\n{{? it.defName || it.intro }}\r\nCOMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}';\r\n{{?}}\r\n$blankline",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n let defName = it.baseUpdate.next.defName;\r\n let intro = it.baseUpdate.next.intro;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? isPrimaryKeyModified }}\r\nDO $$\r\n DECLARE\r\n pk_constraint_name text;\r\n BEGIN\r\n SELECT constraint_name\r\n INTO pk_constraint_name\r\n FROM information_schema.table_constraints\r\n WHERE table_name = '{{=it.defKey}}' AND constraint_type = 'PRIMARY KEY'\r\n LIMIT 1;\r\n\r\n IF pk_constraint_name IS NOT NULL THEN\r\n EXECUTE 'ALTER TABLE {{= schemaName }}{{=it.defKey}} DROP CONSTRAINT ' || pk_constraint_name;\r\n ELSE\r\n RAISE NOTICE 'No primary key constraint found for the table.';\r\n END IF;\r\nEND $$;\r\n{{? indexFields && indexFields.length > 0}}\r\nALTER TABLE {{= tableKey }} ADD PRIMARY KEY ({{~indexFields:field:i}}\"{{= field.defKey }}\"{{= i < indexFields.length-1 ? ',' : '' }}{{~}});\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}COMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(defName, intro, \";\", true)}}';{{?}}\r\n$blankline\r\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{= tableKey }} RENAME TO {{=defKey}};{{?}}\r\n",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};\n$blankline",
+ "columnCreate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(autoIncrement) {\n return dbDataType.toUpperCase() === 'INT8' ? 'BIGSERIAL' : 'SERIAL';\n }\n if(dbDataType.toUpperCase() === 'INT2' ||\n dbDataType.toUpperCase() === 'INT4' ||\n dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase() === 'INT8' ||\n dbDataType.toUpperCase() === 'SERIAL2' ||\n dbDataType.toUpperCase() === 'SERIAL4' ||\n dbDataType.toUpperCase() === 'SERIAL8' ||\n dbDataType.toUpperCase() === 'FLOAT4' ||\n dbDataType.toUpperCase() === 'FLOAT8' ||\n dbDataType.toUpperCase() === 'MONEY' ||\n dbDataType.toUpperCase() === 'TEXT' ||\n dbDataType.toUpperCase() === 'BYTEA' ||\n dbDataType.toUpperCase() === 'BOOLEAN' ||\n dbDataType.toUpperCase() === 'JSONB' ||\n dbDataType.toUpperCase() === 'JSON' ||\n dbDataType.toUpperCase() === 'DATE') {\n return dbDataType;\n }\n if(dbDataType.toUpperCase() === 'DECIMAL') {\n if(dataLen && dataLen >= 1 && dataLen <= 1000) {\n if(numScale && numScale >= 0 && numScale <= dataLen) {\n return `${dbDataType}(${dataLen},${numScale})`;\n } else {\n return `${dbDataType}(${dataLen})`;\n }\n }\n return dbDataType;\n }\n if(dataLen && dataLen >= 0) {\n return `${dbDataType}(${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n}}\nALTER TABLE {{= tableKey }} ADD COLUMN {{= field.defKey }} {{= finalDataType }}{{? field.notNull }} NOT NULL{{?}};\n{{? field.defName || field.intro }}\nCOMMENT ON COLUMN {{= tableKey }}.{{= field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{?}}\n{{? field.defaultValue !== null && field.defaultValue !== undefined && field.defaultValue !== ''}}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} SET DEFAULT {{=field.defaultValue}};\n{{?}}\n{{~}}",
+ "columnUpdate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(autoIncrement) {\n return dbDataType.toUpperCase() === 'INT8' ? 'BIGSERIAL' : 'SERIAL';\n }\n if(dbDataType.toUpperCase() === 'INT2' ||\n dbDataType.toUpperCase() === 'INT4' ||\n dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase() === 'INT8' ||\n dbDataType.toUpperCase() === 'SERIAL2' ||\n dbDataType.toUpperCase() === 'SERIAL4' ||\n dbDataType.toUpperCase() === 'SERIAL8' ||\n dbDataType.toUpperCase() === 'FLOAT4' ||\n dbDataType.toUpperCase() === 'FLOAT8' ||\n dbDataType.toUpperCase() === 'MONEY' ||\n dbDataType.toUpperCase() === 'TEXT' ||\n dbDataType.toUpperCase() === 'BYTEA' ||\n dbDataType.toUpperCase() === 'BOOLEAN' ||\n dbDataType.toUpperCase() === 'JSONB' ||\n dbDataType.toUpperCase() === 'JSON' ||\n dbDataType.toUpperCase() === 'DATE') {\n return dbDataType;\n }\n if(dbDataType.toUpperCase() === 'DECIMAL') {\n if(dataLen && dataLen >= 1 && dataLen <= 1000) {\n if(numScale && numScale >= 0 && numScale <= dataLen) {\n return `${dbDataType}(${dataLen},${numScale})`;\n } else {\n return `${dbDataType}(${dataLen})`;\n }\n }\n return dbDataType;\n }\n if(dataLen && dataLen >= 0) {\n return `${dbDataType}(${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\n const finalDataType = computeDatatype(field);\n const preDefKey = field?.baseUpdate?.pre?.defKey;\n const nextDefKey = field?.baseUpdate?.next?.defKey;\n}}\n{{? updateKeys.includes('defKey') }}ALTER TABLE {{= tableKey }} RENAME COLUMN {{= preDefKey}} TO {{= nextDefKey}};{{?}}\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale' || item === 'autoIncrement') }}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} DROP default;\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} TYPE {{=finalDataType}} USING '{{= field.defKey}}'::{{=finalDataType}};\n{{?}}\n{{? updateKeys.includes('notNull') }}ALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}}{{? field.notNull }} SET {{??}} DROP {{?}} NOT NULL;{{?}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\nCOMMENT ON COLUMN {{= tableKey}}.{{= field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{?}}\n{{? updateKeys.includes('defaultValue') }}\nALTER TABLE {{= tableKey}} ALTER COLUMN {{= field.defKey}}{{? field.defaultValue }} SET DEFAULT {{=field.defaultValue}}{{??}} DROP default{{?}};\n{{?}}\n{{~}}",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\nALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}} {{?}}INDEX {{=row.defKey}} ON {{= tableKey }} (\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{?}}\r\n{{? (row.defName || row.intro) && row.defKey && row.fields.length > 0}}\r\nCOMMENT ON INDEX {{= schemaName }}{{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX IF EXISTS {{= schemaName }}{{? preDefKey}}{{= preDefKey}}{{??}}{{=row.defKey}}{{?}};\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }}(\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{? (row.defName || row.intro) && row.defKey && row.fields.length > 0}}\nCOMMENT ON INDEX {{= schemaName }}{{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\n{{?}}\n{{??}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') && row.fields.length > 0}}\nCOMMENT ON INDEX {{= schemaName }}{{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\n let indexesUpdate = it.indexesUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:i}}\nDROP INDEX IF EXISTS {{= schemaName }}{{=row.defKey}};\n{{~}}",
+ "metaTableQuery": "SELECT\r\n tb.TABLE_NAME as def_key,\r\n d.description as def_name,\r\n tb.table_schema as schema_name\r\nFROM\r\n information_schema.tables tb\r\n JOIN pg_class C ON C.relname = tb.TABLE_NAME\r\n JOIN pg_namespace n ON tb.table_schema = n.nspname AND c.relnamespace = n.oid\r\n LEFT JOIN pg_description d ON d.objoid = C.oid\r\n AND d.objsubid = '0'\r\nWHERE\r\n tb.table_schema IN (:schemaName)\r\nORDER BY\r\n\ttb.table_schema asc",
+ "metaColumnQuery": "SELECT\r\n col.table_schema as schema_name,\r\n col.TABLE_NAME AS tbl_def_key,\r\n col.ordinal_position AS order_value,\r\n col.COLUMN_NAME AS def_key,\r\n d.description AS def_name,\r\n\t\t'' AS intro,\r\n col.udt_name AS db_data_type,\r\n\t\tCASE WHEN col.character_maximum_length IS NULL AND col.numeric_precision IS NOT NULL THEN col.numeric_precision\r\n\t\t ELSE col.character_maximum_length\r\n\t\tEND AS data_len,\r\n\t\tCASE WHEN col.numeric_precision IS NOT NULL THEN (CASE WHEN col.numeric_scale = 0 THEN NULL ELSE col.numeric_scale END)\r\n\t\t\t\tELSE NULL\r\n\t\tEND AS num_scale,\r\n CASE WHEN kc.column_name IS NOT NULL THEN 1 ELSE 0 END AS primary_key,\r\n CASE WHEN col.IS_NULLABLE = 'NO' THEN 1 ELSE 0 END AS not_null,\r\n CASE WHEN col.COLUMN_DEFAULT LIKE 'nextval%' THEN 1 ELSE 0 END AS auto_increment,\r\n\t\tsubstr(col.column_default,0,strpos(col.column_default, concat('::',col.data_type))) AS default_value\r\nFROM\r\n information_schema.COLUMNS col LEFT JOIN (information_schema.key_column_usage kc LEFT JOIN information_schema.table_constraints tc\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tON\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkc.constraint_name = tc.constraint_name\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tand tc.constraint_type = 'PRIMARY KEY'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tand kc.table_schema=tc.table_schema\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tand kc.table_name=tc.table_schema\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) ON\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcol.TABLE_NAME = kc.table_name\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAND col.COLUMN_NAME = kc.column_name AND kc.table_schema = col.table_schema\r\nLEFT JOIN pg_class C ON C.relname = col.TABLE_NAME\r\nLEFT JOIN pg_namespace n ON col.table_schema = n.nspname AND c.relnamespace = n.oid\r\nLEFT JOIN pg_description d ON d.objoid = C.oid AND d.objsubid = col.ordinal_position\r\nWHERE\r\n col.table_schema IN (:schemaName)\r\n AND nspName IN (:schemaName)\r\n AND CONCAT(col.table_schema, '.', col.TABLE_NAME) IN (:sysTableNames)\r\nORDER BY\r\n\tcol.table_schema asc, col.TABLE_NAME asc,col.ordinal_position ASC\r\n",
+ "metaIndexQuery": "SELECT ns.nspname AS schema_name, \r\n t.relname AS tbl_def_key,\r\n a.attname AS col_def_key,\r\n d.description AS def_name,\r\n '' AS intro,\r\n CASE\r\n WHEN ix.indoption[array_position(ix.indkey, a.attnum) - 1] & 1 = 0 THEN 'ASC'\r\n ELSE 'DESC'\r\n END AS sort_type,\r\n CASE\r\n WHEN ix.indisunique THEN 'UNIQUE'\r\n ELSE 'NORMAL'\r\n END AS type,\r\n array_position(ix.indkey, a.attnum) AS order_value,\r\n idx.relname AS def_key\r\nFROM pg_class t\r\n JOIN\r\n pg_namespace ns ON ns.oid = t.relnamespace\r\n JOIN\r\n pg_index ix ON t.oid = ix.indrelid\r\n JOIN\r\n pg_class idx ON ix.indexrelid = idx.oid\r\n JOIN\r\n unnest(ix.indkey) WITH ORDINALITY AS key_col(attnum, ord) ON true\r\n JOIN\r\n pg_attribute a ON t.oid = a.attrelid AND a.attnum = key_col.attnum\r\n LEFT JOIN\r\n pg_description d ON idx.oid = d.objoid\r\nWHERE ns.nspname IN (:schemaName)\r\n AND CONCAT(ns.nspname, '.', t.relname) IN (:sysTableNames)\r\n AND indisprimary = false \r\nORDER BY ns.nspname asc, tbl_def_key, def_key",
+ "metaQueryCharset": null,
+ "orderValue": 2,
+ "isEnabled": 0,
+ "id": "BPMCJTYLF1UAC"
+ },
+ {
+ "defKey": "SQLServer",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "mssql-jdbc-12.6.2.jre11.jar",
+ "jdbcReferDriver": "com.microsoft.sqlserver.jdbc.SQLServerDriver",
+ "jdbcReferUrl": "jdbc:sqlserver://[ip]:[port];databaseName=[databaseName];encrypt=true;trustServerCertificate=true",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}` : 'dbo';\r\n const tableKey = `${schemaName}.${it.defKey}`;\r\n\r\n const dataTypeArray = [\r\n 'TINYINT',\r\n 'SMALLINT',\r\n 'INT',\r\n 'BIGINT',\r\n 'REAL',\r\n 'DATE',\r\n 'DATETIME',\r\n 'TIMESTAMP',\r\n 'MONEY',\r\n 'BIT',\r\n 'TEXT'\r\n ];\r\n\r\n function getDataType(field) {\r\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(autoIncrement) {\r\n return dbDataType.toUpperCase() === 'BIGINT' ? 'BIGINT IDENTITY(1,1)' : 'INT IDENTITY(1,1)';\r\n }\r\n if(dataTypeArray.includes(dbDataType.toUpperCase())) {\r\n return dbDataType;\r\n }\r\n if(dbDataType.toUpperCase() === 'DECIMAL') {\r\n if(dataLen && dataLen >= 1 && dataLen <= 38) {\r\n if(numScale && numScale >= 0 && numScale <= dataLen) {\r\n return `${dbDataType}(${dataLen},${numScale})`;\r\n } else {\r\n return `${dbDataType}(${dataLen})`;\r\n }\r\n }\r\n return dbDataType;\r\n }\r\n if(dbDataType.toUpperCase() === 'TIME' && dataLen && dataLen >= 1 && dataLen <= 7) {\r\n return `${dbDataType}(${dataLen})`;\r\n }\r\n if(dbDataType.toUpperCase() === 'FLOAT' && dataLen && dataLen >= 1 && dataLen <= 53) {\r\n return `${dbDataType}(${dataLen})`;\r\n }\r\n if(dataLen && dataLen >= 0) {\r\n return `${dbDataType}(${dataLen})`;\r\n }\r\n return dbDataType;\r\n }\r\n\r\n function getConstraints(field) {\r\n let constraints = '';\r\n if (field.notNull) {\r\n constraints += ' NOT NULL';\r\n }\r\n if (!field.notNull) {\r\n constraints += ' NULL';\r\n }\r\n if (field.defaultValue) {\r\n constraints += ` DEFAULT ${field.defaultValue}`;\r\n }\r\n return constraints;\r\n }\r\n}}\r\n\r\nIF OBJECT_ID('{{= tableKey }}','U') IS NOT NULL \r\n DROP TABLE {{= tableKey }};\r\n\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{? field.primaryKey }}{{ pkList.push('[' + field.defKey + ']') }}{{?}} \r\n [{{=field.defKey}}] {{= getDataType(field) }}{{= getConstraints(field) }}{{= index < it.fields.length-1 || pkList.length>0 ? ',' : '' }} \r\n{{~}}\r\n{{? pkList.length > 0 }} PRIMARY KEY ({{= pkList.join(', ')}}){{?}}\r\n);\r\n\r\n{{~it.fields:field:index}}\r\n{{? field.defName || field.intro }}\r\nEXEC sp_addextendedproperty \r\n @name = N'MS_Description', \r\n @value = N'{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}', \r\n @level0type = N'SCHEMA', @level0name = N'{{=schemaName}}', \r\n @level1type = N'TABLE', @level1name = N'{{=it.defKey}}', \r\n @level2type = N'COLUMN', @level2name = N'{{=field.defKey}}';\r\n{{?}}\r\n{{~}}\r\n\r\n{{? it.defName || it.intro }}\r\nEXEC sp_addextendedproperty \r\n @name = N'MS_Description', \r\n @value = N'{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}', \r\n @level0type = N'SCHEMA', @level0name = N'{{=schemaName}}', \r\n @level1type = N'TABLE', @level1name = N'{{=it.defKey}}';\r\n{{?}}\r\n$blankline\r\n",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let defName = it.baseUpdate.next.defName;\r\n let intro = it.baseUpdate.next.intro;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n let schemaName = it.schemaName ? `${it.schemaName}` : 'dbo';\r\n const tableKey = `${schemaName}.${it.defKey}`;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? isPrimaryKeyModified }}\r\nBEGIN\r\nDECLARE @constraint_name NVARCHAR(128);\r\nDECLARE @sql NVARCHAR(MAX);\r\n\r\nSELECT @constraint_name = name\r\nFROM sys.key_constraints\r\nWHERE type = 'PK'\r\n AND OBJECT_NAME(parent_object_id) = '{{=it.defKey}}' \r\n AND SCHEMA_NAME(schema_id) = '{{= schemaName }}';\r\n\r\nIF @constraint_name IS NOT NULL\r\n BEGIN\r\n SET @sql = 'ALTER TABLE {{= tableKey}} DROP CONSTRAINT ' + QUOTENAME(@constraint_name);\r\n EXEC sp_executesql @sql;\r\n END\r\nEND\r\n{{? indexFields && indexFields.length > 0}}\r\nALTER TABLE {{= tableKey }} ADD PRIMARY KEY ({{~indexFields:field:i}}{{= field.defKey }}{{= i < indexFields.length-1 ? ',' : '' }}{{~}});\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\r\nEXEC sp_updateextendedproperty \r\n @name = N'MS_Description', \r\n @value = N'{{=it.func.strJoin(defName, intro, \";\", true)}}', \r\n @level0type = N'SCHEMA', @level0name = N'{{= schemaName }}', \r\n @level1type = N'TABLE', @level1name = N'{{=it.defKey}}';\r\n{{?}}\r\n$blankline\r\n{{? updateKeys.some((item) => item === 'defKey') }}EXEC sp_rename '{{= tableKey }}', '{{=defKey}}'; {{?}}",
+ "tableDelete": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}` : 'dbo';\r\n const tableKey = `${schemaName}.${it.defKey}`;\r\n}}\r\nIF OBJECT_ID('{{= tableKey }}', 'U') IS NOT NULL \r\n DROP TABLE {{= tableKey }};",
+ "columnCreate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(autoIncrement) {\n return dbDataType.toUpperCase() === 'BIGINT' ? 'BIGINT IDENTITY(1,1)' : 'INT IDENTITY(1,1)';\n }\n if(dbDataType.toUpperCase() === 'TINYINT' ||\n dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase() === 'BIGINT' ||\n dbDataType.toUpperCase() === 'REAL' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'DATETIME' ||\n dbDataType.toUpperCase() === 'TIMESTAMP' ||\n dbDataType.toUpperCase() === 'MONEY' ||\n dbDataType.toUpperCase() === 'BIT' ||\n dbDataType.toUpperCase() === 'TEXT') {\n return dbDataType; \n } else if(dbDataType.toUpperCase() === 'DECIMAL') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 38) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dbDataType.toUpperCase() === 'TIME' ) {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 7) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'FLOAT') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 53) ? `(${dataLen})` : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}` : 'dbo';\n const tableKey = `${schemaName}.${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n}}\nALTER TABLE {{= tableKey }} ADD {{= field.defKey}} {{= finalDataType}}{{? field.notNull}} NOT NULL{{?}}{{? field.defaultValue}} DEFAULT {{= field.defaultValue}}{{?}};\n{{? field.defName || field.intro }}\nEXEC sp_addextendedproperty \n @name = N'MS_Description', \n @value = N'{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}', \n @level0type = N'SCHEMA', @level0name = N'{{= schemaName }}',\n @level1type = N'TABLE', @level1name = N'{{= it.defKey}}',\n @level2type = N'COLUMN', @level2name = N'{{= field.defKey}}';\n{{?}}\n{{~}}",
+ "columnUpdate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(autoIncrement) {\n return dbDataType.toUpperCase() === 'BIGINT' ? 'BIGINT IDENTITY(1,1)' : 'INT IDENTITY(1,1)';\n }\n if(dbDataType.toUpperCase() === 'TINYINT' ||\n dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase() === 'BIGINT' ||\n dbDataType.toUpperCase() === 'REAL' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'DATETIME' ||\n dbDataType.toUpperCase() === 'TIMESTAMP' ||\n dbDataType.toUpperCase() === 'MONEY' ||\n dbDataType.toUpperCase() === 'BIT' ||\n dbDataType.toUpperCase() === 'TEXT') {\n return dbDataType; \n } else if(dbDataType.toUpperCase() === 'DECIMAL') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 38) ? ((numScale && numScale >= 0 && numScale <= field.dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dbDataType.toUpperCase() === 'TIME' ) {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 7) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'FLOAT') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 53) ? `(${dataLen})` : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}` : 'dbo';\n const tableKey = `${schemaName}.${it.defKey}`;\n let updateIndexData = it.updateIndexData;\n}}\n{{~updateIndexData:row:index}}\n{{? row?.fieldsUpdate?.length > 0 }}\nIF EXISTS (SELECT * FROM sys.indexes WHERE name = '{{=row.defKey}}' AND object_id = OBJECT_ID('{{= tableKey }}'))\n DROP INDEX {{=row.defKey}} ON {{= tableKey }};\n{{?}}\n{{~}}\n{{~fieldsUpdate:field:index}}\n{{\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\n const finalDataType = computeDatatype(field);\n const preDefKey = field?.baseUpdate?.pre?.defKey;\n const nextDefKey = field?.baseUpdate?.next?.defKey;\n}}\n{{? updateKeys.includes('defaultValue') }}\nBEGIN\n DECLARE @constraint_name NVARCHAR(255);\n\n SELECT @constraint_name = name\n FROM sys.default_constraints\n WHERE parent_object_id = OBJECT_ID('{{= tableKey }}') \n AND parent_column_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('{{= tableKey }}') AND name = '{{= preDefKey }}');\n \n IF @constraint_name IS NOT NULL\n BEGIN\n EXEC('ALTER TABLE {{= tableKey }} DROP CONSTRAINT ' + @constraint_name);\n END\nEND\n{{?}}\n{{? updateKeys.includes('defKey') }}EXEC sp_rename '{{= tableKey }}.{{= preDefKey}}', '{{= nextDefKey}}', 'COLUMN';{{?}}\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale' || item === 'notNull' || item === 'autoIncrement') }}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} {{=finalDataType}}{{? field.notNull}} NOT NULL{{?}};\n{{?}}\n{{? updateKeys.includes('defaultValue') }}ALTER TABLE {{= tableKey }} ADD DEFAULT {{= field.defaultValue}} FOR {{= field.defKey}};{{?}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\nEXEC sp_updateextendedproperty \n @name = N'MS_Description', \n @value = N'{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}', \n @level0type = N'SCHEMA', @level0name = N'{{=schemaName}}', \n @level1type = N'TABLE', @level1name = N'{{=it.defKey}}', \n @level2type = N'COLUMN', @level2name = N'{{=field.defKey}}';\n{{?}}\n{{~}}",
+ "columnDelete": "{{\r\n let fieldsUpdate = it.fieldsUpdate; \r\n let schemaName = it.schemaName ? `${it.schemaName}` : 'dbo';\r\n const tableKey = `${schemaName}.${it.defKey}`;\r\n}}\r\n{{~fieldsUpdate:field:index}}\r\nBEGIN\r\n DECLARE @constraint_name NVARCHAR(255);\r\n \r\n SELECT @constraint_name = name\r\n FROM sys.default_constraints\r\n WHERE parent_object_id = OBJECT_ID('{{= tableKey }}') \r\n AND parent_column_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('{{= tableKey }}') AND name = '{{= field.defKey }}');\r\n \r\n IF @constraint_name IS NOT NULL\r\n EXEC('ALTER TABLE {{= tableKey }} DROP CONSTRAINT ' + @constraint_name);\r\n IF EXISTS (SELECT * FROM sys.columns WHERE name = '{{=field.defKey}}' AND object_id = OBJECT_ID('{{= tableKey }}'))\r\n ALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};\r\nEND\r\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}` : 'dbo';\r\n const tableKey = `${schemaName}.${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }}(\r\n {{~row.fields:field:idx}}\r\n [{{=field.fieldDefKey}}] {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{? row.defName || row.intro }}\r\nEXEC sp_addextendedproperty \r\n @name = N'MS_Description', \r\n @value = N'{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}', \r\n @level0type = N'SCHEMA', @level0name = N'{{= schemaName }}', \r\n @level1type = N'TABLE', @level1name = N'{{= it.defKey }}', \r\n @level2type = N'INDEX', @level2name = N'{{= row.defKey }}';\r\n{{?}}\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}` : 'dbo';\n const tableKey = `${schemaName}.${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nIF EXISTS (SELECT * FROM sys.indexes WHERE name = '{{= preDefKey}}' AND object_id = OBJECT_ID('{{=it.defKey}}'))\nBEGIN\n DROP INDEX {{= preDefKey}} ON {{= tableKey }};\nEND\nGO\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{=it.defKey}} (\n {{~row.fields:field:idx}}\n [{{=field.fieldDefKey}}] {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{? row.defName || row.intro }}\nEXEC sp_addextendedproperty \n @name = N'MS_Description', \n @value = N'{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}', \n @level0type = N'SCHEMA', @level0name = N'{{= schemaName }}', \n @level1type = N'TABLE', @level1name = N'{{= it.defKey }}', \n @level2type = N'INDEX', @level2name = N'{{= row.defKey }}';\n{{?}}\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\r\n let indexesUpdate = it.indexesUpdate; \r\n let schemaName = it.schemaName ? `${it.schemaName}` : 'dbo';\r\n const tableKey = `${schemaName}.${it.defKey}`;\r\n}}\r\n{{~indexesUpdate:row:i}}\r\nIF EXISTS (SELECT * FROM sys.indexes WHERE name = '{{=row.defKey}}' AND object_id = OBJECT_ID('{{= tableKey }}'))\r\nBEGIN\r\n DROP INDEX {{=row.defKey}} ON {{= tableKey }};\r\nEND\r\nGO\r\n{{~}}",
+ "metaTableQuery": "SELECT\n tab.name AS def_key,\n ep.value AS def_name,\n sch.name AS schema_name\nFROM sys.schemas sch JOIN sys.tables tab ON sch.schema_id = tab.schema_id\n LEFT JOIN sys.extended_properties ep ON tab.object_id = ep.major_id\n AND ep.minor_id = 0\n AND ep.name = 'MS_Description'\n AND ep.class = 1\nWHERE sch.name IN (:schemaName);",
+ "metaColumnQuery": "SELECT\r\n schema_name = sch.name,\r\n tbl_def_key = tab.name,\r\n order_value = col.column_id,\r\n def_key = col.name,\r\n def_name = ep.value,\r\n intro = '',\r\n db_data_type = t.name,\r\n data_len = IIF(col.max_length = 0, null, col.max_length),\r\n num_scale = IIF(col.scale = 0, null, col.scale),\r\n primary_key = ISNULL((\r\n SELECT\r\n 1\r\n FROM\r\n information_schema.table_constraints AS tc,\r\n information_schema.key_column_usage AS kcu\r\n WHERE tc.constraint_name = kcu.constraint_name\r\n AND tc.constraint_type = 'PRIMARY KEY'\r\n AND tc.table_name = tab.name\r\n AND tc.CONSTRAINT_SCHEMA = sch.name\r\n AND kcu.column_name= col.name\r\n ),0),\r\n not_null= IIF(col.is_nullable = 1, 0, 1),\r\n auto_increment = is_identity,\r\n default_value = ISNULL(REPLACE(REPLACE(dc.definition,'(',''), ')',''),'') -- ISNULL(dc.definition, '')\r\nFROM\r\n sys.schemas sch\r\n INNER JOIN sys.tables tab\r\n ON sch.schema_id = tab.schema_id\r\n INNER JOIN sys.columns col\r\n ON tab.object_id = col.object_id\r\n LEFT JOIN sys.extended_properties ep\r\n ON tab.object_id = ep.major_id\r\n AND col.column_id = ep.minor_id\r\n AND ep.name = 'MS_Description'\r\n AND ep.class = 1\r\n LEFT JOIN sys.types t ON col.system_type_id = t.system_type_id AND col.user_type_id = t.user_type_id\r\n LEFT JOIN sys.default_constraints dc ON dc.object_id = col.default_object_id\r\nwhere sch.name IN (:schemaName) AND CONCAT(sch.name, '.', tab.name) IN (:sysTableNames)\r\nORDER BY sch.name,tbl_def_key, order_value",
+ "metaIndexQuery": "SELECT\r\n sch.name AS schema_name,\r\n tab.name AS TBL_DEF_KEY,\r\n col.name AS COL_DEF_KEY,\r\n i.name AS DEF_KEY,\r\n ep.value AS def_name,\r\n IIF(i.is_unique = 1, 'UNIQUE', 'NORMAL') AS TYPE,\r\n IIF(ic.is_descending_key = 1, 'DESC', 'ASC') AS SORT_TYPE,\r\n ic.key_ordinal AS ORDER_VALUE,\r\n '' AS INTRO\r\nFROM\r\n sys.schemas sch LEFT JOIN sys.tables tab\r\n ON sch.schema_id = tab.schema_id\r\n LEFT JOIN sys.indexes i\r\n ON i.object_id = tab.object_id\r\n LEFT JOIN sys.index_columns ic\r\n ON i.object_id = ic.object_id AND i.index_id = ic.index_id\r\n LEFT JOIN sys.columns col\r\n ON ic.object_id = col.object_id AND ic.column_id = col.column_id\r\n LEFT JOIN sys.extended_properties ep\r\n ON tab.object_id = ep.major_id\r\n AND i.index_id = ep.minor_id\r\n AND ep.name = 'MS_Description'\r\n AND ep.class = 7\r\nWHERE sch.name in (:schemaName) AND CONCAT(sch.name, '.', tab.name) IN (:sysTableNames) AND is_primary_key = 0 AND i.type IN (1, 2)\r\nORDER BY sch.name,TBL_DEF_KEY, ORDER_VALUE\r\n",
+ "metaQueryCharset": null,
+ "orderValue": 3,
+ "isEnabled": 0,
+ "id": "BPMCJTYLF2UAC"
+ },
+ {
+ "defKey": "DB2",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "db2jcc4.jar",
+ "jdbcReferDriver": "com.ibm.db2.jcc.DB2Driver",
+ "jdbcReferUrl": "jdbc:db2://[ip]:[port]/[schemaName]",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n\r\n function getDataType(field) {\r\n const { dbDataType } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n let dataType = dbDataType.toUpperCase();\r\n if(['NVARCHAR','VARCHAR'].includes(dataType)){\r\n dataType = `${dataType}(${field.dataLen ? field.dataLen : 128})`;\r\n return dataType;\r\n }else if(dataType=='CHAR'){\r\n dataType = field.dataLen && field.dataLen>=0 && field.dataLen <=255 ? `${dataType}(${field.dataLen})`:`${dataType}`;\r\n return dataType;\r\n }else if(dataType=='NCHAR'){\r\n dataType = field.dataLen && field.dataLen>=0 && field.dataLen <=63 ? `${dataType}(${field.dataLen})`:`${dataType}`;\r\n return dataType;\r\n }else if(dataType=='TIMESTAMP'){\r\n dataType = field.dataLen && field.dataLen>=0 && field.dataLen <=12 ? `${dataType}(${field.dataLen})`:`${dataType}`;\r\n return dataType;\r\n }else if(dataType=='DECIMAL'){\r\n return field.dataLen && field.dataLen >= 0 && field.dataLen <= 31 ? (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen ? `${dataType}(${field.dataLen},${field.numScale})` : `${dataType}(${field.dataLen})`) : `${dataType}`;\r\n }else if(['SMALLINT','INTEGER','BIGINT','DOUBLE','DATE','TIME','BOOLEAN','REAL'].includes(dataType)){\r\n return dataType;\r\n }\r\n else{\r\n if(field.dataLen){\r\n return `${dataType}(${field.dataLen})`;\r\n }\r\n else{\r\n return dataType; \r\n }\r\n }\r\n\r\n}\r\n function getFieldDefinition(field, index, fields) {\r\n const dataType = getDataType(field);\r\n const defaultNotNull = field.notNull ? ' NOT NULL' : '';\r\n const defaultAutoIncrement = field.autoIncrement ? ' GENERATED ALWAYS AS IDENTITY' : '';\r\n const defaultValue = field.defaultValue ? ` DEFAULT ${field.defaultValue}` : '';\r\n return `${dataType}${defaultNotNull}${defaultAutoIncrement}${defaultValue}${index < it.fields.length - 1 ? ',' : '' }`;\r\n }\r\n}}\r\nDROP TABLE IF EXISTS {{= tableKey }};\r\n\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\r\n {{=field.defKey}} {{= getFieldDefinition(field, index, it.fields) }}\r\n{{~}}\r\n{{? pkList.length >0 }}\r\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i 0}}\r\nALTER TABLE {{= tableKey }} ADD PRIMARY KEY({{~indexFields:field:i}}{{= field.defKey }} {{= i < indexFields.length-1 ? ',' : '' }}{{~}});\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}COMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(defName, intro, \";\", true)}}'; {{?}}\r\n$blankline\r\n{{? updateKeys.some((item) => item === 'defKey') }}RENAME TABLE {{= tableKey }} TO {{= defKey }};{{?}}\r\n",
+ "tableDelete": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\nDROP TABLE IF EXISTS {{= tableKey }};",
+ "columnCreate": "{{\r\n let fieldsUpdate = it.fieldsUpdate;\r\n const computeDatatype = (field) => {\r\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase() === 'VARCHAR' ||\r\n dbDataType.toUpperCase() === 'NVARCHAR') {\r\n return `${dbDataType} (${dataLen ? dataLen : '128'})`; \r\n } else if(dbDataType.toUpperCase() === 'SMALLINT' ||\r\n dbDataType.toUpperCase() === 'INTEGER' ||\r\n dbDataType.toUpperCase() === 'BIGINT' ||\r\n dbDataType.toUpperCase() === 'REAL' ||\r\n dbDataType.toUpperCase() === 'DOUBLE' ||\r\n dbDataType.toUpperCase() === 'DATE' ||\r\n dbDataType.toUpperCase() === 'BOOLEAN' ||\r\n dbDataType.toUpperCase() === 'TIME' ) {\r\n return dbDataType;\r\n } else if(dbDataType.toUpperCase() === 'CHAR') {\r\n return `${dbDataType} ${(dataLen && dataLen > 0 && dataLen <= 255) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'NCHAR') {\r\n return `${dbDataType} ${(dataLen && dataLen > 0 && dataLen <= 63) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 12) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'DECIMAL') {\r\n return `${dbDataType} ${(dataLen && dataLen > 0 && dataLen <= 31) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\r\n } else if(dataLen && dataLen >= 0) {\r\n return `${dbDataType} (${dataLen})`;\r\n }\r\n return dbDataType;\r\n };\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~fieldsUpdate:field:index}}\r\n{{\r\n const finalDataType = computeDatatype(field);\r\n}}\r\nALTER TABLE {{= tableKey }} ADD {{= field.defKey}} {{= finalDataType}} {{? field.notNull}} NOT NULL{{?}}{{? field.defaultValue}} DEFAULT {{= field.defaultValue}}{{?}};\r\n{{? field.defName || field.intro }}\r\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}",
+ "columnUpdate": "{{\r\n let fieldsUpdate = it.fieldsUpdate;\r\n let updateIndexData = it.updateIndexData;\r\n const computeDatatype = (field) => {\r\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase() === 'VARCHAR' ||\r\n dbDataType.toUpperCase() === 'NVARCHAR') {\r\n return `${dbDataType} (${dataLen ? dataLen : '128'})`; \r\n } else if(dbDataType.toUpperCase() === 'SMALLINT' ||\r\n dbDataType.toUpperCase() === 'INTEGER' ||\r\n dbDataType.toUpperCase() === 'BIGINT' ||\r\n dbDataType.toUpperCase() === 'REAL' ||\r\n dbDataType.toUpperCase() === 'DOUBLE' ||\r\n dbDataType.toUpperCase() === 'DATE' ||\r\n dbDataType.toUpperCase() === 'BOOLEAN' ||\r\n dbDataType.toUpperCase() === 'TIME' ) {\r\n return dbDataType;\r\n } else if(dbDataType.toUpperCase() === 'CHAR') {\r\n return `${dbDataType} ${(dataLen && dataLen > 0 && dataLen <= 255) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'NCHAR') {\r\n return `${dbDataType} ${(dataLen && dataLen > 0 && dataLen <= 63) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 12) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'DECIMAL') {\r\n return `${dbDataType} ${(dataLen && dataLen > 0 && dataLen <= 31) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\r\n } else if(dataLen && dataLen >= 0) {\r\n return `${dbDataType} (${dataLen})`;\r\n }\r\n return dbDataType;\r\n };\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~updateIndexData:row:index}}\r\n{{\r\n const fieldsUpdate = row.fieldsUpdate || [];\r\n const preDefKey = row?.baseUpdate?.pre?.defKey;\r\n}}\r\n{{? fieldsUpdate.length > 0 }}\r\nDROP INDEX {{= preDefKey ? preDefKey : row.defKey}};\r\n{{?}}\r\n{{~}}\r\n{{~fieldsUpdate:field:index}}\r\n{{\r\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n const finalDataType = computeDatatype(field);\r\n const preDefKey = field?.baseUpdate?.pre?.defKey;\r\n const nextDefKey = field?.baseUpdate?.next?.defKey;\r\n}}\r\n{{? updateKeys.includes('defKey') }}ALTER TABLE {{= tableKey }} RENAME COLUMN {{= preDefKey }} TO {{= field.defKey }};{{?}}\r\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale') }}\r\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey }} DROP DEFAULT;\r\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey }} SET DATA TYPE {{= finalDataType}};\r\n{{?}}\r\n{{? updateKeys.includes('defaultValue') }}ALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey }} {{? field.defaultValue }} SET {{??}} DROP {{?}} DEFAULT {{? field.defaultValue}} {{= field.defaultValue}} {{?}};{{?}}\r\n{{? updateKeys.includes('notNull') }}ALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey }} {{? field.notNull }} SET {{??}} DROP {{?}} NOT NULL;{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\r\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\nALTER TABLE {{= tableKey }} DROP {{=field.defKey}};\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row?.fields?.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }} (\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{? row.defName || row.intro }}\r\nCOMMENT ON INDEX {{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\r\n{{?}}\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX {{= preDefKey ? preDefKey : row.defKey}};\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }} (\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{? (row.defName || row.intro) && row.defKey && row.fields.length > 0}}\nCOMMENT ON INDEX {{= schemaName }}{{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\n let indexesUpdate = it.indexesUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:i}}\nDROP INDEX {{=row.defKey}};\n{{~}}",
+ "metaTableQuery": "SELECT NAME AS DEF_KEY,\r\n REMARKS AS DEF_NAME,\r\n TRIM(CREATOR) AS SCHEMA_NAME\r\nFROM SYSIBM.SYSTABLES\r\nWHERE TRIM(CREATOR) IN (:schemaName) AND TYPE = 'T'\r\nORDER BY CTIME ASC",
+ "metaColumnQuery": "select\r\n TRIM(tbcreator) as SCHEMA_NAME,\r\n col.tbname as tbl_def_key,\r\n '' as intro,\r\n col.name as def_key,\r\n remarks as def_name,\r\n col.typename as db_data_type ,\r\n col.length as data_len,\r\n col.scale as num_scale,\r\n CASE WHEN col.keyseq IS NOT NULL THEN (\r\n CASE WHEN col.keyseq = 1 THEN 1 ELSE 0 END\r\n ) ELSE 0 END AS primary_key,\r\n CASE WHEN col.nulls = 'Y' THEN 0 ELSE 1 END AS not_null,\r\n col.default as default_value\r\nfrom sysibm.syscolumns col\r\nwhere TRIM(tbcreator) IN (:schemaName)\r\n and CONCAT(CONCAT(TRIM(tbcreator), '.'), TRIM(tbname)) IN (:sysTableNames)\r\norder by tbcreator,TBL_DEF_KEY, col.COLNO",
+ "metaIndexQuery": "SELECT\r\n TRIM(i.TABSCHEMA) AS SCHEMA_NAME,\r\n i.TABNAME AS TBL_DEF_KEY,\r\n c.COLNAME AS COL_DEF_KEY,\r\n i.INDNAME AS DEF_KEY,\r\n i.REMARKS AS DEF_NAME,\r\n '' AS INTRO,\r\n CASE\r\n WHEN COLORDER = 'A' THEN 'ASC'\r\n ELSE 'DESC'\r\n END AS SORT_TYPE,\r\n CASE\r\n WHEN i.UNIQUERULE = 'U' THEN 'UNIQUE'\r\n ELSE 'NORMAL'\r\n END AS TYPE,\r\n c.COLSEQ AS ORDER_VALUE\r\nFROM\r\n SYSCAT.INDEXES i\r\n LEFT JOIN SYSCAT.INDEXCOLUSE c\r\n ON i.INDSCHEMA = c.INDSCHEMA AND i.INDNAME = c.INDNAME\r\nWHERE i.TABSCHEMA IN (:schemaName) AND CONCAT(CONCAT(TRIM(i.TABSCHEMA), '.'), TRIM(i.TABNAME)) IN (:sysTableNames) AND i.UNIQUERULE != 'P'\r\nORDER BY i.TABSCHEMA, TBL_DEF_KEY, c.COLSEQ",
+ "metaQueryCharset": null,
+ "orderValue": 4,
+ "isEnabled": 0,
+ "id": "BPQHC4PNE64AC"
+ },
+ {
+ "defKey": "SQLite",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "sqlite-jdbc-3.49.1.0.jar",
+ "jdbcReferDriver": "org.sqlite.JDBC",
+ "jdbcReferUrl": "jdbc:sqlite:{xxx.db}",
+ "tableCreate": "DROP TABLE IF EXISTS `{{=it.defKey}}`;\r\nCREATE TABLE `{{=it.defKey}}` (\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{? field.primaryKey && field.autoIncrement}}\r\n `{{=field.defKey}}` INTEGER PRIMARY KEY AUTOINCREMENT{{= index < it.fields.length-1 ? ',' : '' }}\r\n {{??}}`{{=field.defKey}}` {{=field.dbDataType}}{{?field.dataLen>0}}{{='('}}{{=field.dataLen}}{{?field.numScale>0}}{{=','}}{{=field.numScale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.fields.length-1 ? ',' : '' }} {{?}}\r\n{{~}}\r\n);\r\n$blankline\r\n",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n const tableKey = `${it.defKey}`;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{= tableKey }} RENAME TO {{=defKey}};{{?}}\r\n",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};",
+ "columnCreate": "{{\r\n\r\n const computeDefaultValue = (field) => {\r\n const { defaultValue } = field;\r\n if(!defaultValue) {\r\n return '';\r\n }\r\n return `DEFAULT ${defaultValue}`;\r\n };\r\n \r\n const computeDatatype = (field) => {\r\n const { dbDataType, dataLen, numScale, defaultValue } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n return `${dbDataType}`;\r\n };\r\n const tableKey = `${it.defKey}`;\r\n const fieldsUpdate = it.fieldsUpdate;\r\n}}\r\n{{~fieldsUpdate:field:index}}\r\nALTER TABLE {{= tableKey }} ADD COLUMN `{{=field.defKey}}` {{=computeDatatype(field)}} {{= field.notNull ? 'NOT NULL' : '' }} {{= computeDefaultValue(field)}};\r\n{{~}}",
+ "columnUpdate": "{{\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue } = field;\n if(!dbDataType) {\n return '';\n }\n return `${dbDataType}`;\n };\n let fieldsUpdate = it.fieldsUpdate;\n const tableKey = `${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\n const finalDataType = computeDatatype(field);\n const preDefKey = field?.baseUpdate?.pre?.defKey;\n const nextDefKey = field?.baseUpdate?.next?.defKey;\n}}\nALTER TABLE {{= tableKey }} RENAME COLUMN {{= preDefKey || field.defKey}} {{= nextDefKey || field.defKey}} {{= finalDataType}};\n{{~}}",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n const tableKey = `${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\nALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};\n{{~}}",
+ "indexCreate": "{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE INDEX {{=row.defKey}} ON {{=it.defKey}} (\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX IF EXISTS {{? preDefKey}} {{= preDefKey}}{{??}} {{=row.defKey}}{{?}};\n{{? row.fields.length && row.fields.length === 1 && row.defKey}}\nCREATE INDEX {{=row.defKey}} ON {{=it.defKey}} (\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\n let indexesUpdate = it.indexesUpdate; \n}}\n{{~indexesUpdate:row:i}}\nDROP INDEX IF EXISTS {{=row.defKey}};\n{{~}}",
+ "metaTableQuery": "SELECT tbl_name AS def_key\r\nfrom sqlite_master\r\nWHERE type = 'table';",
+ "metaColumnQuery": "SELECT\r\n '' AS schema_name,\r\n tbl_name AS tbl_def_key,\r\n c.name AS def_key,\r\n CASE\r\n WHEN INSTR(c.type, '(') > 0 THEN SUBSTR(c.type, 1, INSTR(c.type, '(') - 1) ELSE c.type\r\n END AS db_data_type,\r\n c.`notnull` AS not_null,\r\n c.pk AS primary_key,\r\n c.dflt_value AS default_value,\r\n CASE\r\n WHEN INSTR(c.type, '(') > 0 THEN\r\n CASE \r\n WHEN INSTR(c.type, ',') > 0 THEN CAST(SUBSTR(c.type, INSTR(c.type, '(') + 1, INSTR(c.type, ',') - INSTR(c.type, '(') - 1) AS INTEGER)\r\n ELSE CAST(SUBSTR(c.type, INSTR(c.type, '(') + 1, INSTR(c.type, ')') - INSTR(c.type, '(') - 1) AS INTEGER) \r\n END ELSE NULL\r\n END AS data_len,\r\n CASE\r\n WHEN INSTR(c.type, ',') > 0 THEN CAST(SUBSTR(c.type, INSTR(c.type, ',') + 1, INSTR(c.type, ')') - INSTR(c.type, ',') - 1) AS INTEGER)\r\n ELSE NULL\r\n END AS num_scale\r\nFROM sqlite_master AS t,\r\n pragma_table_info(t.name) AS c\r\nWHERE t.type = 'table'\r\nORDER BY tbl_def_key ASC;",
+ "metaIndexQuery": "WITH input AS (\r\n SELECT\r\n seqno,\r\n '' AS SCHEMA_NAME,\r\n t.tbl_name AS TBL_DEF_KEY,\r\n t.name AS DEF_KEY,\r\n c.name AS COL_DEF_KEY,\r\n '\"' || c.name || '\"' AS targetName,\r\n SUBSTR(t.sql, instr(t.sql , '(')) AS targetSQL\r\n FROM sqlite_master AS t,\r\n pragma_index_info(t.name) AS c\r\n WHERE t.type = 'index'\r\n),\r\npositions AS (\r\n SELECT\r\n *,\r\n INSTR(targetSQL, targetName) AS start_pos\r\n FROM input\r\n),\r\ndelimiters AS (\r\n SELECT\r\n *,\r\n INSTR(SUBSTR(targetSQL, start_pos), ',') AS comma_pos,\r\n INSTR(SUBSTR(targetSQL, start_pos), ')') AS paren_pos\r\n FROM positions\r\n),\r\nlimits AS (\r\n SELECT\r\n *,\r\n CASE\r\n WHEN comma_pos > 0 AND (paren_pos = 0 OR comma_pos < paren_pos) THEN comma_pos\r\n WHEN paren_pos > 0 THEN paren_pos\r\n ELSE LENGTH(SUBSTR(targetSQL, start_pos)) + 1\r\n END AS end_relative_pos\r\n FROM delimiters\r\n)\r\nSELECT \r\n SCHEMA_NAME,\r\n TBL_DEF_KEY,\r\n DEF_KEY,\r\n COL_DEF_KEY,\r\n CASE\r\n WHEN instr(SUBSTR(targetSQL, start_pos, end_relative_pos - 1), 'DESC') > 0 THEN 'DESC'\r\n WHEN instr(SUBSTR(targetSQL, start_pos, end_relative_pos - 1), 'ASC') > 0 THEN 'ASC'\r\n ELSE NULL\r\n END AS SORT_TYPE\r\nFROM limits\r\nORDER BY tbl_def_key ASC, DEF_KEY ASC, seqno ASC;",
+ "metaQueryCharset": null,
+ "orderValue": 5,
+ "isEnabled": 0,
+ "id": "BPQHDDPPE64AB"
+ },
+ {
+ "defKey": "GaussDB",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "opengauss-jdbc-5.1.0.jar",
+ "jdbcReferDriver": "org.postgresql.Driver",
+ "jdbcReferUrl": "jdbc:postgresql://[ip]:[port]/[database]",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n function addField(field, pkList) {\r\n let fieldStr = `${field.defKey} ${field.dbDataType}`;\r\n if (field.autoIncrement) {\r\n fieldStr =`${field.defKey}${field.dbDataType?.toUpperCase() === 'BIGINT' ? ' BIGSERIAL' : ' SERIAL'}`;\r\n } else {\r\n if (['CHAR', 'CHARACTER', 'NCHAR', 'VARCHAR', 'VARCHAR2', 'NVARCHAR2', 'CHARACTER VARYING'].includes(field.dbDataType?.toUpperCase())) {\r\n if (field.dataLen && field.dataLen >= 1) {\r\n fieldStr += `(${field.dataLen})`;\r\n }\r\n } else if (field.dbDataType?.toUpperCase() === 'TIMESTAMP') {\r\n if (field.dataLen && field.dataLen >= 0 && field.dataLen <= 6) {\r\n fieldStr += `(${field.dataLen})`;\r\n }\r\n } else if (field.dbDataType?.toUpperCase() === 'NUMERIC' || field.dbDataType?.toUpperCase() === 'DECIMAL') {\r\n if (field.dataLen && field.dataLen >= 1 && field.dataLen <= 1000) {\r\n if (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen) {\r\n fieldStr += `(${field.dataLen},${field.numScale})`;\r\n } else {\r\n fieldStr += `(${field.dataLen})`;\r\n }\r\n }\r\n }\r\n }\r\n if (field.notNull) {\r\n fieldStr += ' NOT NULL';\r\n }\r\n if (!field.notNull) {\r\n fieldStr += ' NULL';\r\n }\r\n if (field.defaultValue) {\r\n fieldStr += ` DEFAULT ${field.defaultValue}`;\r\n }\r\n if (field.primaryKey) {\r\n pkList.push(field.defKey);\r\n }\r\n return `${fieldStr}${index < it.fields.length - 1 || pkList.length > 0 ? ',' : ''}`;\r\n }\r\n}}\r\n\r\nDROP TABLE IF EXISTS {{= tableKey }};\r\n\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{= addField(field, pkList) }}{{~}}{{? pkList.length > 0 }}\r\n PRIMARY KEY ({{= pkList.join(', ')}}) {{?}}\r\n);\r\n$blankline{{~it.fields:field:index}}{{? field.defName || field.intro }}COMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}'\r\n{{?}}\r\n{{~}}\r\n\r\n{{? it.defName || it.intro }}\r\nCOMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}';\r\n{{?}}",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let defName = it.baseUpdate.next.defName;\r\n let intro = it.baseUpdate.next.intro;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? isPrimaryKeyModified }}\r\nDO $$\r\n DECLARE\r\n pk_constraint_name text;\r\n BEGIN\r\n SELECT constraint_name\r\n INTO pk_constraint_name\r\n FROM information_schema.table_constraints\r\n WHERE table_name = '{{=it.defKey}}' AND constraint_type = 'PRIMARY KEY' {{? it.schemaName }} AND constraint_schema = '{{= it.schemaName }}' {{?}}\r\n LIMIT 1;\r\n\r\n IF pk_constraint_name IS NOT NULL THEN\r\n EXECUTE 'ALTER TABLE {{= tableKey }} DROP CONSTRAINT ' || pk_constraint_name;\r\n ELSE\r\n RAISE NOTICE 'No primary key constraint found for the table.';\r\n END IF;\r\nEND $$;\r\n{{? indexFields && indexFields.length > 0}}\r\nALTER TABLE {{= tableKey }} ADD PRIMARY KEY ({{~indexFields:field:i}}{{= field.defKey }}{{= i < indexFields.length-1 ? ',' : '' }}{{~}})\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}COMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(defName, intro, \";\", true)}}'; {{?}}\r\n$blankline\r\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{= tableKey }} RENAME TO {{=defKey}}; {{?}}\r\n",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};\n$blankline",
+ "columnCreate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(autoIncrement) {\n return dbDataType.toUpperCase() === 'BIGINT' ? 'BIGSERIAL' : 'SERIAL';\n }\n if(dbDataType.toUpperCase() === 'INT2' ||\n dbDataType.toUpperCase() === 'INT4' ||\n dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase() === 'INT8' ||\n dbDataType.toUpperCase() === 'SERIAL2' ||\n dbDataType.toUpperCase() === 'SERIAL4' ||\n dbDataType.toUpperCase() === 'SERIAL8' ||\n dbDataType.toUpperCase() === 'FLOAT4' ||\n dbDataType.toUpperCase() === 'FLOAT8' ||\n dbDataType.toUpperCase() === 'MONEY' ||\n dbDataType.toUpperCase() === 'TEXT' ||\n dbDataType.toUpperCase() === 'BYTEA' ||\n dbDataType.toUpperCase() === 'BOOLEAN' ||\n dbDataType.toUpperCase() === 'JSONB' ||\n dbDataType.toUpperCase() === 'JSON' ||\n dbDataType.toUpperCase() === 'DATE') {\n return dbDataType;\n }\n if(dbDataType.toUpperCase() === 'DECIMAL') {\n if(dataLen && dataLen >= 1 && dataLen <= 1000) {\n if(numScale && numScale >= 0 && numScale <= dataLen) {\n return `${dbDataType}(${dataLen},${numScale})`;\n } else {\n return `${dbDataType}(${dataLen})`;\n }\n }\n return dbDataType;\n }\n if(dataLen && dataLen >= 0) {\n return `${dbDataType}(${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n}}\nALTER TABLE {{= tableKey }} ADD COLUMN {{= field.defKey }} {{= finalDataType }} {{? field.notNull }} NOT NULL{{?}};\n{{? field.defName || field.intro }}\nCOMMENT ON COLUMN {{= tableKey }}.{{= field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{?}}\n{{? field.defaultValue !== null && field.defaultValue !== undefined && field.defaultValue !== ''}}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey }} SET DEFAULT {{=field.defaultValue}};\n{{?}}\n{{~}}",
+ "columnUpdate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(autoIncrement) {\n return dbDataType.toUpperCase() === 'BIGINT' ? 'BIGSERIAL' : 'SERIAL';\n }\n if(dbDataType.toUpperCase() === 'INT2' ||\n dbDataType.toUpperCase() === 'INT4' ||\n dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase() === 'INT8' ||\n dbDataType.toUpperCase() === 'SERIAL2' ||\n dbDataType.toUpperCase() === 'SERIAL4' ||\n dbDataType.toUpperCase() === 'SERIAL8' ||\n dbDataType.toUpperCase() === 'FLOAT4' ||\n dbDataType.toUpperCase() === 'FLOAT8' ||\n dbDataType.toUpperCase() === 'MONEY' ||\n dbDataType.toUpperCase() === 'TEXT' ||\n dbDataType.toUpperCase() === 'BYTEA' ||\n dbDataType.toUpperCase() === 'BOOLEAN' ||\n dbDataType.toUpperCase() === 'JSONB' ||\n dbDataType.toUpperCase() === 'JSON' ||\n dbDataType.toUpperCase() === 'DATE') {\n return dbDataType;\n }\n if(dbDataType.toUpperCase() === 'DECIMAL') {\n if(dataLen && dataLen >= 1 && dataLen <= 1000) {\n if(numScale && numScale >= 0 && numScale <= dataLen) {\n return `${dbDataType}(${dataLen},${numScale})`;\n } else {\n return `${dbDataType}(${dataLen})`;\n }\n }\n return dbDataType;\n }\n if(dataLen && dataLen >= 0) {\n return `${dbDataType}(${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\n const finalDataType = computeDatatype(field);\n const preDefKey = field?.baseUpdate?.pre?.defKey;\n const nextDefKey = field?.baseUpdate?.next?.defKey;\n}}\n{{? updateKeys.includes('defKey') }}ALTER TABLE {{= tableKey }} RENAME COLUMN {{= preDefKey}} TO {{= nextDefKey}};{{?}}\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale' || item === 'autoIncrement') }}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} TYPE {{=finalDataType}} USING \"{{= field.defKey}}\"::{{=finalDataType}};\n{{?}}\n{{? updateKeys.includes('notNull') }}ALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} {{? field.notNull }} SET {{??}} DROP {{?}} NOT NULL;{{?}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\nCOMMENT ON COLUMN {{= tableKey }}.{{= field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{?}}\n{{? updateKeys.includes('defaultValue') }}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} {{? field.defaultValue }} SET DEFAULT {{=field.defaultValue}} {{??}} DROP DEFAULT {{?}};\n{{?}}\n{{~}}",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}ALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }}(\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{?}}\r\n{{? (row.defName || row.intro) && row.defKey && row.fields.length > 0}}\r\nCOMMENT ON INDEX {{= schemaName }}{{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX IF EXISTS {{= schemaName }}{{? preDefKey}}{{= preDefKey}}{{??}}{{=row.defKey}}{{?}};\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}} {{?}} INDEX {{=row.defKey}} ON {{= tableKey }} (\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{? (row.defName || row.intro) && row.defKey && row.fields.length > 0}}\nCOMMENT ON INDEX {{= schemaName }}{{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\n{{?}}\n{{??}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') && row.fields.length > 0}}\nCOMMENT ON INDEX {{= schemaName }}{{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\n let indexesUpdate = it.indexesUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:i}}DROP INDEX IF EXISTS {{= schemaName }}{{=row.defKey}};{{~}}",
+ "metaTableQuery": "SELECT\r\n tb.TABLE_NAME as def_key,\r\n d.description as def_name,\r\n tb.table_schema as schema_name\r\nFROM\r\n information_schema.tables tb\r\n JOIN pg_class C ON C.relname = tb.TABLE_NAME\r\n JOIN pg_namespace n ON tb.table_schema = n.nspname AND c.relnamespace = n.oid\r\n LEFT JOIN pg_description d ON d.objoid = C.oid\r\n AND d.objsubid = '0'\r\nWHERE\r\n tb.table_schema IN (:schemaName)",
+ "metaColumnQuery": "SELECT\r\n col.table_schema as schema_name,\r\n col.TABLE_NAME AS tbl_def_key,\r\n col.ordinal_position AS order_value,\r\n col.COLUMN_NAME AS def_key,\r\n d.description AS def_name,\r\n\t\t'' AS intro,\r\n col.udt_name AS db_data_type,\r\n\t\tCASE WHEN col.character_maximum_length IS NULL AND col.numeric_precision IS NOT NULL THEN col.numeric_precision\r\n\t\t ELSE col.character_maximum_length\r\n\t\tEND AS data_len,\r\n\t\tCASE WHEN col.numeric_precision IS NOT NULL THEN (CASE WHEN col.numeric_scale = 0 THEN NULL ELSE col.numeric_scale END)\r\n\t\t\t\tELSE NULL\r\n\t\tEND AS num_scale,\r\n CASE WHEN kc.column_name IS NOT NULL THEN 1 ELSE 0 END AS primary_key,\r\n CASE WHEN col.IS_NULLABLE = 'NO' THEN 1 ELSE 0 END AS not_null,\r\n CASE WHEN col.COLUMN_DEFAULT LIKE 'nextval%' THEN 1 ELSE 0 END AS auto_increment,\r\n CASE\r\n WHEN strpos(col.column_default, concat('::',col.data_type)) = 0 THEN (CASE\r\n WHEN col.column_default LIKE 'nextval%' THEN ''\r\n ELSE col.column_default\r\n END)\r\n ELSE substr(col.column_default,0,strpos(col.column_default, concat('::',col.data_type))-1)\r\n END AS default_value\r\n\t ---\tsubstr(col.column_default,0,strpos(col.column_default, concat('::',col.data_type))) AS default_value\r\nFROM\r\n information_schema.COLUMNS col LEFT JOIN (information_schema.key_column_usage kc LEFT JOIN information_schema.table_constraints tc\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tON\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkc.constraint_name = tc.constraint_name\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tand tc.constraint_type = 'PRIMARY KEY'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tand kc.table_schema=tc.table_schema\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tand kc.table_name=tc.table_schema\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) ON\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcol.TABLE_NAME = kc.table_name\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAND col.COLUMN_NAME = kc.column_name AND kc.table_schema = col.table_schema\r\nLEFT JOIN pg_class C ON C.relname = col.TABLE_NAME\r\nLEFT JOIN pg_namespace n ON col.table_schema = n.nspname AND c.relnamespace = n.oid\r\nLEFT JOIN pg_description d ON d.objoid = C.oid AND d.objsubid = col.ordinal_position\r\nWHERE\r\n col.table_schema IN (:schemaName)\r\n AND nspName IN (:schemaName)\r\n AND CONCAT(col.table_schema, '.', col.TABLE_NAME) IN (:sysTableNames)\r\nORDER BY\r\n\tcol.table_schema asc, col.TABLE_NAME asc,col.ordinal_position ASC\r\n",
+ "metaIndexQuery": "SELECT\r\n n.nspname AS schema_name,\r\n c1.relname AS tbl_def_key,\r\n a.attname AS col_def_key,\r\n c2.relname AS def_key,\r\n s.conname AS intro,\r\n d.description AS def_name,\r\n x.indoption ,\r\n CASE\r\n WHEN array_length(x.indoption, 1) > 2 THEN (CASE WHEN x.indoption[1] & 2 <> 0 THEN 'DESC' ELSE 'ASC' END )\r\n ELSE (CASE\r\n WHEN x.indoption[0] > 0 THEN 'DESC'\r\n ELSE 'ASC'\r\n END\r\n )\r\n END AS sort_type,\r\n --CASE WHEN x.indoption[1] & 2 <> 0 THEN 'DESC' ELSE 'ASC' END AS sort_type,\r\n CASE WHEN x.indisunique THEN 'UNIQUE' ELSE 'NORMAL' END AS type\r\n\r\nFROM pg_index x\r\n lEFT JOIN pg_class c1 ON c1.oid = x.indrelid\r\n lEFT JOIN pg_class c2 ON c2.oid = x.indexrelid\r\n lEFT JOIN pg_namespace n ON n.oid = c1.relnamespace\r\n LEFT JOIN pg_description d ON c2.oid = d.objoid\r\n lEFT JOIN pg_attribute a ON a.attrelid = c1.oid AND a.attnum = ANY(x.indkey)\r\n LEFT JOIN pg_constraint s ON s.conrelid = x.indrelid AND s.conindid = x.indexrelid\r\nWHERE n.nspname in (:schemaName) AND indisprimary = 0\r\nAND CONCAT(n.nspname, '.', c1.relname) IN (:sysTableNames)\r\nORDER BY n.nspname,tbl_def_key, def_key",
+ "metaQueryCharset": null,
+ "orderValue": 6,
+ "isEnabled": 0,
+ "id": "BPMCJTYLY5UAC"
+ },
+ {
+ "defKey": "DaMeng",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "DmJdbcDriver18-8.1.2.79.jar",
+ "jdbcReferDriver": "dm.jdbc.driver.DmDriver",
+ "jdbcReferUrl": "jdbc:dm://[ip]:[port]",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n\r\n function getDataType(field) {\r\n const { dbDataType } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n let dataType = dbDataType.toUpperCase();\r\n if(['SMALLINT', 'INTEGER', 'BIGINT', 'REAL', 'DATE', 'TINYINT', 'INT', 'INTERVAL'].includes(dataType)\r\n ){\r\n return dataType;\r\n }else if(dataType=='DOUBLE'){\r\n dataType = field.dataLen && field.dataLen>=0 && field.dataLen <=126 ? `${dataType}(${field.dataLen})`:`${dataType}`;\r\n return dataType;\r\n }else if(dataType=='TIME'){\r\n dataType = field.dataLen && field.dataLen>=0 && field.dataLen <=6 ? `${dataType}(${field.dataLen})`:`${dataType}`;\r\n return dataType;\r\n }else if(dataType=='DATETIME'){\r\n dataType = field.dataLen && field.dataLen>=0 && field.dataLen <=10 ? `${dataType}(${field.dataLen})`:`${dataType}`;\r\n return dataType;\r\n }else if(dataType=='TIMESTAMP'){\r\n dataType = field.dataLen && field.dataLen>=0 && field.dataLen <=9 ? `${dataType}(${field.dataLen})`:`${dataType}`;\r\n return dataType;\r\n }else if(dataType=='DECIMAL'){\r\n return field.dataLen && field.dataLen >= 0 && field.dataLen <= 38 ? (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen ? `${dataType}(${field.dataLen},${field.numScale})` : `${dataType}(${field.dataLen})`) : `${dataType}`;\r\n }else{\r\n if(field.dataLen){\r\n return `${dataType}(${field.dataLen})`;\r\n }else{\r\n return dataType; \r\n }\r\n }\r\n\r\n}\r\n function getFieldDefinition(field, index, fields) {\r\n const dataType = getDataType(field);\r\n const defaultNotNull = field.notNull ? ' NOT NULL' : '';\r\n const defaultAutoIncrement = field.autoIncrement ? ' IDENTITY(1,1)' : '';\r\n const defaultValue = field.defaultValue ? ` DEFAULT ${field.defaultValue}` : '';\r\n return `${dataType}${defaultNotNull}${defaultAutoIncrement}${defaultValue}${index < it.fields.length-1 || pkList.length>0 ? ',' : ''}`;\r\n }\r\n}}\r\nDROP TABLE IF EXISTS {{= tableKey }};\r\n\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\r\n {{=field.defKey}} {{= getFieldDefinition(field, index, it.fields) }}\r\n{{~}}\r\n{{? pkList.length >0 }}\r\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i 0}}\r\nALTER TABLE {{= tableKey }} ADD PRIMARY KEY({{~indexFields:field:i}}{{= field.defKey }} {{= i < indexFields.length-1 ? ',' : '' }}{{~}});\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\r\nCOMMENT ON TABLE {{= tableKey }} IS '{{=defName}}{{? defName && intro}}; {{=intro}}{{?? intro}}{{=intro}}{{?}}'; \r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{= tableKey }} RENAME TO {{=defKey}};{{?}}",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};",
+ "columnCreate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'INTEGER' ||\n dbDataType.toUpperCase() === 'BIGINT' ||\n dbDataType.toUpperCase() === 'REAL' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'TINYINT' ||\n dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase().startsWith('INTERVAL')) {\n return dbDataType;\n } else if(dbDataType.toUpperCase() === 'DOUBLE') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 126) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'TIME') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'DATETIME') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 10) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 9) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'DECIMAL') {\n return `${dbDataType} ${(dataLen && dataLen > 0 && dataLen <= 38) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n}}\nALTER TABLE {{= tableKey }} ADD {{= field.defKey}} {{= finalDataType}} {{? field.notNull}} NOT NULL{{?}}{{? field.defaultValue}} DEFAULT {{= field.defaultValue}}{{?}};\n{{? field.defName || field.intro }}\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=field.defName}}{{? field.defName && field.intro}}; {{=field.intro}}{{?? field.intro}}{{=field.intro}}{{?}}';\n{{?}}\n{{~}}",
+ "columnUpdate": "{{\r\n let fieldsUpdate = it.fieldsUpdate;\r\n const computeDatatype = (field) => {\r\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase() === 'SMALLINT' ||\r\n dbDataType.toUpperCase() === 'INTEGER' ||\r\n dbDataType.toUpperCase() === 'BIGINT' ||\r\n dbDataType.toUpperCase() === 'REAL' ||\r\n dbDataType.toUpperCase() === 'DATE' ||\r\n dbDataType.toUpperCase() === 'TINYINT' ||\r\n dbDataType.toUpperCase() === 'INT' ||\r\n dbDataType.toUpperCase().startsWith('INTERVAL')) {\r\n return dbDataType;\r\n } else if(dbDataType.toUpperCase() === 'DOUBLE') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 126) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'TIME') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'DATETIME') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 10) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 9) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'DECIMAL') {\r\n return `${dbDataType} ${(dataLen && dataLen > 0 && dataLen <= 38) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\r\n } else if(dataLen && dataLen >= 0) {\r\n return `${dbDataType} (${dataLen})`;\r\n }\r\n return dbDataType;\r\n };\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~fieldsUpdate:field:index}}\r\n{{\r\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n const finalDataType = computeDatatype(field);\r\n const preDefKey = field?.baseUpdate?.pre?.defKey;\r\n const nextDefKey = field?.baseUpdate?.next?.defKey;\r\n}}\r\n{{? updateKeys.includes('defKey') }}ALTER TABLE {{= tableKey }} RENAME COLUMN {{= preDefKey }} TO {{= field.defKey }};{{?}}\r\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale' || item === 'intro' || item === 'defName') }}\r\nALTER TABLE {{= tableKey }} MODIFY {{= field.defKey}} {{= finalDataType}}{{? updateKeys.includes('notNull') }} {{? field.notNull }} NOT NULL {{??}} NULL {{?}}{{?}}{{? updateKeys.includes('defaultValue') }}{{? field.defaultValue }} DEFAULT {{= field.defaultValue}}{{?}}{{?}};\r\n{{?}}\r\n{{~}}\r\n",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\nALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }} (\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX IF EXISTS {{= schemaName }}{{? preDefKey}}{{= preDefKey}}{{??}}{{=row.defKey}}{{?}};\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }} (\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\n let indexesUpdate = it.indexesUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:i}}\nDROP INDEX IF EXISTS {{= schemaName }}{{=row.defKey}};\n{{~}}",
+ "metaTableQuery": "SELECT\r\n t.table_name AS def_key,\r\n c.comments AS def_name,\r\n t.OWNER AS schema_name\r\nFROM all_tables t left join all_tab_comments c on t.OWNER=c.OWNER and t.TABLE_NAME=c.TABLE_NAME\r\nwhere t.OWNER IN (:schemaName) AND t.table_name not like '##%';",
+ "metaColumnQuery": "SELECT\r\n col.OWNER AS SCHEMA_NAME,\r\n col.table_name AS tbl_def_key,\r\n '' AS intro,\r\n col.column_name AS def_key,\r\n clc.comments AS def_name,\r\n col.data_type AS db_data_type,\r\n col.data_scale AS num_scale,\r\n col.data_length AS data_len,\r\n CASE WHEN col.nullable = 'N' THEN 1 ELSE 0 END AS not_null,\r\n CASE WHEN cpk.constraint_type IS NOT NULL THEN 1 ELSE 0 END AS primary_key,\r\n CASE WHEN ai.TABLE_NAME IS NOT NULL THEN 1 ELSE 0 END AS \"auto_increment\",\r\n col.data_default AS default_value\r\nFROM\r\n all_tab_columns col\r\n LEFT JOIN all_col_comments clc ON col.owner = clc.SCHEMA_NAME AND col.table_name = clc.table_name AND col.column_name = clc.column_name\r\n LEFT JOIN (select cst.owner,cst.constraint_name,csc.table_name,csc.column_name,cst.constraint_type\r\n from all_constraints cst,all_cons_columns csc\r\n where 1=1\r\n and cst.owner = csc.owner\r\n and cst.constraint_name=csc.constraint_name\r\n and cst.constraint_type ='P'\r\n and csc.table_name not like '%$%'\r\n ) cpk on col.owner = cpk.owner and col.table_name = cpk.table_name AND col.column_name = cpk.column_name\r\n LEFT JOIN (\r\n SELECT DISTINCT B.OWNER, B.TABLE_NAME, A.name\r\n FROM SYS.SYSCOLUMNS A,ALL_TABLES B,SYS.SYSOBJECTS C\r\n WHERE A.INFO2 & 0X01 = 0X01\r\n AND A.ID=C.ID\r\n AND C.NAME= B.TABLE_NAME\r\n ) ai ON ai.OWNER = col.OWNER AND UPPER(CONCAT(TRIM(ai.OWNER), '.', TRIM(ai.TABLE_NAME))) = UPPER(CONCAT(TRIM(col.OWNER), '.', TRIM(col.table_name))) AND col.column_name = ai.name\r\nWHERE\r\n col.OWNER IN (:schemaName)\r\n AND UPPER(CONCAT(TRIM(col.OWNER), '.', TRIM(col.table_name))) IN (:sysTableNames)\r\nORDER BY col.OWNER ASC, col.table_name ASC, COLUMN_ID ASC",
+ "metaIndexQuery": "select \n ai.table_owner as schema_name,\n ai.table_name as tbl_def_key,\n dic.column_name as col_def_key,\n dic.descend as sort_type,\n ai.index_name as def_key,\n dic.column_position as order_value,\n '' as intro,\n '' as def_name,\n case when ai.uniqueness = 'UNIQUE' then 'UNIQUE' else 'NORMAL' end as type\nfrom all_indexes ai join dba_ind_columns dic\n on (ai.table_name = dic.table_name and ai.INDEX_NAME = dic.INDEX_NAME)\nwhere ai.table_type = 'TABLE' and ai.table_owner in (:schemaName)\n and CONCAT(ai.table_owner, '.', ai.table_name) in (:sysTableNames)\n and ai.index_name NOT IN (\n SELECT\n INDEX_NAME\n FROM\n USER_CONSTRAINTS uc\n JOIN\n USER_CONS_COLUMNS ucc ON uc.CONSTRAINT_NAME = ucc.CONSTRAINT_NAME\n WHERE\n CONCAT(uc.OWNER, '.', uc.TABLE_NAME) in (:sysTableNames)\n AND uc.OWNER IN (:schemaName)\n AND uc.CONSTRAINT_TYPE = 'P'\n )\norder by ai.table_owner, tbl_def_key, def_key;",
+ "metaQueryCharset": null,
+ "orderValue": 7,
+ "isEnabled": 0,
+ "id": "BPQHDLFQY64AC"
+ },
+ {
+ "defKey": "KingBase",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "kingbase8-8.6.0.jar",
+ "jdbcReferDriver": "com.kingbase8.Driver",
+ "jdbcReferUrl": "jdbc:kingbase8://[ip]:[port]/[database]",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n function addField(field, pkList) {\r\n let fieldStr = `${field.defKey} ${field.dbDataType}`;\r\n if (field.autoIncrement) {\r\n fieldStr =`${field.defKey}${field.dbDataType?.toUpperCase() === 'BIGINT' ? ' BIGSERIAL' : ' SERIAL'}`;\r\n } else {\r\n if (['TINYINT', 'SMALLINT', 'INT', 'INTEGER', 'BIGINT', 'SMALLSERIAL', 'BIGSERIAL', \r\n 'REAL', 'DOUBLE PRECISION', 'DATE', 'DATETIME', 'TEXT', 'BYTEA', 'BOOL', \r\n 'JSONB', 'SERIAL', 'JSON'].includes(field.dbDataType?.toUpperCase())) {\r\n if (field.dataLen && field.dataLen >= 1) {\r\n fieldStr += ``;\r\n }\r\n } \r\n else if (field.dbDataType?.toUpperCase() === 'TIMESTAMP') {\r\n if (field.dataLen && field.dataLen >= 0 && field.dataLen <= 6) {\r\n fieldStr += `(${field.dataLen})`;\r\n }\r\n } else if (field.dbDataType?.toUpperCase() === 'NUMERIC' || field.dbDataType?.toUpperCase() === 'DECIMAL') {\r\n if (field.dataLen && field.dataLen >= 1 && field.dataLen <= 1000) {\r\n if (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen) {\r\n fieldStr += `(${field.dataLen},${field.numScale})`;\r\n } else {\r\n fieldStr += `(${field.dataLen})`;\r\n }\r\n }\r\n }\r\n else{\r\n fieldStr += `(${field.dataLen})`;\r\n }\r\n }\r\n if (field.notNull) {\r\n fieldStr += ' NOT NULL';\r\n }\r\n if (field.defaultValue) {\r\n fieldStr += ` DEFAULT ${field.defaultValue}`;\r\n }\r\n if (field.primaryKey) {\r\n pkList.push(field.defKey);\r\n }\r\n return `${fieldStr}${index < it.fields.length - 1 || pkList.length > 0 ? ',' : ''}`;\r\n }\r\n}}\r\n\r\nDROP TABLE IF EXISTS {{= tableKey }};\r\n\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{= addField(field, pkList) }}{{~}}{{? pkList.length > 0 }}\r\n PRIMARY KEY ({{= pkList.join(', ')}}) {{?}}\r\n);\r\n$blankline{{~it.fields:field:index}}{{? field.defName || field.intro }}COMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}\r\n\r\n{{? it.defName || it.intro }}\r\nCOMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}';\r\n{{?}}",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let defName = it.baseUpdate.next.defName;\r\n let intro = it.baseUpdate.next.intro;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? isPrimaryKeyModified }}\r\nALTER TABLE {{= tableKey }} DROP CONSTRAINT IF EXISTS \"{{=it.defKey}}_pkey\";\r\n{{? indexFields && indexFields.length > 0}}\r\nALTER TABLE {{= tableKey }} ADD PRIMARY KEY ({{~indexFields:field:i}}{{= field.defKey }}{{= i < indexFields.length-1 ? ',' : '' }}{{~}})\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}COMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(defName, intro, \";\", true)}}'; {{?}}\r\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{= tableKey }} RENAME TO {{=defKey}};{{?}}\r\n",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};",
+ "columnCreate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(autoIncrement) {\n return dbDataType.toUpperCase() === 'BIGINT' ? 'BIGSERIAL' : 'SERIAL';\n } else if(dbDataType.toUpperCase() === 'TINYINT' ||\n dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase() === 'INTEGER' ||\n dbDataType.toUpperCase() === 'BIGINT' ||\n dbDataType.toUpperCase() === 'SMALLSERIAL' ||\n dbDataType.toUpperCase() === 'BIGSERIAL' ||\n dbDataType.toUpperCase() === 'REAL' ||\n dbDataType.toUpperCase() === 'DOUBLE PRECISION' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'DATETIME' ||\n dbDataType.toUpperCase() === 'TEXT' ||\n dbDataType.toUpperCase() === 'BYTEA' ||\n dbDataType.toUpperCase() === 'BOOL' ||\n dbDataType.toUpperCase() === 'JSONB' ||\n dbDataType.toUpperCase() === 'SERIAL' ||\n dbDataType.toUpperCase() === 'JSON') {\n return dbDataType;\n } else if(dbDataType.toUpperCase() === 'TIME' ||\n dbDataType.toUpperCase() === 'TIMESTAMP' ) {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'NUMERIC' || \n dbDataType.toUpperCase() === 'DECIMAL') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 1000) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n}}\nALTER TABLE {{= tableKey }} ADD {{= field.defKey}} {{= finalDataType}} {{? field.notNull}} NOT NULL{{?}}{{? field.defaultValue}} DEFAULT {{= field.defaultValue}}{{?}};\n{{? field.defName || field.intro }}\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{?}}\n{{~}}",
+ "columnUpdate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(autoIncrement) {\n return dbDataType.toUpperCase() === 'BIGINT' ? 'BIGSERIAL' : 'SERIAL';\n } else if(dbDataType.toUpperCase() === 'TINYINT' ||\n dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase() === 'INTEGER' ||\n dbDataType.toUpperCase() === 'BIGINT' ||\n dbDataType.toUpperCase() === 'SMALLSERIAL' ||\n dbDataType.toUpperCase() === 'BIGSERIAL' ||\n dbDataType.toUpperCase() === 'REAL' ||\n dbDataType.toUpperCase() === 'DOUBLE PRECISION' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'DATETIME' ||\n dbDataType.toUpperCase() === 'TEXT' ||\n dbDataType.toUpperCase() === 'BYTEA' ||\n dbDataType.toUpperCase() === 'BOOL' ||\n dbDataType.toUpperCase() === 'JSONB' ||\n dbDataType.toUpperCase() === 'SERIAL' ||\n dbDataType.toUpperCase() === 'JSON') {\n return dbDataType;\n } else if(dbDataType.toUpperCase() === 'TIME' ||\n dbDataType.toUpperCase() === 'TIMESTAMP' ) {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'NUMERIC' || \n dbDataType.toUpperCase() === 'DECIMAL') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 1000) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\n const finalDataType = computeDatatype(field);\n const preDefKey = field?.baseUpdate?.pre?.defKey;\n const nextDefKey = field?.baseUpdate?.next?.defKey;\n}}\n{{? updateKeys.includes('defKey') }}ALTER TABLE {{= tableKey }} RENAME COLUMN {{= preDefKey}} TO {{= nextDefKey}};{{?}}\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale' || item === 'autoIncrement') }}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} SET DATA TYPE {{=finalDataType}};\n{{?}}\n{{? updateKeys.includes('notNull') }}ALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} {{? field.notNull }} SET {{??}} DROP {{?}} NOT NULL;{{?}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{?}}\n{{? updateKeys.includes('defaultValue') }}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} {{? field.defaultValue }} SET DEFAULT {{=field.defaultValue}} {{??}} DROP DEFAULT {{?}};\n{{?}}\n{{~}}",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\nALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }}(\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{?}}\r\n{{? (row.defName || row.intro) && row.defKey && row.fields.length > 0}}\r\nCOMMENT ON INDEX {{= schemaName }}{{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX IF EXISTS {{= schemaName }}{{? preDefKey}}{{= preDefKey}}{{??}}{{=row.defKey}}{{?}};\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }} (\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{? (row.defName || row.intro) && row.defKey && row.fields.length > 0}}\nCOMMENT ON INDEX {{= schemaName }}{{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\n let indexesUpdate = it.indexesUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:i}}\nDROP INDEX IF EXISTS {{= schemaName }}{{=row.defKey}};\n{{~}}",
+ "metaTableQuery": "SELECT\r\n tb.TABLE_NAME as def_key,\r\n d.description as def_name,\r\n tb.table_schema as schema_name\r\nFROM\r\n information_schema.tables tb\r\n JOIN pg_class C ON C.relname = tb.TABLE_NAME\r\n JOIN pg_namespace n ON tb.table_schema = n.nspname AND c.relnamespace = n.oid\r\n LEFT JOIN pg_description d ON d.objoid = C.oid\r\n AND d.objsubid = '0'\r\nwhere tb.table_type = 'BASE TABLE' AND tb.table_schema IN (:schemaName);",
+ "metaColumnQuery": "SELECT\r\n col.table_schema AS schema_name,\r\n col.TABLE_NAME AS tbl_def_key,\r\n col.ordinal_position AS order_value,\r\n col.COLUMN_NAME AS def_key,\r\n d.description AS def_name,\r\n\t\t'' AS intro,\r\n col.udt_name AS db_data_type,\r\n\t\tCASE WHEN col.character_maximum_length IS NULL AND col.numeric_precision IS NOT NULL THEN col.numeric_precision\r\n\t\t ELSE col.character_maximum_length\r\n\t\tEND AS data_len,\r\n\t\tCASE WHEN col.numeric_precision IS NOT NULL THEN (CASE WHEN col.numeric_scale = 0 THEN NULL ELSE col.numeric_scale END)\r\n\t\t\t\tELSE NULL \r\n\t\tEND AS num_scale,\r\n CASE WHEN kc.column_name IS NOT NULL THEN 1 ELSE 0 END AS primary_key,\r\n CASE WHEN col.IS_NULLABLE = 'NO' THEN 1 ELSE 0 END AS not_null,\r\n CASE WHEN col.COLUMN_DEFAULT LIKE 'nextval%' THEN 1 ELSE 0 END AS auto_increment,\r\n\t--\tsubstr(col.column_default,0,strpos(col.column_default, concat('::',col.data_type))) AS default_value\r\n\tCASE\r\n WHEN strpos(col.column_default, concat('::',col.data_type)) = 0 THEN (CASE\r\n WHEN col.column_default LIKE 'nextval%' THEN ''\r\n ELSE col.column_default\r\n END)\r\n ELSE substr(col.column_default,0,strpos(col.column_default, concat('::',col.data_type))-1)\r\n END AS default_value\r\nFROM\r\n information_schema.COLUMNS col LEFT JOIN (information_schema.key_column_usage kc JOIN information_schema.table_constraints tc \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tON \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkc.constraint_name = tc.constraint_name \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tand tc.constraint_type = 'PRIMARY KEY'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tand kc.table_schema=tc.table_schema \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tand kc.table_name=tc.table_name --25.1.11 tc.table_schema\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) ON \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcol.TABLE_NAME = kc.table_name \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAND col.COLUMN_NAME = kc.column_name\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t AND col.table_schema=kc.table_schema --25.1.11\r\nLEFT JOIN pg_class C ON C.relname = col.TABLE_NAME\r\nJOIN pg_namespace n ON col.table_schema = n.nspname AND c.relnamespace = n.oid\r\nLEFT JOIN pg_description d ON d.objoid = C.oid AND d.objsubid = col.ordinal_position\r\nWHERE\r\n col.table_schema IN (:schemaName)\r\n AND CONCAT(TRIM(col.table_schema), CONCAT('.', TRIM(col.TABLE_NAME))) IN (:sysTableNames)\r\n AND col.table_schema IN (:schemaName)\r\nORDER BY\r\n\tcol.table_schema, col.TABLE_NAME asc,col.ordinal_position ASC\r\n",
+ "metaIndexQuery": "SELECT ns.nspname AS schema_name, \r\n t.relname AS tbl_def_key,\r\n a.attname AS col_def_key,\r\n d.description AS def_name,\r\n d.description AS intro,\r\n --CASE\r\n -- WHEN ix.indoption[array_position(ix.indkey, a.attnum) - 1] & 1 = 0 THEN 'ASC'\r\n -- ELSE 'DESC'\r\n --END AS sort_type,\r\n CASE\r\n WHEN array_length(ix.indoption, 1) > 2 THEN (CASE WHEN ix.indoption[1] & 2 <> 0 THEN 'DESC' ELSE 'ASC' END )\r\n ELSE (CASE\r\n WHEN ix.indoption[0] > 0 THEN 'DESC'\r\n ELSE 'ASC'\r\n END\r\n )\r\n END AS sort_type,\r\n CASE\r\n WHEN ix.indisunique THEN 'UNIQUE'\r\n ELSE 'NORMAL'\r\n END AS type,\r\n array_position(ix.indkey, a.attnum) AS order_value,\r\n idx.relname AS def_key\r\nFROM pg_class t\r\n JOIN\r\n pg_namespace ns ON ns.oid = t.relnamespace\r\n JOIN\r\n pg_index ix ON t.oid = ix.indrelid\r\n JOIN\r\n pg_class idx ON ix.indexrelid = idx.oid\r\n JOIN\r\n unnest(ix.indkey) WITH ORDINALITY AS key_col(attnum, ord) ON true\r\n JOIN\r\n pg_attribute a ON t.oid = a.attrelid AND a.attnum = key_col.attnum\r\n LEFT JOIN\r\n pg_description d ON idx.oid = d.objoid\r\nWHERE ns.nspname IN (:schemaName)\r\n AND CONCAT(ns.nspname, CONCAT('.', t.relname)) IN (:sysTableNames)\r\n AND indisprimary = false\r\nORDER BY ns.nspname, \r\n tbl_def_key,\r\n def_key",
+ "metaQueryCharset": null,
+ "orderValue": 8,
+ "isEnabled": 0,
+ "id": "BPQHDZHMI64AB"
+ },
+ {
+ "defKey": "ShenTong",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "oscarJDBC.jar",
+ "jdbcReferDriver": "com.oscar.Driver",
+ "jdbcReferUrl": "jdbc:oscar://{host}[:{port}]/[{database}]",
+ "tableCreate": "{{\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(dbDataType.toUpperCase() === 'FLOAT') {\n return `${dbDataType}${(dataLen && dataLen >= 1 && dataLen < 54) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP' ||\n dbDataType.toUpperCase() === 'TIME') {\n return `${dbDataType}${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`; \n } else if(dbDataType.toUpperCase() === 'CHAR' ||\n dbDataType.toUpperCase() === 'VARCHAR' ||\n dbDataType.toUpperCase() === 'BINARY' ||\n dbDataType.toUpperCase() === 'VARBINARY') {\n return `${dbDataType}${(dataLen && dataLen > 0) ? `(${dataLen})` : ''}`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}DROP TABLE IF EXISTS {{= tableKey }};\nCREATE TABLE {{=tableKey }} (\n{{ pkList = [] ; }}\n{{~it.fields:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n let lineEnd=',';\n if(index==it.fields.length-1&&pkList.length==0){\n lineEnd = '';\n }\n}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{= finalDataType}}{{= field.notNull ? ' NOT NULL' : '' }}{{? field.defaultValue }} DEFAULT {{= field.defaultValue }}{{?}}{{=lineEnd}}\n{{~}}\n{{? pkList.length > 0 }} PRIMARY KEY ({{= pkList.join(', ')}}) {{?}}\n);\n\n{{~it.fields:field:index}}\n{{? field.defName || field.intro }}\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{?}}\n{{~}}\n\n{{? it.defName || it.intro }}\nCOMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}';\n{{?}}",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let defName = it.baseUpdate.next.defName;\r\n let intro = it.baseUpdate.next.intro;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? isPrimaryKeyModified }}\r\nALTER TABLE {{= tableKey }} DROP PRIMARY KEY;\r\n{{? indexFields && indexFields.length > 0}}\r\nALTER TABLE {{= tableKey }} ADD PRIMARY KEY({{~indexFields:field:i}}{{= field.defKey }} {{= i < indexFields.length-1 ? ',' : '' }}{{~}});\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\r\nCOMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(defName, intro, \";\", true)}}';\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{= tableKey }} RENAME TO {{=defKey}};{{?}}\r\n",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};",
+ "columnCreate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(dbDataType.toUpperCase() === 'FLOAT') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen < 54) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP' ||\n dbDataType.toUpperCase() === 'TIME') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`; \n } else if(dbDataType.toUpperCase() === 'CHAR' ||\n dbDataType.toUpperCase() === 'VARCHAR' ||\n dbDataType.toUpperCase() === 'BINARY' ||\n dbDataType.toUpperCase() === 'VARBINARY') {\n return `${dbDataType} ${(dataLen && dataLen > 0) ? `(${dataLen})` : ''}`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n}}\nALTER TABLE {{= tableKey }} ADD COLUMN {{= field.defKey}} {{= finalDataType}} {{? field.notNull}} NOT NULL{{?}}{{? field.defaultValue}} DEFAULT {{= field.defaultValue}}{{?}};\n{{? field.defName || field.intro }}\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{?}}\n{{~}}",
+ "columnUpdate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(dbDataType.toUpperCase() === 'FLOAT') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen < 54) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP' ||\n dbDataType.toUpperCase() === 'TIME') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`; \n } else if(dbDataType.toUpperCase() === 'CHAR' ||\n dbDataType.toUpperCase() === 'VARCHAR' ||\n dbDataType.toUpperCase() === 'BINARY' ||\n dbDataType.toUpperCase() === 'VARBINARY') {\n return `${dbDataType} ${(dataLen && dataLen > 0) ? `(${dataLen})` : ''}`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\n const finalDataType = computeDatatype(field);\n const preDefKey = field?.baseUpdate?.pre?.defKey;\n const nextDefKey = field?.baseUpdate?.next?.defKey;\n}}\n{{? updateKeys.includes('defKey') }}ALTER TABLE {{= tableKey }} RENAME COLUMN {{= preDefKey}} TO {{= nextDefKey}};{{?}}\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale' || item === 'autoIncrement') }}\nALTER TABLE {{= tableKey }} MODIFY {{= field.defKey}} {{=finalDataType}};\n{{?}}\n{{? updateKeys.includes('notNull') }}ALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} {{? field.notNull }} SET {{??}} DROP {{?}} NOT NULL;{{?}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{?}}\n{{? updateKeys.includes('defaultValue') }}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} {{? field.defaultValue }} SET DEFAULT {{=field.defaultValue}} {{??}} DROP DEFAULT {{?}};\n{{?}}\n{{~}}",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\nALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }}(\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX IF EXISTS {{= schemaName }}{{=row.defKey}};\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }} (\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\n let indexesUpdate = it.indexesUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:i}}\nDROP INDEX IF EXISTS {{= schemaName }}{{=row.defKey}};\n{{~}}",
+ "metaTableQuery": "SELECT\r\n NULL AS id,\r\n c.relname AS def_key,\r\n d.description AS def_name,\r\n n.nspname AS schema_name\r\nFROM\r\n sys_class c\r\nLEFT JOIN\r\n sys_description d ON c.OID = d.objoid AND d.objsubid = 0\r\nJOIN\r\n sys_namespace n ON c.RELNAMESPACE = n.OID\r\nWHERE\r\n c.RELKIND = 'r' AND -- 'r' 表示普通表\r\n n.nspname IN (:schemaName)-- 当前模式名\r\n\t",
+ "metaColumnQuery": "SELECT\r\n A.TABLE_SCHEM AS schema_name,\r\n A.TABLE_NAME AS tbl_def_key,\r\n A.ordinal_position AS order_value,\r\n A.COLUMN_NAME as def_key,\r\n A.REMARKS AS def_name,\r\n '' AS intro,\r\n A.TYPE_NAME as db_data_type,\r\n A.COLUMN_SIZE as data_len,\r\n A.DECIMAL_DIGITS as num_scale,\r\n DECODE(CASE WHEN B.COLUMN_NAME IS NOT NULL THEN 1 ELSE 0 END, 1, 1, 0) as primary_key, --1:是 0:否\r\n CAST((CASE WHEN A.NULLABLE=0 THEN 1 ELSE 0 END) as VARCHAR(500)) as not_null, --1:是 0:否\r\n DECODE(CASE WHEN D.ATTISAUTO IS True THEN 1 ELSE 0 END, 1, 1, 0) as auto_increment,\r\n A.COLUMN_DEF as default_value\r\nFROM\r\n v_sys_columns A\r\nLEFT \r\nJOIN v_sys_primary_keys B ON A.TABLE_NAME = B.TABLE_NAME\r\nAND A.column_name=b.column_name\r\nJOIN SYS_CLASS C ON A.TABLE_NAME =C.RELNAME \r\nJOIN sys_attribute D ON A.COLUMN_NAME=D.ATTNAME\r\n AND C.OID=D.ATTRELID\r\nAND A.COLUMN_NAME=D.ATTNAME\r\nWHERE\r\n A.TABLE_SCHEM IN (:schemaName)\r\n AND CONCAT(A.TABLE_SCHEM, '.', A.TABLE_NAME) IN (:sysTableNames)\r\n AND A.ORDINAL_POSITION >= 0\r\nORDER BY\r\n A.TABLE_SCHEM asc, A.TABLE_NAME asc,A.ordinal_position ASC;",
+ "metaIndexQuery": "SELECT \r\n A.SCHEMANAME AS SCHEMA_NAME,\r\n A.TABLENAME AS TBL_DEF_KEY, \r\n C.COLUMN_NAME AS COL_DEF_KEY, \r\n '' AS DEF_NAME,\r\n '' AS INTRO, \r\n (CASE WHEN ASC_OR_DESC='A' THEN 'ASC' ELSE 'DESC' END) AS SORT_TYPE,\r\n (CASE WHEN ISUNIQUE='true' THEN 'UNIQUE' ELSE 'NORMAL' END) AS TYPE,\r\n B.ORDINAL_POSITION AS ORDER_VALUE, \r\n A.INDEXNAME AS DEF_KEY\r\nFROM v_sys_indexes A \r\n JOIN v_sys_index_statistics B ON A.INDEXNAME=B.INDEX_NAME\r\n JOIN v_sys_columns C ON A.INDEXNAME=C.TABLE_NAME\r\n AND C.COLUMN_NAME=B.COLUMN_NAME\r\nWHERE \r\n A.SCHEMANAME IN (:schemaName) -- 替换为目标模式\r\n AND CONCAT(A.SCHEMANAME, '.', A.TABLENAME) IN (:sysTableNames) -- 替换为目标表名\r\n AND A.INDEXSCHEMANAME IN (:schemaName) -- 替换为目标模式\r\n AND ISPRIMARY = 0\r\nORDER BY \r\n A.SCHEMANAME, A.TABLENAME, A.INDEXNAME",
+ "metaQueryCharset": null,
+ "orderValue": 9,
+ "isEnabled": 0,
+ "id": "1LNU2743D0402"
+ },
+ {
+ "defKey": "GBase 8A",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "gbase-connector-java-9.5.0.1-build1-bin.jar",
+ "jdbcReferDriver": "com.gbase.jdbc.Driver",
+ "jdbcReferUrl": "jdbc:gbase://[ip]:[port]/[database]?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n\r\n function getDataType(field) {\r\n const { dbDataType } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n const dataType = dbDataType.toUpperCase();\r\n if (['VARCHAR'].includes(dataType)) {\r\n return `${dataType}(${field.dataLen ? field.dataLen : 128})`;\r\n } else if (['BOOLEAN','DATE','LONGBLOB','TIME'].includes(dataType)) {\r\n return dataType;\r\n } else if (dataType === 'FLOAT') {\r\n return field.dataLen && field.dataLen >= 1 && field.dataLen <= 53 ? `${dataType}(${field.dataLen})` : dataType;\r\n } else if (dataType === 'DOUBLE') {\r\n return field.dataLen && field.dataLen >= 0 && field.dataLen <= 30 ? (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen ? `${dataType}(${field.dataLen},${field.numScale})` : `${dataType}(${field.dataLen},30)`) : `${dataType}(30,30)`;\r\n } else if (dataType === 'DECIMAL') {\r\n return field.dataLen && field.dataLen >= 0 && field.dataLen <= 255 ? (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen ? `${dataType}(${field.dataLen},${field.numScale})` : `${dataType}(${field.dataLen})`) : `${dataType}`;\r\n } else {\r\n return field.dataLen && field.dataLen >= 0 ? `${dataType}(${field.dataLen})` : dataType;\r\n }\r\n }\r\n\r\n function getFieldDefinition(field, index, fields) {\r\n const dataType = getDataType(field);\r\n const notNull = field.notNull ? ' NOT NULL' : ' NULL';\r\n const autoIncrement = field.autoIncrement ? ' AUTO_INCREMENT' : '';\r\n const defaultValue = field.defaultValue ? ` DEFAULT ${field.defaultValue}` : '';\r\n const comment = ` COMMENT '${it.func.strJoin(field.defName, field.intro, \";\", true)}'`;\r\n return `\"${field.defKey}\" ${dataType}${notNull}${autoIncrement}${defaultValue}${comment}${index < fields.length - 1 || pkList.length > 0 ? ',' : ''}`;\r\n }\r\n}}\r\nDROP TABLE IF EXISTS {{= tableKey }};\r\n\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\r\n {{= getFieldDefinition(field, index, it.fields) }}\r\n{{~}}\r\n{{? pkList.length > 0 }}\r\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i < pkList.length - 1 ? ',' : '' }}{{~}})\r\n{{?}}\r\n) COMMENT '{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}';\r\n$blankline\r\n",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let defName = it.baseUpdate.next.defName;\r\n let intro = it.baseUpdate.next.intro;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? isPrimaryKeyModified }}\r\nALTER TABLE {{= tableKey }} DROP PRIMARY KEY;\r\n{{? indexFields && indexFields.length > 0}}\r\nALTER TABLE {{= tableKey }} ADD CONSTRAINT PRIMARY KEY ({{~indexFields:field:i}}{{= field.defKey }}{{= i < indexFields.length-1 ? ',' : '' }}{{~}});\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\r\nALTER TABLE {{= tableKey }} COMMENT '{{=it.func.strJoin(defName, intro, \";\", true)}}';\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defKey') }}RENAME TABLE {{= tableKey }} TO {{=defKey}};{{?}}\r\n",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};",
+ "columnCreate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(dbDataType.toUpperCase() === 'VARCHAR') {\n return `${dbDataType} (${dataLen ? dataLen : 128})`\n } else if(dbDataType.toUpperCase() === 'BOOLEAN' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'LONGBLOB' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'TIME') {\n return dbDataType;\n } else if(dbDataType.toUpperCase() === 'FLOAT') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 53) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'DOUBLE') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 30) ? ((numScale && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen, 30})`) : ((numScale && numScale >= 0 && numScale <= 30) ? `(${dataLen},${numScale})` : `(30, 30)`)}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n}}\nALTER TABLE {{= tableKey }} ADD COLUMN {{= field.defKey}} {{= finalDataType}}{{? field.notNull}} NOT NULL{{?}}{{? field.defaultValue}} DEFAULT {{= field.defaultValue}}{{?}} COMMENT '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{~}}",
+ "columnUpdate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(dbDataType.toUpperCase() === 'VARCHAR') {\n return `${dbDataType} (${dataLen ? dataLen : 128})`\n } else if(dbDataType.toUpperCase() === 'BOOLEAN' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'LONGBLOB' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'TIME') {\n return dbDataType;\n } else if(dbDataType.toUpperCase() === 'FLOAT') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 53) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'DOUBLE') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 30) ? ((numScale && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen, 30})`) : ((numScale && numScale >= 0 && numScale <= 30) ? `(${dataLen},${numScale})` : `(30, 30)`)}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\n const finalDataType = computeDatatype(field);\n const preDefKey = field?.baseUpdate?.pre?.defKey;\n const nextDefKey = field?.baseUpdate?.next?.defKey;\n}}\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale' || item === 'intro' || item === 'defName' || item === 'defKey') }}\nALTER TABLE {{= tableKey }} {{? updateKeys.includes('defKey') }} CHANGE COLUMN {{= preDefKey}} {{= nextDefKey}} {{??}} MODIFY COLUMN {{= field.defKey}} {{?}} {{= finalDataType}} {{? updateKeys.includes('defName') || updateKeys.includes('intro') }} COMMENT '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}' {{?}};\n{{?}}\n{{~}}",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}ALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields && row.fields.length === 1 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }}(\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX {{? preDefKey}} {{= preDefKey}}{{??}} {{=row.defKey}} {{?}} ON {{= tableKey }};;\n{{? row.fields && row.fields.length === 1 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }} (\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\n let indexesUpdate = it.indexesUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:i}}\nDROP INDEX {{=row.defKey}} ON {{= tableKey }};\n{{~}}",
+ "metaTableQuery": "SELECT \r\n table_schema AS schemaName,\r\n table_name AS def_key, \r\n table_comment AS def_name\r\nFROM information_schema.tables\r\n WHERE table_schema in (:schemaName)\r\n ",
+ "metaColumnQuery": "SELECT\r\n TRIM(table_schema) AS schema_name,\r\n table_name AS tbl_def_key,\r\n ordinal_position as order_value,\r\n column_name AS def_key,\r\n column_comment AS def_name,\r\n '' AS intro,\r\n data_type AS db_data_type,\r\n column_type,\r\n IF(data_type LIKE column_type,NULL,COALESCE ( character_maximum_length, numeric_precision )) AS data_len,\r\n IF(data_type LIKE column_type, NULL, numeric_scale ) AS num_scale,\r\n IF(column_key = 'PRI', 1, 0 ) AS primary_key,\r\n IF(is_nullable = 'YES', 0, 1 ) AS not_null,\r\n IF(extra = 'AUTO_INCREMENT', 1, 0 ) AS auto_increment,\r\n column_default AS default_value\r\nFROM\r\n information_schema.COLUMNS\r\nWHERE\r\n table_schema IN (:schemaName)\r\n and CONCAT(table_schema, '.', table_name) in (:sysTableNames)\r\nORDER BY\r\n table_schema ASC,\r\n table_name ASC,\r\n ordinal_position ASC;",
+ "metaIndexQuery": "SELECT \r\n TRIM(INDEX_SCHEMA) AS SCHEMA_NAME, \r\n TABLE_NAME AS TBL_DEF_KEY,\r\n COLUMN_NAME AS COL_DEF_KEY,\r\n COMMENT AS DEF_NAME,\r\n '' AS INTRO,\r\n IF (COLLATION = 'A', 'ASC', 'DESC') AS SORT_TYPE,\r\n IF (NON_UNIQUE = 1, 'NORMAL', 'UNIQUE') AS TYPE,\r\n SEQ_IN_INDEX AS ORDER_VALUE,\r\n INDEX_NAME AS DEF_KEY FROM information_schema.STATISTICS\r\n WHERE TRIM(INDEX_SCHEMA) IN (:schemaName) AND CONCAT(TRIM(INDEX_SCHEMA), '.', TRIM(TABLE_NAME)) IN (:sysTableNames)\r\n AND INDEX_TYPE != 'PRIMARY'\r\nORDER BY INDEX_SCHEMA, TABLE_NAME, INDEX_NAME",
+ "metaQueryCharset": null,
+ "orderValue": 10,
+ "isEnabled": 0,
+ "id": "1K6TV6WJR1801"
+ },
+ {
+ "defKey": "GBase 8s",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "gbasedbtjdbc_3.5.1.jar",
+ "jdbcReferDriver": "com.gbasedbt.jdbc.Driver",
+ "jdbcReferUrl": "jdbc:gbasedbt-sqli://[{ip}:{port}][/dbname]",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n const dataTypeArray = [\r\n 'SMALLINT',\r\n 'INT8',\r\n 'INT',\r\n 'INT8',\r\n 'INTEGER',\r\n 'REAL',\r\n 'SMALLFLOAT',\r\n 'BIGSERIAL',\r\n 'TEXT',\r\n 'BIGINT',\r\n 'DATE',\r\n 'DOUBLE PRECISION',\r\n 'BYTE'\r\n ];\r\n function getDataType(field) {\r\n const dataType = field.dbDataType?.toUpperCase();\r\n if (field.autoIncrement && dataType === 'BIGINT') {\r\n return 'SERIAL8';\r\n } else if (field.autoIncrement) {\r\n return 'SERIAL';\r\n } else if (dataTypeArray.includes(dataType)) {\r\n return field.dbDataType;\r\n } else if (dataType === 'TIMESTAMP' && field.dataLen && field.dataLen >= 1 && field.dataLen <= 6) {\r\n return `${field.dbDataType}(${field.dataLen})`;\r\n } else if (dataType === 'FLOAT' && field.dataLen && field.dataLen >= 1 && field.dataLen <= 16) {\r\n return `${field.dbDataType}(${field.dataLen})`;\r\n } else if (dataType === 'MONEY' && field.dataLen && field.dataLen >= 2 && field.dataLen <= 32) {\r\n if (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen) {\r\n return `${field.dbDataType}(${field.dataLen},${field.numScale})`;\r\n } else {\r\n return `${field.dbDataType}(${field.dataLen})`;\r\n }\r\n } else if (\r\n (dataType === 'VARCHAR' || dataType === 'NVARCHAR') &&\r\n field.dataLen &&\r\n field.dataLen >= 1 &&\r\n field.dataLen <= 255\r\n ) {\r\n if (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen) {\r\n return `${field.dbDataType}(${field.dataLen},${field.numScale})`;\r\n } else {\r\n return `${field.dbDataType}(${field.dataLen})`;\r\n }\r\n } else if (\r\n (dataType === 'DECIMAL' || dataType === 'NUMERIC') &&\r\n field.dataLen &&\r\n field.dataLen >= 1 &&\r\n field.dataLen <= 32\r\n ) {\r\n if (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen) {\r\n return `${field.dbDataType}(${field.dataLen},${field.numScale})`;\r\n } else {\r\n return `${field.dbDataType}(${field.dataLen})`;\r\n }\r\n } else if (field.dataLen && field.dataLen >= 0) {\r\n return `${field.dbDataType}(${field.dataLen})`;\r\n }\r\n return field.dbDataType;\r\n }\r\n function getConstraints(field) {\r\n let constraints = '';\r\n if (field.notNull) {\r\n constraints += ' NOT NULL';\r\n }\r\n if (field.defaultValue) {\r\n constraints += ` DEFAULT ${field.defaultValue}`;\r\n }\r\n return constraints;\r\n }\r\n}}\r\nDROP TABLE IF EXISTS {{= tableKey }};\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}{{=field.defKey}} {{= getDataType(field) }}{{= getConstraints(field) }}{{= index < it.fields.length-1 || pkList.length>0 ? ',' : ( pkList.length > 0 ? ',' : '' ) }}{{~}}{{? pkList.length >0 }}\r\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i 0}}\r\nALTER TABLE {{= tableKey }} ADD CONSTRAINT PRIMARY KEY ({{~indexFields:field:i}}{{= field.defKey }}{{= i < indexFields.length-1 ? ',' : '' }}{{~}});\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}COMMENT ON TABLE {{= tableKey }} IS '{{=defName}}{{? defName && intro}}; {{=intro}}{{?? intro}}{{=intro}}{{?}}';{{?}}\r\n{{? updateKeys.some((item) => item === 'defKey') }}RENAME TABLE {{= tableKey }} TO {{=defKey}};{{?}}\r\n",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};",
+ "columnCreate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(autoIncrement) {\n return dbDataType.toUpperCase() === 'BIGINT' ? 'SERIAL8' : 'SERIAL';\n } else if(dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'INT8' ||\n dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase() === 'INT8' ||\n dbDataType.toUpperCase() === 'INTEGER' ||\n dbDataType.toUpperCase() === 'REAL' ||\n dbDataType.toUpperCase() === 'SMALLFLOAT' ||\n dbDataType.toUpperCase() === 'BIGSERIAL' ||\n dbDataType.toUpperCase() === 'TEXT' ||\n dbDataType.toUpperCase() === 'BIGINT' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'DOUBLE PRECISION' ||\n dbDataType.toUpperCase() === 'BYTE') {\n return dbDataType; \n } else if(dbDataType.toUpperCase() === 'TIMESTAMP') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 6) ? `(${dataLen})` : ''}`\n } else if(dbDataType.toUpperCase() === 'FLOAT') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 16) ? `(${dataLen})` : ''}`\n } else if(dbDataType.toUpperCase() === 'MONEY') {\n return `${dbDataType} ${(dataLen && dataLen >= 2 && dataLen <= 32) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dbDataType.toUpperCase() === 'VARCHAR' ||\n dbDataType.toUpperCase() === 'NVARCHAR') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 255) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`; \n } else if(dbDataType.toUpperCase() === 'DECIMAL' ||\n dbDataType.toUpperCase() === 'NUMERIC') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 32) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n}}\nALTER TABLE {{= tableKey }} ADD {{= field.defKey}} {{= finalDataType}}{{? field.notNull}} NOT NULL{{?}}{{? field.defaultValue}} DEFAULT {{= field.defaultValue}}{{?}};\n{{? field.defName || field.intro }}\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=field.defName}}{{? field.defName && field.intro}}; {{=field.intro}}{{?? field.intro}}{{=field.intro}}{{?}}';\n{{?}}\n{{~}}",
+ "columnUpdate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(autoIncrement) {\n return dbDataType.toUpperCase() === 'BIGINT' ? 'SERIAL8' : 'SERIAL';\n } else if(dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'INT8' ||\n dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase() === 'INT8' ||\n dbDataType.toUpperCase() === 'INTEGER' ||\n dbDataType.toUpperCase() === 'REAL' ||\n dbDataType.toUpperCase() === 'SMALLFLOAT' ||\n dbDataType.toUpperCase() === 'BIGSERIAL' ||\n dbDataType.toUpperCase() === 'TEXT' ||\n dbDataType.toUpperCase() === 'BIGINT' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'DOUBLE PRECISION' ||\n dbDataType.toUpperCase() === 'BYTE') {\n return dbDataType; \n } else if(dbDataType.toUpperCase() === 'TIMESTAMP') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 6) ? `(${dataLen})` : ''}`\n } else if(dbDataType.toUpperCase() === 'FLOAT') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 16) ? `(${dataLen})` : ''}`\n } else if(dbDataType.toUpperCase() === 'MONEY') {\n return `${dbDataType} ${(dataLen && dataLen >= 2 && dataLen <= 32) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dbDataType.toUpperCase() === 'VARCHAR' ||\n dbDataType.toUpperCase() === 'NVARCHAR') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 255) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`; \n } else if(dbDataType.toUpperCase() === 'DECIMAL' ||\n dbDataType.toUpperCase() === 'NUMERIC') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 32) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\n const finalDataType = computeDatatype(field);\n const preDefKey = field?.baseUpdate?.pre?.defKey;\n const nextDefKey = field?.baseUpdate?.next?.defKey;\n}}\n{{? updateKeys.includes('defKey') }}RENAME COLUMN {{= tableKey }}.{{= preDefKey }} TO {{= field.defKey }};{{?}}\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale' || item === 'notNull' || item === 'defaultValue' || item === 'autoIncrement') }}\nALTER TABLE {{= tableKey }} MODIFY {{= field.defKey }} {{= finalDataType}} {{? updateKeys.includes('notNull') }} {{? field.notNull }} NOT NULL {{??}} NULL {{?}}{{?}}{{? updateKeys.includes('defaultValue') }}{{? field.defaultValue }} DEFAULT {{= field.defaultValue}}{{?}}{{?}};\n{{?}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=field.defName}}{{? field.defName && field.intro}}; {{=field.intro}}{{?? field.intro}}{{=field.intro}}{{?}}';\n{{?}}\n{{~}}",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\nALTER TABLE {{= tableKey }} DROP {{=field.defKey}};\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}} {{?}}INDEX {{=row.defKey}} ON {{= tableKey }}(\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX IF EXISTS {{? preDefKey}} {{= preDefKey}}{{??}} {{=row.defKey}}{{?}};\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }}(\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\n let indexesUpdate = it.indexesUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:i}}\nDROP INDEX IF EXISTS {{=row.defKey}};\n{{~}}",
+ "metaTableQuery": "select\r\n t.tabname as def_key,\r\n c.comments as def_name,\r\n t.owner as schema_name\r\nfrom systables t\r\n left join syscomments c on t.tabname = c.tabname\r\nwhere t.tabtype = 'T' and t.owner in (:schemaName)",
+ "metaColumnQuery": "SELECT DISTINCT c.colname as def_key,\r\n t.tabname as tbl_def_key,\r\n TRIM(t.owner) as schema_name,\r\n c.colno as order_value,\r\n c.colno ,\r\n CASE\r\n WHEN INSTR(c.coltypename2, '(') = 0 THEN c.coltypename2\r\n ELSE\r\n SUBSTR(c.coltypename2, 1, INSTR(c.coltypename2, '(') - 1) END as db_data_type,\r\n CASE WHEN mod(c.coltype,256) = c.coltype - 256 THEN 1 ELSE 0\r\n END\r\n AS not_null,\r\n CASE d.type\r\n WHEN 'L' THEN get_default_value(c.coltype, c.extended_id, c.collength, d.default::lvarchar(256))::VARCHAR(254)\r\n WHEN 'C' THEN 'current year to second'::VARCHAR(254)\r\n WHEN 'S' THEN 'dbservername'::VARCHAR(254)\r\n WHEN 'U' THEN 'user'::VARCHAR(254)\r\n WHEN 'T' THEN 'today'::VARCHAR(254)\r\n WHEN 'E' THEN de.default::VARCHAR(254)\r\n ELSE NULL::VARCHAR(254)\r\nEND\r\nAS default_value,\r\n CASE WHEN LENGTH(CASE WHEN c.colno IN (SELECT i.part1 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part2 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part3 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part4 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part5 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part6 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part7 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part8 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part9 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part10 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part11 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part12 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part13 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part14 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part15 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n UNION ALL SELECT i.part16 FROM sysindexes i,sysconstraints con WHERE i.idxname = con.idxname AND con.constrtype = 'P' AND con.tabid = c.tabid\r\n ) THEN 'PRI' ELSE ''\r\nEND) = 0 THEN 0 ELSE 1 END AS primary_key,\r\n CASE WHEN mod(c.coltype,256) IN (6,18,53) THEN 1 ELSE 0\r\nEND\r\nAS auto_increment,\r\n CASE lower(colauth)\r\n WHEN 's--' THEN 'select'\r\n WHEN 'su-' THEN 'select,update'\r\n WHEN 'sur' THEN 'select,update,references'\r\n WHEN '-u-' THEN 'update'\r\n WHEN '-ur' THEN 'update,references'\r\n WHEN '--r' THEN 'references'\r\n ELSE 'select,update,reference'\r\nEND\r\nAS privilege,\r\n colcomm.comments as def_name\r\nFROM syscolumnsext c\r\n LEFT JOIN systables t ON c.tabid = t.tabid\r\n LEFT JOIN sysdefaults d ON (c.tabid = d.tabid AND c.colno = d.colno)\r\n LEFT JOIN sysdefaultsexpr de ON (c.tabid = de.tabid AND c.colno = de.colno and de.type='T')\r\n LEFT JOIN syscolauth colauth ON (c.tabid = colauth.tabid )\r\n LEFT JOIN syscolcomments colcomm ON (t.tabname = colcomm.tabname AND c.colname = colcomm.colname)\r\nWHERE CONCAT(CONCAT(TRIM(' ' from t.owner), '.'), TRIM(t.tabname)) IN (:sysTableNames)\r\n and TRIM(t.owner) IN (:schemaName)\r\nORDER BY t.owner, t.tabname, order_value ",
+ "metaIndexQuery": "select\r\n TRIM(t.owner) as schema_name,\r\n t.tabname tbl_def_key,\r\n i.idxname def_key,\r\n '' def_name,\r\n '' intro,\r\n CASE\r\n WHEN idxtype='U'\r\n THEN 'UNIQUE'\r\n ELSE 'NORMAL'\r\n END\r\n AS type,\r\n trim(case\r\n when i.part1 > 0 then ('ASC')\r\n when i.part1 < 0 then ('DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part2 > 0 then (',ASC')\r\n when i.part2 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part3 > 0 then (',ASC')\r\n when i.part3 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part4 > 0 then (',ASC')\r\n when i.part4 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part5 > 0 then (',ASC')\r\n when i.part5 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part6 > 0 then (',ASC')\r\n when i.part6 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part7 > 0 then (',ASC')\r\n when i.part7 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part8 > 0 then (',ASC')\r\n when i.part8 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part9 > 0 then (',ASC')\r\n when i.part9 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part10 > 0 then (',ASC')\r\n when i.part10 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part11 > 0 then (',ASC')\r\n when i.part11 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part12 > 0 then (',ASC')\r\n when i.part12 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part13 > 0 then (',ASC')\r\n when i.part13 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part14 > 0 then (',ASC')\r\n when i.part14 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part15 > 0 then (',ASC')\r\n when i.part15 < 0 then (',DESC')\r\n else ('') end) ||\r\n trim(case\r\n when i.part16 > 0 then (',ASC')\r\n when i.part16 < 0 then (',DESC')\r\n else ('') end) sort_type,\r\n 1 order_value,\r\n trim(case\r\n when i.part1 > 0 then (select colname from syscolumns where colno = i.part1 and tabid = i.tabid)\r\n else (select colname from syscolumns where colno = i.part1*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part2 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part2\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part2*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part3 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part3\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part3*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part4 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part4\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part4*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part5 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part5\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part5*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part6 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part6\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part6*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part7 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part7\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part7*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part8 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part8\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part8*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part9 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part9\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part9*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part10 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part10\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part10*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part11 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part11\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part11*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part12 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part12\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part12*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part13 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part13\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part13*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part14 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part14\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part14*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part15 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part15\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part15*-1 and tabid = i.tabid) end) ||\r\n trim(case\r\n when i.part16 > 0 then (select ',' || colname\r\n from syscolumns\r\n where colno = i.part16\r\n and tabid = i.tabid)\r\n else (select ',' || colname from syscolumns where colno = i.part16*-1 and tabid = i.tabid) end) col_def_key,\r\n i.idxname\r\nfrom systables t\r\n join sysindexes i on\r\n t.tabid = i.tabid\r\nwhere t.tabid > 99\r\n and t.tabtype = 'T'\r\n and TRIM(t.owner) IN (:schemaName)\r\n and CONCAT(CONCAT(TRIM(' ' from t.owner), '.'), TRIM(t.tabname)) IN (:sysTableNames)\r\n and NOT REGEXP_LIKE(i.idxname, '^[[:space:][:digit:]]')\r\norder by t.owner, tbl_def_key, def_key, order_value",
+ "metaQueryCharset": null,
+ "orderValue": 11,
+ "isEnabled": 0,
+ "id": "1KE9YGK6H1M02"
+ },
+ {
+ "defKey": "OceanBase-Oracle",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "oceanbase-client-2.4.13.jar",
+ "jdbcReferDriver": "com.oceanbase.jdbc.Driver",
+ "jdbcReferUrl": "jdbc:oceanbase://[ip]:[port]/?pool=false&user=[user]@oracle&password=[password]",
+ "tableCreate": "\r\n{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n function getFieldLength(field) {\r\n switch (field.dbDataType?.toUpperCase()) {\r\n case 'VARCHAR2':\r\n return `(${field.dataLen ? field.dataLen : 128})`;\r\n case 'TIMESTAMP':\r\n return field.dataLen && field.dataLen >= 1 && field.dataLen <= 9 ? `(${field.dataLen})` : '(6)';\r\n case 'INTEGER':\r\n case 'BINARY_DOUBLE':\r\n case 'DATE':\r\n case 'CLOB':\r\n case 'LONG':\r\n case 'NCLOB':\r\n case 'BLOB':\r\n return '';\r\n case 'FLOAT':\r\n return field.dataLen && field.dataLen >= 1 && field.dataLen <= 126 ? `(${field.dataLen})` : '';\r\n case 'DECIMAL':\r\n case 'NUMBER':\r\n return field.dataLen && field.dataLen >= 1 && field.dataLen <= 38 ? \r\n (field.numScale && field.numScale >= -84 && field.numScale <= 127 ? `(${field.dataLen},${field.numScale})` : `(${field.dataLen})`) : \r\n '';\r\n default:\r\n return field.dataLen ? `(${field.dataLen})` : '';\r\n }\r\n }\r\n}}\r\nBEGIN\r\n EXECUTE IMMEDIATE 'DROP TABLE {{= tableKey }}';\r\nEXCEPTION\r\n WHEN OTHERS THEN\r\n IF SQLCODE != -942 THEN -- Table does not exist error\r\n RAISE;\r\n END IF;\r\nEND;\r\n/\r\n\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\r\n {{=field.defKey}} {{=field.dbDataType}}{{=getFieldLength(field)}}{{=field.autoIncrement ? '' : '' }}{{? field.defaultValue }} DEFAULT {{=field.defaultValue}}{{?}}{{=field.notNull?' NOT NULL' : '' }}{{= index < it.fields.length-1 ? ',' : ( pkList.length > 0 ? ',' : '' ) }}{{~}}\r\n{{? pkList.length > 0 }} \r\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i < pkList.length-1 ? ',' : '' }}{{~}})\r\n{{?}}\r\n);\r\n\r\n{{? it.defName || it.intro }} \r\nCOMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}';\r\n{{?}}\r\n\r\n{{~it.fields:field:index}}\r\n{{? field.defName || field.intro }}\r\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}\r\n$blankline",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let defName = it.baseUpdate.next.defName;\r\n let intro = it.baseUpdate.next.intro;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? isPrimaryKeyModified }}\r\nALTER TABLE {{=it.defKey}} DROP PRIMARY KEY;\r\n{{? indexFields && indexFields.length > 0}}\r\nALTER TABLE {{=it.defKey}} ADD CONSTRAINT {{=it.defKey}}_PRIMARY_KEY PRIMARY KEY ({{~indexFields:field:i}}{{= field.defKey }}{{= i < indexFields.length-1 ? ',' : '' }}{{~}});\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}COMMENT ON TABLE {{=it.defKey}} IS '{{=it.func.strJoin(defName, intro, \";\", true)}}'; {{?}}\r\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{=it.defKey}} RENAME TO {{=defKey}}; {{?}}",
+ "tableDelete": "BEGIN\r\n EXECUTE IMMEDIATE 'DROP TABLE {{=it.defKey}}';\r\nEXCEPTION\r\n WHEN OTHERS THEN\r\n IF SQLCODE != -942 THEN -- Table does not exist error\r\n RAISE;\r\n END IF;\r\nEND;\r\n/",
+ "columnCreate": "{{\r\n let fieldsUpdate = it.fieldsUpdate;\r\n const computeDataLen = (dataLen, maxDataLen, defaultDataLen) => {\r\n if(!dataLen) {\r\n return defaultDataLen;\r\n }\r\n if(dataLen >= 0 && dataLen <= maxDataLen) {\r\n return dataLen;\r\n }\r\n return defaultDataLen;\r\n \r\n };\r\n const computeDatatype = (field) => {\r\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase() === 'VARCHAR2') {\r\n return `${dbDataType} (${dataLen ? dataLen : 128})`;\r\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP') {\r\n return `${dbDataType} (${computeDataLen(dataLen, 9, 6)})`;\r\n } else if(dbDataType.toUpperCase() === 'INTEGER' ||\r\n dbDataType.toUpperCase() === 'BINARY_DOUBLE' ||\r\n dbDataType.toUpperCase() === 'DATE' ||\r\n dbDataType.toUpperCase() === 'CLOB' ||\r\n dbDataType.toUpperCase() === 'LONG' ||\r\n dbDataType.toUpperCase() === 'NCLOB' ||\r\n dbDataType.toUpperCase() === 'BLOB') {\r\n return dbDataType;\r\n } else if(dbDataType.toUpperCase() === 'FLOAT') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 126) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'DECIMAL' ||\r\n dbDataType.toUpperCase() === 'NUMBER') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 38) ? ((numScale && numScale >= -84 && numScale <= 127) ? `(${dataLen},${numScale})` : `(${dataLen})`) : ''}`; \r\n } else if(dataLen && dataLen >= 0) {\r\n return `${dbDataType} (${dataLen})`\r\n }\r\n return dbDataType;\r\n \r\n };\r\n}}\r\n{{~fieldsUpdate:field:index}}\r\n{{\r\n const finalDataType = computeDatatype(field);\r\n}}\r\nALTER TABLE {{= it.defKey}} ADD {{= field.defKey }} {{= finalDataType }} {{? field.defaultValue}} DEFAULT {{=field.defaultValue}}{{?}}{{? field.notNull}} NOT NULL{{?}};\r\n{{? field.defName || field.intro }}\r\nCOMMENT ON COLUMN {{= it.defKey}}.{{= field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}",
+ "columnUpdate": "{{\r\n let fieldsUpdate = it.fieldsUpdate;\r\n const computeDataLen = (dataLen, maxDataLen, defaultDataLen) => {\r\n if(!dataLen) {\r\n return defaultDataLen;\r\n }\r\n if(dataLen >= 0 && dataLen <= maxDataLen) {\r\n return dataLen;\r\n }\r\n return defaultDataLen;\r\n \r\n };\r\n const computeDatatype = (field) => {\r\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase() === 'VARCHAR2') {\r\n return `${dbDataType} (${dataLen ? dataLen : 128})`;\r\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP') {\r\n return `${dbDataType} (${computeDataLen(dataLen, 9, 6)})`;\r\n } else if(dbDataType.toUpperCase() === 'INTEGER' ||\r\n dbDataType.toUpperCase() === 'BINARY_DOUBLE' ||\r\n dbDataType.toUpperCase() === 'DATE' ||\r\n dbDataType.toUpperCase() === 'CLOB' ||\r\n dbDataType.toUpperCase() === 'LONG' ||\r\n dbDataType.toUpperCase() === 'NCLOB' ||\r\n dbDataType.toUpperCase() === 'BLOB') {\r\n return dbDataType;\r\n } else if(dbDataType.toUpperCase() === 'FLOAT') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 126) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'DECIMAL' ||\r\n dbDataType.toUpperCase() === 'NUMBER') {\r\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 38) ? ((numScale && numScale >= -84 && numScale <= 127) ? `(${dataLen},${numScale})` : `(${dataLen})`) : ''}`; \r\n } else if(dataLen && dataLen >= 0) {\r\n return `${dbDataType} (${dataLen})`\r\n }\r\n return dbDataType;\r\n \r\n };\r\n}}\r\n{{~fieldsUpdate:field:index}}\r\n{{\r\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n const finalDataType = computeDatatype(field);\r\n const preDefKey = field?.baseUpdate?.pre?.defKey;\r\n const nextDefKey = field?.baseUpdate?.next?.defKey;\r\n}}\r\n{{? updateKeys.includes('defKey') }}ALTER TABLE {{= it.defKey}} RENAME COLUMN {{= preDefKey}} TO {{= nextDefKey}};{{?}}\r\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale') }}\r\nALTER TABLE {{= it.defKey}} MODIFY {{=field.defKey}} {{=finalDataType}};\r\n{{?}}\r\n{{? updateKeys.includes('notNull') }}ALTER TABLE {{= it.defKey}} MODIFY {{=field.defKey}} {{? field.notNull }} NOT NULL {{??}} NULL {{?}};{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\r\nCOMMENT ON COLUMN {{= it.defKey}}.{{= field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{?}}\r\n{{? updateKeys.includes('defaultValue') }}\r\nALTER TABLE {{= it.defKey}} MODIFY {{=field.defKey}} DEFAULT {{=field.defaultValue}};\r\n{{?}}\r\n{{~}}",
+ "columnDelete": "{{\r\n let fieldsUpdate = it.fieldsUpdate; \r\n}}\r\n{{~fieldsUpdate:field:index}}\r\nALTER TABLE {{=it.defKey}} DROP COLUMN {{=field.defKey}};\r\n{{~}}",
+ "indexCreate": "{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE{{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{=it.defKey}} (\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX {{? preDefKey}} {{= preDefKey}} {{??}} {{=row.defKey}} {{?}};\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}} {{?}} INDEX {{=row.defKey}} ON {{=it.defKey}} (\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\r\n let indexesUpdate = it.indexesUpdate; \r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~indexesUpdate:row:i}}\r\nBEGIN\r\n EXECUTE IMMEDIATE 'DROP INDEX {{= schemaName }}{{=row.defKey}}';\r\nEXCEPTION\r\n WHEN OTHERS THEN\r\n IF SQLCODE!= -1418 THEN -- Index does not exist error\r\n RAISE;\r\n END IF;\r\nEND;\r\n{{~}}",
+ "metaTableQuery": "SELECT\n\t\t'' as id,\n t.table_name AS def_key,\n c.comments AS def_name,\n t.OWNER AS schema_name\nFROM all_tables t left join all_tab_comments c on t.OWNER=c.OWNER and t.TABLE_NAME=c.TABLE_NAME\nwhere upper(t.OWNER) in (:schemaName) order by def_key",
+ "metaColumnQuery": "SELECT\r col.owner AS schema_name,\r\tcol.table_name AS tbl_def_key,\r\tcol.column_id AS order_value,\r\tcol.column_name AS def_key,\r\tclc.comments AS def_name,\r\t'' AS intro,\r\tcol.data_type AS db_data_type,\r\tnvl(col.data_precision,col.data_length) AS data_len,\r\tcol.data_scale AS num_scale,\r\tdecode(col.nullable,'Y',0,1) AS not_null,\r\tCASE WHEN cc.constraint_name IS NOT NULL THEN 1 ELSE 0 END AS primary_key,\r\t--'' AS auto_increment,\r\t\tCASE WHEN col.data_default ='SEQUENCE.NEXTVAL' THEN 1 ELSE 0 END AS auto_increment,\r\tCASE WHEN col.data_default ='SEQUENCE.NEXTVAL' THEN '' ELSE col.data_default END AS default_value\r\t --col.data_default AS default_value\rFROM\r\tall_tab_columns col LEFT JOIN all_col_comments clc ON col.OWNER = clc.OWNER AND col.table_name = clc.table_name AND col.column_name = clc.column_name \r\t LEFT JOIN (all_cons_columns cc JOIN all_constraints cs ON cc.constraint_name = cs.constraint_name AND cc.owner = cs.owner and cs.constraint_type = 'P') on col.owner=cc.owner and col.table_name=cc.table_name and col.column_name = cc.column_name\rWHERE\r\tcol.owner in (:schemaName)\r\tAND CONCAT(CONCAT(col.owner, '.') , col.table_name) in (:sysTableNames)\rORDER BY\r\tcol.owner ASC, col.table_name ASC,col.column_id ASC ",
+ "metaIndexQuery": "SELECT i.TABLE_OWNER AS schema_name,\n i.table_name AS TBL_DEF_KEY,\n ic.column_name AS COL_DEF_KEY,\n i.index_name AS DEF_KEY,\n CASE\n WHEN i.uniqueness = 'UNIQUE' THEN 'UNIQUE'\n ELSE 'NORMAL'\n END AS TYPE,\n CASE\n WHEN ic.descend = 'DESC' THEN 'DESC'\n ELSE 'ASC'\n END AS SORT_TYPE,\n ic.column_position AS ORDER_VALUE,\n NULL AS INTRO -- Oracle does not have a direct equivalent for INDEX_COMMENT\nFROM user_indexes i\n LEFT JOIN all_ind_columns ic ON i.index_name = ic.index_name AND i.table_name = ic.table_name\nWHERE i.TABLE_OWNER in (:schemaName)\n AND CONCAT(CONCAT(i.TABLE_OWNER, '.') , i.table_name) IN (:sysTableNames)\nORDER BY i.TABLE_OWNER, i.table_name, i.index_name, ic.column_position;",
+ "metaQueryCharset": null,
+ "orderValue": 12,
+ "isEnabled": 0,
+ "id": "BPMCJTYLY1UAC"
+ },
+ {
+ "defKey": "OceanBase-Mysql",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "mysql-connector-j-8.3.0.jar",
+ "jdbcReferDriver": "com.mysql.cj.jdbc.Driver",
+ "jdbcReferUrl": "jdbc:mysql://[ip]:[port]/[dbname]?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n\r\n function getDataType(field) {\r\n const { dbDataType } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n const dataType = dbDataType.toUpperCase();\r\n if (['VARCHAR','NVARCHAR','VARBINARY'].includes(dataType)) {\r\n return `${dataType}(${field.dataLen ? field.dataLen : 128})`;\r\n } else if (['DATE','YEAR','TINYTEXT','MEDIUMTEXT','LONGTEXT','TINYBLOB','MEDIUMBLOB','LONGBLOB','BOOLEAN','FLOAT','JSON'].includes(dataType)) {\r\n return dataType;\r\n } else if(['SET','ENUM'].includes(dataType)){\r\n return `${dataType}(${field.defaultValue})`;\r\n } else if (dataType === 'TIMESTAMP') {\r\n return field.dataLen && field.dataLen >= 0 && field.dataLen <= 6 ? `${dataType}(${field.dataLen})` : dataType;\r\n } else if (dataType === 'DOUBLE') {\r\n return field.dataLen && field.dataLen >= 0 && field.dataLen <= 255 ? (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen ? `${dataType}(${field.dataLen},${field.numScale})` : `${dataType}(${field.dataLen},0)`) : `${dataType}`;\r\n } else if (dataType === 'DECIMAL') {\r\n return field.dataLen && field.dataLen >= 0 && field.dataLen <= 65 ? (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen ? `${dataType}(${field.dataLen},${field.numScale})` : `${dataType}(${field.dataLen})`) : `${dataType}`;\r\n } else {\r\n return field.dataLen && field.dataLen >= 0 ? `${dataType}(${field.dataLen})` : `${dataType}`;\r\n }\r\n }\r\n\r\n function getFieldDefinition(field, index, fields) {\r\n const dataType = getDataType(field);\r\n const notNull = field.notNull ? ' NOT NULL' : '';\r\n const autoIncrement = field.autoIncrement ? ' AUTO_INCREMENT' : '';\r\n const defaultValue = field.defaultValue ? ` DEFAULT ${field.defaultValue}` : '';\r\n if(field?.dbDataType?.toUpperCase()==='SET'||\r\n field?.dbDataType?.toUpperCase()==='ENUM'){\r\n defaultValue=field.defaultValue ? ` DEFAULT (\"${field.defaultValue}\")` : '';\r\n }\r\n const comment = ` COMMENT '${it.func.strJoin(field.defName, field.intro, \";\", true)}'`;\r\n return `${dataType}${notNull}${autoIncrement}${defaultValue}${comment}${index < fields.length - 1 || pkList.length > 0 ? ',' : ''}`;\r\n }\r\n}}\r\nDROP TABLE IF EXISTS {{= tableKey }};\r\n\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\r\n `{{=field.defKey}}` {{= getFieldDefinition(field, index, it.fields) }}\r\n{{~}}\r\n{{? pkList.length > 0 }}\r\n PRIMARY KEY ({{~pkList:pkName:i}}`{{= pkName }}`{{= i < pkList.length - 1 ? ',' : '' }}{{~}})\r\n{{?}}\r\n) COMMENT '{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}';\r\n$blankline\r\n",
+ "tableUpdate": "{{\n let defKey = it.baseUpdate.next.defKey;\n let defName = it.baseUpdate.next.defName;\n let intro = it.baseUpdate.next.intro;\n let indexFields = it.indexFields;\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\n}}\n{{? isPrimaryKeyModified }}\nALTER TABLE {{=it.defKey}} DROP PRIMARY KEY;\n{{? indexFields && indexFields.length > 0}}\nALTER TABLE {{=it.defKey}} ADD PRIMARY KEY ({{~indexFields:field:i}}`{{= field.defKey }}`{{= i < indexFields.length-1 ? ',' : '' }}{{~}})\n{{?}}\n{{?}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}ALTER TABLE {{=it.defKey}} COMMENT '{{=it.func.strJoin(defName, intro, \";\", true)}}'';{{?}}\n$blankline\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{=it.defKey}} RENAME TO {{=defKey}};{{?}}\n",
+ "tableDelete": "DROP TABLE IF EXISTS {{=it.defKey}};",
+ "columnCreate": "{{\r\n let fieldsUpdate = it.fieldsUpdate;\r\n const computeLenAndNum = (dataLen, numScale, maxDataLen, maxNumScale) => {\r\n if(!dataLen || dataLen <= 0) {\r\n return '';\r\n }\r\n let currentDataLen = dataLen, currentNumScale = numScale;\r\n if(dataLen >= maxDataLen) {\r\n currentDataLen = maxDataLen;\r\n }\r\n if(!numScale || numScale <= 0) {\r\n return `(${currentDataLen},0)`;\r\n }\r\n if(currentNumScale > maxNumScale) {\r\n currentNumScale = maxNumScale\r\n }\r\n if(currentNumScale > currentDataLen && currentDataLen <= maxNumScale) {\r\n currentNumScale = currentDataLen;\r\n }\r\n return `(${currentDataLen},${currentNumScale})`;\r\n };\r\n const computeDefaultValue = (field) => {\r\n const { defaultValue, dbDataType, primaryKey } = field;\r\n if(!defaultValue){\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase().endsWith('BLOB') || \r\n dbDataType.toUpperCase().endsWith('GEOMETRY') || \r\n dbDataType.toUpperCase().endsWith('TEXT') || \r\n dbDataType.toUpperCase().endsWith('JSON')) {\r\n return '';\r\n } else if(dbDataType.toUpperCase() === 'ENUM' ||\r\n dbDataType.toUpperCase() === 'SET') {\r\n return `DEFAULT \"${defaultValue}\"`;\r\n } else {\r\n return `DEFAULT ${defaultValue}`;\r\n }\r\n };\r\n const computeType = (field) => {\r\n const { dbDataType, dataLen, numScale, defaultValue } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase() === 'VARCHAR' ||\r\n dbDataType.toUpperCase() === 'NVARCHAR' ||\r\n dbDataType.toUpperCase() === 'VARBINARY') {\r\n return `${dbDataType}(${dataLen ? dataLen : 128})`;\r\n } else if(dbDataType.toUpperCase() === 'DATE' ||\r\n dbDataType.toUpperCase() === 'YEAR' ||\r\n dbDataType.toUpperCase() === 'TINYTEXT' ||\r\n dbDataType.toUpperCase() === 'MEDIUMTEXT' ||\r\n dbDataType.toUpperCase() === 'LONGTEXT' ||\r\n dbDataType.toUpperCase() === 'TINYBLOB' ||\r\n dbDataType.toUpperCase() === 'MEDIUMBLOB' ||\r\n dbDataType.toUpperCase() === 'LONGBLOB' ||\r\n dbDataType.toUpperCase() === 'BOOLEAN' ||\r\n dbDataType.toUpperCase() === 'FLOAT' ||\r\n dbDataType.toUpperCase() === 'INT' ||\r\n dbDataType.toUpperCase() === 'JSON' ) {\r\n return dbDataType;\r\n } else if(dbDataType.toUpperCase() === 'ENUM' ||\r\n dbDataType.toUpperCase() === 'SET' ) {\r\n return `${dbDataType}(${defaultValue})`;\r\n } else if(dbDataType.toUpperCase() === 'TIME' ||\r\n dbDataType.toUpperCase() === 'DATETIME' ||\r\n dbDataType.toUpperCase() === 'TIMESTAMP') {\r\n return `${dbDataType}${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'DOUBLE') {\r\n return `${dbDataType}${computeLenAndNum(dataLen, numScale, 255, 30)}`;\r\n } else if(dbDataType.toUpperCase() === 'DECIMAL') {\r\n return `${dbDataType}${computeLenAndNum(dataLen, numScale, 65, 30)}`;\r\n } else if(dataLen && dataLen > 0) {\r\n return `${dbDataType}(${dataLen})`;\r\n }\r\n return `${dbDataType}`;\r\n };\r\n}}\r\n{{~fieldsUpdate:field:index}}\r\nALTER TABLE {{=it.defKey}}\r\nADD COLUMN `{{=field.defKey}}` {{=computeType(field)}} {{= field.notNull ? 'NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT ' : '' }}{{= computeDefaultValue(field)}} COMMENT '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{~}}\r\n",
+ "columnUpdate": "{{ \r\n let fieldsUpdate = it.fieldsUpdate;\r\n const computeLenAndNum = (dataLen, numScale, maxDataLen, maxNumScale) => {\r\n if(!dataLen || dataLen <= 0) {\r\n return '';\r\n }\r\n let currentDataLen = dataLen, currentNumScale = numScale;\r\n if(dataLen >= maxDataLen) {\r\n currentDataLen = maxDataLen;\r\n }\r\n if(!numScale || numScale <= 0) {\r\n return `(${currentDataLen},0)`;\r\n }\r\n if(currentNumScale > maxNumScale) {\r\n currentNumScale = maxNumScale\r\n }\r\n if(currentNumScale > currentDataLen && currentDataLen <= maxNumScale) {\r\n currentNumScale = currentDataLen;\r\n }\r\n return `(${currentDataLen},${currentNumScale})`;\r\n };\r\n const computeDefaultValue = (field) => {\r\n const { defaultValue, primaryKey } = field;\r\n const dbDataType = field.dbDataType ? field.dbDataType : '';\r\n if(!defaultValue) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase().endsWith('BLOB') || \r\n dbDataType.toUpperCase().endsWith('GEOMETRY') || \r\n dbDataType.toUpperCase().endsWith('TEXT') || \r\n dbDataType.toUpperCase().endsWith('JSON') ||\r\n primaryKey) {\r\n return '';\r\n } else if(dbDataType.toUpperCase() === 'ENUM' ||\r\n dbDataType.toUpperCase() === 'SET') {\r\n return `\"${defaultValue}\"`;\r\n } else {\r\n return defaultValue;\r\n }\r\n };\r\n const computeType = (field) => {\r\n const { dbDataType, dataLen, numScale, defaultValue } = field;\r\n if(!dbDataType) {\r\n return '';\r\n }\r\n if(dbDataType.toUpperCase() === 'VARCHAR' ||\r\n dbDataType.toUpperCase() === 'NVARCHAR' ||\r\n dbDataType.toUpperCase() === 'VARBINARY') {\r\n return `${dbDataType}(${dataLen ? dataLen : 128})`;\r\n } else if(dbDataType.toUpperCase() === 'DATE' ||\r\n dbDataType.toUpperCase() === 'YEAR' ||\r\n dbDataType.toUpperCase() === 'TINYTEXT' ||\r\n dbDataType.toUpperCase() === 'MEDIUMTEXT' ||\r\n dbDataType.toUpperCase() === 'LONGTEXT' ||\r\n dbDataType.toUpperCase() === 'TINYBLOB' ||\r\n dbDataType.toUpperCase() === 'MEDIUMBLOB' ||\r\n dbDataType.toUpperCase() === 'LONGBLOB' ||\r\n dbDataType.toUpperCase() === 'BOOLEAN' ||\r\n dbDataType.toUpperCase() === 'FLOAT' ||\r\n dbDataType.toUpperCase() === 'INT' ||\r\n dbDataType.toUpperCase() === 'JSON' ) {\r\n return dbDataType;\r\n } else if(dbDataType.toUpperCase() === 'ENUM' ||\r\n dbDataType.toUpperCase() === 'SET' ) {\r\n return `${dbDataType}(${defaultValue})`;\r\n } else if(dbDataType.toUpperCase() === 'TIME' ||\r\n dbDataType.toUpperCase() === 'DATETIME' ||\r\n dbDataType.toUpperCase() === 'TIMESTAMP') {\r\n return `${dbDataType}${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`;\r\n } else if(dbDataType.toUpperCase() === 'DOUBLE') {\r\n return `${dbDataType}${computeLenAndNum(dataLen, numScale, 255, 30)}`;\r\n } else if(dbDataType.toUpperCase() === 'DECIMAL') {\r\n return `${dbDataType}${computeLenAndNum(dataLen, numScale, 65, 30)}`;\r\n } else if(dataLen && dataLen > 0) {\r\n return `${dbDataType}(${dataLen})`;\r\n }\r\n return `${dbDataType}`;\r\n };\r\n}}{{~fieldsUpdate:field:index}}\r\n{{ \r\n let nextPrimaryKey = field.baseUpdate.next.primaryKey;\r\n let prePrimaryKey = field.baseUpdate.pre.primaryKey;\r\n let preDefKey = field.baseUpdate.pre.defKey;\r\n let updateKeys = field.baseUpdate.updateKeys.split(',');\r\n}}{{? updateKeys.includes('primaryKey') && updateKeys.includes('defaultValue')}}\r\nALTER TABLE `{{=it.defKey}}`\r\n ALTER COLUMN `{{=field.defKey}}` SET DEFAULT {{=field.defaultValue}};\r\n{{?}}\r\nALTER TABLE {{=it.defKey}}\r\n{{? updateKeys.includes('defKey')}} CHANGE `{{=preDefKey}}` `{{=field.defKey}}` {{??}} MODIFY COLUMN `{{=field.defKey}}`{{?}} {{=computeType(field)}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTO_INCREMENT' : '' }} {{= computeDefaultValue(field)}}COMMENT '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{~}}\r\n",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n}}\n{{~fieldsUpdate:field:index}}ALTER TABLE {{=it.defKey}} DROP COLUMN {{=field.defKey}};{{~}}",
+ "indexCreate": "{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}}INDEX {{=row.defKey}} ON {{=it.defKey}} (\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}} \r\n) COMMENT '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n}}\n{{~indexesUpdate:row:index}}\n{{\n let updateKeys = row.baseUpdate.updateKeys.split(',');\n let preDefKey = row.baseUpdate.pre.defKey;\n}}\nALTER TABLE {{=it.defKey}}\nDROP INDEX {{? updateKeys.includes('defKey')}}`{{=preDefKey}}` {{??}} `{{=row.defKey}}` {{?}}, \nADD {{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}} {{?}} INDEX `{{=row.defKey}}`(\n {{~row.fields:field:idx}}\n `{{=field.fieldDefKey}}`{{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n) COMMENT '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\n{{~}}",
+ "indexDelete": "{{\r\n let indexesUpdate = it.indexesUpdate; \r\n}}\r\n{{~indexesUpdate:index:i}}ALTER TABLE {{=it.defKey}} DROP INDEX {{=index.defKey}};{{~}}",
+ "metaTableQuery": "SELECT\n null AS id,\n table_name AS def_key,\n table_comment AS def_name,\n table_schema AS schema_name\nFROM\n information_schema.tables\nWHERE table_type = 'BASE TABLE'\n and table_schema = :schemaName",
+ "metaColumnQuery": "SELECT\n table_name AS tbl_def_key,\n ordinal_position as order_value,\n column_name AS def_key,\n column_comment AS def_name,\n '' AS intro,\n data_type AS db_data_type,\n IF(data_type = column_type,NULL,COALESCE ( character_maximum_length, numeric_precision )) AS data_len,\n IF(data_type = column_type, NULL, numeric_scale ) AS num_scale,\n IF(column_key = 'PRI', 1, 0 ) AS primary_key,\n IF(is_nullable = 'YES', 0, 1 ) AS not_null,\n IF(extra = 'AUTO_INCREMENT', 1, 0 ) AS auto_increment,\n column_default AS default_value\nFROM\n information_schema.COLUMNS\nWHERE\n table_schema = :schemaName\n and table_name in (:sysTableNames)\nORDER BY\n table_name ASC,\n ordinal_position ASC",
+ "metaIndexQuery": "SELECT TABLE_NAME AS TBL_DEF_KEY,\r\n COLUMN_NAME AS COL_DEF_KEY,\r\n INDEX_COMMENT AS DEF_NAME,\r\n COMMENT AS INTRO,\r\n IF (COLLATION = 'A', 'ASC', 'DESC') AS SORT_TYPE,\r\n IF (NON_UNIQUE = 1, 'NORMAL', 'UNIQUE') AS TYPE,\r\n SEQ_IN_INDEX AS ORDER_VALUE,\r\n INDEX_NAME AS DEF_KEY FROM information_schema.STATISTICS\r\n WHERE INDEX_SCHEMA = :schemaName AND TABLE_NAME IN (:sysTableNames) AND INDEX_NAME != 'PRIMARY'\r\nORDER BY TABLE_NAME, INDEX_NAME",
+ "metaQueryCharset": null,
+ "orderValue": 13,
+ "isEnabled": 0,
+ "id": "1K6TUVS7V1802"
+ },
+ {
+ "defKey": "XuguDB",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "xugu-jdbc-12.2.0.jar",
+ "jdbcReferDriver": "com.xugu.cloudjdbc.Driver",
+ "jdbcReferUrl": "jdbc:xugu://[ip]:[port]/[database]",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n\r\n function getDataType(field) {\r\n const { dbDataType } = field;\r\n if(!dbDataType) {\r\n return ''\r\n }\r\n const dataType = dbDataType.toUpperCase();\r\n if (dataType === 'VARCHAR') {\r\n return `${dataType}(${field.dataLen ? field.dataLen : 128})`;\r\n } else if ( ['TINYINT','SMALLINT','INTEGER','BIGINT','SMALLSERIAL','FLOAT','DOUBLE','BOOL','DATE','DATETIME','TIME','BLOB','CLOB','BINARY'].includes(dataType)) {\r\n return dataType;\r\n } else if (dataType === 'NUMERIC') {\r\n return field.dataLen && field.dataLen >= 1 && field.dataLen <= 38 ? (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen ? `${dataType}(${field.dataLen}, ${field.numScale})`: `${dataType}(${field.dataLen})`) : `${dataType}`;\r\n } else {\r\n return field.dataLen && field.dataLen >= 0 ? `${dataType}(${field.dataLen})` : dataType;\r\n }\r\n }\r\n\r\n function getFieldDefinition(field, index, fields) {\r\n const dataType = getDataType(field);\r\n const notNull = field.notNull ? ' NOT NULL' : ' NULL';\r\n const autoIncrement = field.autoIncrement ? ' AUTO_INCREMENT' : '';\r\n const defaultValue = field.defaultValue ? ` DEFAULT ${field.defaultValue}` : '';\r\n const comment = ` COMMENT '${it.func.strJoin(field.defName, field.intro, \";\", true)}'`;\r\n return `${field.defKey} ${dataType}${notNull}${autoIncrement}${defaultValue}${comment}${index < fields.length - 1 || pkList.length > 0 ? ',' : ''}`;\r\n }\r\n}}\r\nDROP TABLE IF EXISTS {{= tableKey }};\r\n\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\r\n {{= getFieldDefinition(field, index, it.fields) }}\r\n{{~}}\r\n{{? pkList.length > 0 }}\r\n CONSTRAINT {{= it.defKey}}_constraint_name PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i < pkList.length - 1 ? ',' : '' }}{{~}})\r\n{{?}}\r\n) COMMENT '{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}';\r\n",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let defName = it.baseUpdate.next.defName;\r\n let intro = it.baseUpdate.next.intro;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? isPrimaryKeyModified }}\r\nALTER TABLE {{= tableKey }} DROP CONSTRAINT {{= it.defKey}}_constraint_name;\r\n{{? indexFields && indexFields.length > 0 || defKey}}\r\nALTER TABLE {{= tableKey }} ADD CONSTRAINT {{= it.defKey}}_constraint_name PRIMARY KEY ({{~indexFields:field:i}}{{= field.defKey }}{{= i < indexFields.length-1 ? ',' : '' }}{{~}});\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\r\nCOMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(defName, intro, \";\", true)}}';\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{= tableKey }} RENAME TO {{=defKey}};{{?}}\r\n",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};",
+ "columnCreate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(dbDataType.toUpperCase() === 'TINYINT' ||\n dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'INTEGER' ||\n dbDataType.toUpperCase() === 'BIGINT' ||\n dbDataType.toUpperCase() === 'SMALLSERIAL' ||\n dbDataType.toUpperCase() === 'FLOAT' ||\n dbDataType.toUpperCase() === 'DOUBLE' ||\n dbDataType.toUpperCase() === 'BOOL' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'DATETIME' ||\n dbDataType.toUpperCase() === 'TIME' ||\n dbDataType.toUpperCase() === 'BLOB' ||\n dbDataType.toUpperCase() === 'CLOB' ||\n dbDataType.toUpperCase() === 'BINARY' ||\n dbDataType.toUpperCase().startsWith('INTERVAL')) {\n return dbDataType;\n } else if(dbDataType.toUpperCase() === 'NUMERIC') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 38) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n}}\nALTER TABLE {{= tableKey }} ADD COLUMN {{= field.defKey}} {{= finalDataType}} {{= field.autoIncrement ? 'AUTO_INCREMENT' : '' }}{{? field.notNull}} NOT NULL {{?}}{{? field.defaultValue}} DEFAULT {{= field.defaultValue}}{{?}} COMMENT '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{~}}",
+ "columnUpdate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(dbDataType.toUpperCase() === 'TINYINT' ||\n dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'INTEGER' ||\n dbDataType.toUpperCase() === 'BIGINT' ||\n dbDataType.toUpperCase() === 'SMALLSERIAL' ||\n dbDataType.toUpperCase() === 'FLOAT' ||\n dbDataType.toUpperCase() === 'DOUBLE' ||\n dbDataType.toUpperCase() === 'BOOL' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'DATETIME' ||\n dbDataType.toUpperCase() === 'TIME' ||\n dbDataType.toUpperCase() === 'BLOB' ||\n dbDataType.toUpperCase() === 'CLOB' ||\n dbDataType.toUpperCase() === 'BINARY' ||\n dbDataType.toUpperCase().startsWith('INTERVAL')) {\n return dbDataType;\n } else if(dbDataType.toUpperCase() === 'NUMERIC') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 38) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\n const finalDataType = computeDatatype(field);\n const preDefKey = field?.baseUpdate?.pre?.defKey;\n const nextDefKey = field?.baseUpdate?.next?.defKey;\n}}\n{{? updateKeys.includes('defKey') }}ALTER TABLE {{= tableKey }} RENAME COLUMN {{= preDefKey}} TO {{= nextDefKey}};{{?}}\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale' || item === 'autoIncrement') }}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} {{=finalDataType}};\n{{?}}\n{{? updateKeys.includes('notNull') }}ALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} {{? field.notNull }} SET {{??}} DROP {{?}} NOT NULL;{{?}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\nCOMMENT ON COLUMN {{= tableKey }}.{{= field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{?}}\n{{? updateKeys.includes('defaultValue') }}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} {{? field.defaultValue }} SET DEFAULT {{=field.defaultValue}}{{??}} DROP DEFAULT {{?}};\n{{?}}\n{{~}}",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\nALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE{{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }}(\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{? field.sortType && field.sortType.toUpperCase() === 'DESC'}} {{=field.sortType}}{{?}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX {{= tableKey }}.{{=row.defKey}};\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON {{= tableKey }}(\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{? field.sortType && field.sortType.toUpperCase() === 'DESC'}} {{=field.sortType}}{{?}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\n let indexesUpdate = it.indexesUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:i}}\nDROP INDEX {{= tableKey }}.{{=row.defKey}};\n{{~}}",
+ "metaTableQuery": "SELECT\r\n T.TABLE_NAME AS DEF_KEY,\r\n T.COMMENTS AS DEF_NAME,\r\n S.SCHEMA_NAME AS SCHEMA_NAME\r\nFROM DBA_TABLES T LEFT JOIN DBA_SCHEMAS S ON T.SCHEMA_ID = S.SCHEMA_ID\r\nAND S.SCHEMA_NAME IN (:schemaName)",
+ "metaColumnQuery": "SELECT\r\n TRIM(S.SCHEMA_NAME) AS SCHEMA_NAME,\r\n T.TABLE_NAME AS TBL_DEF_KEY,\r\n C.COL_NAME AS DEF_KEY,\r\n C.COMMENTS AS DEF_NAME,\r\n C.TYPE_NAME AS DB_DATA_TYPE,\r\n C.SCALE AS DATA_LEN,\r\n CASE WHEN C.NOT_NULL IS TRUE THEN 1 ELSE 0 END AS NOT_NULL,\r\n DEF_VAL AS default_value,\r\n IS_SERIAL AS auto_increment\r\nFROM DBA_TABLES T\r\n LEFT JOIN DBA_SCHEMAS S ON T.SCHEMA_ID = S.SCHEMA_ID\r\n LEFT JOIN DBA_COLUMNS C ON T.TABLE_ID = C.TABLE_ID\r\nWHERE TRIM(S.SCHEMA_NAME) IN (:schemaName) AND CONCAT(TRIM(S.SCHEMA_NAME), '.', TRIM(T.TABLE_NAME)) IN (:sysTableNames)\r\nORDER BY S.SCHEMA_NAME, TBL_DEF_KEY, C.COL_NO",
+ "metaIndexQuery": "SELECT DS.SCHEMA_NAME AS SCHEMA_NAME,\r\n DT.TABLE_NAME AS TBL_DEF_KEY,\r\n DC.COL_NAME AS COL_DEF_KEY,\r\n DI.INDEX_NAME AS DEF_KEY,\r\n DC.COL_NO AS ORDER_VALUE,\r\n '' AS DEF_NAME,\r\n '' AS DEF_NAME,\r\n CASE WHEN DI.IS_UNIQUE IS TRUE THEN 'UNIQUE' ELSE 'NORMAL' END AS TYPE,\r\n CASE\r\n WHEN INSTR(DI.KEYS, CONCAT('\"', DC.COL_NAME, '\" DESC')) > 0 THEN 'DESC'\r\n ELSE 'ASC'\r\n END AS SORT_TYPE\r\nFROM DBA_INDEXES DI\r\n LEFT JOIN DBA_TABLES DT ON DI.TABLE_ID = DT.TABLE_ID\r\n LEFT JOIN DBA_COLUMNS DC ON (DT.TABLE_ID = DC.TABLE_ID AND POSITION(DI.KEYS, DC.COL_NAME) != 0)\r\n LEFT JOIN DBA_SCHEMAS DS ON DT.SCHEMA_ID = DS.SCHEMA_ID\r\nWHERE TRIM(DS.SCHEMA_NAME) IN (:schemaName) AND CONCAT(TRIM(DS.SCHEMA_NAME), '.', TRIM(DT.TABLE_NAME)) IN (:sysTableNames) AND IS_PRIMARY = 0\r\nORDER BY DS.SCHEMA_NAME, TBL_DEF_KEY, DEF_KEY, ORDER_VALUE",
+ "metaQueryCharset": null,
+ "orderValue": 14,
+ "isEnabled": 0,
+ "id": "1K6TWWNW01802"
+ },
+ {
+ "defKey": "HighGo",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "HgdbJdbc-6.0.3.jre8.jar",
+ "jdbcReferDriver": "com.highgo.jdbc.Driver",
+ "jdbcReferUrl": "jdbc:highgo://[ip]:[port]/[database]",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n function formatDataType(field) {\r\n const supportedDataTypes = [\r\n 'SMALLINT',\r\n 'INTEGER',\r\n 'BIGINT',\r\n 'SMALLSERIAL',\r\n 'BIGSERIAL',\r\n 'REAL',\r\n 'DOUBLE PRECISION',\r\n 'DATE',\r\n 'TEXT',\r\n 'BYTEA',\r\n 'MONEY',\r\n 'BOOLEAN',\r\n 'SERIAL',\r\n 'JSON',\r\n 'INTERVAL'\r\n ];\r\n if (field.autoIncrement) {\r\n return field.dbDataType?.toUpperCase() === 'BIGINT' ? 'BIGSERIAL' : 'SERIAL';\r\n }\r\n if (supportedDataTypes.includes(field.dbDataType?.toUpperCase())) {\r\n return field.dbDataType;\r\n }\r\n if (field.dbDataType?.toUpperCase() === 'TIME' ||\r\n field.dbDataType?.toUpperCase() === 'TIMESTAMP') {\r\n if (field.dataLen && field.dataLen >= 0 && field.dataLen <= 6) {\r\n return `${field.dbDataType}(${field.dataLen})`;\r\n }\r\n return field.dbDataType;\r\n }\r\n if (field.dbDataType?.toUpperCase() === 'NUMERIC' ||\r\n field.dbDataType?.toUpperCase() === 'DECIMAL') {\r\n if (field.dataLen && field.dataLen >= 1 && field.dataLen <= 1000) {\r\n if (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen) {\r\n return `${field.dbDataType}(${field.dataLen},${field.numScale})`;\r\n }\r\n return `${field.dbDataType}(${field.dataLen})`;\r\n }\r\n return field.dbDataType;\r\n }\r\n if (field.dataLen && field.dataLen >= 0) {\r\n return `${field.dbDataType}(${field.dataLen})`;\r\n }\r\n return field.dbDataType;\r\n }\r\n}}\r\nDROP TABLE IF EXISTS {{= tableKey }};\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n {{~it.fields:field:index}}\r\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}{{=field.defKey}} {{= formatDataType(field) }}{{= field.notNull ? ' NOT NULL' : '' }}{{? !field.autoIncrement && field.defaultValue }} DEFAULT {{= field.defaultValue }}{{?}}{{= index < it.fields.length-1 || pkList.length>0 ? ',' : '' }}\r\n {{~}}\r\n {{? pkList.length > 0 }}PRIMARY KEY ({{= pkList.join(', ')}}){{?}}\r\n);\r\n\r\n\r\n{{~it.fields:field:index}}\r\n{{? field.defName || field.intro }}\r\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}\r\n\r\n{{? it.defName || it.intro }}\r\nCOMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}';\r\n{{?}}\r\n",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let defName = it.baseUpdate.next.defName;\r\n let intro = it.baseUpdate.next.intro;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? isPrimaryKeyModified }}\r\nDO $$\r\n DECLARE\r\n pk_constraint_name text;\r\n BEGIN\r\n SELECT constraint_name\r\n INTO pk_constraint_name\r\n FROM information_schema.table_constraints\r\n WHERE table_name = '{{=it.defKey}}' AND constraint_type = 'PRIMARY KEY'\r\n LIMIT 1;\r\n\r\n IF pk_constraint_name IS NOT NULL THEN\r\n EXECUTE 'ALTER TABLE {{= tableKey }} DROP CONSTRAINT ' || pk_constraint_name;\r\n ELSE\r\n RAISE NOTICE 'No primary key constraint found for the table.';\r\n END IF;\r\nEND $$;\r\n{{? indexFields && indexFields.length > 0}}\r\nALTER TABLE {{= tableKey }} ADD PRIMARY KEY ({{~indexFields:field:i}}\"{{= field.defKey }}\"{{= i < indexFields.length-1 ? ',' : '' }}{{~}});\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}COMMENT ON TABLE {{= tableKey }} IS '{{=it.func.strJoin(defName, intro, \";\", true)}}';{{?}}\r\n$blankline\r\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{= tableKey }} RENAME TO {{= defKey }};{{?}}\r\n",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};",
+ "columnCreate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(autoIncrement) {\n return dbDataType.toUpperCase() === 'BIGINT' ? 'BIGSERIAL' : 'SERIAL';\n }\n if(dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'INTEGER' ||\n dbDataType.toUpperCase() === 'BIGINT' ||\n dbDataType.toUpperCase() === 'SMALLSERIAL' ||\n dbDataType.toUpperCase() === 'BIGSERIAL' ||\n dbDataType.toUpperCase() === 'REAL' ||\n dbDataType.toUpperCase() === 'DOUBLE PRECISION' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'TEXT' ||\n dbDataType.toUpperCase() === 'BYTEA' ||\n dbDataType.toUpperCase() === 'MONEY' ||\n dbDataType.toUpperCase() === 'BOOLEAN' ||\n dbDataType.toUpperCase() === 'SERIAL' ||\n dbDataType.toUpperCase() === 'JSON' ||\n dbDataType.toUpperCase().startsWith('INTERVAL')) {\n return dbDataType;\n } else if(dbDataType.toUpperCase() === 'TIME' ||\n dbDataType.toUpperCase() === 'TIMESTAMP') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`; \n } else if(dbDataType.toUpperCase() === 'NUMERIC' || \n dbDataType.toUpperCase() === 'DECIMAL') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 1000) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType}(${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n}}\nALTER TABLE {{= tableKey }} ADD {{= field.defKey}} {{= finalDataType}}{{? field.notNull}} NOT NULL{{?}}{{? field.defaultValue}} DEFAULT {{= field.defaultValue}}{{?}};\n{{? field.defName || field.intro }}\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{?}}\n{{~}}",
+ "columnUpdate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(autoIncrement) {\n return dbDataType.toUpperCase() === 'BIGINT' ? 'BIGSERIAL' : 'SERIAL';\n }\n if(dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'INTEGER' ||\n dbDataType.toUpperCase() === 'BIGINT' ||\n dbDataType.toUpperCase() === 'SMALLSERIAL' ||\n dbDataType.toUpperCase() === 'BIGSERIAL' ||\n dbDataType.toUpperCase() === 'REAL' ||\n dbDataType.toUpperCase() === 'DOUBLE PRECISION' ||\n dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'TEXT' ||\n dbDataType.toUpperCase() === 'BYTEA' ||\n dbDataType.toUpperCase() === 'MONEY' ||\n dbDataType.toUpperCase() === 'BOOLEAN' ||\n dbDataType.toUpperCase() === 'SERIAL' ||\n dbDataType.toUpperCase() === 'JSON' ||\n dbDataType.toUpperCase().startsWith('INTERVAL')) {\n return dbDataType;\n } else if(dbDataType.toUpperCase() === 'TIME' ||\n dbDataType.toUpperCase() === 'TIMESTAMP') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`; \n } else if(dbDataType.toUpperCase() === 'NUMERIC' || \n dbDataType.toUpperCase() === 'DECIMAL') {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 1000) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType}(${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\n const finalDataType = computeDatatype(field);\n const preDefKey = field?.baseUpdate?.pre?.defKey;\n const nextDefKey = field?.baseUpdate?.next?.defKey;\n}}\n{{? updateKeys.includes('defKey') }}ALTER TABLE {{= tableKey }} RENAME COLUMN {{= preDefKey}} TO {{= nextDefKey}};{{?}}\n{{? updateKeys.includes('defaultValue') }}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}}{{? field.defaultValue }} SET DEFAULT {{=field.defaultValue}}{{??}} DROP DEFAULT{{?}};\n{{?}}\n{{? updateKeys.some((item) => item === 'dbDataType' || item === 'dataLen' || item === 'numScale' || item === 'autoIncrement') }}\nALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} SET DATA TYPE {{=finalDataType}} USING {{= field.defKey }}::{{=finalDataType}};\n{{?}}\n{{? updateKeys.includes('notNull') && field.notNull }}ALTER TABLE {{= tableKey }} ALTER COLUMN {{= field.defKey}} SET NOT NULL;{{?}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\nCOMMENT ON COLUMN {{= tableKey }}.{{=field.defKey}} IS '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{?}}\n{{~}}",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\nALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}} {{?}}INDEX {{=row.defKey}} ON {{= tableKey }}(\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n);\r\n{{?}}\r\n{{? row.defName || row.intro }}\r\nCOMMENT ON INDEX {{= schemaName }} {{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX IF EXISTS {{= schemaName }}{{? preDefKey}} {{= preDefKey}} {{??}} {{=row.defKey}} {{?}};\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}} {{?}} INDEX {{=row.defKey}} ON {{= tableKey }} (\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{=field.sortType}} {{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n);\n{{?}}\n{{? (row.defName || row.intro) && row.defKey && row.fields.length > 0}}\nCOMMENT ON INDEX {{= schemaName }}{{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}';\n{{?}}\n{{??}}\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') && row.fields.length > 0}}\nCOMMENT ON INDEX {{= schemaName }}{{=row.defKey}} IS '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}'\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\n let indexesUpdate = it.indexesUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:i}}\nDROP INDEX IF EXISTS {{= schemaName }}{{=row.defKey}};\n{{~}}",
+ "metaTableQuery": "SELECT c.relname AS def_key,\r\n CAST(obj_description(c.relfilenode, 'pg_class') AS varchar) AS def_name,\r\n n.nspname AS schema_name\r\nFROM pg_class AS c\r\n JOIN pg_tables AS b ON c.relname = b.tablename\r\n JOIN pg_namespace AS n ON b.schemaname = n.nspname AND c.relnamespace = n.oid\r\nWHERE b.schemaname IN (:schemaName);",
+ "metaColumnQuery": " -- select col.table_schema as schema_name, col.table_name as tbl_def_key, col.ordinal_position as order_value, col.column_name as def_key, d.description as def_name, col.udt_name as db_data_type,\r\n -- col.character_maximum_length as data_length, col.numeric_scale as num_scale, case when tc.constraint_type = 'PRIMARY KEY' then 1 else 0 end as primary_key, case when col.is_nullable = 'YES' then 0 else 1 end as not_null,\r\n -- col.column_default as default_value from information_schema.columns col\r\n -- inner join pg_class c on c.relname = col.table_name inner join pg_tables b on c.relname = b.tablename inner join pg_namespace n on b.schemaname = n.nspname and c.relnamespace = n.oid\r\n -- left join pg_description d on d.objoid = c.oid and d.objsubid = col.ordinal_position left join information_schema.key_column_usage tku on tku.table_name = col.table_name and tku.column_name = col.column_name left join information_schema.table_constraints tc on tc.constraint_name = tku.constraint_name\r\n -- where 1 = 1 and b.schemaname in (:schemaName) and CONCAT(TRIM(b.schemaname), '.', TRIM(col.table_name)) in (:sysTableNames) and CONCAT(TRIM(col.table_schema), '.', TRIM(col.table_name)) in (:sysTableNames)\r\n -- and col.table_schema in (:schemaName) order by col.table_schema asc, col.table_name asc, col.ordinal_position asc\r\n \r\n \r\nSELECT\r\n col.table_schema as schema_name,\r\n col.TABLE_NAME AS tbl_def_key,\r\n col.ordinal_position AS order_value,\r\n col.COLUMN_NAME AS def_key,\r\n d.description AS def_name,\r\n '' AS intro,\r\n col.udt_name AS db_data_type,\r\n CASE WHEN col.character_maximum_length IS NULL AND col.numeric_precision IS NOT NULL THEN col.numeric_precision\r\n ELSE col.character_maximum_length\r\n END AS data_len,\r\n CASE WHEN col.numeric_precision IS NOT NULL THEN (CASE WHEN col.numeric_scale = 0 THEN NULL ELSE col.numeric_scale END)\r\n ELSE NULL\r\n END AS num_scale,\r\n CASE WHEN kc.column_name IS NOT NULL THEN 1 ELSE 0 END AS primary_key,\r\n CASE WHEN col.IS_NULLABLE = 'NO' THEN 1 ELSE 0 END AS not_null,\r\n CASE WHEN col.COLUMN_DEFAULT LIKE 'nextval%' THEN 1 ELSE 0 END AS auto_increment,\r\n -- substr(col.column_default,0,strpos(col.column_default, concat('::',col.data_type))) AS default_value\r\n CASE\r\n WHEN strpos(col.column_default, concat('::',col.data_type)) = 0 THEN (CASE\r\n WHEN col.column_default LIKE 'nextval%' THEN ''\r\n ELSE col.column_default\r\n END)\r\n ELSE substr(col.column_default,0,strpos(col.column_default, concat('::',col.data_type)))\r\n END AS default_value\r\nFROM\r\n information_schema.COLUMNS col LEFT JOIN (information_schema.key_column_usage kc LEFT JOIN information_schema.table_constraints tc\r\n ON\r\n kc.constraint_name = tc.constraint_name\r\n and tc.constraint_type = 'PRIMARY KEY'\r\n and kc.table_schema=tc.table_schema\r\n and kc.table_name=tc.table_schema\r\n ) ON\r\n col.TABLE_NAME = kc.table_name\r\n AND col.COLUMN_NAME = kc.column_name AND kc.table_schema = col.table_schema\r\n LEFT JOIN pg_class C ON C.relname = col.TABLE_NAME\r\n LEFT JOIN pg_namespace n ON col.table_schema = n.nspname AND c.relnamespace = n.oid\r\n LEFT JOIN pg_description d ON d.objoid = C.oid AND d.objsubid = col.ordinal_position\r\nWHERE\r\n col.table_schema IN (:schemaName)\r\n AND nspName IN (:schemaName)\r\n AND CONCAT(col.table_schema, '.', col.TABLE_NAME) IN (:sysTableNames)\r\nORDER BY\r\n col.table_schema asc, col.TABLE_NAME asc,col.ordinal_position ASC\r\n ",
+ "metaIndexQuery": "SELECT ns.nspname AS schema_name,\r\n t.relname AS tbl_def_key,\r\n a.attname AS col_def_key,\r\n d.description AS def_name,\r\n d.description AS intro,\r\n CASE\r\n WHEN ix.indoption[array_position(ix.indkey, a.attnum) - 1] & 1 = 0 THEN 'ASC'\r\n ELSE 'DESC'\r\n END AS sort_type,\r\n CASE\r\n WHEN ix.indisunique THEN 'UNIQUE'\r\n ELSE 'NORMAL'\r\n END AS type,\r\n array_position(ix.indkey, a.attnum) AS order_value,\r\n idx.relname AS def_key\r\nFROM pg_class t\r\n JOIN\r\n pg_namespace ns ON ns.oid = t.relnamespace\r\n JOIN\r\n pg_index ix ON t.oid = ix.indrelid\r\n JOIN\r\n pg_class idx ON ix.indexrelid = idx.oid\r\n JOIN\r\n unnest(ix.indkey) WITH ORDINALITY AS key_col(attnum, ord) ON true\r\n JOIN\r\n pg_attribute a ON t.oid = a.attrelid AND a.attnum = key_col.attnum\r\n LEFT JOIN\r\n pg_description d ON idx.oid = d.objoid\r\nWHERE ns.nspname IN (:schemaName)\r\n AND CONCAT(TRIM(ns.nspname), '.', TRIM(t.relname)) IN (:sysTableNames)\r\n AND indisprimary = false\r\nORDER BY ns.nspname, \r\n tbl_def_key,\r\n def_key",
+ "metaQueryCharset": null,
+ "orderValue": 15,
+ "isEnabled": 0,
+ "id": "1K6TXL42H1802"
+ },
+ {
+ "defKey": "Hive",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "hive-jdbc-3.1.2-standalone.jar;mysql-connector-j-8.3.0.jar;postgresql-42.7.3.jar;",
+ "jdbcReferDriver": "org.apache.hive.jdbc.HiveDriver",
+ "jdbcReferUrl": "jdbc:hive2://[ip]:[port]",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n function addField(field, pkList) {\r\n let fieldStr = `${field.defKey} ${field.dbDataType}`;\r\n if (['VARCHAR', 'CHAR'].includes(field.dbDataType?.toUpperCase())) {\r\n fieldStr += `(${field.dataLen ? field.dataLen : 128})`;\r\n } else if (field.dbDataType?.toUpperCase() === 'DECIMAL' && field.dataLen && field.dataLen >= 1 && field.dataLen <= 38) {\r\n if (field.numScale && field.numScale >= 0 && field.numScale <= field.dataLen) {\r\n fieldStr += `(${field.dataLen},${field.numScale})`;\r\n } else {\r\n fieldStr += `(${field.dataLen})`;\r\n }\r\n }\r\n if (field.defName || field.intro) {\r\n fieldStr += ` COMMENT '${it.func.strJoin(field.defName, field.intro, \";\", true)}'`;\r\n }\r\n if (field.primaryKey) {\r\n pkList.push(field.defKey);\r\n }\r\n return `${fieldStr}${index < it.fields.length - 1 ? ',' : ''}`;\r\n }\r\n}}\r\n\r\nDROP TABLE IF EXISTS {{= tableKey }};\r\n\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; }}\r\n{{~it.fields:field:index}}\r\n {{= addField(field, pkList) }}{{~}}{{? pkList.length > 0 }},\r\n CONSTRAINT {{= it.defKey}}_constraint_name PRIMARY KEY ({{= pkList.join(', ')}}) DISABLE NOVALIDATE{{?}}\r\n);\r\n$blankline\r\n\r\n{{? it.defName || it.intro }}\r\nALTER TABLE {{= tableKey }} SET TBLPROPERTIES ('comment' = '{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}');\r\n{{?}}\r\n$blankline\r\n\r\n\r\n",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let defName = it.baseUpdate.next.defName;\r\n let intro = it.baseUpdate.next.intro;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? isPrimaryKeyModified }}\r\nALTER TABLE {{= tableKey }} DROP CONSTRAINT {{= it.defKey}}_constraint_name;\r\n{{? indexFields && indexFields.length > 0 || defKey}}\r\nALTER TABLE {{= tableKey }} ADD CONSTRAINT {{= it.defKey}}_constraint_name PRIMARY KEY ({{~indexFields:field:i}}{{= field.defKey }}{{= i < indexFields.length-1 ? ',' : '' }}{{~}}) DISABLE NOVALIDATE;\r\n{{?}}\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\r\nALTER TABLE {{= tableKey }} SET TBLPROPERTIES ('comment' = '{{=it.func.strJoin(defName, intro, \";\", true)}}');\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{= tableKey }} RENAME TO {{=defKey}};{{?}}\r\n",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};",
+ "columnCreate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(dbDataType.toUpperCase() === 'VARCHAR' ||\n dbDataType.toUpperCase() === 'CHAR') {\n return `${dbDataType} (${dataLen ? dataLen : '128'})`; \n } else if(dbDataType.toUpperCase() === 'DECIMAL' ) {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 38) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n}}\nALTER TABLE {{= tableKey }} ADD COLUMNS ({{= field.defKey}} {{= finalDataType}}{{? field.defName || field.intro }} COMMENT '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}'{{?}});\n{{~}}",
+ "columnUpdate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(dbDataType.toUpperCase() === 'VARCHAR' ||\n dbDataType.toUpperCase() === 'CHAR') {\n return `${dbDataType} (${dataLen ? dataLen : '128'})`; \n } else if(dbDataType.toUpperCase() === 'DECIMAL' ) {\n return `${dbDataType} ${(dataLen && dataLen >= 1 && dataLen <= 38) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{\n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\n const finalDataType = computeDatatype(field);\n const preDefKey = field?.baseUpdate?.pre?.defKey;\n const nextDefKey = field?.baseUpdate?.next?.defKey;\n}}\nALTER TABLE {{= tableKey }} CHANGE {{= preDefKey || field.defKey}} {{= nextDefKey || field.defKey}} {{= finalDataType}} COMMENT '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}';\n{{~}}",
+ "columnDelete": null,
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields.length > 0 && row.defKey}}\r\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}}{{?}} INDEX {{=row.defKey}} ON TABLE {{= tableKey }} (\r\n {{~row.fields:field:idx}}\r\n {{=field.fieldDefKey}} {{= idx < row.fields.length - 1 ? ',' : ''}}\r\n {{~}}\r\n) AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'\r\nWITH DEFERRED REBUILD {{? row.defName || row.intro }} COMMENT '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}'{{?}};\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n const updateKeys = row?.baseUpdate?.updateKeys?.split(\",\") || [];\n const fieldsUpdate = row.fieldsUpdate || [];\n const preDefKey = row?.baseUpdate?.pre?.defKey;\n \n}}\n{{? updateKeys.some((item) => item === 'defKey' || item === 'type') || fieldsUpdate.length > 0 }}\nDROP INDEX IF EXISTS {{=row.defKey}} ON {{= tableKey }};\n{{? row.fields.length > 0 && row.defKey}}\nCREATE {{? row.type.toUpperCase() === 'UNIQUE'}}{{=row.type}}{{?}} INDEX {{=row.defKey}} ON TABLE {{= tableKey }} (\n {{~row.fields:field:idx}}\n {{=field.fieldDefKey}} {{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n) AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'\nWITH DEFERRED REBUILD {{? row.defName || row.intro }} COMMENT '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}' {{?}};\n{{?}}\n{{?}}\n{{~}}",
+ "indexDelete": "{{\n let indexesUpdate = it.indexesUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:i}}\nDROP INDEX IF EXISTS {{=row.defKey}} ON {{= tableKey }};\n{{~}}",
+ "metaTableQuery": "SELECT\r\n tbl.\"TBL_NAME\" AS def_key -- 表名\r\n ,tbl_params.\"PARAM_VALUE\" AS def_name -- 表注释\r\n ,db.\"NAME\" AS schema_name -- 数据库名\r\nFROM\r\n \"SDS\" SDS\r\n LEFT JOIN \"TBLS\" tbl ON sds.\"SD_ID\" = tbl.\"SD_ID\"\r\n LEFT JOIN \"TABLE_PARAMS\" tbl_params ON tbl.\"TBL_ID\" = tbl_params.\"TBL_ID\" AND tbl_params.\"PARAM_KEY\" = 'comment'\r\n LEFT JOIN \"PARTITION_KEYS\" partkey ON tbl.\"TBL_ID\" = partkey.\"TBL_ID\"\r\n LEFT JOIN \"DBS\" db ON tbl.\"DB_ID\" = db.\"DB_ID\" -- 过滤数据库\r\nWHERE\r\n tbl.\"TBL_NAME\" IS NOT NULL\r\n AND db.\"NAME\" IN (:schemaName)\r\n AND tbl.\"TBL_TYPE\" = 'MANAGED_TABLE'-- 只查询MANAGED_TABLE类型的表",
+ "metaColumnQuery": "SELECT\r\n tbl.\"TBL_NAME\" AS tbl_def_key -- 表名\r\n ,tbl_params.\"PARAM_VALUE\" AS tbl_comment -- 表注释\r\n ,col.\"COLUMN_NAME\" AS def_key -- 字段名称\r\n ,col.\"COMMENT\" AS def_name -- 字段注释\r\n ,col.\"TYPE_NAME\" AS db_data_type -- 字段类型\r\n ,db.\"NAME\" AS schema_name\r\nFROM\r\n \"SDS\" sds\r\n LEFT JOIN \"TBLS\" tbl ON sds.\"SD_ID\" = tbl.\"SD_ID\"\r\n LEFT JOIN \"TABLE_PARAMS\" tbl_params ON tbl.\"TBL_ID\" = tbl_params.\"TBL_ID\" AND tbl_params.\"PARAM_KEY\" = 'comment'\r\n LEFT JOIN \"PARTITION_KEYS\" partkey ON tbl.\"TBL_ID\" = partkey.\"TBL_ID\"\r\n LEFT JOIN \"DBS\" db ON tbl.\"DB_ID\" = db.\"DB_ID\"\r\n LEFT JOIN \"COLUMNS_V2\" col ON sds.\"CD_ID\" = col.\"CD_ID\" -- 过滤数据库\r\nWHERE\r\n tbl.\"TBL_NAME\" IS NOT NULL\r\n AND db.\"NAME\" IN (:schemaName)\r\n AND CONCAT(TRIM(db.\"NAME\"), '.', TRIM(tbl.\"TBL_NAME\")) IN (:sysTableNames)\r\nORDER BY schema_name ASC, tbl_def_key ASC",
+ "metaIndexQuery": "SELECT\n tbl.\"TBL_NAME\" AS TBL_DEF_KEY\n ,sort.\"COLUMN_NAME\" AS COL_DEF_KEY\n , i.\"INDEX_NAME\" AS DEF_KEY\n , params.\"PARAM_VALUE\" AS DEF_NAME\n , '' AS INTRO\n , '' AS SORT_TYPE\n , '' AS TYPE\n , sort.\"INTEGER_IDX\" AS ORDER_VALUE\n , db.\"NAME\" AS SCHEMA_NAME\nFROM\n \"SDS\" SDS\n LEFT JOIN \"TBLS\" tbl ON sds.\"SD_ID\" = tbl.\"SD_ID\"\n LEFT JOIN \"DBS\" db ON tbl.\"DB_ID\" = db.\"DB_ID\" -- 过滤数据库\n INNER JOIN \"IDXS\" i ON tbl.\"TBL_ID\" = i.\"ORIG_TBL_ID\"\n INNER JOIN \"SORT_COLS\" sort ON i.\"SD_ID\" = sort.\"SD_ID\"\n INNER JOIN \"INDEX_PARAMS\" params ON i.\"INDEX_ID\" = params.\"INDEX_ID\" and params.\"PARAM_KEY\" = 'comment'\nWHERE\n tbl.\"TBL_NAME\" IS NOT NULL\n AND db.\"NAME\" IN (:schemaName)\n AND CONCAT(TRIM(db.\"NAME\"), '.', TRIM(tbl.\"TBL_NAME\")) IN (:sysTableNames)\nORDER BY SCHEMA_NAME, TBL_DEF_KEY, DEF_KEY, ORDER_VALUE ;",
+ "metaQueryCharset": null,
+ "orderValue": 16,
+ "isEnabled": 0,
+ "id": "BPMCJTYLY4UAC"
+ },
+ {
+ "defKey": "Doris",
+ "defName": null,
+ "icon": "",
+ "driverFiles": "mysql-connector-j-8.3.0.jar",
+ "jdbcReferDriver": "com.mysql.cj.jdbc.Driver",
+ "jdbcReferUrl": "jdbc:mysql://[ip]:[port]",
+ "tableCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n\r\n function getDataType(field) {\r\n const { dbDataType } = field;\r\n if(!dbDataType) {\r\n return ''\r\n }\r\n const dataType = dbDataType.toUpperCase();\r\n if (dataType === 'VARCHAR') {\r\n return `${dataType}(${field.dataLen ? field.dataLen : 128})`;\r\n } else if (['JSON','DATE'].includes(dataType)) {\r\n return dataType;\r\n } else if (dataType === 'TIMESTAMP') {\r\n return field.dataLen && field.dataLen >= 0 && field.dataLen <= 9 ? `${dataType}(${field.dataLen})` : dataType;\r\n } else if (dataType === 'DECIMAL') {\r\n return field.dataLen && field.dataLen >= 0 && field.dataLen <= 6 ? `${dataType}(${field.dataLen})` : dataType;\r\n } else {\r\n return field.dataLen && field.dataLen >= 0 ? `${dataType}(${field.dataLen})` : dataType;\r\n }\r\n }\r\n\r\n function getFieldDefinition(field, index, fields) {\r\n const dataType = getDataType(field);\r\n const notNull = field.notNull ? ' NOT NULL' : '';\r\n const defaultValue = field.defaultValue ? ` DEFAULT ${field.defaultValue}` : '';\r\n const comment = ` COMMENT '${it.func.strJoin(field.defName, field.intro, \";\", true)}'`;\r\n return `${dataType}${notNull}${defaultValue}${comment}${index < nonPkList.length-1 ? ',' : ''}`;\r\n }\r\n}}\r\nDROP TABLE IF EXISTS {{= tableKey }};\r\n\r\nCREATE TABLE {{= tableKey }}(\r\n{{ pkList = [] ; nonPkList = [] ; }}\r\n{{~it.fields:field:index}}{{? field.primaryKey }}{{ pkList.push(field) }}{{??}}{{ nonPkList.push(field) }}{{?}}{{~}}\r\n{{~pkList:field:index}}\r\n `{{=field.defKey}}` {{= getFieldDefinition(field, index, it.fields) }}{{?}}\r\n{{~nonPkList:field:index}}\r\n `{{=field.defKey}}` {{= getFieldDefinition(field, index, it.fields) }}{{?}}\r\n{{~}}\r\n){{? pkList.length > 0 }} UNIQUE KEY ({{~pkList:field:index}}`{{= field.defKey }}`{{= index < pkList.length-1 ? ',' : '' }}{{~}}){{?}}\r\n{{? it.defName || it.intro }} \r\n COMMENT '{{=it.func.strJoin(it.defName, it.intro, \";\", true)}}' \r\n{{?}}\r\n DISTRIBUTED BY HASH(`{{=pkList.length > 0 ? pkList[0].defKey : it.fields[0].defKey}}`) BUCKETS 1\r\n PROPERTIES(\r\n \"replication_allocation\" = \"tag.location.default: 1\"\r\n );\r\n$blankline\r\n",
+ "tableUpdate": "{{\r\n let defKey = it.baseUpdate.next.defKey;\r\n let defName = it.baseUpdate.next.defName;\r\n let intro = it.baseUpdate.next.intro;\r\n let indexFields = it.indexFields;\r\n let isPrimaryKeyModified = it.isPrimaryKeyModified;\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n const updateKeys = it?.baseUpdate?.updateKeys?.split(\",\") || [];\r\n}}\r\n{{? updateKeys.some((item) => item === 'defName' || item === 'intro') }}\r\nALTER TABLE {{= tableKey }} MODIFY COMMENT '{{=it.func.strJoin(defName, intro, \";\", true)}}';\r\n{{?}}\r\n{{? updateKeys.some((item) => item === 'defKey') }}ALTER TABLE {{= tableKey }} RENAME {{=defKey}};{{?}}\r\n",
+ "tableDelete": "{{\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\nDROP TABLE IF EXISTS {{= tableKey }};",
+ "columnCreate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase() === 'VARCHAR' ||\n dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'BIGINT') {\n return `${dbDataType} ${dataLen ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'JSON') {\n return dbDataType; \n } else if(dbDataType.toUpperCase() === 'DECIMAL') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'DATETIME') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 38) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 9) ? `(${dataLen})` : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n \n}}\n{{~fieldsUpdate:field:index}}\n{{\n const finalDataType = computeDatatype(field);\n}}\nALTER TABLE {{= tableKey }} ADD COLUMN {{= field.defKey}} {{= finalDataType}}{{= field.autoIncrement ? ' AUTO_INCREMENT ' : '' }}{{? field.notNull}} NOT NULL {{?}}{{? field.defaultValue}} DEFAULT {{= field.defaultValue}}{{?}}{{? field.defName || field.intro }} COMMENT '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}'{{?}};\n{{~}}",
+ "columnUpdate": "{{\n let fieldsUpdate = it.fieldsUpdate;\n const computeDatatype = (field) => {\n const { dbDataType, dataLen, numScale, defaultValue, autoIncrement } = field;\n if(!dbDataType) {\n return '';\n }\n if(dbDataType.toUpperCase() === 'INT' ||\n dbDataType.toUpperCase() === 'VARCHAR' ||\n dbDataType.toUpperCase() === 'SMALLINT' ||\n dbDataType.toUpperCase() === 'BIGINT') {\n return `${dbDataType} ${dataLen ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'DATE' ||\n dbDataType.toUpperCase() === 'JSON') {\n return dbDataType; \n } else if(dbDataType.toUpperCase() === 'DECIMAL') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 6) ? `(${dataLen})` : ''}`;\n } else if(dbDataType.toUpperCase() === 'DATETIME') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 38) ? ((numScale && numScale >= 0 && numScale <= dataLen) ? `(${dataLen},${numScale})` : `(${dataLen})` ) : ''}`;\n } else if(dbDataType.toUpperCase() === 'TIMESTAMP') {\n return `${dbDataType} ${(dataLen && dataLen >= 0 && dataLen <= 9) ? `(${dataLen})` : ''}`;\n } else if(dataLen && dataLen >= 0) {\n return `${dbDataType} (${dataLen})`;\n }\n return dbDataType;\n };\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\n{{ \n const updateKeys = field?.baseUpdate?.updateKeys?.split(\",\") || [];\n const finalDataType = computeDatatype(field);\n const preDefKey = field?.baseUpdate?.pre?.defKey;\n const nextDefKey = field?.baseUpdate?.next?.defKey;\n}}\n{{? updateKeys.includes('defKey')}}\nALTER TABLE {{= tableKey }} RENAME COLUMN {{=preDefKey}} {{=field.defKey}};;\n{{?}}\n{{? updateKeys.includes('defaultValue')}}\nALTER TABLE {{= tableKey }} ALTER COLUMN `{{=field.defKey}}` SET DEFAULT {{=field.defaultValue}};\n{{?}}\nALTER TABLE {{= tableKey }} MODIFY COLUMN `{{=field.defKey}}` {{=finalDataType}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT ' : '' }}{{? field.defaultValue }} DEFAULT {{=field.defaultValue}}{{?}}{{? field.defName || field.intro }} COMMENT '{{=it.func.strJoin(field.defName, field.intro, \";\", true)}}'{{?}};\n{{~}}\n",
+ "columnDelete": "{{\n let fieldsUpdate = it.fieldsUpdate; \n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~fieldsUpdate:field:index}}\nALTER TABLE {{= tableKey }} DROP COLUMN {{=field.defKey}};\n{{~}}",
+ "indexCreate": "{{\r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~it.indexes:row:index}}\r\n{{? row.fields && row.fields.length === 1 && row.defKey}}\r\nALTER TABLE {{= tableKey }} ADD INDEX {{=row.defKey}} ({{~row.fields:field:idx}} {{=field.fieldDefKey}} {{~}}) {{? row.defName || row.intro }} COMMENT '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}'{{?}};\r\n{{?}}\r\n{{~}}\r\n",
+ "indexUpdate": "{{ \n let indexesUpdate = it.indexesUpdate;\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\n const tableKey = `${schemaName}${it.defKey}`;\n}}\n{{~indexesUpdate:row:index}}\n{{\n let updateKeys = row.baseUpdate.updateKeys.split(',');\n let preDefKey = row.baseUpdate.pre.defKey;\n}}\nALTER TABLE {{=it.defKey}}\nDROP INDEX {{= schemaName }}{{? updateKeys.includes('defKey')}}{{=preDefKey}}{{??}}{{=row.defKey}}{{?}}, \nADD {{? row.type.toUpperCase() === 'UNIQUE'}} {{=row.type}} {{?}} INDEX {{= schemaName }}{{=row.defKey}}(\n {{~row.fields:field:idx}}\n `{{=field.fieldDefKey}}` {{=field.sortType}}{{= idx < row.fields.length - 1 ? ',' : ''}}\n {{~}}\n){{? row.defName || row.intro }}COMMENT '{{=it.func.strJoin(row.defName, row.intro, \";\", true)}}'{{?}};\n{{~}}",
+ "indexDelete": "{{\r\n let indexesUpdate = it.indexesUpdate; \r\n let schemaName = it.schemaName ? `${it.schemaName}.` : '';\r\n const tableKey = `${schemaName}${it.defKey}`;\r\n}}\r\n{{~indexesUpdate:index:i}}\r\nDROP INDEX {{=index.defKey}} ON {{= tableKey }};\r\n{{~}}",
+ "metaTableQuery": "SELECT\n null AS id,\n table_name AS def_key,\n table_comment AS def_name,\n table_schema AS schema_name\nFROM\n information_schema.tables\nWHERE table_type = 'BASE TABLE'\n and table_schema IN (:schemaName)",
+ "metaColumnQuery": "SELECT\n table_schema AS schema_name,\n table_name AS tbl_def_key,\n ordinal_position as order_value,\n column_name AS def_key,\n column_comment AS def_name,\n '' AS intro,\n data_type AS db_data_type,\n IF(data_type = column_type,NULL,COALESCE ( character_maximum_length, numeric_precision )) AS data_len,\n IF(data_type = column_type, NULL, numeric_scale ) AS num_scale,\n IF(column_key = 'PRI', 1, 0 ) AS primary_key,\n IF(is_nullable = 'YES', 0, 1 ) AS not_null,\n IF(extra = 'AUTO_INCREMENT', 1, 0 ) AS auto_increment,\n column_default AS default_value\nFROM\n information_schema.COLUMNS\nWHERE\n table_schema IN (:schemaName)\n and CONCAT(table_schema, '.', table_name) in (:sysTableNames)\nORDER BY\n table_schema ASC,\n table_name ASC,\n ordinal_position ASC",
+ "metaIndexQuery": "SELECT TABLE_NAME AS TBL_DEF_KEY,\r\n COLUMN_NAME AS COL_DEF_KEY,\r\n INDEX_COMMENT AS DEF_NAME,\r\n COMMENT AS INTRO,\r\n IF (COLLATION = 'A', 'ASC', 'DESC') AS SORT_TYPE,\r\n IF (NON_UNIQUE = 1, 'NORMAL', 'UNIQUE') AS TYPE,\r\n SEQ_IN_INDEX AS ORDER_VALUE,\r\n INDEX_NAME AS DEF_KEY FROM information_schema.STATISTICS\r\nWHERE INDEX_SCHEMA IN (:schemaName) AND CONCAT(TRIM(INDEX_SCHEMA), '.', TRIM(TABLE_NAME)) IN (:sysTableNames) AND INDEX_NAME != 'PRIMARY'\r\nORDER BY TBL_DEF_KEY, DEF_KEY, ORDER_VALUE",
+ "metaQueryCharset": null,
+ "orderValue": 17,
+ "isEnabled": 0,
+ "id": "BPQHE5O6A64AC"
+ },
+ {
+ "defKey": "StarRocks",
+ "defName": null,
+ "icon": "