@grest-ts/sql 0.0.6 → 0.0.7
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/LICENSE +21 -21
- package/README.md +498 -498
- package/dist/src/select/parts/S0Union.d.ts +2 -2
- package/dist/tsconfig.publish.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/MysqlTable.ts +101 -101
- package/src/MysqlTableStructureParser.ts +283 -283
- package/src/SQL.ts +244 -244
- package/src/SqlExpression.ts +172 -172
- package/src/SqlFunctions.ts +471 -471
- package/src/Symbols.ts +10 -10
- package/src/Types.ts +244 -244
- package/src/delete/DeleteBuilder.ts +64 -64
- package/src/delete/DeleteInterfaces.ts +70 -70
- package/src/escape.ts +51 -51
- package/src/index.ts +5 -5
- package/src/insert/InsertBuilder.ts +75 -75
- package/src/insert/InsertInterfaces.ts +16 -16
- package/src/select/SelectBuilder.ts +371 -371
- package/src/select/parts/GatewayWhere.ts +30 -30
- package/src/select/parts/S0Union.ts +43 -43
- package/src/select/parts/S0Uses.ts +21 -21
- package/src/select/parts/S0With.ts +21 -21
- package/src/select/parts/S1Join.ts +38 -38
- package/src/select/parts/S2Columns.ts +68 -68
- package/src/select/parts/S2Where.ts +51 -51
- package/src/select/parts/S3GroupBy.ts +23 -23
- package/src/select/parts/S4Having.ts +24 -24
- package/src/select/parts/S5OrderBy.ts +21 -21
- package/src/select/parts/S6Limit.ts +9 -9
- package/src/select/parts/S7Exec.ts +41 -41
- package/src/update/UpdateBuilder.ts +95 -95
- package/src/update/UpdateInterfaces.ts +87 -87
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
import {isColumnOkToUse, isTableReferenced, Key, OrderByStructure, SQL_BOOL, SqlQuery} from "../Types";
|
|
2
|
-
import {Expr} from "../SqlExpression";
|
|
3
|
-
|
|
4
|
-
export interface GatewayDeleteWhereMethods<Entity> {
|
|
5
|
-
|
|
6
|
-
where(c1: Partial<Entity>): GatewayDeleteOrderByMethods<Entity>
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface GatewayDeleteOrderByMethods<Entity> extends DeleteLimitMethods {
|
|
10
|
-
|
|
11
|
-
orderBy(fields: keyof Entity): DeleteLimitMethods
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface DeleteWhereMethods<Tables> {
|
|
16
|
-
|
|
17
|
-
where<
|
|
18
|
-
T1 extends string,
|
|
19
|
-
T2 extends string = never,
|
|
20
|
-
T3 extends string = never,
|
|
21
|
-
T4 extends string = never,
|
|
22
|
-
T5 extends string = never,
|
|
23
|
-
T6 extends string = never,
|
|
24
|
-
T7 extends string = never,
|
|
25
|
-
T8 extends string = never,
|
|
26
|
-
T9 extends string = never,
|
|
27
|
-
T10 extends string = never,
|
|
28
|
-
T = Tables
|
|
29
|
-
>(
|
|
30
|
-
c1: C<T, T1>,
|
|
31
|
-
c2?: C<T, T2>,
|
|
32
|
-
c3?: C<T, T3>,
|
|
33
|
-
c4?: C<T, T4>,
|
|
34
|
-
c5?: C<T, T5>,
|
|
35
|
-
c6?: C<T, T6>,
|
|
36
|
-
c7?: C<T, T7>,
|
|
37
|
-
c8?: C<T, T8>,
|
|
38
|
-
c9?: C<T, T9>,
|
|
39
|
-
c10?: C<T, T10>
|
|
40
|
-
): DeleteOrderByMethods<Tables> & DeleteLimitMethods
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
type C<Tables, T extends string> = isTableReferenced<Tables, Key<T>, Expr<T, unknown, SQL_BOOL>>
|
|
45
|
-
|
|
46
|
-
export interface DeleteOrderByMethods<Tables> extends DeleteLimitMethods {
|
|
47
|
-
orderBy<
|
|
48
|
-
TableRef,
|
|
49
|
-
Columns extends OrderByStructure<Expr<TableRef, string | unknown, any>>
|
|
50
|
-
>(
|
|
51
|
-
...items: isColumnOkToUse<Tables, Columns>
|
|
52
|
-
): DeleteLimitMethods
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
export interface DeleteLimitMethods {
|
|
57
|
-
noLimit(): ExecDeleteMethods
|
|
58
|
-
|
|
59
|
-
limit(limit: number | [number, number]): ExecDeleteMethods
|
|
60
|
-
|
|
61
|
-
limit1(): ExecDeleteMethods
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
export interface ExecDeleteMethods extends SqlQuery<{ affectedRows: number }> {
|
|
66
|
-
|
|
67
|
-
toString(lvl?: number): string
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
1
|
+
import {isColumnOkToUse, isTableReferenced, Key, OrderByStructure, SQL_BOOL, SqlQuery} from "../Types";
|
|
2
|
+
import {Expr} from "../SqlExpression";
|
|
3
|
+
|
|
4
|
+
export interface GatewayDeleteWhereMethods<Entity> {
|
|
5
|
+
|
|
6
|
+
where(c1: Partial<Entity>): GatewayDeleteOrderByMethods<Entity>
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface GatewayDeleteOrderByMethods<Entity> extends DeleteLimitMethods {
|
|
10
|
+
|
|
11
|
+
orderBy(fields: keyof Entity): DeleteLimitMethods
|
|
12
|
+
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface DeleteWhereMethods<Tables> {
|
|
16
|
+
|
|
17
|
+
where<
|
|
18
|
+
T1 extends string,
|
|
19
|
+
T2 extends string = never,
|
|
20
|
+
T3 extends string = never,
|
|
21
|
+
T4 extends string = never,
|
|
22
|
+
T5 extends string = never,
|
|
23
|
+
T6 extends string = never,
|
|
24
|
+
T7 extends string = never,
|
|
25
|
+
T8 extends string = never,
|
|
26
|
+
T9 extends string = never,
|
|
27
|
+
T10 extends string = never,
|
|
28
|
+
T = Tables
|
|
29
|
+
>(
|
|
30
|
+
c1: C<T, T1>,
|
|
31
|
+
c2?: C<T, T2>,
|
|
32
|
+
c3?: C<T, T3>,
|
|
33
|
+
c4?: C<T, T4>,
|
|
34
|
+
c5?: C<T, T5>,
|
|
35
|
+
c6?: C<T, T6>,
|
|
36
|
+
c7?: C<T, T7>,
|
|
37
|
+
c8?: C<T, T8>,
|
|
38
|
+
c9?: C<T, T9>,
|
|
39
|
+
c10?: C<T, T10>
|
|
40
|
+
): DeleteOrderByMethods<Tables> & DeleteLimitMethods
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
type C<Tables, T extends string> = isTableReferenced<Tables, Key<T>, Expr<T, unknown, SQL_BOOL>>
|
|
45
|
+
|
|
46
|
+
export interface DeleteOrderByMethods<Tables> extends DeleteLimitMethods {
|
|
47
|
+
orderBy<
|
|
48
|
+
TableRef,
|
|
49
|
+
Columns extends OrderByStructure<Expr<TableRef, string | unknown, any>>
|
|
50
|
+
>(
|
|
51
|
+
...items: isColumnOkToUse<Tables, Columns>
|
|
52
|
+
): DeleteLimitMethods
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
export interface DeleteLimitMethods {
|
|
57
|
+
noLimit(): ExecDeleteMethods
|
|
58
|
+
|
|
59
|
+
limit(limit: number | [number, number]): ExecDeleteMethods
|
|
60
|
+
|
|
61
|
+
limit1(): ExecDeleteMethods
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
export interface ExecDeleteMethods extends SqlQuery<{ affectedRows: number }> {
|
|
66
|
+
|
|
67
|
+
toString(lvl?: number): string
|
|
68
|
+
|
|
69
|
+
}
|
|
70
|
+
|
package/src/escape.ts
CHANGED
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import {PrepareQueryArgument} from "./Types";
|
|
2
|
-
import sql from "sqlstring";
|
|
3
|
-
|
|
4
|
-
export function escape(value: string | number | (string | number)[] | PrepareQueryArgument): string {
|
|
5
|
-
return (sql as any).escape(value);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
const mysqlReservedKeywords = new Set([
|
|
9
|
-
"ADD", "ALL", "ALTER", "ANALYZE", "AND", "AS", "ASC", "AUTO_INCREMENT",
|
|
10
|
-
"BETWEEN", "BIGINT", "BINARY", "BLOB", "BOTH", "BY", "CALL", "CASCADE",
|
|
11
|
-
"CASE", "CHANGE", "CHAR", "CHARACTER", "CHECK", "COLLATE", "COLUMN",
|
|
12
|
-
"CONDITION", "CONSTRAINT", "CONTINUE", "CONVERT", "CREATE", "CROSS",
|
|
13
|
-
"CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR",
|
|
14
|
-
"DATABASE", "DATABASES", "DAY_HOUR", "DAY_MICROSECOND", "DAY_MINUTE",
|
|
15
|
-
"DAY_SECOND", "DEC", "DECIMAL", "DECLARE", "DEFAULT", "DELAYED", "DELETE",
|
|
16
|
-
"DESC", "DESCRIBE", "DETERMINISTIC", "DISTINCT", "DISTINCTROW", "DIV",
|
|
17
|
-
"DOUBLE", "DROP", "DUAL", "EACH", "ELSE", "ELSEIF", "ENCLOSED", "ESCAPED",
|
|
18
|
-
"EXISTS", "EXIT", "EXPLAIN", "FALSE", "FETCH", "FLOAT", "FLOAT4", "FLOAT8",
|
|
19
|
-
"FOR", "FORCE", "FOREIGN", "FROM", "FULLTEXT", "GRANT", "GROUP", "HAVING",
|
|
20
|
-
"HIGH_PRIORITY", "HOUR_MICROSECOND", "HOUR_MINUTE", "HOUR_SECOND", "IF",
|
|
21
|
-
"IGNORE", "IN", "INDEX", "INFILE", "INNER", "INOUT", "INSENSITIVE", "INSERT",
|
|
22
|
-
"INT", "INT1", "INT2", "INT3", "INT4", "INT8", "INTEGER", "INTERVAL", "INTO",
|
|
23
|
-
"IS", "ITERATE", "JOIN", "KEY", "KEYS", "KILL", "LEADING", "LEAVE", "LEFT",
|
|
24
|
-
"LIKE", "LIMIT", "LINES", "LOAD", "LOCALTIME", "LOCALTIMESTAMP", "LOCK", "LONG",
|
|
25
|
-
"LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MATCH", "MEDIUMBLOB",
|
|
26
|
-
"MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT", "MINUTE_MICROSECOND", "MINUTE_SECOND",
|
|
27
|
-
"MOD", "MODIFIES", "NATURAL", "NOT", "NO_WRITE_TO_BINLOG", "NULL", "NUMERIC",
|
|
28
|
-
"ON", "OPTIMIZE", "OPTION", "OPTIONALLY", "OR", "ORDER", "OUT", "OUTER",
|
|
29
|
-
"OUTFILE", "PRECISION", "PRIMARY", "PROCEDURE", "PURGE", "RANGE", "READ",
|
|
30
|
-
"READS", "REAL", "REFERENCES", "REGEXP", "RELEASE", "RENAME", "REPEAT",
|
|
31
|
-
"REPLACE", "REQUIRE", "RESTRICT", "RETURN", "REVOKE", "RIGHT", "RLIKE",
|
|
32
|
-
"SCHEMA", "SCHEMAS", "SECOND_MICROSECOND", "SELECT", "SENSITIVE", "SEPARATOR",
|
|
33
|
-
"SET", "SHOW", "SMALLINT", "SPATIAL", "SPECIFIC", "SQL", "SQLEXCEPTION",
|
|
34
|
-
"SQLSTATE", "SQLWARNING", "SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS", "SQL_SMALL_RESULT",
|
|
35
|
-
"SSL", "STARTING", "STRAIGHT_JOIN", "TABLE", "TERMINATED", "THEN", "TINYBLOB",
|
|
36
|
-
"TINYINT", "TINYTEXT", "TO", "TRAILING", "TRIGGER", "TRUE", "UNDO", "UNION",
|
|
37
|
-
"UNIQUE", "UNLOCK", "UNSIGNED", "UPDATE", "USAGE", "USE", "USING", "UTC_DATE",
|
|
38
|
-
"UTC_TIME", "UTC_TIMESTAMP", "VALUES", "VARBINARY", "VARCHAR", "VARCHARACTER",
|
|
39
|
-
"VARYING", "WHEN", "WHERE", "WHILE", "WITH", "WRITE", "XOR", "YEAR_MONTH",
|
|
40
|
-
"ZEROFILL", "ROWS"
|
|
41
|
-
]);
|
|
42
|
-
|
|
43
|
-
export function escapeId(value: string): string {
|
|
44
|
-
// We could skip/remove this check, but it makes prettier SQL queries as 99% of strings here do not need escaping.
|
|
45
|
-
if (typeof value === "string"
|
|
46
|
-
&& /^[a-zA-Z][a-zA-Z0-9_]*$/.test(value)
|
|
47
|
-
&& !mysqlReservedKeywords.has(value.toUpperCase())) {
|
|
48
|
-
return value;
|
|
49
|
-
} else {
|
|
50
|
-
return (sql as any).escapeId(value);
|
|
51
|
-
}
|
|
1
|
+
import {PrepareQueryArgument} from "./Types";
|
|
2
|
+
import sql from "sqlstring";
|
|
3
|
+
|
|
4
|
+
export function escape(value: string | number | (string | number)[] | PrepareQueryArgument): string {
|
|
5
|
+
return (sql as any).escape(value);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const mysqlReservedKeywords = new Set([
|
|
9
|
+
"ADD", "ALL", "ALTER", "ANALYZE", "AND", "AS", "ASC", "AUTO_INCREMENT",
|
|
10
|
+
"BETWEEN", "BIGINT", "BINARY", "BLOB", "BOTH", "BY", "CALL", "CASCADE",
|
|
11
|
+
"CASE", "CHANGE", "CHAR", "CHARACTER", "CHECK", "COLLATE", "COLUMN",
|
|
12
|
+
"CONDITION", "CONSTRAINT", "CONTINUE", "CONVERT", "CREATE", "CROSS",
|
|
13
|
+
"CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR",
|
|
14
|
+
"DATABASE", "DATABASES", "DAY_HOUR", "DAY_MICROSECOND", "DAY_MINUTE",
|
|
15
|
+
"DAY_SECOND", "DEC", "DECIMAL", "DECLARE", "DEFAULT", "DELAYED", "DELETE",
|
|
16
|
+
"DESC", "DESCRIBE", "DETERMINISTIC", "DISTINCT", "DISTINCTROW", "DIV",
|
|
17
|
+
"DOUBLE", "DROP", "DUAL", "EACH", "ELSE", "ELSEIF", "ENCLOSED", "ESCAPED",
|
|
18
|
+
"EXISTS", "EXIT", "EXPLAIN", "FALSE", "FETCH", "FLOAT", "FLOAT4", "FLOAT8",
|
|
19
|
+
"FOR", "FORCE", "FOREIGN", "FROM", "FULLTEXT", "GRANT", "GROUP", "HAVING",
|
|
20
|
+
"HIGH_PRIORITY", "HOUR_MICROSECOND", "HOUR_MINUTE", "HOUR_SECOND", "IF",
|
|
21
|
+
"IGNORE", "IN", "INDEX", "INFILE", "INNER", "INOUT", "INSENSITIVE", "INSERT",
|
|
22
|
+
"INT", "INT1", "INT2", "INT3", "INT4", "INT8", "INTEGER", "INTERVAL", "INTO",
|
|
23
|
+
"IS", "ITERATE", "JOIN", "KEY", "KEYS", "KILL", "LEADING", "LEAVE", "LEFT",
|
|
24
|
+
"LIKE", "LIMIT", "LINES", "LOAD", "LOCALTIME", "LOCALTIMESTAMP", "LOCK", "LONG",
|
|
25
|
+
"LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MATCH", "MEDIUMBLOB",
|
|
26
|
+
"MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT", "MINUTE_MICROSECOND", "MINUTE_SECOND",
|
|
27
|
+
"MOD", "MODIFIES", "NATURAL", "NOT", "NO_WRITE_TO_BINLOG", "NULL", "NUMERIC",
|
|
28
|
+
"ON", "OPTIMIZE", "OPTION", "OPTIONALLY", "OR", "ORDER", "OUT", "OUTER",
|
|
29
|
+
"OUTFILE", "PRECISION", "PRIMARY", "PROCEDURE", "PURGE", "RANGE", "READ",
|
|
30
|
+
"READS", "REAL", "REFERENCES", "REGEXP", "RELEASE", "RENAME", "REPEAT",
|
|
31
|
+
"REPLACE", "REQUIRE", "RESTRICT", "RETURN", "REVOKE", "RIGHT", "RLIKE",
|
|
32
|
+
"SCHEMA", "SCHEMAS", "SECOND_MICROSECOND", "SELECT", "SENSITIVE", "SEPARATOR",
|
|
33
|
+
"SET", "SHOW", "SMALLINT", "SPATIAL", "SPECIFIC", "SQL", "SQLEXCEPTION",
|
|
34
|
+
"SQLSTATE", "SQLWARNING", "SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS", "SQL_SMALL_RESULT",
|
|
35
|
+
"SSL", "STARTING", "STRAIGHT_JOIN", "TABLE", "TERMINATED", "THEN", "TINYBLOB",
|
|
36
|
+
"TINYINT", "TINYTEXT", "TO", "TRAILING", "TRIGGER", "TRUE", "UNDO", "UNION",
|
|
37
|
+
"UNIQUE", "UNLOCK", "UNSIGNED", "UPDATE", "USAGE", "USE", "USING", "UTC_DATE",
|
|
38
|
+
"UTC_TIME", "UTC_TIMESTAMP", "VALUES", "VARBINARY", "VARCHAR", "VARCHARACTER",
|
|
39
|
+
"VARYING", "WHEN", "WHERE", "WHILE", "WITH", "WRITE", "XOR", "YEAR_MONTH",
|
|
40
|
+
"ZEROFILL", "ROWS"
|
|
41
|
+
]);
|
|
42
|
+
|
|
43
|
+
export function escapeId(value: string): string {
|
|
44
|
+
// We could skip/remove this check, but it makes prettier SQL queries as 99% of strings here do not need escaping.
|
|
45
|
+
if (typeof value === "string"
|
|
46
|
+
&& /^[a-zA-Z][a-zA-Z0-9_]*$/.test(value)
|
|
47
|
+
&& !mysqlReservedKeywords.has(value.toUpperCase())) {
|
|
48
|
+
return value;
|
|
49
|
+
} else {
|
|
50
|
+
return (sql as any).escapeId(value);
|
|
51
|
+
}
|
|
52
52
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export * from './SQL';
|
|
2
|
-
export * from './SqlFunctions';
|
|
3
|
-
export * from './SqlExpression';
|
|
4
|
-
export * from './Types';
|
|
5
|
-
export * from './MysqlTable';
|
|
1
|
+
export * from './SQL';
|
|
2
|
+
export * from './SqlFunctions';
|
|
3
|
+
export * from './SqlExpression';
|
|
4
|
+
export * from './Types';
|
|
5
|
+
export * from './MysqlTable';
|
|
6
6
|
export * from './MysqlTableStructureParser';
|
|
@@ -1,76 +1,76 @@
|
|
|
1
|
-
import {escape, escapeId} from "../escape";
|
|
2
|
-
import {ExecInsertMethods, InsertSetMethods} from "./InsertInterfaces";
|
|
3
|
-
import {SQL_ENTITY, SQL_EXPRESSION} from "../Symbols";
|
|
4
|
-
|
|
5
|
-
export class InsertBuilder<Entity> implements ExecInsertMethods, InsertSetMethods<Entity> {
|
|
6
|
-
|
|
7
|
-
public readonly [SQL_ENTITY]: undefined; // never used
|
|
8
|
-
|
|
9
|
-
private _ignore: boolean = false;
|
|
10
|
-
private _tableName: string;
|
|
11
|
-
|
|
12
|
-
private _set: string[] = []
|
|
13
|
-
|
|
14
|
-
private _valueNames: Set<string>;
|
|
15
|
-
private _valuesObjects: any[];
|
|
16
|
-
|
|
17
|
-
private _select: string;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
public to(tableName: string) {
|
|
21
|
-
this._tableName = tableName;
|
|
22
|
-
return this;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public ignore() {
|
|
26
|
-
this._ignore = true;
|
|
27
|
-
return this;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
public select(query: any) {
|
|
31
|
-
this._select = query[SQL_EXPRESSION];
|
|
32
|
-
return this;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
public set(obj: any) {
|
|
36
|
-
for (const prop in obj) {
|
|
37
|
-
this._set.push(escapeId(prop) + " = " + escape(obj[prop]));
|
|
38
|
-
}
|
|
39
|
-
return this;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
public values(objects: any[]) {
|
|
43
|
-
this._valueNames = new Set();
|
|
44
|
-
for (let i = 0; i < objects.length; i++) {
|
|
45
|
-
for (const prop in objects[i]) {
|
|
46
|
-
this._valueNames.add(prop);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
this._valuesObjects = objects;
|
|
50
|
-
return this;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
private toValuesString() {
|
|
54
|
-
const valueNames = Array.from(this._valueNames.values());
|
|
55
|
-
const fields = "(" + valueNames.map(e => escapeId(e)).join(", ") + ") VALUES \n";
|
|
56
|
-
const cols: string[] = [];
|
|
57
|
-
for (let i = 0; i < this._valuesObjects.length; i++) {
|
|
58
|
-
const obj = this._valuesObjects[i];
|
|
59
|
-
const col: string[] = [];
|
|
60
|
-
for (let v = 0; v < valueNames.length; v++) {
|
|
61
|
-
const value = obj[valueNames[v]];
|
|
62
|
-
col.push(value === undefined ? "NULL" : escape(value))
|
|
63
|
-
}
|
|
64
|
-
cols.push("(" + col.join(", ") + ")");
|
|
65
|
-
col.length = 0;
|
|
66
|
-
}
|
|
67
|
-
return fields + cols.join(",\n");
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
public toSqlString() {
|
|
71
|
-
return "INSERT " + (this._ignore ? "IGNORE " : "") + "INTO " + this._tableName + " " +
|
|
72
|
-
(this._set.length > 0 ? "SET \n " + this._set.join(",\n") + "\n" : "") +
|
|
73
|
-
(this._valueNames?.size > 0 ? "" + this.toValuesString() : "") +
|
|
74
|
-
(this._select ? this._select : "")
|
|
75
|
-
}
|
|
1
|
+
import {escape, escapeId} from "../escape";
|
|
2
|
+
import {ExecInsertMethods, InsertSetMethods} from "./InsertInterfaces";
|
|
3
|
+
import {SQL_ENTITY, SQL_EXPRESSION} from "../Symbols";
|
|
4
|
+
|
|
5
|
+
export class InsertBuilder<Entity> implements ExecInsertMethods, InsertSetMethods<Entity> {
|
|
6
|
+
|
|
7
|
+
public readonly [SQL_ENTITY]: undefined; // never used
|
|
8
|
+
|
|
9
|
+
private _ignore: boolean = false;
|
|
10
|
+
private _tableName: string;
|
|
11
|
+
|
|
12
|
+
private _set: string[] = []
|
|
13
|
+
|
|
14
|
+
private _valueNames: Set<string>;
|
|
15
|
+
private _valuesObjects: any[];
|
|
16
|
+
|
|
17
|
+
private _select: string;
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
public to(tableName: string) {
|
|
21
|
+
this._tableName = tableName;
|
|
22
|
+
return this;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public ignore() {
|
|
26
|
+
this._ignore = true;
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public select(query: any) {
|
|
31
|
+
this._select = query[SQL_EXPRESSION];
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public set(obj: any) {
|
|
36
|
+
for (const prop in obj) {
|
|
37
|
+
this._set.push(escapeId(prop) + " = " + escape(obj[prop]));
|
|
38
|
+
}
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public values(objects: any[]) {
|
|
43
|
+
this._valueNames = new Set();
|
|
44
|
+
for (let i = 0; i < objects.length; i++) {
|
|
45
|
+
for (const prop in objects[i]) {
|
|
46
|
+
this._valueNames.add(prop);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
this._valuesObjects = objects;
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private toValuesString() {
|
|
54
|
+
const valueNames = Array.from(this._valueNames.values());
|
|
55
|
+
const fields = "(" + valueNames.map(e => escapeId(e)).join(", ") + ") VALUES \n";
|
|
56
|
+
const cols: string[] = [];
|
|
57
|
+
for (let i = 0; i < this._valuesObjects.length; i++) {
|
|
58
|
+
const obj = this._valuesObjects[i];
|
|
59
|
+
const col: string[] = [];
|
|
60
|
+
for (let v = 0; v < valueNames.length; v++) {
|
|
61
|
+
const value = obj[valueNames[v]];
|
|
62
|
+
col.push(value === undefined ? "NULL" : escape(value))
|
|
63
|
+
}
|
|
64
|
+
cols.push("(" + col.join(", ") + ")");
|
|
65
|
+
col.length = 0;
|
|
66
|
+
}
|
|
67
|
+
return fields + cols.join(",\n");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public toSqlString() {
|
|
71
|
+
return "INSERT " + (this._ignore ? "IGNORE " : "") + "INTO " + this._tableName + " " +
|
|
72
|
+
(this._set.length > 0 ? "SET \n " + this._set.join(",\n") + "\n" : "") +
|
|
73
|
+
(this._valueNames?.size > 0 ? "" + this.toValuesString() : "") +
|
|
74
|
+
(this._select ? this._select : "")
|
|
75
|
+
}
|
|
76
76
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import {AliasedTable, IsAMatchingB, NotUsingWithPart, SqlQuery} from "../Types";
|
|
2
|
-
|
|
3
|
-
export interface ExecInsertMethods extends SqlQuery<{ insertId: number }> {
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export interface InsertSetMethods<Entity> {
|
|
8
|
-
|
|
9
|
-
set(value: Entity): ExecInsertMethods
|
|
10
|
-
|
|
11
|
-
values(value: Entity[]): ExecInsertMethods
|
|
12
|
-
|
|
13
|
-
select<Result>(value: IsAMatchingB<Result, Entity, AliasedTable<string, string, Result, object, NotUsingWithPart>>): ExecInsertMethods
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
import {AliasedTable, IsAMatchingB, NotUsingWithPart, SqlQuery} from "../Types";
|
|
2
|
+
|
|
3
|
+
export interface ExecInsertMethods extends SqlQuery<{ insertId: number }> {
|
|
4
|
+
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface InsertSetMethods<Entity> {
|
|
8
|
+
|
|
9
|
+
set(value: Entity): ExecInsertMethods
|
|
10
|
+
|
|
11
|
+
values(value: Entity[]): ExecInsertMethods
|
|
12
|
+
|
|
13
|
+
select<Result>(value: IsAMatchingB<Result, Entity, AliasedTable<string, string, Result, object, NotUsingWithPart>>): ExecInsertMethods
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
|