diff --git a/src/index.test.ts b/src/index.test.ts index 5342114..4a43297 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -89,4 +89,15 @@ describe('sqlite-level', () => { expect(await result.next()).toEqual('value2') expect(await result.next()).toBeUndefined() }) + + it('value update', async () => { + await level.put('fixed_key1', 'value1') + await level.batch([ + {type: 'put', key: 'fixed_key1', value: 'value2'}, + {type: 'put', key: 'fixed_key2', value: 'value3'}, + {type: 'put', key: 'fixed_key2', value: 'value4'}, + ]) + expect(await level.get('fixed_key1')).toEqual('value2') + expect(await level.get('fixed_key2')).toEqual('value4') + }) }) diff --git a/src/index.ts b/src/index.ts index 1f43863..ad08f7c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -207,7 +207,7 @@ export class SqliteLevel extends AbstractL } async _open(options: AbstractOpenOptions, callback: (error?: Error) => void) { - this.db.exec('CREATE TABLE IF NOT EXISTS kv (key TEXT, value TEXT)') + this.db.exec('CREATE TABLE IF NOT EXISTS kv (key TEXT UNIQUE, value TEXT)') this.nextTick(callback) } @@ -240,7 +240,7 @@ export class SqliteLevel extends AbstractL }) ) } - const stmt = this.db.prepare('INSERT INTO kv (key, value) VALUES (?, ?)') + const stmt = this.db.prepare('INSERT INTO kv (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value=excluded.value') stmt.run(key.toString(), value.toString()) this.nextTick(callback) } @@ -277,7 +277,7 @@ export class SqliteLevel extends AbstractL curType = op.type } else if (curType !== op.type) { if (curType === 'put') { - batches.push(`INSERT INTO kv (key, value) VALUES ${curBatch.join(',')}`) + batches.push(`INSERT INTO kv (key, value) VALUES ${curBatch.join(',')} ON CONFLICT(key) DO UPDATE SET value=excluded.value`) } else if (curType === 'del') { batches.push(`DELETE FROM kv WHERE key IN (${curBatch.join(',')})`) } @@ -292,7 +292,7 @@ export class SqliteLevel extends AbstractL } if (curBatch.length > 0) { if (curType === 'put') { - batches.push(`INSERT INTO kv (key, value) VALUES ${curBatch.join(',')}`) + batches.push(`INSERT INTO kv (key, value) VALUES ${curBatch.join(',')} ON CONFLICT(key) DO UPDATE SET value=excluded.value`) } else if (curType === 'del') { batches.push(`DELETE FROM kv WHERE key IN (${curBatch.join(',')})`) }