@l-v-yonsama/multi-platform-database-drivers 0.14.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -3
- package/built/src/drivers/Auth0Driver.d.ts +3 -3
- package/built/src/drivers/Auth0Driver.js +10 -10
- package/built/src/drivers/Auth0Driver.js.map +1 -1
- package/built/src/drivers/AwsDriver.d.ts +2 -2
- package/built/src/drivers/AwsDriver.js +2 -2
- package/built/src/drivers/AwsDriver.js.map +1 -1
- package/built/src/drivers/BaseDriver.d.ts +2 -2
- package/built/src/drivers/BaseSQLSupportDriver.d.ts +2 -2
- package/built/src/drivers/DBDriverResolver.js +4 -0
- package/built/src/drivers/DBDriverResolver.js.map +1 -1
- package/built/src/drivers/KeycloakDriver.d.ts +3 -3
- package/built/src/drivers/KeycloakDriver.js +8 -8
- package/built/src/drivers/KeycloakDriver.js.map +1 -1
- package/built/src/drivers/MemcacheDriver.d.ts +3 -3
- package/built/src/drivers/MemcacheDriver.js +10 -9
- package/built/src/drivers/MemcacheDriver.js.map +1 -1
- package/built/src/drivers/MqttDriver.d.ts +5 -3
- package/built/src/drivers/MqttDriver.js +56 -5
- package/built/src/drivers/MqttDriver.js.map +1 -1
- package/built/src/drivers/MySQLDriver.d.ts +2 -2
- package/built/src/drivers/MySQLDriver.js +7 -3
- package/built/src/drivers/MySQLDriver.js.map +1 -1
- package/built/src/drivers/OracleDriver.d.ts +54 -0
- package/built/src/drivers/OracleDriver.js +566 -0
- package/built/src/drivers/OracleDriver.js.map +1 -0
- package/built/src/drivers/PostgresDriver.d.ts +2 -2
- package/built/src/drivers/PostgresDriver.js +5 -2
- package/built/src/drivers/PostgresDriver.js.map +1 -1
- package/built/src/drivers/RDSBaseDriver.js +1 -1
- package/built/src/drivers/RDSBaseDriver.js.map +1 -1
- package/built/src/drivers/RedisDriver.d.ts +4 -4
- package/built/src/drivers/RedisDriver.js +4 -4
- package/built/src/drivers/RedisDriver.js.map +1 -1
- package/built/src/drivers/SQLServerDriver.d.ts +2 -2
- package/built/src/drivers/SQLServerDriver.js +5 -4
- package/built/src/drivers/SQLServerDriver.js.map +1 -1
- package/built/src/drivers/SQLiteDriver.d.ts +2 -2
- package/built/src/drivers/SQLiteDriver.js +9 -2
- package/built/src/drivers/SQLiteDriver.js.map +1 -1
- package/built/src/drivers/aws/AwsCloudwatchServiceClient.d.ts +7 -5
- package/built/src/drivers/aws/AwsCloudwatchServiceClient.js +14 -15
- package/built/src/drivers/aws/AwsCloudwatchServiceClient.js.map +1 -1
- package/built/src/drivers/aws/AwsDynamoServiceClient.d.ts +2 -4
- package/built/src/drivers/aws/AwsDynamoServiceClient.js +0 -5
- package/built/src/drivers/aws/AwsDynamoServiceClient.js.map +1 -1
- package/built/src/drivers/aws/AwsS3ServiceClient.d.ts +3 -3
- package/built/src/drivers/aws/AwsS3ServiceClient.js +6 -6
- package/built/src/drivers/aws/AwsS3ServiceClient.js.map +1 -1
- package/built/src/drivers/aws/AwsSQSServiceClient.d.ts +3 -3
- package/built/src/drivers/aws/AwsSQSServiceClient.js +5 -4
- package/built/src/drivers/aws/AwsSQSServiceClient.js.map +1 -1
- package/built/src/drivers/index.d.ts +1 -0
- package/built/src/drivers/index.js +1 -0
- package/built/src/drivers/index.js.map +1 -1
- package/built/src/helpers/ProposalHelper.d.ts +5 -0
- package/built/src/helpers/ProposalHelper.js +275 -0
- package/built/src/helpers/ProposalHelper.js.map +1 -0
- package/built/src/helpers/SQLHelper.d.ts +5 -10
- package/built/src/helpers/SQLHelper.js +37 -397
- package/built/src/helpers/SQLHelper.js.map +1 -1
- package/built/src/helpers/index.d.ts +2 -0
- package/built/src/helpers/index.js +2 -0
- package/built/src/helpers/index.js.map +1 -1
- package/built/src/helpers/prompts/Auth0PromptHelper.d.ts +2 -0
- package/built/src/helpers/prompts/Auth0PromptHelper.js +45 -0
- package/built/src/helpers/prompts/Auth0PromptHelper.js.map +1 -0
- package/built/src/helpers/prompts/AwsPromptHelper.d.ts +6 -0
- package/built/src/helpers/prompts/AwsPromptHelper.js +200 -0
- package/built/src/helpers/prompts/AwsPromptHelper.js.map +1 -0
- package/built/src/helpers/prompts/KeycloakPromptHelper.d.ts +2 -0
- package/built/src/helpers/prompts/KeycloakPromptHelper.js +38 -0
- package/built/src/helpers/prompts/KeycloakPromptHelper.js.map +1 -0
- package/built/src/helpers/prompts/MemcachePromptHelper.d.ts +2 -0
- package/built/src/helpers/prompts/MemcachePromptHelper.js +31 -0
- package/built/src/helpers/prompts/MemcachePromptHelper.js.map +1 -0
- package/built/src/helpers/prompts/MqttPromptHelper.d.ts +2 -0
- package/built/src/helpers/prompts/MqttPromptHelper.js +31 -0
- package/built/src/helpers/prompts/MqttPromptHelper.js.map +1 -0
- package/built/src/helpers/prompts/RdsPromptHelper.d.ts +7 -0
- package/built/src/helpers/prompts/RdsPromptHelper.js +164 -0
- package/built/src/helpers/prompts/RdsPromptHelper.js.map +1 -0
- package/built/src/helpers/prompts/RedisPromptHelper.d.ts +2 -0
- package/built/src/helpers/prompts/RedisPromptHelper.js +22 -0
- package/built/src/helpers/prompts/RedisPromptHelper.js.map +1 -0
- package/built/src/helpers/prompts/SchemaPromptHelper.d.ts +2 -0
- package/built/src/helpers/prompts/SchemaPromptHelper.js +82 -0
- package/built/src/helpers/prompts/SchemaPromptHelper.js.map +1 -0
- package/built/src/helpers/prompts/index.d.ts +8 -0
- package/built/src/helpers/prompts/index.js +12 -0
- package/built/src/helpers/prompts/index.js.map +1 -0
- package/built/src/helpers/prompts/promptFormatUtils.d.ts +1 -0
- package/built/src/helpers/prompts/promptFormatUtils.js +8 -0
- package/built/src/helpers/prompts/promptFormatUtils.js.map +1 -0
- package/built/src/resource/DbResource.d.ts +3 -1
- package/built/src/resource/DbResource.js +3 -0
- package/built/src/resource/DbResource.js.map +1 -1
- package/built/src/types/drivers/ScanParams.d.ts +66 -8
- package/built/src/types/helpers/index.d.ts +40 -2
- package/built/src/types/helpers/index.js.map +1 -1
- package/built/src/types/resource/AwsDynamoTableAttributes.d.ts +1 -0
- package/built/src/types/resource/ConnectionSetting.d.ts +22 -0
- package/built/src/types/resource/ConnectionSetting.js +13 -0
- package/built/src/types/resource/ConnectionSetting.js.map +1 -1
- package/built/src/types/resource/DBType.d.ts +2 -1
- package/built/src/types/resource/DBType.js +1 -0
- package/built/src/types/resource/DBType.js.map +1 -1
- package/built/src/types/resource/OracleColumnType.d.ts +30 -0
- package/built/src/types/resource/OracleColumnType.js +74 -0
- package/built/src/types/resource/OracleColumnType.js.map +1 -0
- package/built/src/utils/dbType.d.ts +1 -0
- package/built/src/utils/dbType.js +12 -1
- package/built/src/utils/dbType.js.map +1 -1
- package/package.json +8 -7
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.toRdsDatabase = exports.separateMultipleQueries = exports.needsQuoting = exports.wrapQuote = exports.wrapBackQuote = exports.wrapDoubleQuote = exports.wrapSingleQuote = exports.normalizeSimpleParametersQuery = exports.normalizePositionedParametersQuery = exports.normalizeQuery = exports.isReadOnlyQuery = exports.parseQuery = exports.hasSetVariableClause = exports.toSafeQueryForPgsqlAst = exports.toViewDataNormalizedQuery = exports.toViewDataQuery = exports.createColumnNames = exports.createTableNames = exports.toCountRecordsQuery = exports.toViewRecordsQuery = exports.toDeleteStatement = exports.toUpdateStatement = exports.toInsertStatement = exports.createUndoChangeSQL = exports.formatQuery = exports.getSqlLanguage = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const rdh_1 = require("@l-v-yonsama/rdh");
|
|
6
6
|
const dayjs_1 = tslib_1.__importDefault(require("dayjs"));
|
|
@@ -32,6 +32,7 @@ const DBTypeToSqlLanguageMap = {
|
|
|
32
32
|
Postgres: 'postgresql',
|
|
33
33
|
SQLServer: 'transactsql',
|
|
34
34
|
SQLite: 'sqlite',
|
|
35
|
+
Oracle: 'plsql',
|
|
35
36
|
Redis: 'mysql',
|
|
36
37
|
Memcache: 'mysql',
|
|
37
38
|
Keycloak: 'mysql',
|
|
@@ -292,7 +293,7 @@ const toDeleteStatement = ({ schemaName, tableName, columns, conditions, bindOpt
|
|
|
292
293
|
};
|
|
293
294
|
};
|
|
294
295
|
exports.toDeleteStatement = toDeleteStatement;
|
|
295
|
-
function toViewRecordsQuery({ tableRes, schemaName, idQuoteCharacter, sqlLang, limit,
|
|
296
|
+
function toViewRecordsQuery({ tableRes, schemaName, idQuoteCharacter, sqlLang, limit, limitClauseStyle, limitMode, limitLastColumn, }) {
|
|
296
297
|
const tableNameWithSchema = createTableNameWithSchema({
|
|
297
298
|
schema: schemaName,
|
|
298
299
|
table: tableRes.name,
|
|
@@ -300,7 +301,7 @@ function toViewRecordsQuery({ tableRes, schemaName, idQuoteCharacter, sqlLang, l
|
|
|
300
301
|
sqlLang,
|
|
301
302
|
});
|
|
302
303
|
let query = '';
|
|
303
|
-
if (
|
|
304
|
+
if (limitClauseStyle === 'top' && limit) {
|
|
304
305
|
query = `SELECT TOP ${limit} * FROM ${tableNameWithSchema}`;
|
|
305
306
|
}
|
|
306
307
|
else {
|
|
@@ -315,9 +316,12 @@ function toViewRecordsQuery({ tableRes, schemaName, idQuoteCharacter, sqlLang, l
|
|
|
315
316
|
: limitLastColumn;
|
|
316
317
|
query += ` ORDER BY ${quotedColumn} DESC`;
|
|
317
318
|
}
|
|
318
|
-
if (
|
|
319
|
+
if (limitClauseStyle === 'trailing' && limit) {
|
|
319
320
|
query += ` LIMIT ${limit}`;
|
|
320
321
|
}
|
|
322
|
+
else if (limitClauseStyle === 'fetchFirst' && limit) {
|
|
323
|
+
query += ` FETCH FIRST ${limit} ROWS ONLY`;
|
|
324
|
+
}
|
|
321
325
|
return query;
|
|
322
326
|
}
|
|
323
327
|
exports.toViewRecordsQuery = toViewRecordsQuery;
|
|
@@ -601,6 +605,26 @@ const parseQuery = (sql) => {
|
|
|
601
605
|
return undefined;
|
|
602
606
|
};
|
|
603
607
|
exports.parseQuery = parseQuery;
|
|
608
|
+
const READ_ONLY_STATEMENT_TYPES = new Set([
|
|
609
|
+
'select',
|
|
610
|
+
'show',
|
|
611
|
+
'union',
|
|
612
|
+
'union all',
|
|
613
|
+
'values',
|
|
614
|
+
]);
|
|
615
|
+
const isReadOnlyQuery = (sql) => {
|
|
616
|
+
var _a;
|
|
617
|
+
const qst = (0, exports.parseQuery)(sql);
|
|
618
|
+
const type = (_a = qst === null || qst === void 0 ? void 0 : qst.ast) === null || _a === void 0 ? void 0 : _a.type;
|
|
619
|
+
if (!type) {
|
|
620
|
+
return false;
|
|
621
|
+
}
|
|
622
|
+
if (type === 'pragma') {
|
|
623
|
+
return !/\bpragma\s+[a-zA-Z0-9\-_.()]+\s*=\s*.+/i.test(sql);
|
|
624
|
+
}
|
|
625
|
+
return READ_ONLY_STATEMENT_TYPES.has(type);
|
|
626
|
+
};
|
|
627
|
+
exports.isReadOnlyQuery = isReadOnlyQuery;
|
|
604
628
|
const normalizeQuery = ({ query, toPositionedParameter, toPositionalCharacter, bindParams, }) => {
|
|
605
629
|
if (toPositionedParameter) {
|
|
606
630
|
return (0, exports.normalizePositionedParametersQuery)(query, bindParams, toPositionalCharacter);
|
|
@@ -756,355 +780,11 @@ const normalizeSimpleParametersQuery = (query, bindParams) => {
|
|
|
756
780
|
return { query: newLines.join('\n'), binds };
|
|
757
781
|
};
|
|
758
782
|
exports.normalizeSimpleParametersQuery = normalizeSimpleParametersQuery;
|
|
759
|
-
const createTableDefinisionsForPrompt = (params) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
760
|
-
const { db: idb, sql, rdsDriver } = params;
|
|
761
|
-
const db = idb instanceof DbResource_1.RdsDatabase ? idb : toRdsDatabase(idb);
|
|
762
|
-
try {
|
|
763
|
-
if (db) {
|
|
764
|
-
const qst = (0, exports.parseQuery)(sql);
|
|
765
|
-
if (qst === undefined || qst.names === undefined) {
|
|
766
|
-
return undefined;
|
|
767
|
-
}
|
|
768
|
-
const dbTableWithSchemas = [];
|
|
769
|
-
const qnameList = [qst.names];
|
|
770
|
-
if (qst.additionalNames) {
|
|
771
|
-
qnameList.push(...qst.additionalNames);
|
|
772
|
-
}
|
|
773
|
-
qnameList.forEach(({ schemaName, tableName }) => {
|
|
774
|
-
var _a, _b;
|
|
775
|
-
const schemas = db.children.filter((it) => schemaName ? (0, rdh_1.equalsIgnoreCase)(it.name, schemaName) : true);
|
|
776
|
-
for (const schema of schemas) {
|
|
777
|
-
const tbl = schema.children.find((it) => (0, rdh_1.equalsIgnoreCase)(it.name, tableName));
|
|
778
|
-
if (tbl) {
|
|
779
|
-
dbTableWithSchemas.push({ table: tbl, schemaName: schema.name });
|
|
780
|
-
if ((_a = tbl.foreignKeys) === null || _a === void 0 ? void 0 : _a.referenceTo) {
|
|
781
|
-
Object.values(tbl.foreignKeys.referenceTo).forEach((refTo) => {
|
|
782
|
-
const tblTo = schema.children.find((it) => (0, rdh_1.equalsIgnoreCase)(it.name, refTo.tableName));
|
|
783
|
-
if (tblTo &&
|
|
784
|
-
dbTableWithSchemas.find((it) => it.table.name === tblTo.name) === undefined) {
|
|
785
|
-
dbTableWithSchemas.push({
|
|
786
|
-
table: tblTo,
|
|
787
|
-
schemaName: schema.name,
|
|
788
|
-
});
|
|
789
|
-
}
|
|
790
|
-
});
|
|
791
|
-
}
|
|
792
|
-
if ((_b = tbl.foreignKeys) === null || _b === void 0 ? void 0 : _b.referencedFrom) {
|
|
793
|
-
Object.values(tbl.foreignKeys.referencedFrom).forEach((refFrom) => {
|
|
794
|
-
const tblFrom = schema.children.find((it) => (0, rdh_1.equalsIgnoreCase)(it.name, refFrom.tableName));
|
|
795
|
-
if (tblFrom &&
|
|
796
|
-
dbTableWithSchemas.find((it) => it.table.name === tblFrom.name) === undefined) {
|
|
797
|
-
dbTableWithSchemas.push({
|
|
798
|
-
table: tblFrom,
|
|
799
|
-
schemaName: schema.name,
|
|
800
|
-
});
|
|
801
|
-
}
|
|
802
|
-
});
|
|
803
|
-
}
|
|
804
|
-
break;
|
|
805
|
-
}
|
|
806
|
-
}
|
|
807
|
-
});
|
|
808
|
-
if (dbTableWithSchemas.length === 0) {
|
|
809
|
-
return undefined;
|
|
810
|
-
}
|
|
811
|
-
const lines = [];
|
|
812
|
-
for (const dbTable of dbTableWithSchemas) {
|
|
813
|
-
let tableDDL = '';
|
|
814
|
-
if (rdsDriver && rdsDriver.supportsShowCreate()) {
|
|
815
|
-
tableDDL = yield rdsDriver.getTableDDL({
|
|
816
|
-
schemaName: dbTable.schemaName,
|
|
817
|
-
tableName: dbTable.table.name,
|
|
818
|
-
});
|
|
819
|
-
}
|
|
820
|
-
if (tableDDL) {
|
|
821
|
-
lines.push(tableDDL);
|
|
822
|
-
}
|
|
823
|
-
else {
|
|
824
|
-
const tableDef = (0, exports.toCreateTableDDL)({ dbTable: dbTable.table });
|
|
825
|
-
lines.push(tableDef);
|
|
826
|
-
}
|
|
827
|
-
lines.push('');
|
|
828
|
-
}
|
|
829
|
-
return lines.join('\n');
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
catch (_) {
|
|
833
|
-
console.error(_);
|
|
834
|
-
}
|
|
835
|
-
return undefined;
|
|
836
|
-
});
|
|
837
|
-
exports.createTableDefinisionsForPrompt = createTableDefinisionsForPrompt;
|
|
838
|
-
const getProposals = (params) => {
|
|
839
|
-
const { db: idb, sql, lastChar, keyword, parentWord } = params;
|
|
840
|
-
const upperKeyword = keyword.toUpperCase();
|
|
841
|
-
const upperParentWord = parentWord === null || parentWord === void 0 ? void 0 : parentWord.toUpperCase();
|
|
842
|
-
let ast;
|
|
843
|
-
const retList = [];
|
|
844
|
-
const db = idb instanceof DbResource_1.RdsDatabase ? idb : toRdsDatabase(idb);
|
|
845
|
-
try {
|
|
846
|
-
if (db) {
|
|
847
|
-
try {
|
|
848
|
-
[ast] = (0, pgsql_ast_parser_1.parse)(sql, { locationTracking: true });
|
|
849
|
-
}
|
|
850
|
-
catch (_) {
|
|
851
|
-
}
|
|
852
|
-
if (parentWord) {
|
|
853
|
-
let list = getProposalsByKeywordWithParent(db, ast, upperKeyword, upperParentWord, lastChar);
|
|
854
|
-
if (list.length === 0) {
|
|
855
|
-
list = getProposalsByKeyword(db, upperKeyword, lastChar);
|
|
856
|
-
}
|
|
857
|
-
retList.push(...list);
|
|
858
|
-
}
|
|
859
|
-
else {
|
|
860
|
-
if (keyword) {
|
|
861
|
-
const list = getProposalsByKeyword(db, upperKeyword, lastChar);
|
|
862
|
-
retList.push(...list);
|
|
863
|
-
}
|
|
864
|
-
else {
|
|
865
|
-
retList.push(...getAllProposals(db));
|
|
866
|
-
}
|
|
867
|
-
}
|
|
868
|
-
}
|
|
869
|
-
if (lastChar !== '.' && !parentWord) {
|
|
870
|
-
constant_1.RESERVED_WORDS.filter((s) => s.startsWith(upperKeyword)).forEach((s) => {
|
|
871
|
-
retList.push({
|
|
872
|
-
label: s,
|
|
873
|
-
kind: types_1.ProposalKind.ReservedWord,
|
|
874
|
-
});
|
|
875
|
-
});
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
catch (_) {
|
|
879
|
-
}
|
|
880
|
-
const uniqueRetList = Array.from(retList
|
|
881
|
-
.reduce((map, p) => {
|
|
882
|
-
const key = `${p.kind}:${p.label}`;
|
|
883
|
-
const existing = map.get(key);
|
|
884
|
-
if (!existing || (!existing.detail && p.detail)) {
|
|
885
|
-
map.set(key, p);
|
|
886
|
-
}
|
|
887
|
-
return map;
|
|
888
|
-
}, new Map())
|
|
889
|
-
.values());
|
|
890
|
-
return uniqueRetList;
|
|
891
|
-
};
|
|
892
|
-
exports.getProposals = getProposals;
|
|
893
|
-
const getResourcePositions = (params) => {
|
|
894
|
-
const { db: idb, sql } = params;
|
|
895
|
-
const sqlLowerCase = sql.toLocaleLowerCase();
|
|
896
|
-
const retList = [];
|
|
897
|
-
if (idb === undefined) {
|
|
898
|
-
return retList;
|
|
899
|
-
}
|
|
900
|
-
const schema = idb instanceof DbResource_1.RdsDatabase
|
|
901
|
-
? idb.getSchema({ isDefault: true })
|
|
902
|
-
: toRdsDatabase(idb).getSchema({ isDefault: true });
|
|
903
|
-
const tableNames = schema.children
|
|
904
|
-
.map((it) => it.name.toLocaleLowerCase())
|
|
905
|
-
.join('|');
|
|
906
|
-
const reg = new RegExp('\\b(' + tableNames + ')\\b', 'g');
|
|
907
|
-
let m;
|
|
908
|
-
const tableResList = [];
|
|
909
|
-
const columnNameSet = new Set();
|
|
910
|
-
while ((m = reg.exec(sqlLowerCase)) !== null) {
|
|
911
|
-
const name = m[0];
|
|
912
|
-
let comment = undefined;
|
|
913
|
-
const tableRes = schema.children.find((it) => it.name.toLocaleLowerCase() === name);
|
|
914
|
-
if (tableRes) {
|
|
915
|
-
tableResList.push(tableRes);
|
|
916
|
-
comment = tableRes.comment;
|
|
917
|
-
tableRes.children.forEach((it) => {
|
|
918
|
-
columnNameSet.add(it.name.toLowerCase());
|
|
919
|
-
});
|
|
920
|
-
}
|
|
921
|
-
retList.push({
|
|
922
|
-
kind: types_1.ProposalKind.Table,
|
|
923
|
-
name: tableRes.name,
|
|
924
|
-
comment,
|
|
925
|
-
offset: m.index,
|
|
926
|
-
length: name.length,
|
|
927
|
-
});
|
|
928
|
-
}
|
|
929
|
-
if (columnNameSet.size > 0) {
|
|
930
|
-
const reg2 = new RegExp('\\b(' + Array.from(columnNameSet).join('|') + ')\\b', 'g');
|
|
931
|
-
let m2;
|
|
932
|
-
while ((m2 = reg2.exec(sqlLowerCase)) !== null) {
|
|
933
|
-
const name = m2[0];
|
|
934
|
-
const columnRes = tableResList
|
|
935
|
-
.flatMap((table) => table.children)
|
|
936
|
-
.find((column) => column.name.toLocaleLowerCase() === name);
|
|
937
|
-
if (!columnRes) {
|
|
938
|
-
continue;
|
|
939
|
-
}
|
|
940
|
-
retList.push({
|
|
941
|
-
kind: types_1.ProposalKind.Column,
|
|
942
|
-
name: columnRes.name,
|
|
943
|
-
comment: columnRes.comment,
|
|
944
|
-
offset: m2.index,
|
|
945
|
-
length: name.length,
|
|
946
|
-
});
|
|
947
|
-
}
|
|
948
|
-
}
|
|
949
|
-
return retList;
|
|
950
|
-
};
|
|
951
|
-
exports.getResourcePositions = getResourcePositions;
|
|
952
|
-
const resolveAlias = (ast, alias) => {
|
|
953
|
-
if (!ast || !alias) {
|
|
954
|
-
return undefined;
|
|
955
|
-
}
|
|
956
|
-
if (ast.type === 'select') {
|
|
957
|
-
for (const tbl of ast.from) {
|
|
958
|
-
if (tbl.type === 'table') {
|
|
959
|
-
if (tbl.name.alias.toUpperCase() === alias) {
|
|
960
|
-
return tbl.name.name;
|
|
961
|
-
}
|
|
962
|
-
}
|
|
963
|
-
}
|
|
964
|
-
}
|
|
965
|
-
return undefined;
|
|
966
|
-
};
|
|
967
|
-
const matchKeyword = (list, keyword) => {
|
|
968
|
-
return list.some((it) => it.toUpperCase().startsWith(keyword));
|
|
969
|
-
};
|
|
970
|
-
function resolveLastOrderByColumn(table) {
|
|
971
|
-
const columns = table.children;
|
|
972
|
-
if (!(columns === null || columns === void 0 ? void 0 : columns.length)) {
|
|
973
|
-
return undefined;
|
|
974
|
-
}
|
|
975
|
-
const dateColumn = columns.find((col) => {
|
|
976
|
-
const name = col.name.toLowerCase();
|
|
977
|
-
const looksLikeCreated = /created(_at)?$/.test(name) ||
|
|
978
|
-
/create(d)?date$/.test(name) ||
|
|
979
|
-
/insert(ed)?(_at)?$/.test(name);
|
|
980
|
-
return (0, rdh_1.isDateTimeOrDate)(col.colType) && looksLikeCreated;
|
|
981
|
-
});
|
|
982
|
-
if (dateColumn) {
|
|
983
|
-
return dateColumn.name;
|
|
984
|
-
}
|
|
985
|
-
const pks = table.getPrimaryColumnNames();
|
|
986
|
-
if (pks.length === 1) {
|
|
987
|
-
const pkCol = columns.find((c) => c.name === pks[0]);
|
|
988
|
-
if (pkCol && (0, rdh_1.isNumericLike)(pkCol.colType)) {
|
|
989
|
-
return pkCol.name;
|
|
990
|
-
}
|
|
991
|
-
}
|
|
992
|
-
return undefined;
|
|
993
|
-
}
|
|
994
|
-
exports.resolveLastOrderByColumn = resolveLastOrderByColumn;
|
|
995
|
-
const getProposalsByKeywordWithParent = (db, ast, keyword, parentWord, lastChar) => {
|
|
996
|
-
var _a;
|
|
997
|
-
const retList = [];
|
|
998
|
-
const schema = db.children.find((it) => it.name.toUpperCase() === parentWord);
|
|
999
|
-
if (schema) {
|
|
1000
|
-
schema.children.forEach((table) => {
|
|
1001
|
-
var _a;
|
|
1002
|
-
const table_comment = (_a = table.comment) !== null && _a !== void 0 ? _a : '';
|
|
1003
|
-
if (keyword === '' ||
|
|
1004
|
-
matchKeyword([table.name, table_comment], keyword)) {
|
|
1005
|
-
retList.push(createTableProposal(schema, table));
|
|
1006
|
-
}
|
|
1007
|
-
});
|
|
1008
|
-
}
|
|
1009
|
-
const defaultSchema = db.getSchema({ isDefault: true });
|
|
1010
|
-
let table = defaultSchema.children.find((it) => it.name.toUpperCase() === parentWord);
|
|
1011
|
-
if (!table) {
|
|
1012
|
-
const resolvedName = resolveAlias(ast, parentWord);
|
|
1013
|
-
if (resolvedName) {
|
|
1014
|
-
table = defaultSchema.children.find((it) => it.name.toUpperCase() === resolvedName.toUpperCase());
|
|
1015
|
-
}
|
|
1016
|
-
}
|
|
1017
|
-
if (table) {
|
|
1018
|
-
const table_comment = (_a = table.comment) !== null && _a !== void 0 ? _a : '';
|
|
1019
|
-
if (matchKeyword([table.name, table_comment], keyword)) {
|
|
1020
|
-
retList.push(createTableProposal(schema, table));
|
|
1021
|
-
}
|
|
1022
|
-
table.children.forEach((column) => {
|
|
1023
|
-
var _a;
|
|
1024
|
-
const columnComment = (_a = column.comment) !== null && _a !== void 0 ? _a : '';
|
|
1025
|
-
if (keyword === '' ||
|
|
1026
|
-
matchKeyword([column.name, columnComment], keyword)) {
|
|
1027
|
-
retList.push(createColumnProposal(table, column));
|
|
1028
|
-
}
|
|
1029
|
-
});
|
|
1030
|
-
}
|
|
1031
|
-
return retList;
|
|
1032
|
-
};
|
|
1033
|
-
const getProposalsByKeyword = (db, keyword, lastChar) => {
|
|
1034
|
-
const retList = [];
|
|
1035
|
-
const schema = db.getSchema({ isDefault: true });
|
|
1036
|
-
if (lastChar === ' ') {
|
|
1037
|
-
if (['INTO', 'UPDATE', 'FROM'].includes(keyword)) {
|
|
1038
|
-
schema.children.forEach((table) => {
|
|
1039
|
-
retList.push(createTableProposal(schema, table));
|
|
1040
|
-
});
|
|
1041
|
-
return retList;
|
|
1042
|
-
}
|
|
1043
|
-
if ('DELETE' === keyword) {
|
|
1044
|
-
retList.push(createReservedWordProposal('FROM'));
|
|
1045
|
-
}
|
|
1046
|
-
}
|
|
1047
|
-
schema.children.forEach((table) => {
|
|
1048
|
-
var _a;
|
|
1049
|
-
const table_comment = (_a = table.comment) !== null && _a !== void 0 ? _a : '';
|
|
1050
|
-
if (matchKeyword([table.name, table_comment], keyword)) {
|
|
1051
|
-
retList.push(createTableProposal(schema, table));
|
|
1052
|
-
}
|
|
1053
|
-
table.children.forEach((column) => {
|
|
1054
|
-
var _a;
|
|
1055
|
-
const columnComment = (_a = column.comment) !== null && _a !== void 0 ? _a : '';
|
|
1056
|
-
if (matchKeyword([column.name, columnComment], keyword)) {
|
|
1057
|
-
retList.push(createColumnProposal(table, column));
|
|
1058
|
-
}
|
|
1059
|
-
});
|
|
1060
|
-
});
|
|
1061
|
-
return retList;
|
|
1062
|
-
};
|
|
1063
|
-
const getAllProposals = (db) => {
|
|
1064
|
-
const retList = [];
|
|
1065
|
-
const schema = db.getSchema({ isDefault: true });
|
|
1066
|
-
schema.children.forEach((table) => {
|
|
1067
|
-
retList.push(createTableProposal(schema, table));
|
|
1068
|
-
});
|
|
1069
|
-
schema.getUniqColumnNameWithComments().forEach((it) => {
|
|
1070
|
-
var _a;
|
|
1071
|
-
retList.push({
|
|
1072
|
-
label: it.name,
|
|
1073
|
-
kind: types_1.ProposalKind.Column,
|
|
1074
|
-
detail: (_a = it.comment) !== null && _a !== void 0 ? _a : '',
|
|
1075
|
-
});
|
|
1076
|
-
});
|
|
1077
|
-
return retList;
|
|
1078
|
-
};
|
|
1079
|
-
const createTableProposal = (schema, table) => {
|
|
1080
|
-
var _a;
|
|
1081
|
-
const detail = (_a = table.comment) !== null && _a !== void 0 ? _a : '';
|
|
1082
|
-
return {
|
|
1083
|
-
label: table.name,
|
|
1084
|
-
kind: types_1.ProposalKind.Table,
|
|
1085
|
-
detail,
|
|
1086
|
-
};
|
|
1087
|
-
};
|
|
1088
|
-
const createColumnProposal = (table, column) => {
|
|
1089
|
-
var _a;
|
|
1090
|
-
const detail = (_a = column.comment) !== null && _a !== void 0 ? _a : '';
|
|
1091
|
-
return {
|
|
1092
|
-
label: column.name,
|
|
1093
|
-
kind: types_1.ProposalKind.Column,
|
|
1094
|
-
detail,
|
|
1095
|
-
};
|
|
1096
|
-
};
|
|
1097
783
|
const stripComment = (query) => {
|
|
1098
784
|
return query
|
|
1099
785
|
.replace(/\/\*[^*]*\*\//gm, '')
|
|
1100
786
|
.replace(/(\s)?(#|--)\s+.*$/gm, '$1');
|
|
1101
787
|
};
|
|
1102
|
-
const createReservedWordProposal = (word) => {
|
|
1103
|
-
return {
|
|
1104
|
-
label: word,
|
|
1105
|
-
kind: types_1.ProposalKind.ReservedWord,
|
|
1106
|
-
};
|
|
1107
|
-
};
|
|
1108
788
|
const wrapSingleQuote = (input) => (0, exports.wrapQuote)(input, "'");
|
|
1109
789
|
exports.wrapSingleQuote = wrapSingleQuote;
|
|
1110
790
|
const wrapDoubleQuote = (input) => (0, exports.wrapQuote)(input, '"');
|
|
@@ -1202,7 +882,8 @@ const toEmbeddedStringValue = (colType, value) => {
|
|
|
1202
882
|
return (0, exports.wrapSingleQuote)(value);
|
|
1203
883
|
}
|
|
1204
884
|
if ((0, rdh_1.isJsonLike)(colType)) {
|
|
1205
|
-
|
|
885
|
+
const text = typeof value === 'string' ? value : JSON.stringify(value);
|
|
886
|
+
return (0, exports.wrapSingleQuote)(text);
|
|
1206
887
|
}
|
|
1207
888
|
if (value.length === 0) {
|
|
1208
889
|
return 'NULL';
|
|
@@ -1315,52 +996,7 @@ const createQNamesUsingLocation = ({ tableName, schemaName, location, sql, }) =>
|
|
|
1315
996
|
schemaName,
|
|
1316
997
|
};
|
|
1317
998
|
};
|
|
1318
|
-
const
|
|
1319
|
-
var _a;
|
|
1320
|
-
const columns = dbTable.children;
|
|
1321
|
-
const colDefs = [];
|
|
1322
|
-
columns.forEach((col) => {
|
|
1323
|
-
let line = ` ${col.name} ${col.colType}`;
|
|
1324
|
-
if (col.primaryKey) {
|
|
1325
|
-
line += ' PRIMARY KEY';
|
|
1326
|
-
}
|
|
1327
|
-
else {
|
|
1328
|
-
if (col.nullable === false) {
|
|
1329
|
-
line += ' NOT NULL';
|
|
1330
|
-
}
|
|
1331
|
-
}
|
|
1332
|
-
if (col.uniqKey) {
|
|
1333
|
-
line += ' UNIQUE';
|
|
1334
|
-
}
|
|
1335
|
-
if (col.extra) {
|
|
1336
|
-
if (col.extra.toLocaleLowerCase() === 'auto_increment') {
|
|
1337
|
-
line += ' AUTO_INCREMENT';
|
|
1338
|
-
}
|
|
1339
|
-
}
|
|
1340
|
-
if (col.default) {
|
|
1341
|
-
line += ` DEFAULT ${col.default}`;
|
|
1342
|
-
}
|
|
1343
|
-
if (col.comment) {
|
|
1344
|
-
line += ` COMMENT '${col.comment}'`;
|
|
1345
|
-
}
|
|
1346
|
-
colDefs.push(line);
|
|
1347
|
-
});
|
|
1348
|
-
if ((_a = dbTable.foreignKeys) === null || _a === void 0 ? void 0 : _a.referenceTo) {
|
|
1349
|
-
Object.entries(dbTable.foreignKeys.referenceTo).forEach(([colName, refTo]) => {
|
|
1350
|
-
colDefs.push(` FOREIGN KEY ${refTo.constraintName}(${colName}) REFERENCES ${refTo.tableName}(${refTo.columnName})`);
|
|
1351
|
-
});
|
|
1352
|
-
}
|
|
1353
|
-
let tableDef = `CREATE TABLE ${dbTable.name} (\n${colDefs.join(',\n')}\n)`;
|
|
1354
|
-
if (dbTable.comment) {
|
|
1355
|
-
tableDef += ` COMMENT '${dbTable.comment}';`;
|
|
1356
|
-
}
|
|
1357
|
-
else {
|
|
1358
|
-
tableDef += `;`;
|
|
1359
|
-
}
|
|
1360
|
-
return tableDef;
|
|
1361
|
-
};
|
|
1362
|
-
exports.toCreateTableDDL = toCreateTableDDL;
|
|
1363
|
-
const toGeneralQuery = ({ selectClause, tableRes, schemaName, conditions, quote, idQuoteCharacter, sqlLang, limit, limitAsTop, }) => {
|
|
999
|
+
const toGeneralQuery = ({ selectClause, tableRes, schemaName, conditions, quote, idQuoteCharacter, sqlLang, limit, limitClauseStyle, }) => {
|
|
1364
1000
|
const tableNameWithSchema = createTableNameWithSchema({
|
|
1365
1001
|
schema: schemaName,
|
|
1366
1002
|
table: tableRes.name,
|
|
@@ -1372,7 +1008,7 @@ const toGeneralQuery = ({ selectClause, tableRes, schemaName, conditions, quote,
|
|
|
1372
1008
|
bindParams: {},
|
|
1373
1009
|
};
|
|
1374
1010
|
let top = '';
|
|
1375
|
-
if (
|
|
1011
|
+
if (limitClauseStyle === 'top' && limit !== undefined) {
|
|
1376
1012
|
top = `TOP ${limit} `;
|
|
1377
1013
|
}
|
|
1378
1014
|
let query = `SELECT ${top}${selectClause} ${os.EOL}FROM ${tableNameWithSchema} `;
|
|
@@ -1389,9 +1025,12 @@ const toGeneralQuery = ({ selectClause, tableRes, schemaName, conditions, quote,
|
|
|
1389
1025
|
query += os.EOL + 'WHERE' + os.EOL + q;
|
|
1390
1026
|
}
|
|
1391
1027
|
}
|
|
1392
|
-
if (
|
|
1028
|
+
if (limitClauseStyle === 'trailing' && limit !== undefined) {
|
|
1393
1029
|
query += os.EOL + 'LIMIT ' + limit;
|
|
1394
1030
|
}
|
|
1031
|
+
else if (limitClauseStyle === 'fetchFirst' && limit !== undefined) {
|
|
1032
|
+
query += os.EOL + 'FETCH FIRST ' + limit + ' ROWS ONLY';
|
|
1033
|
+
}
|
|
1395
1034
|
return {
|
|
1396
1035
|
query: query.trim(),
|
|
1397
1036
|
binds: params.bindParams,
|
|
@@ -1443,4 +1082,5 @@ const toRdsDatabase = (awsDb) => {
|
|
|
1443
1082
|
});
|
|
1444
1083
|
return db;
|
|
1445
1084
|
};
|
|
1085
|
+
exports.toRdsDatabase = toRdsDatabase;
|
|
1446
1086
|
//# sourceMappingURL=SQLHelper.js.map
|