fdb2 1.0.36 → 1.0.37

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.
Files changed (31) hide show
  1. package/dist/public/explorer.css +150 -141
  2. package/dist/public/explorer.js +470 -303
  3. package/dist/public/index.css +85 -7
  4. package/dist/public/index.js +6 -0
  5. package/dist/public/layout.js +1 -1
  6. package/dist/server/service/database/mssql.service.d.ts.map +1 -1
  7. package/dist/server/service/database/mssql.service.js +14 -45
  8. package/dist/server/service/database/mssql.service.js.map +1 -1
  9. package/dist/server/service/database/mssql.service.ts +21 -49
  10. package/dist/server/service/database/mysql.service.d.ts.map +1 -1
  11. package/dist/server/service/database/mysql.service.js +34 -52
  12. package/dist/server/service/database/mysql.service.js.map +1 -1
  13. package/dist/server/service/database/mysql.service.ts +50 -55
  14. package/dist/server/service/database/oracle.service.d.ts.map +1 -1
  15. package/dist/server/service/database/oracle.service.js +16 -53
  16. package/dist/server/service/database/oracle.service.js.map +1 -1
  17. package/dist/server/service/database/oracle.service.ts +23 -56
  18. package/dist/server/service/database/postgres.service.d.ts.map +1 -1
  19. package/dist/server/service/database/postgres.service.js +15 -53
  20. package/dist/server/service/database/postgres.service.js.map +1 -1
  21. package/dist/server/service/database/postgres.service.ts +22 -57
  22. package/dist/server/service/database/sql-type.helper.d.ts +28 -0
  23. package/dist/server/service/database/sql-type.helper.d.ts.map +1 -0
  24. package/dist/server/service/database/sql-type.helper.js +151 -0
  25. package/dist/server/service/database/sql-type.helper.js.map +1 -0
  26. package/dist/server/service/database/sql-type.helper.ts +157 -0
  27. package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
  28. package/dist/server/service/database/sqlite.service.js +58 -67
  29. package/dist/server/service/database/sqlite.service.js.map +1 -1
  30. package/dist/server/service/database/sqlite.service.ts +72 -72
  31. package/package.json +1 -1
@@ -3,11 +3,12 @@ import * as fs from 'fs';
3
3
  import * as path from 'path';
4
4
  import { execSync } from 'child_process';
5
5
  import { BaseDatabaseService } from './base.service';
