@simplysm/sd-cli 10.0.4 → 10.0.22
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/.eslintrc.cjs +1 -1
- package/dist/SdLinter.d.ts +5 -0
- package/dist/SdLinter.js.map +1 -0
- package/dist/SdLinter.mjs +37 -0
- package/dist/SdTsIncrementalBuilder.d.ts +16 -0
- package/dist/SdTsIncrementalBuilder.js.map +1 -0
- package/dist/SdTsIncrementalBuilder.mjs +54 -0
- package/dist/build-cluster.js.map +1 -1
- package/dist/build-cluster.mjs +124 -0
- package/dist/builders/SdCliClientBuilder.d.ts +13 -0
- package/dist/builders/SdCliClientBuilder.js.map +1 -0
- package/dist/builders/SdCliClientBuilder.mjs +167 -0
- package/dist/builders/SdCliJsLibLinter.d.ts +3 -7
- package/dist/builders/SdCliJsLibLinter.js.map +1 -1
- package/dist/builders/{SdCliJsLibLinter.js → SdCliJsLibLinter.mjs} +8 -17
- package/dist/builders/SdCliServerBuilder.d.ts +14 -0
- package/dist/builders/SdCliServerBuilder.js.map +1 -0
- package/dist/builders/SdCliServerBuilder.mjs +171 -0
- package/dist/builders/SdCliTsLibBuilder.d.ts +3 -10
- package/dist/builders/SdCliTsLibBuilder.js.map +1 -1
- package/dist/builders/SdCliTsLibBuilder.mjs +75 -0
- package/dist/commons.d.ts +28 -2
- package/dist/entry/SdCliLocalUpdate.d.ts +7 -0
- package/dist/entry/SdCliLocalUpdate.js.map +1 -0
- package/dist/entry/SdCliLocalUpdate.mjs +55 -0
- package/dist/entry/SdCliProject.d.ts +1 -0
- package/dist/entry/SdCliProject.js.map +1 -1
- package/dist/entry/{SdCliProject.js → SdCliProject.mjs} +94 -10
- package/dist/sd-cli.js.map +1 -1
- package/dist/{sd-cli.js → sd-cli.mjs} +16 -0
- package/dist/sd-core-common/src/decorators/NotifyPropertyChange.d.ts +20 -0
- package/dist/sd-core-common/src/decorators/NotifyPropertyChange.js.map +1 -0
- package/dist/sd-core-common/src/decorators/NotifyPropertyChange.mjs +12 -0
- package/dist/sd-core-common/src/decorators/PropertyGetSetDecoratorBase.d.ts +43 -0
- package/dist/sd-core-common/src/decorators/PropertyGetSetDecoratorBase.js.map +1 -0
- package/dist/sd-core-common/src/decorators/PropertyGetSetDecoratorBase.mjs +54 -0
- package/dist/sd-core-common/src/decorators/PropertyValidate.d.ts +16 -0
- package/dist/sd-core-common/src/decorators/PropertyValidate.js.map +1 -0
- package/dist/sd-core-common/src/decorators/PropertyValidate.mjs +26 -0
- package/dist/sd-core-common/src/decorators/decorator-return-types.d.ts +14 -0
- package/dist/sd-core-common/src/decorators/decorator-return-types.js.map +1 -0
- package/dist/sd-core-common/src/decorators/decorator-return-types.mjs +2 -0
- package/dist/sd-core-common/src/errors/ArgumentError.d.ts +10 -0
- package/dist/sd-core-common/src/errors/ArgumentError.js.map +1 -0
- package/dist/sd-core-common/src/errors/ArgumentError.mjs +13 -0
- package/dist/sd-core-common/src/errors/NeverEntryError.d.ts +10 -0
- package/dist/sd-core-common/src/errors/NeverEntryError.js.map +1 -0
- package/dist/sd-core-common/src/errors/NeverEntryError.mjs +13 -0
- package/dist/sd-core-common/src/errors/NotImplementError.d.ts +10 -0
- package/dist/sd-core-common/src/errors/NotImplementError.js.map +1 -0
- package/dist/sd-core-common/src/errors/NotImplementError.mjs +13 -0
- package/dist/sd-core-common/src/errors/SdError.d.ts +23 -0
- package/dist/sd-core-common/src/errors/SdError.js.map +1 -0
- package/dist/sd-core-common/src/errors/SdError.mjs +40 -0
- package/dist/sd-core-common/src/errors/TimeoutError.d.ts +11 -0
- package/dist/sd-core-common/src/errors/TimeoutError.js.map +1 -0
- package/dist/sd-core-common/src/errors/TimeoutError.mjs +16 -0
- package/dist/sd-core-common/src/extensions/ArrayExtension.d.ts +147 -0
- package/dist/sd-core-common/src/extensions/ArrayExtension.js.map +1 -0
- package/dist/sd-core-common/src/extensions/ArrayExtension.mjs +448 -0
- package/dist/sd-core-common/src/extensions/MapExtension.d.ts +4 -0
- package/dist/sd-core-common/src/extensions/MapExtension.js.map +1 -0
- package/dist/sd-core-common/src/extensions/MapExtension.mjs +15 -0
- package/dist/sd-core-common/src/extensions/SetExtension.d.ts +3 -0
- package/dist/sd-core-common/src/extensions/SetExtension.js.map +1 -0
- package/dist/sd-core-common/src/extensions/SetExtension.mjs +10 -0
- package/dist/sd-core-common/src/index.d.ts +32 -0
- package/dist/sd-core-common/src/index.js.map +1 -0
- package/dist/sd-core-common/src/index.mjs +33 -0
- package/dist/sd-core-common/src/types/DateOnly.d.ts +135 -0
- package/dist/sd-core-common/src/types/DateOnly.js.map +1 -0
- package/dist/sd-core-common/src/types/DateOnly.mjs +220 -0
- package/dist/sd-core-common/src/types/DateTime.d.ts +42 -0
- package/dist/sd-core-common/src/types/DateTime.js.map +1 -0
- package/dist/sd-core-common/src/types/DateTime.mjs +156 -0
- package/dist/sd-core-common/src/types/DeepPartial.d.ts +3 -0
- package/dist/sd-core-common/src/types/DeepPartial.js.map +1 -0
- package/dist/sd-core-common/src/types/DeepPartial.mjs +2 -0
- package/dist/sd-core-common/src/types/ObjectSet.d.ts +4 -0
- package/dist/sd-core-common/src/types/ObjectSet.js.map +1 -0
- package/dist/sd-core-common/src/types/ObjectSet.mjs +18 -0
- package/dist/sd-core-common/src/types/Time.d.ts +27 -0
- package/dist/sd-core-common/src/types/Time.js.map +1 -0
- package/dist/sd-core-common/src/types/Time.mjs +108 -0
- package/dist/sd-core-common/src/types/Type.d.ts +7 -0
- package/dist/sd-core-common/src/types/Type.js.map +1 -0
- package/dist/sd-core-common/src/types/Type.mjs +2 -0
- package/dist/sd-core-common/src/types/UnwrappedType.d.ts +1 -0
- package/dist/sd-core-common/src/types/UnwrappedType.js.map +1 -0
- package/dist/sd-core-common/src/types/UnwrappedType.mjs +2 -0
- package/dist/sd-core-common/src/types/Uuid.d.ts +8 -0
- package/dist/sd-core-common/src/types/Uuid.js.map +1 -0
- package/dist/sd-core-common/src/types/Uuid.mjs +26 -0
- package/dist/sd-core-common/src/types/WrappedType.d.ts +1 -0
- package/dist/sd-core-common/src/types/WrappedType.js.map +1 -0
- package/dist/sd-core-common/src/types/WrappedType.mjs +2 -0
- package/dist/sd-core-common/src/utils/DateTimeFormatUtil.d.ts +12 -0
- package/dist/sd-core-common/src/utils/DateTimeFormatUtil.js.map +1 -0
- package/dist/sd-core-common/src/utils/DateTimeFormatUtil.mjs +67 -0
- package/dist/sd-core-common/src/utils/FunctionQueue.d.ts +8 -0
- package/dist/sd-core-common/src/utils/FunctionQueue.js.map +1 -0
- package/dist/sd-core-common/src/utils/FunctionQueue.mjs +46 -0
- package/dist/sd-core-common/src/utils/FunctionUtil.d.ts +6 -0
- package/dist/sd-core-common/src/utils/FunctionUtil.js.map +1 -0
- package/dist/sd-core-common/src/utils/FunctionUtil.mjs +31 -0
- package/dist/sd-core-common/src/utils/JsonConvert.d.ts +8 -0
- package/dist/sd-core-common/src/utils/JsonConvert.js.map +1 -0
- package/dist/sd-core-common/src/utils/JsonConvert.mjs +78 -0
- package/dist/sd-core-common/src/utils/MathUtil.d.ts +3 -0
- package/dist/sd-core-common/src/utils/MathUtil.js.map +1 -0
- package/dist/sd-core-common/src/utils/MathUtil.mjs +6 -0
- package/dist/sd-core-common/src/utils/NumberUtil.d.ts +6 -0
- package/dist/sd-core-common/src/utils/NumberUtil.js.map +1 -0
- package/dist/sd-core-common/src/utils/NumberUtil.mjs +32 -0
- package/dist/sd-core-common/src/utils/ObjectUtil.d.ts +80 -0
- package/dist/sd-core-common/src/utils/ObjectUtil.js.map +1 -0
- package/dist/sd-core-common/src/utils/ObjectUtil.mjs +452 -0
- package/dist/sd-core-common/src/utils/SdSyncEventEmitter.d.ts +6 -0
- package/dist/sd-core-common/src/utils/SdSyncEventEmitter.js.map +1 -0
- package/dist/sd-core-common/src/utils/SdSyncEventEmitter.mjs +27 -0
- package/dist/sd-core-common/src/utils/StringUtil.d.ts +8 -0
- package/dist/sd-core-common/src/utils/StringUtil.js.map +1 -0
- package/dist/sd-core-common/src/utils/StringUtil.mjs +77 -0
- package/dist/sd-core-common/src/utils/Wait.d.ts +4 -0
- package/dist/sd-core-common/src/utils/Wait.js.map +1 -0
- package/dist/sd-core-common/src/utils/Wait.mjs +23 -0
- package/dist/sd-core-node/src/index.d.ts +6 -0
- package/dist/sd-core-node/src/index.js.map +1 -0
- package/dist/sd-core-node/src/index.mjs +7 -0
- package/dist/sd-core-node/src/utils/FsUtil.d.ts +44 -0
- package/dist/sd-core-node/src/utils/FsUtil.js.map +1 -0
- package/dist/sd-core-node/src/utils/FsUtil.mjs +493 -0
- package/dist/sd-core-node/src/utils/Logger.d.ts +91 -0
- package/dist/sd-core-node/src/utils/Logger.js.map +1 -0
- package/dist/sd-core-node/src/utils/Logger.mjs +185 -0
- package/dist/sd-core-node/src/utils/PathUtil.d.ts +6 -0
- package/dist/sd-core-node/src/utils/PathUtil.js.map +1 -0
- package/dist/sd-core-node/src/utils/PathUtil.mjs +24 -0
- package/dist/sd-core-node/src/utils/SdFsWatcher.d.ts +15 -0
- package/dist/sd-core-node/src/utils/SdFsWatcher.js.map +1 -0
- package/dist/sd-core-node/src/utils/SdFsWatcher.mjs +43 -0
- package/dist/sd-core-node/src/utils/SdProcess.d.ts +5 -0
- package/dist/sd-core-node/src/utils/SdProcess.js.map +1 -0
- package/dist/sd-core-node/src/utils/SdProcess.mjs +36 -0
- package/dist/sd-orm-common/src/CaseQueryHelper.d.ts +12 -0
- package/dist/sd-orm-common/src/CaseQueryHelper.js.map +1 -0
- package/dist/sd-orm-common/src/CaseQueryHelper.mjs +19 -0
- package/dist/sd-orm-common/src/CaseWhenQueryHelper.d.ts +12 -0
- package/dist/sd-orm-common/src/CaseWhenQueryHelper.js.map +1 -0
- package/dist/sd-orm-common/src/CaseWhenQueryHelper.mjs +20 -0
- package/dist/sd-orm-common/src/DbContext.d.ts +81 -0
- package/dist/sd-orm-common/src/DbContext.js.map +1 -0
- package/dist/sd-orm-common/src/DbContext.mjs +635 -0
- package/dist/sd-orm-common/src/IDbConnection.d.ts +15 -0
- package/dist/sd-orm-common/src/IDbConnection.js.map +1 -0
- package/dist/sd-orm-common/src/IDbConnection.mjs +2 -0
- package/dist/sd-orm-common/src/IDbContextExecutor.d.ts +17 -0
- package/dist/sd-orm-common/src/IDbContextExecutor.js.map +1 -0
- package/dist/sd-orm-common/src/IDbContextExecutor.mjs +2 -0
- package/dist/sd-orm-common/src/IDbMigration.d.ts +4 -0
- package/dist/sd-orm-common/src/IDbMigration.js.map +1 -0
- package/dist/sd-orm-common/src/IDbMigration.mjs +2 -0
- package/dist/sd-orm-common/src/QueryBuilder.d.ts +48 -0
- package/dist/sd-orm-common/src/QueryBuilder.js.map +1 -0
- package/dist/sd-orm-common/src/QueryBuilder.mjs +1022 -0
- package/dist/sd-orm-common/src/QueryHelper.d.ts +75 -0
- package/dist/sd-orm-common/src/QueryHelper.js.map +1 -0
- package/dist/sd-orm-common/src/QueryHelper.mjs +627 -0
- package/dist/sd-orm-common/src/QueryUnit.d.ts +10 -0
- package/dist/sd-orm-common/src/QueryUnit.js.map +1 -0
- package/dist/sd-orm-common/src/QueryUnit.mjs +16 -0
- package/dist/sd-orm-common/src/Queryable.d.ts +105 -0
- package/dist/sd-orm-common/src/Queryable.js.map +1 -0
- package/dist/sd-orm-common/src/Queryable.mjs +1375 -0
- package/dist/sd-orm-common/src/SdOrmDataType.d.ts +21 -0
- package/dist/sd-orm-common/src/SdOrmDataType.js.map +1 -0
- package/dist/sd-orm-common/src/SdOrmDataType.mjs +2 -0
- package/dist/sd-orm-common/src/commons.d.ts +400 -0
- package/dist/sd-orm-common/src/commons.js.map +1 -0
- package/dist/sd-orm-common/src/commons.mjs +8 -0
- package/dist/sd-orm-common/src/decorators.d.ts +29 -0
- package/dist/sd-orm-common/src/decorators.js.map +1 -0
- package/dist/sd-orm-common/src/decorators.mjs +89 -0
- package/dist/sd-orm-common/src/index.d.ts +17 -0
- package/dist/sd-orm-common/src/index.js.map +1 -0
- package/dist/sd-orm-common/src/index.mjs +18 -0
- package/dist/sd-orm-common/src/models/SystemMigration.d.ts +3 -0
- package/dist/sd-orm-common/src/models/SystemMigration.js.map +1 -0
- package/dist/sd-orm-common/src/models/SystemMigration.mjs +13 -0
- package/dist/sd-orm-common/src/utils/DbDefinitionUtil.d.ts +14 -0
- package/dist/sd-orm-common/src/utils/DbDefinitionUtil.js.map +1 -0
- package/dist/sd-orm-common/src/utils/DbDefinitionUtil.mjs +66 -0
- package/dist/sd-orm-common/src/utils/SdOrmUtil.d.ts +8 -0
- package/dist/sd-orm-common/src/utils/SdOrmUtil.js.map +1 -0
- package/dist/sd-orm-common/src/utils/SdOrmUtil.mjs +248 -0
- package/dist/sd-orm-node/src/DbConnectionFactory.d.ts +4 -0
- package/dist/sd-orm-node/src/DbConnectionFactory.js.map +1 -0
- package/dist/sd-orm-node/src/DbConnectionFactory.mjs +17 -0
- package/dist/sd-orm-node/src/NodeDbContextExecutor.d.ts +19 -0
- package/dist/sd-orm-node/src/NodeDbContextExecutor.js.map +1 -0
- package/dist/sd-orm-node/src/NodeDbContextExecutor.mjs +71 -0
- package/dist/sd-orm-node/src/SdOrm.d.ts +10 -0
- package/dist/sd-orm-node/src/SdOrm.js.map +1 -0
- package/dist/sd-orm-node/src/SdOrm.mjs +25 -0
- package/dist/sd-orm-node/src/index.d.ts +4 -0
- package/dist/sd-orm-node/src/index.js.map +1 -0
- package/dist/sd-orm-node/src/index.mjs +5 -0
- package/dist/sd-orm-node-mssql/src/MssqlDbConnection.d.ts +25 -0
- package/dist/sd-orm-node-mssql/src/MssqlDbConnection.js.map +1 -0
- package/dist/sd-orm-node-mssql/src/MssqlDbConnection.mjs +321 -0
- package/dist/sd-orm-node-mssql/src/index.d.ts +2 -0
- package/dist/sd-orm-node-mssql/src/index.js.map +1 -0
- package/dist/sd-orm-node-mssql/src/index.mjs +3 -0
- package/dist/sd-orm-node-mysql/src/MysqlDbConnection.d.ts +22 -0
- package/dist/sd-orm-node-mysql/src/MysqlDbConnection.js.map +1 -0
- package/dist/sd-orm-node-mysql/src/MysqlDbConnection.mjs +200 -0
- package/dist/sd-orm-node-mysql/src/index.d.ts +2 -0
- package/dist/sd-orm-node-mysql/src/index.js.map +1 -0
- package/dist/sd-orm-node-mysql/src/index.mjs +3 -0
- package/dist/sd-orm-node-sqlite/src/SqliteDbConnection.d.ts +22 -0
- package/dist/sd-orm-node-sqlite/src/SqliteDbConnection.js.map +1 -0
- package/dist/sd-orm-node-sqlite/src/SqliteDbConnection.mjs +172 -0
- package/dist/sd-orm-node-sqlite/src/index.d.ts +2 -0
- package/dist/sd-orm-node-sqlite/src/index.js.map +1 -0
- package/dist/sd-orm-node-sqlite/src/index.mjs +3 -0
- package/dist/sd-service-common/src/commons-orm.d.ts +4 -0
- package/dist/sd-service-common/src/commons-orm.js.map +1 -0
- package/dist/sd-service-common/src/commons-orm.mjs +2 -0
- package/dist/sd-service-common/src/commons-smtp.d.ts +29 -0
- package/dist/sd-service-common/src/commons-smtp.js.map +1 -0
- package/dist/sd-service-common/src/commons-smtp.mjs +2 -0
- package/dist/sd-service-common/src/commons.d.ts +57 -0
- package/dist/sd-service-common/src/commons.js.map +1 -0
- package/dist/sd-service-common/src/commons.mjs +3 -0
- package/dist/sd-service-common/src/index.d.ts +3 -0
- package/dist/sd-service-common/src/index.js.map +1 -0
- package/dist/sd-service-common/src/index.mjs +4 -0
- package/dist/sd-service-server/src/ApiServiceError.d.ts +12 -0
- package/dist/sd-service-server/src/ApiServiceError.js.map +1 -0
- package/dist/sd-service-server/src/ApiServiceError.mjs +15 -0
- package/dist/sd-service-server/src/SdServiceServer.d.ts +39 -0
- package/dist/sd-service-server/src/SdServiceServer.js.map +1 -0
- package/dist/sd-service-server/src/SdServiceServer.mjs +513 -0
- package/dist/sd-service-server/src/commons.d.ts +23 -0
- package/dist/sd-service-server/src/commons.js.map +1 -0
- package/dist/sd-service-server/src/commons.mjs +3 -0
- package/dist/sd-service-server/src/index.d.ts +8 -0
- package/dist/sd-service-server/src/index.js.map +1 -0
- package/dist/sd-service-server/src/index.mjs +9 -0
- package/dist/sd-service-server/src/services/SdAutoUpdateService.d.ts +4 -0
- package/dist/sd-service-server/src/services/SdAutoUpdateService.js.map +1 -0
- package/dist/sd-service-server/src/services/SdAutoUpdateService.mjs +20 -0
- package/dist/sd-service-server/src/services/SdCryptoService.d.ts +7 -0
- package/dist/sd-service-server/src/services/SdCryptoService.js.map +1 -0
- package/dist/sd-service-server/src/services/SdCryptoService.mjs +39 -0
- package/dist/sd-service-server/src/services/SdOrmService.d.ts +22 -0
- package/dist/sd-service-server/src/services/SdOrmService.js.map +1 -0
- package/dist/sd-service-server/src/services/SdOrmService.mjs +115 -0
- package/dist/sd-service-server/src/services/SdSmtpClientService.d.ts +6 -0
- package/dist/sd-service-server/src/services/SdSmtpClientService.js.map +1 -0
- package/dist/sd-service-server/src/services/SdSmtpClientService.mjs +44 -0
- package/dist/sd-service-server/src/utils/SdServiceServerConfigUtil.d.ts +4 -0
- package/dist/sd-service-server/src/utils/SdServiceServerConfigUtil.js.map +1 -0
- package/dist/sd-service-server/src/utils/SdServiceServerConfigUtil.mjs +36 -0
- package/dist/server-worker.d.ts +1 -0
- package/dist/server-worker.js.map +1 -0
- package/dist/server-worker.mjs +36 -0
- package/package.json +12 -5
- package/src/SdLinter.ts +41 -0
- package/src/SdTsIncrementalBuilder.ts +75 -0
- package/src/build-cluster.ts +69 -18
- package/src/builders/SdCliClientBuilder.ts +189 -0
- package/src/builders/SdCliJsLibLinter.ts +11 -23
- package/src/builders/SdCliServerBuilder.ts +191 -0
- package/src/builders/SdCliTsLibBuilder.ts +33 -202
- package/src/commons.ts +33 -2
- package/src/entry/SdCliLocalUpdate.ts +70 -0
- package/src/entry/SdCliProject.ts +133 -17
- package/src/sd-cli.ts +20 -0
- package/src/server-worker.ts +45 -0
- package/tsconfig.json +1 -10
- package/dist/build-cluster.js +0 -75
- package/dist/builders/SdCliTsLibBuilder.js +0 -205
- /package/dist/{commons.js → commons.mjs} +0 -0
- /package/dist/utils/{SdCliBuildResultUtil.js → SdCliBuildResultUtil.mjs} +0 -0
- /package/dist/utils/{SdCliConfigUtil.js → SdCliConfigUtil.mjs} +0 -0
|
@@ -0,0 +1,1022 @@
|
|
|
1
|
+
import { NeverEntryError, Uuid } from "@simplysm/sd-core-common";
|
|
2
|
+
import { QueryHelper } from "./QueryHelper";
|
|
3
|
+
export class QueryBuilder {
|
|
4
|
+
constructor(_dialect) {
|
|
5
|
+
this._dialect = _dialect;
|
|
6
|
+
this.qh = new QueryHelper(this._dialect);
|
|
7
|
+
}
|
|
8
|
+
// ----------------------------------------------------
|
|
9
|
+
// DATABASE
|
|
10
|
+
// ----------------------------------------------------
|
|
11
|
+
// region DATABASE
|
|
12
|
+
createDatabaseIfNotExists(def) {
|
|
13
|
+
if (this._dialect === "mysql") {
|
|
14
|
+
return `
|
|
15
|
+
CREATE DATABASE IF NOT EXISTS ${this.wrap(def.database)};
|
|
16
|
+
ALTER DATABASE ${this.wrap(def.database)} CHARACTER SET utf8 COLLATE utf8_bin;`.trim();
|
|
17
|
+
}
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
19
|
+
else if (this._dialect === "mssql-azure") {
|
|
20
|
+
return `IF NOT EXISTS(SELECT * FROM sys.databases WHERE name='${def.database}') CREATE DATABASE ${this.wrap(def.database)} COLLATE Korean_Wansung_CS_AS (EDITION='Basic', SERVICE_OBJECTIVE='Basic', MAXSIZE = 2 GB)`.trim();
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
return `IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = '${def.database}') CREATE DATABASE ${this.wrap(def.database)} COLLATE Korean_Wansung_CS_AS`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
clearDatabaseIfExists(def) {
|
|
27
|
+
if (this._dialect === "mysql") {
|
|
28
|
+
return `
|
|
29
|
+
DROP DATABASE IF EXISTS ${this.wrap(def.database)};
|
|
30
|
+
CREATE DATABASE IF NOT EXISTS ${this.wrap(def.database)};
|
|
31
|
+
ALTER DATABASE ${this.wrap(def.database)} CHARACTER SET utf8 COLLATE utf8_bin;`;
|
|
32
|
+
}
|
|
33
|
+
else if (this._dialect === "mssql-azure") {
|
|
34
|
+
return `
|
|
35
|
+
IF EXISTS(select * from sys.databases WHERE name='${def.database}')
|
|
36
|
+
BEGIN
|
|
37
|
+
DECLARE @sql NVARCHAR(MAX);
|
|
38
|
+
SET @sql = N'';
|
|
39
|
+
|
|
40
|
+
-- 프록시저 초기화
|
|
41
|
+
SELECT @sql = @sql + 'DROP PROCEDURE ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(o.name) +';' + CHAR(13) + CHAR(10)
|
|
42
|
+
FROM sys.sql_modules m
|
|
43
|
+
INNER JOIN sys.objects o ON m.object_id=o.object_id
|
|
44
|
+
WHERE type_desc like '%PROCEDURE%'
|
|
45
|
+
AND SCHEMA_NAME(schema_id) <> 'sys'
|
|
46
|
+
|
|
47
|
+
-- 함수 초기화
|
|
48
|
+
SELECT @sql = @sql + 'DROP FUNCTION ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(o.name) + N';' + CHAR(13) + CHAR(10)
|
|
49
|
+
FROM sys.sql_modules m
|
|
50
|
+
INNER JOIN sys.objects o ON m.object_id=o.object_id
|
|
51
|
+
WHERE type_desc like '%function%'
|
|
52
|
+
AND SCHEMA_NAME(schema_id) <> 'sys'
|
|
53
|
+
|
|
54
|
+
-- 뷰 초기화
|
|
55
|
+
SELECT @sql = @sql + 'DROP VIEW ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(v.name) + N';' + CHAR(13) + CHAR(10)
|
|
56
|
+
FROM sys.views v
|
|
57
|
+
WHERE SCHEMA_NAME(schema_id) <> 'sys'
|
|
58
|
+
|
|
59
|
+
-- 테이블 FK 끊기 초기화
|
|
60
|
+
SELECT @sql = @sql + N'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME([tbl].schema_id)) + '.' + QUOTENAME([tbl].[name]) + N' DROP CONSTRAINT ' + QUOTENAME([obj].[name]) + N';' + CHAR(13) + CHAR(10)
|
|
61
|
+
FROM sys.tables [tbl]
|
|
62
|
+
INNER JOIN sys.objects AS [obj] ON [obj].[parent_object_id] = [tbl].[object_id] AND [obj].[type] = 'F'
|
|
63
|
+
|
|
64
|
+
-- 테이블 삭제
|
|
65
|
+
SELECT @sql = @sql + N'DROP TABLE ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME([tbl].[name]) + N';' + CHAR(13) + CHAR(10)
|
|
66
|
+
FROM sys.tables [tbl]
|
|
67
|
+
WHERE [type]= 'U'
|
|
68
|
+
|
|
69
|
+
EXEC(@sql);
|
|
70
|
+
END`.trim();
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
return `
|
|
74
|
+
IF EXISTS(select * from sys.databases WHERE name='${def.database}')
|
|
75
|
+
BEGIN
|
|
76
|
+
DECLARE @sql NVARCHAR(MAX);
|
|
77
|
+
SET @sql = N'';
|
|
78
|
+
|
|
79
|
+
-- 프록시저 초기화
|
|
80
|
+
SELECT @sql = @sql + 'DROP PROCEDURE ${this.wrap(def.database)}.' + QUOTENAME(sch.name) + '.' + QUOTENAME(o.name) +';' + CHAR(13) + CHAR(10)
|
|
81
|
+
FROM ${this.wrap(def.database)}.sys.sql_modules m
|
|
82
|
+
INNER JOIN ${this.wrap(def.database)}.sys.objects o ON m.object_id=o.object_id
|
|
83
|
+
INNER JOIN ${this.wrap(def.database)}.sys.schemas sch ON sch.schema_id = [o].schema_id
|
|
84
|
+
WHERE type_desc like '%PROCEDURE%'
|
|
85
|
+
|
|
86
|
+
-- 함수 초기화
|
|
87
|
+
SELECT @sql = @sql + 'DROP FUNCTION ${this.wrap(def.database)}.' + QUOTENAME(sch.name) + '.' + QUOTENAME(o.name) + N';' + CHAR(13) + CHAR(10)
|
|
88
|
+
FROM ${this.wrap(def.database)}.sys.sql_modules m
|
|
89
|
+
INNER JOIN ${this.wrap(def.database)}.sys.objects o ON m.object_id=o.object_id
|
|
90
|
+
INNER JOIN ${this.wrap(def.database)}.sys.schemas sch ON sch.schema_id = [o].schema_id
|
|
91
|
+
WHERE type_desc like '%function%' AND sch.name <> 'sys'
|
|
92
|
+
|
|
93
|
+
-- 뷰 초기화
|
|
94
|
+
SELECT @sql = @sql + 'DROP VIEW ' + QUOTENAME(sch.name) + '.' + QUOTENAME(v.name) + N';' + CHAR(13) + CHAR(10)
|
|
95
|
+
FROM ${this.wrap(def.database)}.sys.views v
|
|
96
|
+
INNER JOIN ${this.wrap(def.database)}.sys.schemas sch ON sch.schema_id = [v].schema_id
|
|
97
|
+
WHERE sch.name <> 'sys'
|
|
98
|
+
|
|
99
|
+
-- 테이블 FK 끊기 초기화
|
|
100
|
+
SELECT @sql = @sql + N'ALTER TABLE ${this.wrap(def.database)}.' + QUOTENAME(sch.name) + '.' + QUOTENAME([tbl].[name]) + N' DROP CONSTRAINT ' + QUOTENAME([obj].[name]) + N';' + CHAR(13) + CHAR(10)
|
|
101
|
+
FROM ${this.wrap(def.database)}.sys.tables [tbl]
|
|
102
|
+
INNER JOIN ${this.wrap(def.database)}.sys.objects AS [obj] ON [obj].[parent_object_id] = [tbl].[object_id] AND [obj].[type] = 'F'
|
|
103
|
+
INNER JOIN ${this.wrap(def.database)}.sys.schemas sch ON sch.schema_id = [tbl].schema_id
|
|
104
|
+
|
|
105
|
+
-- 테이블 삭제
|
|
106
|
+
SELECT @sql = @sql + N'DROP TABLE ${this.wrap(def.database)}.' + QUOTENAME(sch.name) + '.' + QUOTENAME([tbl].[name]) + N';' + CHAR(13) + CHAR(10)
|
|
107
|
+
FROM ${this.wrap(def.database)}.sys.tables [tbl]
|
|
108
|
+
INNER JOIN ${this.wrap(def.database)}.sys.schemas sch ON sch.schema_id = [tbl].schema_id
|
|
109
|
+
WHERE [type]= 'U'
|
|
110
|
+
|
|
111
|
+
EXEC(@sql);
|
|
112
|
+
END`.trim();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
getDatabaseInfo(def) {
|
|
116
|
+
if (this._dialect === "mysql") {
|
|
117
|
+
return `SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='${def.database}'`.trim();
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
return `SELECT * FROM dbo.sysdatabases WHERE name='${def.database}'`.trim();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
getTableInfos(def) {
|
|
124
|
+
if (this._dialect === "mysql") {
|
|
125
|
+
if (def?.database === undefined)
|
|
126
|
+
throw new NeverEntryError();
|
|
127
|
+
return `SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='${def.database}'`.trim();
|
|
128
|
+
}
|
|
129
|
+
else if (this._dialect === "mssql-azure") {
|
|
130
|
+
return `SELECT * FROM [INFORMATION_SCHEMA].[TABLES]${def?.schema !== undefined ? ` WHERE TABLE_SCHEMA='${def.schema}'` : ""}`.trim();
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
if (def?.database === undefined)
|
|
134
|
+
throw new NeverEntryError();
|
|
135
|
+
return `SELECT * FROM ${this.wrap(def.database)}.[INFORMATION_SCHEMA].[TABLES]${def.schema !== undefined ? ` WHERE TABLE_SCHEMA='${def.schema}'` : ""}`.trim();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
getTableInfo(def) {
|
|
139
|
+
if (this._dialect === "sqlite") {
|
|
140
|
+
return `SELECT * FROM sqlite_master WHERE type='table' AND name='${def.table.name}'`.trim();
|
|
141
|
+
}
|
|
142
|
+
else if (this._dialect === "mysql") {
|
|
143
|
+
if (def.table.database === undefined)
|
|
144
|
+
throw new NeverEntryError();
|
|
145
|
+
return `SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='${def.table.database}' AND TABLE_NAME='${def.table.name}'`.trim();
|
|
146
|
+
}
|
|
147
|
+
else if (this._dialect === "mssql-azure") {
|
|
148
|
+
if (def.table.schema === undefined)
|
|
149
|
+
throw new NeverEntryError();
|
|
150
|
+
return `SELECT * FROM [INFORMATION_SCHEMA].[TABLES] WHERE TABLE_SCHEMA='${def.table.schema}' AND TABLE_NAME='${def.table.name}'`.trim();
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
if (def.table.database === undefined || def.table.schema === undefined)
|
|
154
|
+
throw new NeverEntryError();
|
|
155
|
+
return `SELECT * FROM ${this.wrap(def.table.database)}.[INFORMATION_SCHEMA].[TABLES] WHERE TABLE_SCHEMA='${def.table.schema}' AND TABLE_NAME='${def.table.name}'`.trim();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
getTableColumnInfos(def) {
|
|
159
|
+
if (this._dialect === "mysql") {
|
|
160
|
+
throw new Error("MYSQL 미구현");
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
const databaseDot = def.table.database !== undefined ? def.table.database + "." : "";
|
|
164
|
+
const schemaDot = def.table.schema !== undefined ? def.table.schema + "." : "";
|
|
165
|
+
return `
|
|
166
|
+
SELECT
|
|
167
|
+
c2.COLUMN_NAME as name,
|
|
168
|
+
c2.DATA_TYPE as dataType,
|
|
169
|
+
c2.CHARACTER_MAXIMUM_LENGTH as length,
|
|
170
|
+
c2.NUMERIC_PRECISION as precision,
|
|
171
|
+
c2.NUMERIC_SCALE as digits,
|
|
172
|
+
c.is_nullable as nullable,
|
|
173
|
+
c.is_identity as autoIncrement
|
|
174
|
+
FROM ${databaseDot}sys.columns c
|
|
175
|
+
INNER JOIN ${databaseDot}[INFORMATION_SCHEMA].[COLUMNS] c2 ON OBJECT_ID(c2.TABLE_CATALOG + '.' + c2.TABLE_SCHEMA + '.' + c2.TABLE_NAME) = c.object_id AND c2.ORDINAL_POSITION = c.column_id
|
|
176
|
+
WHERE c.object_id = OBJECT_ID('${databaseDot}${schemaDot}${def.table.name}')
|
|
177
|
+
`.trim();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
getTablePrimaryKeys(def) {
|
|
181
|
+
if (this._dialect === "mysql") {
|
|
182
|
+
throw new Error("MYSQL 미구현");
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
const databaseDot = def.table.database !== undefined ? def.table.database + "." : "";
|
|
186
|
+
const schemaDot = def.table.schema !== undefined ? def.table.schema + "." : "";
|
|
187
|
+
return `
|
|
188
|
+
SELECT c.name as name
|
|
189
|
+
FROM ${databaseDot}sys.indexes i
|
|
190
|
+
INNER JOIN ${databaseDot}sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
|
191
|
+
INNER JOIN ${databaseDot}sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id
|
|
192
|
+
WHERE i.type = 1 AND i.object_id = OBJECT_ID('${databaseDot}${schemaDot}${def.table.name}')
|
|
193
|
+
ORDER BY ic.key_ordinal;
|
|
194
|
+
`.trim();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
getTableForeignKeys(def) {
|
|
198
|
+
if (this._dialect === "mysql") {
|
|
199
|
+
throw new Error("MYSQL 미구현");
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
const databaseDot = def.table.database !== undefined ? def.table.database + "." : "";
|
|
203
|
+
const schemaDot = def.table.schema !== undefined ? def.table.schema + "." : "";
|
|
204
|
+
return `
|
|
205
|
+
SELECT
|
|
206
|
+
f.name as name,
|
|
207
|
+
sc.name as sourceColumnName,
|
|
208
|
+
ts.name as targetSchemaName,
|
|
209
|
+
tt.name as targetTableName
|
|
210
|
+
FROM SIMPLYSM_TS.sys.foreign_keys f
|
|
211
|
+
INNER JOIN SIMPLYSM_TS.sys.foreign_key_columns fc ON f.object_id = fc.constraint_object_id
|
|
212
|
+
INNER JOIN SIMPLYSM_TS.sys.columns sc ON sc.object_id = fc.parent_object_id AND sc.column_id = fc.parent_column_id
|
|
213
|
+
INNER JOIN SIMPLYSM_TS.sys.tables tt ON tt.object_id = f.referenced_object_id
|
|
214
|
+
INNER JOIN SIMPLYSM_TS.sys.schemas ts ON ts.schema_id = tt.schema_id
|
|
215
|
+
WHERE f.parent_object_id = OBJECT_ID('${databaseDot}${schemaDot}${def.table.name}')
|
|
216
|
+
ORDER BY f.object_id, fc.constraint_column_id
|
|
217
|
+
`.trim();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
getTableIndexes(def) {
|
|
221
|
+
if (this._dialect === "mysql") {
|
|
222
|
+
throw new Error("MYSQL 미구현");
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
const databaseDot = def.table.database !== undefined ? def.table.database + "." : "";
|
|
226
|
+
const schemaDot = def.table.schema !== undefined ? def.table.schema + "." : "";
|
|
227
|
+
return `
|
|
228
|
+
SELECT
|
|
229
|
+
i.name as name,
|
|
230
|
+
c.name as columnName,
|
|
231
|
+
ic.is_descending_key as isDesc
|
|
232
|
+
FROM ${databaseDot}sys.indexes i
|
|
233
|
+
INNER JOIN ${databaseDot}sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
|
234
|
+
INNER JOIN ${databaseDot}sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id
|
|
235
|
+
WHERE i.type = 2 AND i.object_id = OBJECT_ID('${databaseDot}${schemaDot}${def.table.name}')
|
|
236
|
+
ORDER BY i.index_id, ic.key_ordinal;
|
|
237
|
+
`.trim();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
createTable(def) {
|
|
241
|
+
const tableName = this.getTableName(def.table);
|
|
242
|
+
let query = "";
|
|
243
|
+
query += `CREATE TABLE ${tableName}
|
|
244
|
+
( `;
|
|
245
|
+
const colDefs = def.columns.map((colDef) => ({
|
|
246
|
+
...colDef,
|
|
247
|
+
pkOrderBy: def.primaryKeys.single((pk) => pk.columnName === colDef.name)?.orderBy
|
|
248
|
+
}));
|
|
249
|
+
query += colDefs.map((colDef) => " " + this._getQueryOfColDef(colDef)).join(",\n");
|
|
250
|
+
if (this._dialect === "sqlite") {
|
|
251
|
+
}
|
|
252
|
+
else if (def.primaryKeys.length > 0) {
|
|
253
|
+
query += ",\n";
|
|
254
|
+
if (this._dialect === "mysql") {
|
|
255
|
+
query += ` PRIMARY KEY (${def.primaryKeys.map((item) => `${this.wrap(item.columnName) + (item.orderBy === "ASC" ? "" : ` ${item.orderBy}`)}`).join(", ")})\n`;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
const pkName = this.wrap(`PK_${def.table.name}`);
|
|
259
|
+
query += ` CONSTRAINT ${pkName} PRIMARY KEY (${def.primaryKeys.map((item) => (this.wrap(item.columnName) + (item.orderBy === "ASC" ? "" : ` ${item.orderBy}`))).join(", ")})\n`;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
query += "\n";
|
|
264
|
+
}
|
|
265
|
+
query += ");";
|
|
266
|
+
return query.trim();
|
|
267
|
+
}
|
|
268
|
+
createView(def) {
|
|
269
|
+
const tableName = this.getTableNameWithoutDatabase(def.table);
|
|
270
|
+
return `CREATE VIEW ${tableName} AS\n${this.query({ type: "select", ...def.queryDef })}`.trim();
|
|
271
|
+
}
|
|
272
|
+
dropTable(def) {
|
|
273
|
+
const tableName = this.getTableName(def.table);
|
|
274
|
+
return `DROP TABLE ${tableName}`;
|
|
275
|
+
}
|
|
276
|
+
addColumn(def) {
|
|
277
|
+
const tableName = this.getTableName(def.table);
|
|
278
|
+
const queries = [];
|
|
279
|
+
if (!def.column.nullable && def.column.defaultValue !== undefined) {
|
|
280
|
+
queries.push(`ALTER TABLE ${tableName}
|
|
281
|
+
ADD ${this._getQueryOfColDef({
|
|
282
|
+
...def.column,
|
|
283
|
+
nullable: true
|
|
284
|
+
})}`);
|
|
285
|
+
queries.push(`UPDATE ${tableName}
|
|
286
|
+
SET ${this.wrap(def.column.name)} = ${this.getQueryOfQueryValue(def.column.defaultValue)}`);
|
|
287
|
+
queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${this._getQueryOfColDef(def.column)}`);
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
queries.push(`ALTER TABLE ${tableName}
|
|
291
|
+
ADD ${this._getQueryOfColDef(def.column)}`);
|
|
292
|
+
}
|
|
293
|
+
return queries;
|
|
294
|
+
}
|
|
295
|
+
removeColumn(def) {
|
|
296
|
+
const tableName = this.getTableName(def.table);
|
|
297
|
+
return `ALTER TABLE ${tableName} DROP COLUMN ${this.wrap(def.column)}`;
|
|
298
|
+
}
|
|
299
|
+
modifyColumn(def) {
|
|
300
|
+
if (this._dialect === "mysql") {
|
|
301
|
+
const tableName = this.getTableName(def.table);
|
|
302
|
+
const queries = [];
|
|
303
|
+
if (!def.column.nullable && def.column.defaultValue !== undefined) {
|
|
304
|
+
queries.push(`ALTER TABLE ${tableName} MODIFY COLUMN ${this._getQueryOfColDef({
|
|
305
|
+
...def.column,
|
|
306
|
+
nullable: true
|
|
307
|
+
})}`);
|
|
308
|
+
queries.push(`UPDATE ${tableName}
|
|
309
|
+
SET ${this.wrap(def.column.name)} = ${this.getQueryOfQueryValue(def.column.defaultValue)}
|
|
310
|
+
WHERE ${this.wrap(def.column.name)} IS NULL`);
|
|
311
|
+
}
|
|
312
|
+
queries.push(`ALTER TABLE ${tableName} MODIFY COLUMN ${this._getQueryOfColDef(def.column)}`);
|
|
313
|
+
return queries;
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
const tableName = this.getTableName(def.table);
|
|
317
|
+
const queries = [];
|
|
318
|
+
if (!def.column.nullable && def.column.defaultValue !== undefined) {
|
|
319
|
+
queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${this._getQueryOfColDef({
|
|
320
|
+
...def.column,
|
|
321
|
+
nullable: true
|
|
322
|
+
})}`);
|
|
323
|
+
queries.push(`UPDATE ${tableName}
|
|
324
|
+
SET ${this.wrap(def.column.name)} = ${this.getQueryOfQueryValue(def.column.defaultValue)}
|
|
325
|
+
WHERE ${this.wrap(def.column.name)} IS NULL`);
|
|
326
|
+
}
|
|
327
|
+
queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${this._getQueryOfColDef(def.column)}`);
|
|
328
|
+
return queries;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
renameColumn(def) {
|
|
332
|
+
if (this._dialect === "mysql") {
|
|
333
|
+
const tableName = this.getTableName(def.table);
|
|
334
|
+
return `ALTER TABLE ${tableName} RENAME COLUMN ${this.wrap(def.prevName)} TO ${this.wrap(def.nextName)}`;
|
|
335
|
+
}
|
|
336
|
+
else if (this._dialect === "mssql-azure") {
|
|
337
|
+
if (def.table.schema === undefined)
|
|
338
|
+
throw new NeverEntryError();
|
|
339
|
+
return `EXECUTE sp_rename N'${def.table.schema}.${def.table.name}.${this.wrap(def.prevName)}', N'${def.nextName}', 'COLUMN'`;
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
if (def.table.database === undefined || def.table.schema === undefined)
|
|
343
|
+
throw new NeverEntryError();
|
|
344
|
+
return `EXECUTE ${def.table.database}..sp_rename N'${def.table.schema}.${def.table.name}.${this.wrap(def.prevName)}', N'${def.nextName}', 'COLUMN'`;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
dropPrimaryKey(def) {
|
|
348
|
+
if (this._dialect === "mysql") {
|
|
349
|
+
throw new Error("MYSQL 미구현");
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
const databaseDot = def.table.database !== undefined ? def.table.database + "." : "";
|
|
353
|
+
const schemaDot = def.table.schema !== undefined ? def.table.schema + "." : "";
|
|
354
|
+
return `ALTER TABLE ${databaseDot}${schemaDot}${def.table.name} DROP CONSTRAINT PK_${def.table.name}`;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
addPrimaryKey(def) {
|
|
358
|
+
if (this._dialect === "mysql") {
|
|
359
|
+
throw new Error("MYSQL 미구현");
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
const databaseDot = def.table.database !== undefined ? def.table.database + "." : "";
|
|
363
|
+
const schemaDot = def.table.schema !== undefined ? def.table.schema + "." : "";
|
|
364
|
+
return `ALTER TABLE ${databaseDot}${schemaDot}${def.table.name} ADD CONSTRAINT PK_${def.table.name} PRIMARY KEY (${def.columns.map((item) => this.wrap(item)).join(", ")})`;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
addForeignKey(def) {
|
|
368
|
+
if (this._dialect === "sqlite") {
|
|
369
|
+
const tableName = this.getTableNameChain(def.table).join(".");
|
|
370
|
+
const tableNameChain = this.getTableNameChain(def.table);
|
|
371
|
+
const tableKey = tableNameChain.join("_").length > 30
|
|
372
|
+
? tableNameChain.join("_").replace(/[a-z]/g, "")
|
|
373
|
+
: tableNameChain.join("_");
|
|
374
|
+
const fkName = this.wrap(`FK_${tableKey}_${def.foreignKey.name}`);
|
|
375
|
+
const targetTableName = this.getTableName(def.foreignKey.targetTable);
|
|
376
|
+
return `
|
|
377
|
+
pragma writable_schema=1;
|
|
378
|
+
UPDATE sqlite_master
|
|
379
|
+
SET sql = SUBSTR(sql, 1, LENGTH(sql) - 1) || ',
|
|
380
|
+
CONSTRAINT ${fkName} FOREIGN KEY (${def.foreignKey.fkColumns.map((columnName) => `${this.wrap(columnName)}`).join(", ")})
|
|
381
|
+
REFERENCES ${targetTableName}(${def.foreignKey.targetPkColumns.map((columnName) => `${this.wrap(columnName)}`).join(", ")})
|
|
382
|
+
ON UPDATE RESTRICT
|
|
383
|
+
ON DELETE RESTRICT
|
|
384
|
+
)'
|
|
385
|
+
WHERE name = '${tableName}' AND type = 'table'
|
|
386
|
+
RETURNING *;
|
|
387
|
+
pragma writable_schema=0;`.trim();
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
const tableName = this.getTableName(def.table);
|
|
391
|
+
const tableNameChain = this.getTableNameChain(def.table);
|
|
392
|
+
const tableKey = this._dialect === "mysql" && tableNameChain.join("_").length > 30
|
|
393
|
+
? tableNameChain.join("_").replace(/[a-z]/g, "")
|
|
394
|
+
: tableNameChain.join("_");
|
|
395
|
+
const fkName = this.wrap(`FK_${tableKey}_${def.foreignKey.name}`);
|
|
396
|
+
const targetTableName = this.getTableName(def.foreignKey.targetTable);
|
|
397
|
+
let query = "";
|
|
398
|
+
query += `ALTER TABLE ${tableName}
|
|
399
|
+
ADD CONSTRAINT ${fkName} FOREIGN KEY (${def.foreignKey.fkColumns.map((columnName) => `${this.wrap(columnName)}`).join(", ")}) `;
|
|
400
|
+
query += ` REFERENCES ${targetTableName} (${def.foreignKey.targetPkColumns.map((columnName) => `${this.wrap(columnName)}`).join(", ")})\n`;
|
|
401
|
+
query += " ON DELETE NO ACTION\n";
|
|
402
|
+
query += " ON UPDATE NO ACTION;";
|
|
403
|
+
return query.trim();
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
removeForeignKey(def) {
|
|
407
|
+
const tableName = this.getTableName(def.table);
|
|
408
|
+
const tableNameChain = this.getTableNameChain(def.table);
|
|
409
|
+
const tableKey = this._dialect === "mysql" && tableNameChain.join("_").length > 30
|
|
410
|
+
? tableNameChain.join("_").replace(/[a-z]/g, "")
|
|
411
|
+
: tableNameChain.join("_");
|
|
412
|
+
const fkName = this.wrap(`FK_${tableKey}_${def.foreignKey}`);
|
|
413
|
+
return `ALTER TABLE ${tableName} DROP CONSTRAINT ${fkName};`;
|
|
414
|
+
}
|
|
415
|
+
createIndex(def) {
|
|
416
|
+
const tableName = this.getTableName(def.table);
|
|
417
|
+
const tableNameChain = this._dialect === "mysql" ? this.getTableNameChain(def.table) : this.getTableNameChain(def.table).slice(-2);
|
|
418
|
+
const tableKey = this._dialect === "mysql" && tableNameChain.join("_").length > 30
|
|
419
|
+
? tableNameChain.join("_").replace(/[a-z]/g, "")
|
|
420
|
+
: tableNameChain.join("_");
|
|
421
|
+
const isUnique = def.index.columns.some((item) => item.unique);
|
|
422
|
+
const idxName = this.wrap(`${isUnique ? "UDX" : "IDX"}_${tableKey}_${def.index.name}`);
|
|
423
|
+
return `CREATE
|
|
424
|
+
${isUnique ? "UNIQUE " : ""}INDEX
|
|
425
|
+
${idxName}
|
|
426
|
+
ON
|
|
427
|
+
${tableName}
|
|
428
|
+
(
|
|
429
|
+
${def.index.columns.map((item) => `${this.wrap(item.name)} ${item.orderBy}`).join(", ")}
|
|
430
|
+
);`;
|
|
431
|
+
}
|
|
432
|
+
dropIndex(def) {
|
|
433
|
+
const tableName = this.getTableName(def.table);
|
|
434
|
+
const tableNameChain = this._dialect === "mysql" ? this.getTableNameChain(def.table) : this.getTableNameChain(def.table).slice(-2);
|
|
435
|
+
const tableKey = this._dialect === "mysql" && tableNameChain.join("_").length > 30
|
|
436
|
+
? tableNameChain.join("_").replace(/[a-z]/g, "")
|
|
437
|
+
: tableNameChain.join("_");
|
|
438
|
+
const idxName = this.wrap(`IDX_${tableKey}_${def.index}`);
|
|
439
|
+
return `DROP INDEX ${idxName} ON ${tableName};`;
|
|
440
|
+
}
|
|
441
|
+
configIdentityInsert(def) {
|
|
442
|
+
const tableName = this.getTableName(def.table);
|
|
443
|
+
return `SET IDENTITY_INSERT ${tableName} ${def.state.toUpperCase()}`;
|
|
444
|
+
}
|
|
445
|
+
configForeignKeyCheck(def) {
|
|
446
|
+
if (this._dialect === "mysql") {
|
|
447
|
+
return `SET foreign_key_checks=${def.useCheck ? 1 : 0};`;
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
const tableName = this.getTableName(def.table);
|
|
451
|
+
return `ALTER TABLE ${tableName} ${def.useCheck ? "" : "NO"} CHECK CONSTRAINT ALL;`;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// endregion
|
|
455
|
+
// ----------------------------------------------------
|
|
456
|
+
// TABLE
|
|
457
|
+
// ----------------------------------------------------
|
|
458
|
+
// region TABLE
|
|
459
|
+
select(def) {
|
|
460
|
+
if (def.top !== undefined && def.limit) {
|
|
461
|
+
throw new Error("TOP과 LIMIT은 함께사용할 수 없습니다.");
|
|
462
|
+
}
|
|
463
|
+
let q = "SELECT";
|
|
464
|
+
if (def.distinct) {
|
|
465
|
+
q += " DISTINCT";
|
|
466
|
+
}
|
|
467
|
+
if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
|
|
468
|
+
if (def.top !== undefined) {
|
|
469
|
+
q += ` TOP ${def.top}`;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
// SELECT FIELDS
|
|
473
|
+
if (def.select) {
|
|
474
|
+
q += "\n";
|
|
475
|
+
const selectFieldQueryStrings = [];
|
|
476
|
+
for (const selectKey of Object.keys(def.select)) {
|
|
477
|
+
const selectValue = def.select[selectKey];
|
|
478
|
+
if (selectValue?.["from"] !== undefined) {
|
|
479
|
+
const selectQueryDef = selectValue;
|
|
480
|
+
let subQuery = " (\n";
|
|
481
|
+
subQuery += " " + this.select(selectQueryDef).replace(/\n/g, "\n ") + "\n";
|
|
482
|
+
subQuery += ` ) as ${selectKey}`;
|
|
483
|
+
selectFieldQueryStrings.push(subQuery);
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
selectFieldQueryStrings.push(` ${this.getQueryOfQueryValue(def.select[selectKey])} as ${selectKey}`);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
q += selectFieldQueryStrings.join(",\n");
|
|
490
|
+
q += "\n";
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
q += " *\n";
|
|
494
|
+
}
|
|
495
|
+
// FROM
|
|
496
|
+
if (def.from instanceof Array) {
|
|
497
|
+
q += "FROM (\n";
|
|
498
|
+
for (const from of def.from) {
|
|
499
|
+
q += " " + this.select(from).replace(/\n/g, "\n ");
|
|
500
|
+
q += "\n\n UNION ALL\n\n";
|
|
501
|
+
}
|
|
502
|
+
q = q.slice(0, -14);
|
|
503
|
+
q += ")";
|
|
504
|
+
}
|
|
505
|
+
else if (def.from?.["from"] !== undefined) {
|
|
506
|
+
const fromQueryDef = def.from;
|
|
507
|
+
q += "FROM (\n";
|
|
508
|
+
q += " " + this.select(fromQueryDef).replace(/\n/g, "\n ") + "\n";
|
|
509
|
+
q += ")";
|
|
510
|
+
}
|
|
511
|
+
else if (def.from !== undefined) {
|
|
512
|
+
q += `FROM ${def.from}`;
|
|
513
|
+
}
|
|
514
|
+
if (def.from !== undefined && def.as !== undefined) {
|
|
515
|
+
q += ` as ${def.as}`;
|
|
516
|
+
}
|
|
517
|
+
if (typeof def.from === "string" && def.lock) {
|
|
518
|
+
q += " with (XLOCK)";
|
|
519
|
+
}
|
|
520
|
+
q += "\n";
|
|
521
|
+
// PIVOT
|
|
522
|
+
if (this._dialect !== "mysql") {
|
|
523
|
+
if (def.pivot) {
|
|
524
|
+
let valueCol = this.getQueryOfQueryValue(def.pivot.valueColumn);
|
|
525
|
+
valueCol = valueCol.startsWith("(") && valueCol.endsWith(")") ? valueCol.slice(1, -1) : valueCol;
|
|
526
|
+
q += `PIVOT (${valueCol} FOR ${this.getQueryOfQueryValue(def.pivot.pivotColumn)}`;
|
|
527
|
+
q += ` IN (${def.pivot.pivotKeys.map((key) => this.wrap(key)).join(", ")}))${def.as !== undefined ? ` as ${def.as}` : ""}`;
|
|
528
|
+
q += "\n";
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
// UNPIVOT
|
|
532
|
+
if (def.unpivot) {
|
|
533
|
+
let valueCol = this.getQueryOfQueryValue(def.unpivot.valueColumn);
|
|
534
|
+
valueCol = valueCol.startsWith("(") && valueCol.endsWith(")") ? valueCol.slice(1, -1) : valueCol;
|
|
535
|
+
q += `UNPIVOT (${valueCol} FOR ${this.getQueryOfQueryValue(def.unpivot.pivotColumn)}`;
|
|
536
|
+
q += ` IN (${def.unpivot.pivotKeys.map((key) => this.wrap(key)).join(", ")}))${def.as !== undefined ? ` as ${def.as}` : ""}`;
|
|
537
|
+
q += "\n";
|
|
538
|
+
}
|
|
539
|
+
// JOIN
|
|
540
|
+
if (def.join && def.join.length > 0) {
|
|
541
|
+
for (const joinDef of def.join) {
|
|
542
|
+
q += this._getQueryOfJoinDef(joinDef);
|
|
543
|
+
q += "\n";
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
// WHERE
|
|
547
|
+
if (def.where) {
|
|
548
|
+
q += `WHERE ${def.where.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
|
|
549
|
+
q += "\n";
|
|
550
|
+
}
|
|
551
|
+
// GROUP BY
|
|
552
|
+
if (def.groupBy && def.groupBy.length > 0) {
|
|
553
|
+
q += `GROUP BY ${def.groupBy.map((item) => this.getQueryOfQueryValue(item)).join(", ")}`;
|
|
554
|
+
q += "\n";
|
|
555
|
+
}
|
|
556
|
+
// HAVING
|
|
557
|
+
if (def.having) {
|
|
558
|
+
if (!(def.groupBy && def.groupBy.length > 0)) {
|
|
559
|
+
throw new Error("'HAVING'을 사용하려면, 'GROUP BY'를 반드시 설정해야 합니다.");
|
|
560
|
+
}
|
|
561
|
+
q += `HAVING ${def.having.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
|
|
562
|
+
q += "\n";
|
|
563
|
+
}
|
|
564
|
+
// ORDER BY
|
|
565
|
+
if (def.orderBy && def.orderBy.length > 0) {
|
|
566
|
+
q += `ORDER BY ${def.orderBy.map((item) => this.getQueryOfQueryValue(item[0]) + " " + item[1]).join(", ")}`;
|
|
567
|
+
q += "\n";
|
|
568
|
+
}
|
|
569
|
+
// LIMIT
|
|
570
|
+
if (def.limit) {
|
|
571
|
+
if (!(def.orderBy && def.orderBy.length > 0)) {
|
|
572
|
+
throw new Error("'LIMIT'을 사용하려면, 'ORDER BY'를 반드시 설정해야 합니다.");
|
|
573
|
+
}
|
|
574
|
+
if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
|
|
575
|
+
q += `OFFSET ${def.limit[0]} ROWS FETCH NEXT ${def.limit[1]} ROWS ONLY`;
|
|
576
|
+
q += "\n";
|
|
577
|
+
}
|
|
578
|
+
else {
|
|
579
|
+
q += `LIMIT ${def.limit[0]}, ${def.limit[1]}`;
|
|
580
|
+
q += "\n";
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
if (this._dialect !== "mssql" && this._dialect !== "mssql-azure") {
|
|
584
|
+
if (def.top !== undefined) {
|
|
585
|
+
q += `LIMIT ${def.top}`;
|
|
586
|
+
q += "\n";
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
// SAMPLE
|
|
590
|
+
if (def.sample !== undefined) {
|
|
591
|
+
if (this._dialect === "mssql") {
|
|
592
|
+
q += `TABLESAMPLE (${def.sample} ROWS)`;
|
|
593
|
+
q += "\n";
|
|
594
|
+
}
|
|
595
|
+
else {
|
|
596
|
+
throw new Error("'select > sample'의 경우 mssql만 구현되어 있습니다.");
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
return q.trim();
|
|
600
|
+
}
|
|
601
|
+
insertInto(def) {
|
|
602
|
+
let q = "";
|
|
603
|
+
q += `INSERT INTO ${def.target} (${Object.keys(def.select).join(", ")})`;
|
|
604
|
+
q += "\n";
|
|
605
|
+
q += this.select(def);
|
|
606
|
+
return q.trim() + ";";
|
|
607
|
+
}
|
|
608
|
+
insert(def) {
|
|
609
|
+
let q = "";
|
|
610
|
+
q += `INSERT INTO ${def.from} (${Object.keys(def.record).join(", ")})`;
|
|
611
|
+
q += "\n";
|
|
612
|
+
if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
|
|
613
|
+
if (def.output) {
|
|
614
|
+
q += `OUTPUT ${def.output.map((item) => "INSERTED." + item).join(", ")}`;
|
|
615
|
+
q += "\n";
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
q += `VALUES (${Object.values(def.record).map((val) => this.getQueryOfQueryValue(val)).join(", ")})`;
|
|
619
|
+
q += "\n";
|
|
620
|
+
if (this._dialect === "sqlite") {
|
|
621
|
+
if (def.output) {
|
|
622
|
+
q += `RETURNING ${def.output.join(", ")}`;
|
|
623
|
+
q += "\n";
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
return q.trim() + ";";
|
|
627
|
+
}
|
|
628
|
+
update(def) {
|
|
629
|
+
if (this._dialect === "sqlite") {
|
|
630
|
+
if (def.join && def.join.length > 0) {
|
|
631
|
+
throw new Error("sqlite - update - join 미구현");
|
|
632
|
+
}
|
|
633
|
+
else if (def.limit || def.top !== undefined) {
|
|
634
|
+
throw new Error("sqlite - update - limit, top 미구현");
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
if (def.as === undefined)
|
|
638
|
+
throw new NeverEntryError();
|
|
639
|
+
if (def.top !== undefined && def.limit) {
|
|
640
|
+
throw new Error("TOP과 LIMIT은 함께사용할 수 없습니다.");
|
|
641
|
+
}
|
|
642
|
+
let q = "";
|
|
643
|
+
// LINE 1
|
|
644
|
+
q += "UPDATE";
|
|
645
|
+
if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
|
|
646
|
+
if (def.top !== undefined) {
|
|
647
|
+
q += ` TOP (${def.top})`;
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
if (this._dialect !== "mssql" && this._dialect !== "mssql-azure") {
|
|
651
|
+
// FROM, AS
|
|
652
|
+
q += ` ${def.from} as ${def.as}`;
|
|
653
|
+
q += "\n";
|
|
654
|
+
// JOIN
|
|
655
|
+
if (def.join && def.join.length > 0) {
|
|
656
|
+
for (const joinDef of def.join) {
|
|
657
|
+
q += this._getQueryOfJoinDef(joinDef);
|
|
658
|
+
q += "\n";
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
q += "SET";
|
|
662
|
+
q += "\n";
|
|
663
|
+
}
|
|
664
|
+
else {
|
|
665
|
+
q += ` ${def.as} SET`;
|
|
666
|
+
q += "\n";
|
|
667
|
+
}
|
|
668
|
+
// FIELD = VALUE
|
|
669
|
+
q += Object.keys(def.record).map((key) => ` ${this._dialect === "sqlite" ? "" : def.as + "."}${key} = ${this.getQueryOfQueryValue(def.record[key])}`).join(",\n");
|
|
670
|
+
q += "\n";
|
|
671
|
+
// OUTPUT
|
|
672
|
+
if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
|
|
673
|
+
if (def.output) {
|
|
674
|
+
q += `OUTPUT ${def.output.map((item) => "INSERTED." + item).join(", ")}`;
|
|
675
|
+
q += "\n";
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
|
|
679
|
+
// FROM, AS
|
|
680
|
+
q += `FROM ${def.from} as ${def.as}`;
|
|
681
|
+
q += "\n";
|
|
682
|
+
// JOIN
|
|
683
|
+
if (def.join && def.join.length > 0) {
|
|
684
|
+
for (const joinDef of def.join) {
|
|
685
|
+
q += this._getQueryOfJoinDef(joinDef);
|
|
686
|
+
q += "\n";
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
// WHERE
|
|
691
|
+
if (def.where) {
|
|
692
|
+
q += `WHERE ${def.where.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
|
|
693
|
+
q += "\n";
|
|
694
|
+
}
|
|
695
|
+
if (this._dialect !== "mssql" && this._dialect !== "mssql-azure") {
|
|
696
|
+
if (def.top !== undefined) {
|
|
697
|
+
q += `LIMIT ${def.top}`;
|
|
698
|
+
q += "\n";
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
if (this._dialect === "sqlite") {
|
|
702
|
+
if (def.output) {
|
|
703
|
+
q += `RETURNING ${def.output.join(", ")}`;
|
|
704
|
+
q += "\n";
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
return q.trim() + ";";
|
|
708
|
+
}
|
|
709
|
+
insertIfNotExists(def) {
|
|
710
|
+
if (this._dialect === "mysql") {
|
|
711
|
+
throw new Error("MYSQL 미구현");
|
|
712
|
+
}
|
|
713
|
+
else {
|
|
714
|
+
let q = "";
|
|
715
|
+
// LINE 1
|
|
716
|
+
q += `MERGE ${def.from} as ${def.as}`;
|
|
717
|
+
q += "\n";
|
|
718
|
+
// USING
|
|
719
|
+
q += "USING (SELECT 0 as _using) as _using";
|
|
720
|
+
q += "\n";
|
|
721
|
+
// WHERE
|
|
722
|
+
q += `ON ${def.where.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
|
|
723
|
+
q += "\n";
|
|
724
|
+
// INSERT
|
|
725
|
+
q += "WHEN NOT MATCHED THEN\n";
|
|
726
|
+
q += ` INSERT (${Object.keys(def.insertRecord).join(", ")})\n`;
|
|
727
|
+
q += ` VALUES (${Object.values(def.insertRecord).map((val) => this.getQueryOfQueryValue(val)).join(", ")})`;
|
|
728
|
+
q += "\n";
|
|
729
|
+
if (def.output) {
|
|
730
|
+
if (this._dialect === "sqlite") {
|
|
731
|
+
q += `RETURNING ${def.output.join(", ")}`;
|
|
732
|
+
q += "\n";
|
|
733
|
+
}
|
|
734
|
+
else {
|
|
735
|
+
q += `OUTPUT ${def.output.map((item) => "INSERTED." + item).join(", ")}`;
|
|
736
|
+
q += "\n";
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
return q.trim() + ";";
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
upsert(def) {
|
|
743
|
+
if (this._dialect === "sqlite") {
|
|
744
|
+
throw new Error("sqlite - upsert 미구현");
|
|
745
|
+
}
|
|
746
|
+
else if (this._dialect === "mysql") {
|
|
747
|
+
const procName = this.wrap("SD" + Uuid.new().toString().replace(/-/g, ""));
|
|
748
|
+
const q = `
|
|
749
|
+
USE ${def.from.split(".")[0]};
|
|
750
|
+
|
|
751
|
+
CREATE PROCEDURE ${procName}()
|
|
752
|
+
proc_label:BEGIN
|
|
753
|
+
|
|
754
|
+
IF EXISTS (
|
|
755
|
+
${this.select(def).replace(/\n/g, "\n ")}
|
|
756
|
+
) THEN
|
|
757
|
+
|
|
758
|
+
${Object.keys(def.updateRecord).length > 0 ? this.update({ ...def, record: def.updateRecord }) : "LEAVE proc_label;"}
|
|
759
|
+
|
|
760
|
+
ELSE
|
|
761
|
+
|
|
762
|
+
${Object.keys(def.insertRecord).length > 0 ? this.insert({ ...def, record: def.insertRecord }) : "LEAVE proc_label;"}
|
|
763
|
+
|
|
764
|
+
END IF;
|
|
765
|
+
|
|
766
|
+
END;
|
|
767
|
+
CALL ${procName};
|
|
768
|
+
DROP PROCEDURE ${procName};`;
|
|
769
|
+
return q.trim() + ";";
|
|
770
|
+
}
|
|
771
|
+
else {
|
|
772
|
+
let q = "";
|
|
773
|
+
// LINE 1
|
|
774
|
+
q += `MERGE ${def.from} as ${def.as}`;
|
|
775
|
+
q += "\n";
|
|
776
|
+
// USING
|
|
777
|
+
q += "USING (SELECT 0 as _using) as _using";
|
|
778
|
+
q += "\n";
|
|
779
|
+
// WHERE
|
|
780
|
+
q += `ON ${def.where.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
|
|
781
|
+
q += "\n";
|
|
782
|
+
// UPDATE
|
|
783
|
+
if (typeof def.updateRecord !== "undefined" && Object.keys(def.updateRecord).length > 0) {
|
|
784
|
+
q += "WHEN MATCHED THEN\n";
|
|
785
|
+
q += " UPDATE SET\n";
|
|
786
|
+
q += Object.keys(def.updateRecord).map((key) => ` ${key} = ${this.getQueryOfQueryValue(def.updateRecord[key])}`).join(",\n");
|
|
787
|
+
q += "\n";
|
|
788
|
+
}
|
|
789
|
+
// INSERT
|
|
790
|
+
q += "WHEN NOT MATCHED THEN\n";
|
|
791
|
+
q += ` INSERT (${Object.keys(def.insertRecord).join(", ")})\n`;
|
|
792
|
+
q += ` VALUES (${Object.values(def.insertRecord).map((val) => this.getQueryOfQueryValue(val)).join(", ")})`;
|
|
793
|
+
q += "\n";
|
|
794
|
+
if (def.output) {
|
|
795
|
+
q += `OUTPUT ${def.output.map((item) => "INSERTED." + item).join(", ")}`;
|
|
796
|
+
q += "\n";
|
|
797
|
+
}
|
|
798
|
+
return q.trim() + ";";
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
delete(def) {
|
|
802
|
+
if (def.as === undefined)
|
|
803
|
+
throw new NeverEntryError();
|
|
804
|
+
if (this._dialect === "mysql") {
|
|
805
|
+
// TODO: 일반적인 경우엔 그냥 DELETE 쿼리 사용
|
|
806
|
+
return `
|
|
807
|
+
USE ${def.from.split(".")[0]};
|
|
808
|
+
|
|
809
|
+
SET foreign_key_checks=0;
|
|
810
|
+
|
|
811
|
+
SET @cols = NULL;
|
|
812
|
+
|
|
813
|
+
SELECT GROUP_CONCAT('${"`_" + def.as.slice(1)}.\`', COLUMN_NAME, '\`', ' = ', '${def.as}.\`', COLUMN_NAME, '\`' separator ' AND ') INTO @cols
|
|
814
|
+
FROM INFORMATION_SCHEMA.COLUMNS
|
|
815
|
+
WHERE CONCAT('\`', TABLE_SCHEMA, '\`.\`', TABLE_NAME, '\`') = '${def.from}' AND COLUMN_KEY='PRI';
|
|
816
|
+
|
|
817
|
+
SET @sql = CONCAT('${`DELETE ${def.as} FROM ${def.from} as ${def.as} JOIN (
|
|
818
|
+
${this.select(def).replace(/\n/g, "\n ").replace("*", def.as + ".*")}
|
|
819
|
+
) ${"`_" + def.as.slice(1)} ON 1 = 1 WHERE `.replace(/'/g, "''")}', @cols, ';');
|
|
820
|
+
SELECT @sql;
|
|
821
|
+
|
|
822
|
+
PREPARE stmt FROM @sql;
|
|
823
|
+
EXECUTE stmt;
|
|
824
|
+
DEALLOCATE PREPARE stmt;
|
|
825
|
+
|
|
826
|
+
SET foreign_key_checks=1;`.trim();
|
|
827
|
+
}
|
|
828
|
+
else {
|
|
829
|
+
if (this._dialect === "sqlite") {
|
|
830
|
+
if (def.join && def.join.length > 0) {
|
|
831
|
+
throw new Error("sqlite - update - join 미구현");
|
|
832
|
+
}
|
|
833
|
+
else if (def.limit || def.top !== undefined) {
|
|
834
|
+
throw new Error("sqlite - update - limit, top 미구현");
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
let q = "";
|
|
838
|
+
// LINE 1
|
|
839
|
+
q += "DELETE";
|
|
840
|
+
if (def.top !== undefined) {
|
|
841
|
+
q += ` TOP (${def.top})`;
|
|
842
|
+
}
|
|
843
|
+
q += "\n";
|
|
844
|
+
if (this._dialect !== "sqlite") {
|
|
845
|
+
q += ` ${def.as}`;
|
|
846
|
+
q += "\n";
|
|
847
|
+
}
|
|
848
|
+
// OUTPUT
|
|
849
|
+
if (def.output) {
|
|
850
|
+
if (this._dialect === "sqlite") {
|
|
851
|
+
q += `RETURNING ${def.output.map((item) => "DELETED." + item).join(", ")}`;
|
|
852
|
+
q += "\n";
|
|
853
|
+
}
|
|
854
|
+
else {
|
|
855
|
+
q += `OUTPUT ${def.output.map((item) => "DELETED." + item).join(", ")}`;
|
|
856
|
+
q += "\n";
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
// FROM, AS
|
|
860
|
+
q += `FROM ${def.from} as ${def.as}`;
|
|
861
|
+
q += "\n";
|
|
862
|
+
// JOIN
|
|
863
|
+
if (def.join && def.join.length > 0) {
|
|
864
|
+
for (const joinDef of def.join) {
|
|
865
|
+
q += this._getQueryOfJoinDef(joinDef);
|
|
866
|
+
q += "\n";
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
// WHERE
|
|
870
|
+
if (def.where) {
|
|
871
|
+
q += `WHERE ${def.where.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
|
|
872
|
+
q += "\n";
|
|
873
|
+
}
|
|
874
|
+
return q.trim() + ";";
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
truncateTable(def) {
|
|
878
|
+
const tableName = this.getTableName(def.table);
|
|
879
|
+
return `TRUNCATE TABLE ${tableName}`;
|
|
880
|
+
}
|
|
881
|
+
// endregion
|
|
882
|
+
// ----------------------------------------------------
|
|
883
|
+
// HELPERS
|
|
884
|
+
// ----------------------------------------------------
|
|
885
|
+
// region HELPERS
|
|
886
|
+
query(def) {
|
|
887
|
+
return this[def.type](def);
|
|
888
|
+
}
|
|
889
|
+
wrap(name) {
|
|
890
|
+
return this._dialect === "mysql" ? "`" + name + "`"
|
|
891
|
+
: "[" + name + "]";
|
|
892
|
+
}
|
|
893
|
+
getTableName(def) {
|
|
894
|
+
return this.getTableNameChain(def).map((item) => this.wrap(item)).join(".");
|
|
895
|
+
}
|
|
896
|
+
getTableNameWithoutDatabase(def) {
|
|
897
|
+
return this.getTableNameChain(def).slice(1).map((item) => this.wrap(item)).join(".");
|
|
898
|
+
}
|
|
899
|
+
getTableNameChain(def) {
|
|
900
|
+
if (this._dialect === "mysql") {
|
|
901
|
+
if (def.database !== undefined) {
|
|
902
|
+
return [def.database, def.name];
|
|
903
|
+
}
|
|
904
|
+
else {
|
|
905
|
+
return [def.name];
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
else if (this._dialect === "mssql-azure") {
|
|
909
|
+
if (def.schema !== undefined) {
|
|
910
|
+
return [def.schema, def.name];
|
|
911
|
+
}
|
|
912
|
+
else {
|
|
913
|
+
return [def.name];
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
else {
|
|
917
|
+
if (def.database !== undefined) {
|
|
918
|
+
if (def.schema === undefined) {
|
|
919
|
+
throw new Error(`SCHEMA가 지정되어있지 않습니다. (DB: ${def.database}, TABLE: ${def.name})`);
|
|
920
|
+
}
|
|
921
|
+
return [def.database, def.schema, def.name];
|
|
922
|
+
}
|
|
923
|
+
else if (def.schema !== undefined) {
|
|
924
|
+
return [def.schema, def.name];
|
|
925
|
+
}
|
|
926
|
+
else {
|
|
927
|
+
return [def.name];
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
getQueryOfQueryValue(queryValue) {
|
|
932
|
+
if (queryValue instanceof Array) {
|
|
933
|
+
return "(" + queryValue.map((item) => this.getQueryOfQueryValue(item)).join("") + ")";
|
|
934
|
+
}
|
|
935
|
+
else if (queryValue["from"] !== undefined) {
|
|
936
|
+
let subQuery = "(\n";
|
|
937
|
+
subQuery += " " + this.select(queryValue).replace(/\n/g, "\n ") + "\n";
|
|
938
|
+
subQuery += ")";
|
|
939
|
+
return subQuery;
|
|
940
|
+
}
|
|
941
|
+
else {
|
|
942
|
+
return queryValue;
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
_getQueryOfColDef(colDef) {
|
|
946
|
+
let q = "";
|
|
947
|
+
if (this._dialect === "sqlite") {
|
|
948
|
+
q += this.wrap(colDef.name) + " ";
|
|
949
|
+
q += this.qh.type(colDef.dataType) + " ";
|
|
950
|
+
q += colDef.pkOrderBy ? `PRIMARY KEY ${colDef.pkOrderBy} ` : "";
|
|
951
|
+
q += colDef.autoIncrement ? this.qh.type(colDef.dataType) === "UNIQUEIDENTIFIER" ? "default NEWID() " : "AUTOINCREMENT " : "";
|
|
952
|
+
q += colDef.autoIncrement ? "" : colDef.nullable ? "NULL " : "NOT NULL ";
|
|
953
|
+
}
|
|
954
|
+
else if (this._dialect === "mysql") {
|
|
955
|
+
q += this.wrap(colDef.name) + " ";
|
|
956
|
+
q += this.qh.type(colDef.dataType) + " ";
|
|
957
|
+
q += colDef.nullable ? "NULL " : "NOT NULL ";
|
|
958
|
+
q += colDef.autoIncrement ? this.qh.type(colDef.dataType) === "CHAR(38)" ? "default (REPLACE(UUID(), '-', '')) " : "AUTO_INCREMENT" : "";
|
|
959
|
+
}
|
|
960
|
+
else {
|
|
961
|
+
q += this.wrap(colDef.name) + " ";
|
|
962
|
+
q += this.qh.type(colDef.dataType) + " ";
|
|
963
|
+
q += colDef.autoIncrement ? this.qh.type(colDef.dataType) === "UNIQUEIDENTIFIER" ? "default NEWID() " : "IDENTITY(1,1) " : "";
|
|
964
|
+
q += colDef.nullable ? "NULL" : "NOT NULL";
|
|
965
|
+
}
|
|
966
|
+
return q.trim();
|
|
967
|
+
}
|
|
968
|
+
_getQueryOfJoinDef(def) {
|
|
969
|
+
let q = "";
|
|
970
|
+
if (Object.keys(def).every((key) => def[key] === undefined || (["from", "as", "where", "select", "isCustomSelect"].includes(key))) && !def.isCustomSelect) {
|
|
971
|
+
q += "LEFT OUTER JOIN ";
|
|
972
|
+
if (def.from instanceof Array) {
|
|
973
|
+
if (def.as === undefined)
|
|
974
|
+
throw new NeverEntryError();
|
|
975
|
+
q += "(\n";
|
|
976
|
+
for (const from of def.from) {
|
|
977
|
+
q += " " + this.select(from).replace(/\n/g, "\n ");
|
|
978
|
+
q += "\n\n UNION ALL\n\n";
|
|
979
|
+
}
|
|
980
|
+
q = q.slice(0, -14);
|
|
981
|
+
q += `) as ${def.as}`;
|
|
982
|
+
}
|
|
983
|
+
else if (def.from?.["from"] !== undefined) {
|
|
984
|
+
if (def.as === undefined)
|
|
985
|
+
throw new NeverEntryError();
|
|
986
|
+
q += "(\n";
|
|
987
|
+
q += " " + this.select(def.from).replace(/\n/g, "\n ") + "\n";
|
|
988
|
+
q += `) as ${def.as}`;
|
|
989
|
+
}
|
|
990
|
+
else {
|
|
991
|
+
if (def.as === undefined)
|
|
992
|
+
throw new NeverEntryError();
|
|
993
|
+
q += `${def.from} as ${def.as}`;
|
|
994
|
+
}
|
|
995
|
+
if (def.where) {
|
|
996
|
+
q += ` ON ${def.where.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
|
|
997
|
+
}
|
|
998
|
+
else {
|
|
999
|
+
q += " ON 1 = 1";
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
else {
|
|
1003
|
+
if (this._dialect === "sqlite") {
|
|
1004
|
+
q += "LEFT OUTER JOIN (\n";
|
|
1005
|
+
q += " " + this.select(def).replace(/\n/g, "\n ") + "\n";
|
|
1006
|
+
q += ") as " + def.as;
|
|
1007
|
+
}
|
|
1008
|
+
else if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
|
|
1009
|
+
q += "OUTER APPLY (\n";
|
|
1010
|
+
q += " " + this.select(def).replace(/\n/g, "\n ") + "\n";
|
|
1011
|
+
q += ") as " + def.as;
|
|
1012
|
+
}
|
|
1013
|
+
else {
|
|
1014
|
+
q += "LEFT OUTER JOIN LATERAL (\n";
|
|
1015
|
+
q += " " + this.select(def).replace(/\n/g, "\n ") + "\n";
|
|
1016
|
+
q += ") as " + def.as + " ON 1 = 1";
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
return q.trim();
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
//# sourceMappingURL=QueryBuilder.js.map
|