From 4f87f9061fbcb34c403f1adfb097e1b0288e998f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 11 Oct 2018 10:06:04 +0200 Subject: [PATCH] sqlite - delegating storage service --- .../storage2/node/nextStorageService.ts | 72 +++++++++++++++++++ src/vs/workbench/electron-browser/main.ts | 4 +- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/storage2/node/nextStorageService.ts b/src/vs/platform/storage2/node/nextStorageService.ts index 9390e01c5ff..42a18b708e7 100644 --- a/src/vs/platform/storage2/node/nextStorageService.ts +++ b/src/vs/platform/storage2/node/nextStorageService.ts @@ -9,6 +9,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkspaceStorageChangeEvent, INextStorageService, StorageScope } from 'vs/platform/storage2/common/storage2'; import { Storage, IStorageLoggingOptions } from 'vs/base/node/storage'; +import { IStorageService, StorageScope as LocalStorageScope } from 'vs/platform/storage/common/storage'; export class NextStorageService extends Disposable implements INextStorageService { _serviceBrand: any; @@ -81,4 +82,75 @@ export class NextStorageService extends Disposable implements INextStorageServic private getStorage(scope: StorageScope): Storage { return scope === StorageScope.GLOBAL ? this.globalStorage : this.workspaceStorage; } +} + +export class NextDelegatingStorageService extends Disposable implements INextStorageService { + _serviceBrand: any; + + private _onDidChangeStorage: Emitter = this._register(new Emitter()); + get onDidChangeStorage(): Event { return this._onDidChangeStorage.event; } + + constructor( + @INextStorageService private nextStorageService: NextStorageService, + @IStorageService private storageService: IStorageService, + @ILogService private logService: ILogService, + @IEnvironmentService environmentService: IEnvironmentService + ) { + super(); + + this._register(this.nextStorageService.onDidChangeStorage(e => this._onDidChangeStorage.fire(e))); + } + + get(key: string, scope: StorageScope, fallbackValue?: any): string { + const dbValue = this.nextStorageService.get(key, scope, fallbackValue); + const localStorageValue = this.storageService.get(key, this.convertScope(scope), fallbackValue); + + this.assertStorageValue(key, scope, dbValue, localStorageValue); + + return localStorageValue; + } + + getBoolean(key: string, scope: StorageScope, fallbackValue?: boolean): boolean { + const dbValue = this.nextStorageService.getBoolean(key, scope, fallbackValue); + const localStorageValue = this.storageService.getBoolean(key, this.convertScope(scope), fallbackValue); + + this.assertStorageValue(key, scope, dbValue, localStorageValue); + + return localStorageValue; + } + + getInteger(key: string, scope: StorageScope, fallbackValue?: number): number { + const dbValue = this.nextStorageService.getInteger(key, scope, fallbackValue); + const localStorageValue = this.storageService.getInteger(key, this.convertScope(scope), fallbackValue); + + this.assertStorageValue(key, scope, dbValue, localStorageValue); + + return localStorageValue; + } + + private assertStorageValue(key: string, scope: StorageScope, dbValue: any, storageValue: any): void { + if (dbValue !== storageValue) { + this.logService.error(`Unexpected storage value (key: ${key}, scope: ${scope === StorageScope.GLOBAL ? 'global' : 'workspace'}), actual: ${dbValue}, expected: ${storageValue}`); + } + } + + set(key: string, value: any, scope: StorageScope): Promise { + this.storageService.store(key, value, this.convertScope(scope)); + + return this.nextStorageService.set(key, value, scope); + } + + delete(key: string, scope: StorageScope): Promise { + this.storageService.remove(key, this.convertScope(scope)); + + return this.nextStorageService.delete(key, scope); + } + + close(): Promise { + return this.nextStorageService.close(); + } + + private convertScope(scope: StorageScope): LocalStorageScope { + return scope === StorageScope.GLOBAL ? LocalStorageScope.GLOBAL : LocalStorageScope.WORKSPACE; + } } \ No newline at end of file diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 32f493ab65d..0ffbf8097be 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -36,7 +36,7 @@ import { IWorkspacesService, ISingleFolderWorkspaceIdentifier } from 'vs/platfor import { createSpdLogService } from 'vs/platform/log/node/spdlogService'; import * as fs from 'fs'; import { ConsoleLogService, MultiplexLogService, ILogService } from 'vs/platform/log/common/log'; -import { NextStorageService } from 'vs/platform/storage2/node/nextStorageService'; +import { NextStorageService, NextDelegatingStorageService } from 'vs/platform/storage2/node/nextStorageService'; import { IssueChannelClient } from 'vs/platform/issue/node/issueIpc'; import { IIssueService } from 'vs/platform/issue/common/issue'; import { LogLevelSetterChannelClient, FollowerLogService } from 'vs/platform/log/node/logIpc'; @@ -103,8 +103,8 @@ function openWorkbench(configuration: IWindowConfiguration): Promise { createNextStorageService(environmentService, logService) ]).then(services => { const workspaceService = services[0]; - const nextStorageService = services[1]; const storageService = createStorageService(workspaceService, environmentService); + const nextStorageService = new NextDelegatingStorageService(services[1], storageService, logService, environmentService); return domContentLoaded().then(() => { perf.mark('willStartWorkbench'); -- GitLab