-
Notifications
You must be signed in to change notification settings - Fork 3.9k
/
Copy pathdatabasesApi.ts
71 lines (63 loc) · 2.01 KB
/
databasesApi.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Copyright 2022 The Cockroach Authors.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
import {
executeInternalSql,
LARGE_RESULT_SIZE,
SqlExecutionErrorMessage,
SqlExecutionRequest,
sqlResultsAreEmpty,
} from "./sqlApi";
import { withTimeout } from "./util";
import moment from "moment";
export type DatabasesColumns = {
database_name: string;
};
export type DatabasesListResponse = {
databases: string[];
error: SqlExecutionErrorMessage;
};
export const databasesRequest: SqlExecutionRequest = {
statements: [
{
sql: `select database_name
from [show databases]`,
},
],
execute: true,
max_result_size: LARGE_RESULT_SIZE,
};
// getDatabasesList fetches databases names from the database. Callers of
// getDatabasesList from cluster-ui will need to pass a timeout argument for
// promise timeout handling (callers from db-console already have promise
// timeout handling as part of the cacheDataReducer).
export function getDatabasesList(
timeout?: moment.Duration,
): Promise<DatabasesListResponse> {
return withTimeout(
executeInternalSql<DatabasesColumns>(databasesRequest),
timeout,
).then(result => {
// If request succeeded but query failed, throw error (caught by saga/cacheDataReducer).
const noTxnResultsExist = result?.execution?.txn_results?.length === 0;
if (
result.error &&
(noTxnResultsExist || result.execution.txn_results[0].rows.length === 0)
) {
throw result.error;
}
if (sqlResultsAreEmpty(result)) {
return { databases: [], error: result.error };
}
const dbNames: string[] = result.execution.txn_results[0].rows.map(
row => row.database_name,
);
return { databases: dbNames, error: result.error };
});
}