From 618884b735465a730e56bb3ce5060ad01f34ba20 Mon Sep 17 00:00:00 2001 From: Hieuzest Date: Wed, 6 Dec 2023 00:14:33 +0800 Subject: [PATCH] fix(sqlite): `create`, `update` using params, fix tests (#58) --- packages/postgres/src/index.ts | 2 +- packages/sqlite/src/index.ts | 8 ++++---- packages/tests/src/transaction.ts | 32 +++++++++++++++---------------- packages/tests/src/update.ts | 30 +++++++++++++++++++++++++---- 4 files changed, 47 insertions(+), 25 deletions(-) diff --git a/packages/postgres/src/index.ts b/packages/postgres/src/index.ts index 41a9e8c5..92fe7cd2 100644 --- a/packages/postgres/src/index.ts +++ b/packages/postgres/src/index.ts @@ -78,7 +78,7 @@ function getTypeDef(field: Field & { autoInc?: boolean }) { def += `VARCHAR(${length || 255})` if (!isNullable(initial)) def += ` DEFAULT '${initial.replace(/'/g, "''")}'` } else if (type === 'text') { - def += `VARCHAR(${length || 65535})` + def += `TEXT` if (!isNullable(initial)) def += ` DEFAULT '${initial.replace(/'/g, "''")}'` } else if (type === 'boolean') { def += 'BOOLEAN' diff --git a/packages/sqlite/src/index.ts b/packages/sqlite/src/index.ts index 382f2afa..bd99f81d 100644 --- a/packages/sqlite/src/index.ts +++ b/packages/sqlite/src/index.ts @@ -372,10 +372,10 @@ export class SQLiteDriver extends Driver { const modified = !deepEqual(clone(data), executeUpdate(data, update, ref)) if (!modified) return 0 const row = this.sql.dump(model, data) - const assignment = updateFields.map((key) => `${escapeId(key)} = ${this.sql.escape(row[key])}`).join(',') + const assignment = updateFields.map((key) => `${escapeId(key)} = ?`).join(',') const query = Object.fromEntries(indexFields.map(key => [key, row[key]])) const filter = this.sql.parseQuery(query) - this.#run(`UPDATE ${escapeId(table)} SET ${assignment} WHERE ${filter}`) + this.#run(`UPDATE ${escapeId(table)} SET ${assignment} WHERE ${filter}`, updateFields.map((key) => row[key])) return 1 } @@ -398,8 +398,8 @@ export class SQLiteDriver extends Driver { const model = this.model(table) data = this.sql.dump(model, data) const keys = Object.keys(data) - const sql = `INSERT INTO ${escapeId(table)} (${this.#joinKeys(keys)}) VALUES (${keys.map(key => this.sql.escape(data[key])).join(', ')})` - return this.#run(sql, [], () => this.#get(`SELECT last_insert_rowid() AS id`)) + const sql = `INSERT INTO ${escapeId(table)} (${this.#joinKeys(keys)}) VALUES (${Array(keys.length).fill('?').join(', ')})` + return this.#run(sql, keys.map(key => data[key]), () => this.#get(`SELECT last_insert_rowid() AS id`)) } async create(sel: Selection.Mutable, data: {}) { diff --git a/packages/tests/src/transaction.ts b/packages/tests/src/transaction.ts index b5074e65..6d013d8a 100644 --- a/packages/tests/src/transaction.ts +++ b/packages/tests/src/transaction.ts @@ -81,12 +81,12 @@ namespace TransactionOperations { return data.id }) await expect(database.withTransaction(async (database) => { - await expect(database.set('temptx', { + await database.set('temptx', { $or: [ { id: magicIds }, { timestamp: magicBorn }, ], - }, { list: ['2', '3', '3'] })).to.eventually.have.shape({ matched: 3 }) + }, { list: ['2', '3', '3'] }) await expect(database.get('temptx', {})).to.eventually.have.shape(table) })).to.be.fulfilled await expect(database.get('temptx', {})).to.eventually.have.shape(table) @@ -101,7 +101,7 @@ namespace TransactionOperations { { id: table[table.length - 1].id + 2, text: 'by\'tower' }, ] table.push(...data.map(bar => merge(database.tables.temptx.create(), bar))) - await expect(database.upsert('temptx', data)).to.eventually.have.shape({ inserted: 2, matched: 0 }) + await database.upsert('temptx', data) })).to.be.fulfilled await expect(database.get('temptx', {})).to.eventually.have.length(9) }) @@ -116,11 +116,11 @@ namespace TransactionOperations { expect(data9).to.be.undefined table.push({ id: 9, num: 999 }) await expect(database.withTransaction(async (database) => { - await expect(database.upsert('temptx', row => [ + await database.upsert('temptx', row => [ { id: 2, num: $.multiply(2, row.id) }, { id: 3, num: $.add(3, row.num) }, { id: 9, num: 999 }, - ])).to.eventually.have.shape({ inserted: 1, matched: 2 }) + ]) await expect(database.get('temptx', {})).to.eventually.have.shape(table) })).to.be.fulfilled await expect(database.get('temptx', {})).to.eventually.have.shape(table) @@ -129,11 +129,11 @@ namespace TransactionOperations { it('remove', async () => { await setup(database, 'temptx', barTable) await expect(database.withTransaction(async (database) => { - await expect(database.remove('temptx', { id: 2 })).to.eventually.deep.equal({ removed: 1 }) + await database.remove('temptx', { id: 2 }) await expect(database.get('temptx', {})).eventually.length(6) - await expect(database.remove('temptx', { id: 2 })).to.eventually.deep.equal({ removed: 0 }) + await database.remove('temptx', { id: 2 }) await expect(database.get('temptx', {})).eventually.length(6) - await expect(database.remove('temptx', {})).to.eventually.deep.equal({ removed: 6 }) + await database.remove('temptx', {}) await expect(database.get('temptx', {})).eventually.length(0) })).to.be.fulfilled await expect(database.get('temptx', {})).eventually.length(0) @@ -167,12 +167,12 @@ namespace TransactionOperations { return data.id }) await expect(database.withTransaction(async (database) => { - await expect(database.set('temptx', { + await database.set('temptx', { $or: [ { id: magicIds }, { timestamp: magicBorn }, ], - }, { list: ['2', '3', '3'] })).to.eventually.have.shape({ matched: 3 }) + }, { list: ['2', '3', '3'] }) await expect(database.get('temptx', {})).to.eventually.have.shape(table) throw new Error('oops') })).to.be.rejected @@ -188,7 +188,7 @@ namespace TransactionOperations { { id: table[table.length - 1].id + 2, text: 'by\'tower' }, ] table.push(...data.map(bar => merge(database.tables.temptx.create(), bar))) - await expect(database.upsert('temptx', data)).to.eventually.have.shape({ inserted: 2, matched: 0 }) + await database.upsert('temptx', data) throw new Error('oops') })).to.be.rejected await expect(database.get('temptx', {})).to.eventually.have.length(0) @@ -204,11 +204,11 @@ namespace TransactionOperations { expect(data9).to.be.undefined table.push({ id: 9, num: 999 }) await expect(database.withTransaction(async (database) => { - await expect(database.upsert('temptx', row => [ + await database.upsert('temptx', row => [ { id: 2, num: $.multiply(2, row.id) }, { id: 3, num: $.add(3, row.num) }, { id: 9, num: 999 }, - ])).to.eventually.have.shape({ inserted: 1, matched: 2 }) + ]) await expect(database.get('temptx', {})).to.eventually.have.shape(table) throw new Error('oops') })).to.be.rejected @@ -218,11 +218,11 @@ namespace TransactionOperations { it('remove', async () => { await setup(database, 'temptx', barTable) await expect(database.withTransaction(async (database) => { - await expect(database.remove('temptx', { id: 2 })).to.eventually.deep.equal({ removed: 1 }) + await database.remove('temptx', { id: 2 }) await expect(database.get('temptx', {})).eventually.length(6) - await expect(database.remove('temptx', { id: 2 })).to.eventually.deep.equal({ removed: 0 }) + await database.remove('temptx', { id: 2 }) await expect(database.get('temptx', {})).eventually.length(6) - await expect(database.remove('temptx', {})).to.eventually.deep.equal({ removed: 6 }) + await database.remove('temptx', {}) await expect(database.get('temptx', {})).eventually.length(0) throw new Error('oops') })).to.be.rejected diff --git a/packages/tests/src/update.ts b/packages/tests/src/update.ts index e3c5e93a..827283d6 100644 --- a/packages/tests/src/update.ts +++ b/packages/tests/src/update.ts @@ -11,6 +11,7 @@ interface Bar { timestamp?: Date date?: Date time?: Date + bigtext?: string } interface Baz { @@ -34,6 +35,7 @@ function OrmOperations(database: Database) { timestamp: 'timestamp', date: 'date', time: 'time', + bigtext: 'text', }, { autoInc: true, }) @@ -122,6 +124,12 @@ namespace OrmOperations { expect(ids.map(id => id - min + 1)).shape([1, 2, 3, 4, 5]) await database.remove('temp2', {}) }) + + it('enormous field', async () => { + const row = { id: 100, bigtext: Array(1000000).fill('a').join('') } + await database.create('temp2', row) + await expect(database.get('temp2', 100)).to.eventually.have.nested.property('0.bigtext', row.bigtext) + }) } export const set = function Set(database: Database) { @@ -161,6 +169,13 @@ namespace OrmOperations { })) await expect(database.get('temp2', {})).to.eventually.have.shape(table) }) + + it('enormous field', async () => { + const row = await database.create('temp2', {}) + row.bigtext = Array(1000000).fill('a').join('') + await database.set('temp2', row.id, { bigtext: row.bigtext }) + await expect(database.get('temp2', row.id)).to.eventually.have.nested.property('0.bigtext', row.bigtext) + }) } export const upsert = function Upsert(database: Database) { @@ -230,18 +245,25 @@ namespace OrmOperations { ]) await expect(database.get('temp3', {})).to.eventually.have.deep.members(table) }) + + it('enormous field', async () => { + const row = await database.create('temp2', {}) + row.bigtext = Array(1000000).fill('a').join('') + await database.upsert('temp2', [row]) + await expect(database.get('temp2', row.id)).to.eventually.have.nested.property('0.bigtext', row.bigtext) + }) } export const remove = function Remove(database: Database) { it('basic support', async () => { await setup(database, 'temp3', bazTable) - await expect(database.remove('temp3', { ida: 1, idb: 'a' })).to.eventually.deep.equal({ removed: 1 }) + await expect(database.remove('temp3', { ida: 1, idb: 'a' })).to.eventually.have.shape({ matched: 1 }) await expect(database.get('temp3', {})).eventually.length(3) - await expect(database.remove('temp3', { ida: 1, idb: 'b', value: 'b' })).to.eventually.deep.equal({ removed: 0 }) + await expect(database.remove('temp3', { ida: 1, idb: 'b', value: 'b' })).to.eventually.have.shape({ matched: 0 }) await expect(database.get('temp3', {})).eventually.length(3) - await expect(database.remove('temp3', { idb: 'b' })).to.eventually.deep.equal({ removed: 2 }) + await expect(database.remove('temp3', { idb: 'b' })).to.eventually.have.shape({ matched: 2 }) await expect(database.get('temp3', {})).eventually.length(1) - await expect(database.remove('temp3', {})).to.eventually.deep.equal({ removed: 1 }) + await expect(database.remove('temp3', {})).to.eventually.have.shape({ matched: 1 }) await expect(database.get('temp3', {})).eventually.length(0) })