Skip to content

Commit 3d7b497

Browse files
committed
+ name escape
1 parent 219a50b commit 3d7b497

3 files changed

Lines changed: 181 additions & 8 deletions

File tree

src/manager.ts

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import {
77
SQLiteManagerDefault,
88
SQLiteManagerCollate,
99
SQLiteManagerForeignKeyOptions,
10-
SQLiteManagerForeignKeyOn
10+
SQLiteManagerForeignKeyOn,
11+
keywords
1112
} from './types'
1213

1314
enum AT {
@@ -40,9 +41,14 @@ export class SQLiteManager {
4041
this.create = true
4142
if (table.columns) {
4243
this.create = false
44+
this.table = table
45+
} else {
46+
this.table = { name: this.escape(table.name) } as SQLiteManagerTable
4347
}
48+
} else {
49+
this.create = true
50+
this.table = {} as SQLiteManagerTable
4451
}
45-
this.table = table
4652
}
4753
}
4854

@@ -60,10 +66,10 @@ export class SQLiteManager {
6066
/** If changing name in altertable you need to manually call the queryBuilder() */
6167
set name(name: string) {
6268
if (this.create) {
63-
this.table.name = name
69+
this.table.name = this.escape(name)
6470
} else {
65-
this.table.name = name
66-
this.queryBuilder(AT.RENAME_TABLE, { name: name } as SQLiteManagerColumn)
71+
this.table.name = this.escape(name)
72+
this.queryBuilder(AT.RENAME_TABLE, { name: this.table.name } as SQLiteManagerColumn)
6773
}
6874
}
6975

@@ -241,6 +247,7 @@ export class SQLiteManager {
241247
* sql[]: SELECT sql FROM sqlite_schema WHERE tbl_name='X'; where X is the name of the table you're using
242248
*/
243249
addColumn(column: SQLiteManagerColumn, sql?: string[]): string {
250+
column.name = this.escape(column.name)
244251
if (this.table.columns) {
245252
if (typeof this.findColumn(column.name) == 'undefined') {
246253
this.table.columns.push(column)
@@ -279,16 +286,19 @@ export class SQLiteManager {
279286

280287
renameColumn(oldColumnName: string, newColumnName: string): string {
281288
const i = this.findColumn(oldColumnName)
289+
newColumnName = this.escape(newColumnName)
290+
let query = ''
282291

283292
if (typeof i != 'undefined' && this.table.columns) {
284293
if (typeof this.findColumn(newColumnName) == 'undefined') {
285294
this.table.columns[i].name = newColumnName
286295
} else {
287296
throw new Error('Column already exists')
288297
}
298+
query = this.queryBuilder(AT.RENAME_COLUMN, { name: oldColumnName } as SQLiteManagerColumn, newColumnName)
289299
}
290300

291-
return this.queryBuilder(AT.RENAME_COLUMN, { name: oldColumnName } as SQLiteManagerColumn, newColumnName)
301+
return query
292302
}
293303

294304
/**
@@ -350,4 +360,17 @@ export class SQLiteManager {
350360
}
351361
return false
352362
}
363+
364+
private escape(name: string): string {
365+
keywords.forEach(keyword => {
366+
if (name.toUpperCase() == keyword) {
367+
throw new Error("You can't use a SQLite keyword as a name")
368+
}
369+
})
370+
371+
name = name.replace(/'/g, "''")
372+
name = name.replace(/"/g, '""')
373+
374+
return name
375+
}
353376
}

src/types.ts

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,3 +279,153 @@ export interface SQLiteManagerTable {
279279
/** Columns */
280280
columns?: SQLiteManagerColumn[]
281281
}
282+
283+
export const keywords = [
284+
'ABORT',
285+
'ACTION',
286+
'ADD',
287+
'AFTER',
288+
'ALL',
289+
'ALTER',
290+
'ALWAYS',
291+
'ANALYZE',
292+
'AND',
293+
'AS',
294+
'ASC',
295+
'ATTACH',
296+
'AUTOINCREMENT',
297+
'BEFORE',
298+
'BEGIN',
299+
'BETWEEN',
300+
'BY',
301+
'CASCADE',
302+
'CASE',
303+
'CAST',
304+
'CHECK',
305+
'COLLATE',
306+
'COLUMN',
307+
'COMMIT',
308+
'CONFLICT',
309+
'CONSTRAINT',
310+
'CREATE',
311+
'CROSS',
312+
'CURRENT',
313+
'CURRENT_DATE',
314+
'CURRENT_TIME',
315+
'CURRENT_TIMESTAMP',
316+
'DATABASE',
317+
'DEFAULT',
318+
'DEFERRABLE',
319+
'DEFERRED',
320+
'DELETE',
321+
'DESC',
322+
'DETACH',
323+
'DISTINCT',
324+
'DO',
325+
'DROP',
326+
'EACH',
327+
'ELSE',
328+
'END',
329+
'ESCAPE',
330+
'EXCEPT',
331+
'EXCLUDE',
332+
'EXCLUSIVE',
333+
'EXISTS',
334+
'EXPLAIN',
335+
'FAIL',
336+
'FILTER',
337+
'FIRST',
338+
'FOLLOWING',
339+
'FOR',
340+
'FOREIGN',
341+
'FROM',
342+
'FULL',
343+
'GENERATED',
344+
'GLOB',
345+
'GROUP',
346+
'GROUPS',
347+
'HAVING',
348+
'IF',
349+
'IGNORE',
350+
'IMMEDIATE',
351+
'IN',
352+
'INDEX',
353+
'INDEXED',
354+
'INITIALLY',
355+
'INNER',
356+
'INSERT',
357+
'INSTEAD',
358+
'INTERSECT',
359+
'INTO',
360+
'IS',
361+
'ISNULL',
362+
'JOIN',
363+
'KEY',
364+
'LAST',
365+
'LEFT',
366+
'LIKE',
367+
'LIMIT',
368+
'MATCH',
369+
'MATERIALIZED',
370+
'NATURAL',
371+
'NO',
372+
'NOT',
373+
'NOTHING',
374+
'NOTNULL',
375+
'NULL',
376+
'NULLS',
377+
'OF',
378+
'OFFSET',
379+
'ON',
380+
'OR',
381+
'ORDER',
382+
'OTHERS',
383+
'OUTER',
384+
'OVER',
385+
'PARTITION',
386+
'PLAN',
387+
'PRAGMA',
388+
'PRECEDING',
389+
'PRIMARY',
390+
'QUERY',
391+
'RAISE',
392+
'RANGE',
393+
'RECURSIVE',
394+
'REFERENCES',
395+
'REGEXP',
396+
'REINDEX',
397+
'RELEASE',
398+
'RENAME',
399+
'REPLACE',
400+
'RESTRICT',
401+
'RETURNING',
402+
'RIGHT',
403+
'ROLLBACK',
404+
'ROW',
405+
'ROWS',
406+
'SAVEPOINT',
407+
'SELECT',
408+
'SET',
409+
'TABLE',
410+
'TEMP',
411+
'TEMPORARY',
412+
'THEN',
413+
'TIES',
414+
'TO',
415+
'TRANSACTION',
416+
'TRIGGER',
417+
'UNBOUNDED',
418+
'UNION',
419+
'UNIQUE',
420+
'UPDATE',
421+
'USING',
422+
'VACUUM',
423+
'VALUES',
424+
'VIEW',
425+
'VIRTUAL',
426+
'WHEN',
427+
'WHERE',
428+
'WINDOW',
429+
'WITH',
430+
'WITHOUT'
431+
]

test/manager.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ describe('Create a table', () => {
1717
expect(manager.deleteColumn(testTable.columns[0].name)).not.toContain(testTable.columns[0].name)
1818

1919
const risRen: string = manager.renameColumn(testTable.columns[1].name, testTable.columns[2].name)
20+
console.log(risRen)
2021

2122
expect(risRen).not.toContain(testTable.columns[1].name)
2223
expect(risRen).toContain(testTable.columns[2].name)
@@ -29,6 +30,7 @@ describe('Create a table', () => {
2930
const risCnstr: string = manager.changeColumnConstraints(testTable.columns[2].name, testTable.columns[2].constraints)
3031

3132
expect(risCnstr).toContain('NOT NULL UNIQUE')
33+
console.log(risCnstr)
3234
})
3335

3436
it('tests alter table', () => {
@@ -70,7 +72,5 @@ describe('Create a table', () => {
7072

7173
const risCnstr: string = manager.changeColumnConstraints(testTable.columns[2].name, testTable2.columns[2].constraints, sqlite_schema)
7274
expect(risCnstr).toContain('"' + testTable.columns[2].name + '" TEXT UNIQUE')
73-
74-
console.log(risCnstr)
7575
})
7676
})

0 commit comments

Comments
 (0)