-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsql-condition.ts
85 lines (70 loc) · 1.93 KB
/
sql-condition.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import { SqlParameter } from './load';
export class SqlCondition {
static readonly ALL = new SqlCondition("TRUE=TRUE")
parameters: Array<SqlParameter> = [];
usedcolumns: Array<string> = []
constructor(private sql?: string) {
if (this.sql === undefined) {
this.sql = ''
}
}
/**
*
* @param columnName you should really make this a constant ... i mean REALLY
* @returns
*/
column(columnName: string) {
if (columnName.match(/[`'"]/g)) {
throw new Error("dont do this >:/")
}
this.usedcolumns.push(columnName)
this.sql += `\`${columnName}\` `
return this;
}
smaller() {
this.sql += "< "
return this
}
greater() {
this.sql += "> "
return this
}
now() {
this.sql += "UNIX_TIMESTAMP(NOW(3))*1000 "
}
param(value: SqlParameter | Date) {
if (value instanceof Date) {
value = value.valueOf()
}
this.parameters.push(value)
return this
}
and(cb: (condition: SqlCondition) => SqlCondition) {
const cond = new SqlCondition()
cb(cond)
this.sql += `AND ${cond.build(this.parameters)} `
return this
}
equals(other: SqlParameter) {
this.sql += " = ? "
this.parameters.push(other)
return this
}
checkColumns(classref) {
const instnace = new classref();
for (const column of this.usedcolumns) {
if (!Object.keys(instnace).includes(column)) {
throw new Error("missing column")
}
}
}
build(params: Array<SqlParameter> | null) {
if (this.parameters.length) {
if (params == null) {
throw new Error("cannot use parameters for this condition currently")
}
params.push(...this.parameters)
}
return this.sql;
}
}