6
- import {
7
- TableEntity,
8
- ColumnEntity,
9
- IndexEntity,
10
- ForeignKeyEntity
6
+ import { buildColumnType, formatDefaultLiteral, escapeSqlString } from './sql-type.helper';
7
+ import {
8
+ TableEntity,
9
+ ColumnEntity,
10
+ IndexEntity,
11
+ ForeignKeyEntity
11
12
  } from '../../model/database.entity';
12
13
 
13
14
  /**
@@ -749,28 +750,19 @@ export class PostgreSQLService extends BaseDatabaseService {
749
750
 
750
751
  // 修改表注释
751
752
  if (tableDiff.tableCommentChanged) {
752
- sqlStatements.push(`COMMENT ON TABLE "${tableName}" IS '${tableDiff.tableComment}';`);
753
+ sqlStatements.push(`COMMENT ON TABLE "${tableName}" IS '${escapeSqlString(tableDiff.tableComment)}';`);
753
754
  }
754
755
 
756
+ // 重命名列:RENAME COLUMN 保留数据与索引,必须先于其它 ALTER 执行
757
+ (tableDiff.renamedColumns || []).forEach(({ oldColumn, newColumn }: any) => {
758
+ sqlStatements.push(`ALTER TABLE "${tableName}" RENAME COLUMN "${oldColumn.name}" TO "${newColumn.name}";`);
759
+ });
760
+
755
761
  // 添加新列
756
762
  tableDiff.addedColumns.forEach((column: any) => {
757
- // 检查type是否已经包含长度信息(括号)
758
- const typeHasLength = /\(\d+\)/.test(column.type);
759
-
760
- let columnSQL = `ALTER TABLE "${tableName}" ADD COLUMN "${column.name}" ${column.type}`;
761
-
762
- // 处理长度和精度(仅当type中没有指定长度时才添加)
763
- if (!typeHasLength) {
764
- if (column.length) {
765
- columnSQL += `(${column.length})`;
766
- } else if (column.precision) {
767
- if (column.scale) {
768
- columnSQL += `(${column.precision},${column.scale})`;
769
- } else {
770
- columnSQL += `(${column.precision})`;
771
- }
772
- }
773
- }
763
+ const columnType = buildColumnType('postgres', column.type, column.length, column.precision, column.scale);
764
+
765
+ let columnSQL = `ALTER TABLE "${tableName}" ADD COLUMN "${column.name}" ${columnType}`;
774
766
 
775
767
  // 处理NULL约束
776
768
  if (!column.nullable) {
@@ -779,17 +771,12 @@ export class PostgreSQLService extends BaseDatabaseService {
779
771
 
780
772
  // 处理默认值
781
773
  if (column.defaultValue) {
782
- const upperDefault = column.defaultValue.toString().toUpperCase();
783
- if (['CURRENT_TIMESTAMP', 'NOW()', 'CURRENT_DATE', 'CURRENT_TIME'].includes(upperDefault)) {
784
- columnSQL += ` DEFAULT ${upperDefault}`;
785
- } else {
786
- columnSQL += ` DEFAULT '${column.defaultValue}'`;
787
- }
774
+ columnSQL += ` DEFAULT ${formatDefaultLiteral(column.defaultValue)}`;
788
775
  }
789
776
 
790
777
  // 处理自增(PostgreSQL使用SERIAL或GENERATED AS IDENTITY)
791
778
  if (column.isAutoIncrement) {
792
- if (column.type.toLowerCase().includes('serial') || column.type.toLowerCase().includes('bigserial')) {
779
+ if (column.type.toLowerCase().includes('serial')) {
793
780
  // 类型已经包含自增
794
781
  } else {
795
782
  columnSQL += ' GENERATED ALWAYS AS IDENTITY';
@@ -800,33 +787,16 @@ export class PostgreSQLService extends BaseDatabaseService {
800
787
 
801
788
  // 添加列注释
802
789
  if (column.comment) {
803
- sqlStatements.push(`COMMENT ON COLUMN "${tableName}"."${column.name}" IS '${column.comment}';`);
790
+ sqlStatements.push(`COMMENT ON COLUMN "${tableName}"."${column.name}" IS '${escapeSqlString(column.comment)}';`);
804
791
  }
805
792
  });
806
793
 
807
794
  // 修改列
808
795
  tableDiff.modifiedColumns.forEach((modification: any) => {
809
796
  const { oldColumn, newColumn } = modification;
797
+ const columnType = buildColumnType('postgres', newColumn.type, newColumn.length, newColumn.precision, newColumn.scale);
810
798
 
811
- // 检查type是否已经包含长度信息(括号)
812
- const typeHasLength = /\(\d+\)/.test(newColumn.type);
813
-
814
- let columnSQL = `ALTER TABLE "${tableName}" ALTER COLUMN "${newColumn.name}" SET DATA TYPE ${newColumn.type}`;
815
-
816
- // 处理长度和精度(仅当type中没有指定长度时才添加)
817
- if (!typeHasLength) {
818
- if (newColumn.length) {
819
- columnSQL += `(${newColumn.length})`;
820
- } else if (newColumn.precision) {
821
- if (newColumn.scale) {
822
- columnSQL += `(${newColumn.precision},${newColumn.scale})`;
823
- } else {
824
- columnSQL += `(${newColumn.precision})`;
825
- }
826
- }
827
- }
828
-
829
- sqlStatements.push(columnSQL + ';');
799
+ sqlStatements.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${newColumn.name}" SET DATA TYPE ${columnType};`);
830
800
 
831
801
  // 修改NULL约束
832
802
  if (!newColumn.nullable) {
@@ -837,19 +807,14 @@ export class PostgreSQLService extends BaseDatabaseService {
837
807
 
838
808
  // 修改默认值
839
809
  if (newColumn.defaultValue) {
840
- const upperDefault = newColumn.defaultValue.toString().toUpperCase();
841
- if (['CURRENT_TIMESTAMP', 'NOW()', 'CURRENT_DATE', 'CURRENT_TIME'].includes(upperDefault)) {
842
- sqlStatements.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${newColumn.name}" SET DEFAULT ${upperDefault};`);
843
- } else {
844
- sqlStatements.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${newColumn.name}" SET DEFAULT '${newColumn.defaultValue}';`);
845
- }
810
+ sqlStatements.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${newColumn.name}" SET DEFAULT ${formatDefaultLiteral(newColumn.defaultValue)};`);
846
811
  } else {
847
812
  sqlStatements.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${newColumn.name}" DROP DEFAULT;`);
848
813
  }
849
814
 
850
815
  // 修改列注释
851
816
  if (newColumn.comment) {
852
- sqlStatements.push(`COMMENT ON COLUMN "${tableName}"."${newColumn.name}" IS '${newColumn.comment}';`);
817
+ sqlStatements.push(`COMMENT ON COLUMN "${tableName}"."${newColumn.name}" IS '${escapeSqlString(newColumn.comment)}';`);
853
818
  }
854
819
  });
855
820
 
@@ -0,0 +1,28 @@
1
+ /**
2
+ * SQL 类型参数工具。
3
+ *
4
+ * 解决的问题:前端提交的列类型可能只带基础类型名(如 VARCHAR)而长度/精度为空,
5
+ * 直接拼接会生成非法 SQL(MySQL 的 `VARCHAR` 必须带长度、`DECIMAL` 必须带精度)。
6
+ * 这里按数据库补齐默认参数;类型本身已带括号(如 ENUM('a','b')、DECIMAL(10,2))时原样返回。
7
+ */
8
+ /** 类型是否已自带参数(如 VARCHAR(255)、DECIMAL(10,2)、ENUM('a','b')) */
9
+ export declare function hasTypeParams(type: string): boolean;
10
+ /** 提取类型的基础名称(去掉括号及参数) */
11
+ export declare function baseTypeName(type: string): string;
12
+ /**
13
+ * 构建列类型字符串,按数据库补齐缺失的长度/精度参数。
14
+ *
15
+ * @param databaseType mysql | postgres | mssql | oracle | sqlite
16
+ * @param type 列类型(可能已带参数)
17
+ * @param length 用户填写的长度
18
+ * @param precision 用户填写的精度
19
+ * @param scale 用户填写的小数位
20
+ */
21
+ export declare function buildColumnType(databaseType: string, type: string, length?: number | string | null, precision?: number | string | null, scale?: number | string | null): string;
22
+ /** 转义 SQL 字符串字面量中的单引号 */
23
+ export declare function escapeSqlString(value: any): string;
24
+ /** 默认值是否为函数/关键字形式(不加引号) */
25
+ export declare function isFunctionDefault(value: any): boolean;
26
+ /** 生成 SQL 默认值字面量(函数原样输出,其余加引号并转义) */
27
+ export declare function formatDefaultLiteral(value: any): string;
28
+ //# sourceMappingURL=sql-type.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-type.helper.d.ts","sourceRoot":"","sources":["../../../../server/service/database/sql-type.helper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyDH,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,yBAAyB;AACzB,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AASD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,EAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,EAClC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAC7B,MAAM,CAkBR;AAED,yBAAyB;AACzB,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAElD;AAWD,2BAA2B;AAC3B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAYrD;AAED,qCAAqC;AACrC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAQvD"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ /**
3
+ * SQL 类型参数工具。
4
+ *
5
+ * 解决的问题:前端提交的列类型可能只带基础类型名(如 VARCHAR)而长度/精度为空,
6
+ * 直接拼接会生成非法 SQL(MySQL 的 `VARCHAR` 必须带长度、`DECIMAL` 必须带精度)。
7
+ * 这里按数据库补齐默认参数;类型本身已带括号(如 ENUM('a','b')、DECIMAL(10,2))时原样返回。
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.hasTypeParams = hasTypeParams;
11
+ exports.baseTypeName = baseTypeName;
12
+ exports.buildColumnType = buildColumnType;
13
+ exports.escapeSqlString = escapeSqlString;
14
+ exports.isFunctionDefault = isFunctionDefault;
15
+ exports.formatDefaultLiteral = formatDefaultLiteral;
16
+ /**
17
+ * 各数据库中「缺参即非法」的类型的默认参数。
18
+ * SQLite 的 VARCHAR 等不带长度也合法,因此不在此列。
19
+ */
20
+ const TYPE_DEFAULTS = {
21
+ mysql: {
22
+ tinyint: { length: 4 },
23
+ smallint: { length: 6 },
24
+ mediumint: { length: 9 },
25
+ int: { length: 11 },
26
+ integer: { length: 11 },
27
+ bigint: { length: 20 },
28
+ decimal: { precision: 10, scale: 2 },
29
+ float: { precision: 10, scale: 2 },
30
+ double: { precision: 16, scale: 4 },
31
+ bit: { length: 1 },
32
+ char: { length: 1 },
33
+ varchar: { length: 255 },
34
+ binary: { length: 1 },
35
+ varbinary: { length: 255 }
36
+ },
37
+ postgres: {
38
+ decimal: { precision: 10, scale: 2 },
39
+ numeric: { precision: 10, scale: 2 },
40
+ 'character varying': { length: 255 },
41
+ varchar: { length: 255 },
42
+ character: { length: 1 },
43
+ char: { length: 1 }
44
+ },
45
+ mssql: {
46
+ decimal: { precision: 18, scale: 0 },
47
+ numeric: { precision: 18, scale: 0 },
48
+ float: { precision: 53 },
49
+ char: { length: 1 },
50
+ varchar: { length: 255 },
51
+ nchar: { length: 1 },
52
+ nvarchar: { length: 255 },
53
+ binary: { length: 1 },
54
+ varbinary: { length: 255 }
55
+ },
56
+ oracle: {
57
+ char: { length: 1 },
58
+ nchar: { length: 1 },
59
+ varchar2: { length: 4000 },
60
+ nvarchar2: { length: 2000 },
61
+ raw: { length: 2000 }
62
+ }
63
+ };
64
+ /** 类型是否已自带参数(如 VARCHAR(255)、DECIMAL(10,2)、ENUM('a','b')) */
65
+ function hasTypeParams(type) {
66
+ return !!type && type.includes('(');
67
+ }
68
+ /** 提取类型的基础名称(去掉括号及参数) */
69
+ function baseTypeName(type) {
70
+ if (!type)
71
+ return '';
72
+ const match = type.trim().match(/^([a-zA-Z\s]+?)\s*\(/);
73
+ const base = match?.[1] ?? type;
74
+ return base.trim().toLowerCase();
75
+ }
76
+ /** 把用户输入的长度/精度/小数位规整为数字,空值视为未填写 */
77
+ function toNumber(value) {
78
+ if (value === null || value === undefined || value === '')
79
+ return null;
80
+ const num = Number(value);
81
+ return Number.isNaN(num) ? null : num;
82
+ }
83
+ /**
84
+ * 构建列类型字符串,按数据库补齐缺失的长度/精度参数。
85
+ *
86
+ * @param databaseType mysql | postgres | mssql | oracle | sqlite
87
+ * @param type 列类型(可能已带参数)
88
+ * @param length 用户填写的长度
89
+ * @param precision 用户填写的精度
90
+ * @param scale 用户填写的小数位
91
+ */
92
+ function buildColumnType(databaseType, type, length, precision, scale) {
93
+ if (!type || hasTypeParams(type))
94
+ return type;
95
+ const defaults = TYPE_DEFAULTS[String(databaseType || '').toLowerCase()]?.[baseTypeName(type)];
96
+ if (!defaults)
97
+ return type;
98
+ if (defaults.precision != null) {
99
+ const p = toNumber(precision) ?? defaults.precision;
100
+ const s = toNumber(scale) ?? defaults.scale;
101
+ return s != null ? `${type}(${p},${s})` : `${type}(${p})`;
102
+ }
103
+ if (defaults.length != null) {
104
+ const l = toNumber(length) ?? defaults.length;
105
+ return l != null ? `${type}(${l})` : type;
106
+ }
107
+ return type;
108
+ }
109
+ /** 转义 SQL 字符串字面量中的单引号 */
110
+ function escapeSqlString(value) {
111
+ return String(value ?? '').replace(/'/g, "''");
112
+ }
113
+ /** 各数据库常见的函数/关键字形式默认值(应原样输出,不加引号) */
114
+ const DEFAULT_KEYWORDS = new Set([
115
+ 'current_timestamp', 'now()', 'current_date', 'current_time',
116
+ 'localtimestamp', 'localtime', 'current_user',
117
+ 'sysdate', 'systimestamp', 'getdate()', 'getutcdate()',
118
+ 'sysdatetime()', 'sysdatetimeoffset()', 'sysutcdatetime()',
119
+ 'newid()', 'newsequentialid()', 'gen_random_uuid()', 'uuid_generate_v4()'
120
+ ]);
121
+ /** 默认值是否为函数/关键字形式(不加引号) */
122
+ function isFunctionDefault(value) {
123
+ if (value === null || value === undefined)
124
+ return false;
125
+ const raw = String(value).trim();
126
+ if (!raw)
127
+ return false;
128
+ const lower = raw.toLowerCase();
129
+ if (lower === 'null')
130
+ return true;
131
+ if (DEFAULT_KEYWORDS.has(lower))
132
+ return true;
133
+ // now() / getdate() / newid() 等零参函数调用
134
+ if (/^[a-z_][a-z0-9_]*\s*\(\s*\)$/.test(lower))
135
+ return true;
136
+ // current_timestamp(6) 等带精度参数的时间函数
137
+ if (/^current_timestamp\s*\(\s*\d+\s*\)$/.test(lower))
138
+ return true;
139
+ return false;
140
+ }
141
+ /** 生成 SQL 默认值字面量(函数原样输出,其余加引号并转义) */
142
+ function formatDefaultLiteral(value) {
143
+ if (value === null || value === undefined || String(value).trim() === '') {
144
+ return 'NULL';
145
+ }
146
+ if (isFunctionDefault(value)) {
147
+ return String(value).trim();
148
+ }
149
+ return `'${escapeSqlString(value)}'`;
150
+ }
151
+ //# sourceMappingURL=sql-type.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-type.helper.js","sourceRoot":"","sources":["../../../../server/service/database/sql-type.helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * SQL 类型参数工具。
3
+ *
4
+ * 解决的问题:前端提交的列类型可能只带基础类型名(如 VARCHAR)而长度/精度为空,
5
+ * 直接拼接会生成非法 SQL(MySQL 的 `VARCHAR` 必须带长度、`DECIMAL` 必须带精度)。
6
+ * 这里按数据库补齐默认参数;类型本身已带括号(如 ENUM('a','b')、DECIMAL(10,2))时原样返回。
7
+ */
8
+
9
+ interface TypeDefault {
10
+ length?: number;
11
+ precision?: number;
12
+ scale?: number;
13
+ }
14
+
15
+ /**
16
+ * 各数据库中「缺参即非法」的类型的默认参数。
17
+ * SQLite 的 VARCHAR 等不带长度也合法,因此不在此列。
18
+ */
19
+ const TYPE_DEFAULTS: Record<string, Record<string, TypeDefault>> = {
20
+ mysql: {
21
+ tinyint: { length: 4 },
22
+ smallint: { length: 6 },
23
+ mediumint: { length: 9 },
24
+ int: { length: 11 },
25
+ integer: { length: 11 },
26
+ bigint: { length: 20 },
27
+ decimal: { precision: 10, scale: 2 },
28
+ float: { precision: 10, scale: 2 },
29
+ double: { precision: 16, scale: 4 },
30
+ bit: { length: 1 },
31
+ char: { length: 1 },
32
+ varchar: { length: 255 },
33
+ binary: { length: 1 },
34
+ varbinary: { length: 255 }
35
+ },
36
+ postgres: {
37
+ decimal: { precision: 10, scale: 2 },
38
+ numeric: { precision: 10, scale: 2 },
39
+ 'character varying': { length: 255 },
40
+ varchar: { length: 255 },
41
+ character: { length: 1 },
42
+ char: { length: 1 }
43
+ },
44
+ mssql: {
45
+ decimal: { precision: 18, scale: 0 },
46
+ numeric: { precision: 18, scale: 0 },
47
+ float: { precision: 53 },
48
+ char: { length: 1 },
49
+ varchar: { length: 255 },
50
+ nchar: { length: 1 },
51
+ nvarchar: { length: 255 },
52
+ binary: { length: 1 },
53
+ varbinary: { length: 255 }
54
+ },
55
+ oracle: {
56
+ char: { length: 1 },
57
+ nchar: { length: 1 },
58
+ varchar2: { length: 4000 },
59
+ nvarchar2: { length: 2000 },
60
+ raw: { length: 2000 }
61
+ }
62
+ };
63
+
64
+ /** 类型是否已自带参数(如 VARCHAR(255)、DECIMAL(10,2)、ENUM('a','b')) */
65
+ export function hasTypeParams(type: string): boolean {
66
+ return !!type && type.includes('(');
67
+ }
68
+
69
+ /** 提取类型的基础名称(去掉括号及参数) */
70
+ export function baseTypeName(type: string): string {
71
+ if (!type) return '';
72
+ const match = type.trim().match(/^([a-zA-Z\s]+?)\s*\(/);
73
+ const base = match?.[1] ?? type;
74
+ return base.trim().toLowerCase();
75
+ }
76
+
77
+ /** 把用户输入的长度/精度/小数位规整为数字,空值视为未填写 */
78
+ function toNumber(value: number | string | null | undefined): number | null {
79
+ if (value === null || value === undefined || value === '') return null;
80
+ const num = Number(value);
81
+ return Number.isNaN(num) ? null : num;
82
+ }
83
+
84
+ /**
85
+ * 构建列类型字符串,按数据库补齐缺失的长度/精度参数。
86
+ *
87
+ * @param databaseType mysql | postgres | mssql | oracle | sqlite
88
+ * @param type 列类型(可能已带参数)
89
+ * @param length 用户填写的长度
90
+ * @param precision 用户填写的精度
91
+ * @param scale 用户填写的小数位
92
+ */
93
+ export function buildColumnType(
94
+ databaseType: string,
95
+ type: string,
96
+ length?: number | string | null,
97
+ precision?: number | string | null,
98
+ scale?: number | string | null
99
+ ): string {
100
+ if (!type || hasTypeParams(type)) return type;
101
+
102
+ const defaults = TYPE_DEFAULTS[String(databaseType || '').toLowerCase()]?.[baseTypeName(type)];
103
+ if (!defaults) return type;
104
+
105
+ if (defaults.precision != null) {
106
+ const p = toNumber(precision) ?? defaults.precision;
107
+ const s = toNumber(scale) ?? defaults.scale;
108
+ return s != null ? `${type}(${p},${s})` : `${type}(${p})`;
109
+ }
110
+
111
+ if (defaults.length != null) {
112
+ const l = toNumber(length) ?? defaults.length;
113
+ return l != null ? `${type}(${l})` : type;
114
+ }
115
+
116
+ return type;
117
+ }
118
+
119
+ /** 转义 SQL 字符串字面量中的单引号 */
120
+ export function escapeSqlString(value: any): string {
121
+ return String(value ?? '').replace(/'/g, "''");
122
+ }
123
+
124
+ /** 各数据库常见的函数/关键字形式默认值(应原样输出,不加引号) */
125
+ const DEFAULT_KEYWORDS = new Set([
126
+ 'current_timestamp', 'now()', 'current_date', 'current_time',
127
+ 'localtimestamp', 'localtime', 'current_user',
128
+ 'sysdate', 'systimestamp', 'getdate()', 'getutcdate()',
129
+ 'sysdatetime()', 'sysdatetimeoffset()', 'sysutcdatetime()',
130
+ 'newid()', 'newsequentialid()', 'gen_random_uuid()', 'uuid_generate_v4()'
131
+ ]);
132
+
133
+ /** 默认值是否为函数/关键字形式(不加引号) */
134
+ export function isFunctionDefault(value: any): boolean {
135
+ if (value === null || value === undefined) return false;
136
+ const raw = String(value).trim();
137
+ if (!raw) return false;
138
+ const lower = raw.toLowerCase();
139
+ if (lower === 'null') return true;
140
+ if (DEFAULT_KEYWORDS.has(lower)) return true;
141
+ // now() / getdate() / newid() 等零参函数调用
142
+ if (/^[a-z_][a-z0-9_]*\s*\(\s*\)$/.test(lower)) return true;
143
+ // current_timestamp(6) 等带精度参数的时间函数
144
+ if (/^current_timestamp\s*\(\s*\d+\s*\)$/.test(lower)) return true;
145
+ return false;
146
+ }
147
+
148
+ /** 生成 SQL 默认值字面量(函数原样输出,其余加引号并转义) */
149
+ export function formatDefaultLiteral(value: any): string {
150
+ if (value === null || value === undefined || String(value).trim() === '') {
151
+ return 'NULL';
152
+ }
153
+ if (isFunctionDefault(value)) {
154
+ return String(value).trim();
155
+ }
156
+ return `'${escapeSqlString(value)}'`;
157
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.service.d.ts","sourceRoot":"","sources":["../../../../server/service/database/sqlite.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlite.service.d.ts","sourceRoot":"","sources":["../../../../server/service/database/sqlite.service.ts"],"names":[],"mappings":"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"}