提交 ee34a6ec 编写于 作者: B Benjamin Pasero

sqlite - ignore same updates/deletes

上级 dc2868ac
......@@ -99,6 +99,9 @@ export class Storage extends Disposable {
}
set(key: string, value: any): Promise<void> {
if (this.state === StorageState.Closed) {
return Promise.resolve(); // Return early if we are already closed
}
// We remove the key for undefined/null values
if (isUndefinedOrNull(value)) {
......@@ -108,6 +111,12 @@ export class Storage extends Disposable {
// Otherwise, convert to String and store
const valueStr = String(value);
// Return early if value already set
const currentValue = this.cache.get(key);
if (currentValue === valueStr) {
return Promise.resolve();
}
// Update in cache and pending
this.cache.set(key, valueStr);
this.pendingUpdates.set(key, valueStr);
......@@ -120,12 +129,20 @@ export class Storage extends Disposable {
}
delete(key: string): Promise<void> {
if (this.state === StorageState.Closed) {
return Promise.resolve(); // Return early if we are already closed
}
// Remove from cache and add to pending
this.cache.delete(key);
const wasDeleted = this.cache.delete(key);
if (!wasDeleted) {
return Promise.resolve(); // Return early if value already deleted
}
if (!this.pendingDeletes.has(key)) {
this.pendingDeletes.add(key);
}
this.pendingUpdates.delete(key);
// Event
......@@ -136,11 +153,6 @@ export class Storage extends Disposable {
private update(): Promise<void> {
// Return early if we are already closed
if (this.state === StorageState.Closed) {
return Promise.resolve();
}
// Schedule
if (!this.pendingScheduler.isScheduled()) {
this.pendingScheduler.schedule();
......@@ -150,6 +162,9 @@ export class Storage extends Disposable {
}
close(): Promise<void> {
if (this.state === StorageState.Closed) {
return Promise.resolve(); // return if already closed
}
// Update state
this.state = StorageState.Closed;
......
......@@ -10,7 +10,7 @@ import { tmpdir } from 'os';
import { equal, ok } from 'assert';
import { mkdirp, del } from 'vs/base/node/pfs';
suite('Storage', () => {
suite('Storage Library', () => {
function uniqueStorageDir(): string {
const id = generateUuid();
......@@ -56,6 +56,12 @@ suite('Storage', () => {
changes = new Set<string>();
// Does not trigger events for same update values
storage.set('bar', 'foo');
storage.set('barNumber', 55);
storage.set('barBoolean', true);
equal(changes.size, 0);
// Simple deletes
const delete1Promise = storage.delete('bar');
const delete2Promise = storage.delete('barNumber');
......@@ -70,6 +76,14 @@ suite('Storage', () => {
ok(changes.has('barNumber'));
ok(changes.has('barBoolean'));
changes = new Set<string>();
// Does not trigger events for same delete values
storage.delete('bar');
storage.delete('barNumber');
storage.delete('barBoolean');
equal(changes.size, 0);
let deletePromiseResolved = false;
await Promise.all([delete1Promise, delete2Promise, delete3Promise]).then(() => deletePromiseResolved = true);
equal(deletePromiseResolved, true);
......@@ -175,7 +189,7 @@ suite('Storage', () => {
});
});
suite('SQLite Storage Impl ', () => {
suite('SQLite Storage Library', () => {
function uniqueStorageDir(): string {
const id = generateUuid();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册