Skip to content

Commit a5fcfe7

Browse files
authored
Add functionality to set the selected db item (#1839)
1 parent c436688 commit a5fcfe7

File tree

3 files changed

+85
-5
lines changed

3 files changed

+85
-5
lines changed

extensions/ql-vscode/src/databases/config/db-config-store.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { pathExists, writeJSON, readJSON, readJSONSync } from "fs-extra";
22
import { join } from "path";
3-
import { cloneDbConfig, DbConfig } from "./db-config";
3+
import { cloneDbConfig, DbConfig, SelectedDbItem } from "./db-config";
44
import * as chokidar from "chokidar";
55
import { DisposableObject, DisposeHandler } from "../../pure/disposable-object";
66
import { DbConfigValidator } from "./db-config-validator";
@@ -56,11 +56,31 @@ export class DbConfigStore extends DisposableObject {
5656
return this.configPath;
5757
}
5858

59+
public async setSelectedDbItem(dbItem: SelectedDbItem): Promise<void> {
60+
if (!this.config) {
61+
// If the app is trying to set the selected item without a config
62+
// being set it means that there is a bug in our code, so we throw
63+
// an error instead of just returning an error result.
64+
throw Error("Cannot select database item if config is not loaded");
65+
}
66+
67+
const config: DbConfig = {
68+
...this.config,
69+
selected: dbItem,
70+
};
71+
72+
await this.writeConfig(config);
73+
}
74+
75+
private async writeConfig(config: DbConfig): Promise<void> {
76+
await writeJSON(this.configPath, config, {
77+
spaces: 2,
78+
});
79+
}
80+
5981
private async loadConfig(): Promise<void> {
6082
if (!(await pathExists(this.configPath))) {
61-
await writeJSON(this.configPath, this.createEmptyConfig(), {
62-
spaces: 2,
63-
});
83+
await this.writeConfig(this.createEmptyConfig());
6484
}
6585

6686
await this.readConfig();

extensions/ql-vscode/src/databases/db-item-selection.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { DbItem, DbItemKind, LocalDbItem, RemoteDbItem } from "./db-item";
2+
import { SelectedDbItem, SelectedDbItemKind } from "./config/db-config";
23

34
export function getSelectedDbItem(dbItems: DbItem[]): DbItem | undefined {
45
for (const dbItem of dbItems) {
@@ -42,3 +43,52 @@ function extractSelected(
4243
}
4344
return undefined;
4445
}
46+
47+
export function mapDbItemToSelectedDbItem(
48+
dbItem: DbItem,
49+
): SelectedDbItem | undefined {
50+
switch (dbItem.kind) {
51+
case DbItemKind.RootLocal:
52+
case DbItemKind.RootRemote:
53+
// Root items are not selectable.
54+
return undefined;
55+
56+
case DbItemKind.LocalList:
57+
return {
58+
kind: SelectedDbItemKind.LocalUserDefinedList,
59+
listName: dbItem.listName,
60+
};
61+
62+
case DbItemKind.RemoteUserDefinedList:
63+
return {
64+
kind: SelectedDbItemKind.RemoteUserDefinedList,
65+
listName: dbItem.listName,
66+
};
67+
68+
case DbItemKind.RemoteSystemDefinedList:
69+
return {
70+
kind: SelectedDbItemKind.RemoteSystemDefinedList,
71+
listName: dbItem.listName,
72+
};
73+
74+
case DbItemKind.RemoteOwner:
75+
return {
76+
kind: SelectedDbItemKind.RemoteOwner,
77+
ownerName: dbItem.ownerName,
78+
};
79+
80+
case DbItemKind.LocalDatabase:
81+
return {
82+
kind: SelectedDbItemKind.LocalDatabase,
83+
listName: dbItem?.parentListName,
84+
databaseName: dbItem.databaseName,
85+
};
86+
87+
case DbItemKind.RemoteRepo:
88+
return {
89+
kind: SelectedDbItemKind.RemoteRepository,
90+
listName: dbItem?.parentListName,
91+
repositoryName: dbItem.repoFullName,
92+
};
93+
}
94+
}

extensions/ql-vscode/src/databases/db-manager.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import { AppEvent, AppEventEmitter } from "../common/events";
33
import { ValueResult } from "../common/value-result";
44
import { DbConfigStore } from "./config/db-config-store";
55
import { DbItem } from "./db-item";
6-
import { getSelectedDbItem } from "./db-item-selection";
6+
import {
7+
getSelectedDbItem,
8+
mapDbItemToSelectedDbItem,
9+
} from "./db-item-selection";
710
import { createLocalTree, createRemoteTree } from "./db-tree-creator";
811

912
export class DbManager {
@@ -44,4 +47,11 @@ export class DbManager {
4447
public getConfigPath(): string {
4548
return this.dbConfigStore.getConfigPath();
4649
}
50+
51+
public async setSelectedDbItem(dbItem: DbItem): Promise<void> {
52+
const selectedDbItem = mapDbItemToSelectedDbItem(dbItem);
53+
if (selectedDbItem) {
54+
await this.dbConfigStore.setSelectedDbItem(selectedDbItem);
55+
}
56+
}
4757
}

0 commit comments

Comments
 (0)