dbgate-api 4.4.1 → 4.4.5-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env-portal +11 -1
- package/package.json +8 -8
- package/src/controllers/archive.js +21 -16
- package/src/controllers/config.js +11 -4
- package/src/controllers/connections.js +39 -7
- package/src/controllers/databaseConnections.js +34 -23
- package/src/controllers/files.js +11 -11
- package/src/controllers/jsldata.js +4 -4
- package/src/controllers/metadata.js +4 -4
- package/src/controllers/plugins.js +9 -9
- package/src/controllers/queryHistory.js +2 -2
- package/src/controllers/runners.js +23 -15
- package/src/controllers/serverConnections.js +12 -9
- package/src/controllers/sessions.js +14 -7
- package/src/currentVersion.js +2 -2
- package/src/index.js +1 -1
- package/src/main.js +57 -40
- package/src/nativeModules.js +11 -3
- package/src/nativeModulesContent.js +1 -1
- package/src/proc/databaseConnectionProcess.js +41 -2
- package/src/shell/generateDeploySql.js +14 -2
- package/src/utility/DatastoreProxy.js +8 -1
- package/src/utility/directories.js +10 -0
- package/src/utility/platformInfo.js +5 -3
- package/src/utility/processArgs.js +8 -6
- package/src/utility/socket.js +20 -10
- package/src/utility/useController.js +26 -9
package/.env-portal
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
DEVMODE=1
|
|
2
2
|
|
|
3
|
-
CONNECTIONS=mysql,postgres
|
|
3
|
+
CONNECTIONS=mysql,postgres,mongo,mongo2
|
|
4
4
|
|
|
5
5
|
LABEL_mysql=MySql localhost
|
|
6
6
|
SERVER_mysql=localhost
|
|
@@ -15,3 +15,13 @@ USER_postgres=postgres
|
|
|
15
15
|
PASSWORD_postgres=test
|
|
16
16
|
PORT_postgres=5433
|
|
17
17
|
ENGINE_postgres=postgres@dbgate-plugin-postgres
|
|
18
|
+
|
|
19
|
+
LABEL_mongo=Mongo URL
|
|
20
|
+
URL_mongo=mongodb://localhost:27017
|
|
21
|
+
ENGINE_mongo=mongo@dbgate-plugin-mongo
|
|
22
|
+
|
|
23
|
+
LABEL_mongo2=Mongo Server
|
|
24
|
+
SERVER_mongo2=localhost
|
|
25
|
+
ENGINE_mongo2=mongo@dbgate-plugin-mongo
|
|
26
|
+
|
|
27
|
+
# docker run -p 3000:3000 -e CONNECTIONS=mongo -e URL_mongo=mongodb://localhost:27017 -e ENGINE_mongo=mongo@dbgate-plugin-mongo -e LABEL_mongo=mongo dbgate/dbgate:beta
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dbgate-api",
|
|
3
3
|
"main": "src/index.js",
|
|
4
|
-
"version": "4.4.1",
|
|
4
|
+
"version": "4.4.5-alpha.1",
|
|
5
5
|
"homepage": "https://dbgate.org/",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -19,16 +19,15 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"async-lock": "^1.2.4",
|
|
21
21
|
"axios": "^0.21.1",
|
|
22
|
-
"better-sqlite3-with-prebuilds": "^7.1.8",
|
|
23
22
|
"body-parser": "^1.19.0",
|
|
24
23
|
"bufferutil": "^4.0.1",
|
|
25
24
|
"byline": "^5.0.0",
|
|
26
25
|
"compare-versions": "^3.6.0",
|
|
27
26
|
"cors": "^2.8.5",
|
|
28
27
|
"cross-env": "^6.0.3",
|
|
29
|
-
"dbgate-query-splitter": "^4.4.1",
|
|
30
|
-
"dbgate-sqltree": "^4.4.1",
|
|
31
|
-
"dbgate-tools": "^4.4.1",
|
|
28
|
+
"dbgate-query-splitter": "^4.4.5-alpha.1",
|
|
29
|
+
"dbgate-sqltree": "^4.4.5-alpha.1",
|
|
30
|
+
"dbgate-tools": "^4.4.5-alpha.1",
|
|
32
31
|
"diff": "^5.0.0",
|
|
33
32
|
"diff2html": "^3.4.13",
|
|
34
33
|
"eslint": "^6.8.0",
|
|
@@ -39,6 +38,7 @@
|
|
|
39
38
|
"fs-reverse": "^0.0.3",
|
|
40
39
|
"get-port": "^5.1.1",
|
|
41
40
|
"http": "^0.0.0",
|
|
41
|
+
"is-electron": "^2.2.1",
|
|
42
42
|
"js-yaml": "^4.1.0",
|
|
43
43
|
"json-stable-stringify": "^1.0.1",
|
|
44
44
|
"line-reader": "^0.4.0",
|
|
@@ -49,7 +49,6 @@
|
|
|
49
49
|
"node-ssh-forward": "^0.7.2",
|
|
50
50
|
"portfinder": "^1.0.28",
|
|
51
51
|
"simple-encryptor": "^4.0.0",
|
|
52
|
-
"socket.io": "^2.3.0",
|
|
53
52
|
"tar": "^6.0.5",
|
|
54
53
|
"uuid": "^3.4.0"
|
|
55
54
|
},
|
|
@@ -65,7 +64,7 @@
|
|
|
65
64
|
"devDependencies": {
|
|
66
65
|
"@types/fs-extra": "^9.0.11",
|
|
67
66
|
"@types/lodash": "^4.14.149",
|
|
68
|
-
"dbgate-types": "^4.4.1",
|
|
67
|
+
"dbgate-types": "^4.4.5-alpha.1",
|
|
69
68
|
"env-cmd": "^10.1.0",
|
|
70
69
|
"node-loader": "^1.0.2",
|
|
71
70
|
"nodemon": "^2.0.2",
|
|
@@ -74,6 +73,7 @@
|
|
|
74
73
|
"webpack-cli": "^3.3.11"
|
|
75
74
|
},
|
|
76
75
|
"optionalDependencies": {
|
|
77
|
-
"
|
|
76
|
+
"better-sqlite3": "7.4.5",
|
|
77
|
+
"msnodesqlv8": "^2.4.4"
|
|
78
78
|
}
|
|
79
79
|
}
|
|
@@ -10,7 +10,7 @@ const { saveFreeTableData } = require('../utility/freeTableStorage');
|
|
|
10
10
|
const loadFilesRecursive = require('../utility/loadFilesRecursive');
|
|
11
11
|
|
|
12
12
|
module.exports = {
|
|
13
|
-
folders_meta:
|
|
13
|
+
folders_meta: true,
|
|
14
14
|
async folders() {
|
|
15
15
|
const folders = await fs.readdir(archivedir());
|
|
16
16
|
return [
|
|
@@ -27,14 +27,14 @@ module.exports = {
|
|
|
27
27
|
];
|
|
28
28
|
},
|
|
29
29
|
|
|
30
|
-
createFolder_meta:
|
|
30
|
+
createFolder_meta: true,
|
|
31
31
|
async createFolder({ folder }) {
|
|
32
32
|
await fs.mkdir(path.join(archivedir(), folder));
|
|
33
33
|
socket.emitChanged('archive-folders-changed');
|
|
34
34
|
return true;
|
|
35
35
|
},
|
|
36
36
|
|
|
37
|
-
createLink_meta:
|
|
37
|
+
createLink_meta: true,
|
|
38
38
|
async createLink({ linkedFolder }) {
|
|
39
39
|
const folder = await this.getNewArchiveFolder({ database: path.parse(linkedFolder).name + '.link' });
|
|
40
40
|
fs.writeFile(path.join(archivedir(), folder), linkedFolder);
|
|
@@ -43,7 +43,7 @@ module.exports = {
|
|
|
43
43
|
return folder;
|
|
44
44
|
},
|
|
45
45
|
|
|
46
|
-
files_meta:
|
|
46
|
+
files_meta: true,
|
|
47
47
|
async files({ folder }) {
|
|
48
48
|
const dir = resolveArchiveFolder(folder);
|
|
49
49
|
if (!(await fs.exists(dir))) return [];
|
|
@@ -70,23 +70,23 @@ module.exports = {
|
|
|
70
70
|
];
|
|
71
71
|
},
|
|
72
72
|
|
|
73
|
-
refreshFiles_meta:
|
|
73
|
+
refreshFiles_meta: true,
|
|
74
74
|
async refreshFiles({ folder }) {
|
|
75
75
|
socket.emitChanged(`archive-files-changed-${folder}`);
|
|
76
76
|
},
|
|
77
77
|
|
|
78
|
-
refreshFolders_meta:
|
|
78
|
+
refreshFolders_meta: true,
|
|
79
79
|
async refreshFolders() {
|
|
80
80
|
socket.emitChanged(`archive-folders-changed`);
|
|
81
81
|
},
|
|
82
82
|
|
|
83
|
-
deleteFile_meta:
|
|
83
|
+
deleteFile_meta: true,
|
|
84
84
|
async deleteFile({ folder, file, fileType }) {
|
|
85
85
|
await fs.unlink(path.join(resolveArchiveFolder(folder), `${file}.${fileType}`));
|
|
86
86
|
socket.emitChanged(`archive-files-changed-${folder}`);
|
|
87
87
|
},
|
|
88
88
|
|
|
89
|
-
renameFile_meta:
|
|
89
|
+
renameFile_meta: true,
|
|
90
90
|
async renameFile({ folder, file, newFile, fileType }) {
|
|
91
91
|
await fs.rename(
|
|
92
92
|
path.join(resolveArchiveFolder(folder), `${file}.${fileType}`),
|
|
@@ -95,13 +95,14 @@ module.exports = {
|
|
|
95
95
|
socket.emitChanged(`archive-files-changed-${folder}`);
|
|
96
96
|
},
|
|
97
97
|
|
|
98
|
-
renameFolder_meta:
|
|
98
|
+
renameFolder_meta: true,
|
|
99
99
|
async renameFolder({ folder, newFolder }) {
|
|
100
|
-
await
|
|
100
|
+
const uniqueName = await this.getNewArchiveFolder({ database: newFolder });
|
|
101
|
+
await fs.rename(path.join(archivedir(), folder), path.join(archivedir(), uniqueName));
|
|
101
102
|
socket.emitChanged(`archive-folders-changed`);
|
|
102
103
|
},
|
|
103
104
|
|
|
104
|
-
deleteFolder_meta:
|
|
105
|
+
deleteFolder_meta: true,
|
|
105
106
|
async deleteFolder({ folder }) {
|
|
106
107
|
if (!folder) throw new Error('Missing folder parameter');
|
|
107
108
|
if (folder.endsWith('.link')) {
|
|
@@ -112,13 +113,14 @@ module.exports = {
|
|
|
112
113
|
socket.emitChanged(`archive-folders-changed`);
|
|
113
114
|
},
|
|
114
115
|
|
|
115
|
-
saveFreeTable_meta:
|
|
116
|
+
saveFreeTable_meta: true,
|
|
116
117
|
async saveFreeTable({ folder, file, data }) {
|
|
117
|
-
saveFreeTableData(path.join(resolveArchiveFolder(folder), `${file}.jsonl`), data);
|
|
118
|
+
await saveFreeTableData(path.join(resolveArchiveFolder(folder), `${file}.jsonl`), data);
|
|
119
|
+
socket.emitChanged(`archive-files-changed-${folder}`);
|
|
118
120
|
return true;
|
|
119
121
|
},
|
|
120
122
|
|
|
121
|
-
loadFreeTable_meta:
|
|
123
|
+
loadFreeTable_meta: true,
|
|
122
124
|
async loadFreeTable({ folder, file }) {
|
|
123
125
|
return new Promise((resolve, reject) => {
|
|
124
126
|
const fileStream = fs.createReadStream(path.join(resolveArchiveFolder(folder), `${file}.jsonl`));
|
|
@@ -140,11 +142,14 @@ module.exports = {
|
|
|
140
142
|
},
|
|
141
143
|
|
|
142
144
|
async getNewArchiveFolder({ database }) {
|
|
145
|
+
const isLink = database.endsWith(database);
|
|
146
|
+
const name = isLink ? database.slice(0, -5) : database;
|
|
147
|
+
const suffix = isLink ? '.link' : '';
|
|
143
148
|
if (!(await fs.exists(path.join(archivedir(), database)))) return database;
|
|
144
149
|
let index = 2;
|
|
145
|
-
while (await fs.exists(path.join(archivedir(), `${
|
|
150
|
+
while (await fs.exists(path.join(archivedir(), `${name}${index}${suffix}`))) {
|
|
146
151
|
index += 1;
|
|
147
152
|
}
|
|
148
|
-
return `${
|
|
153
|
+
return `${name}${index}${suffix}`;
|
|
149
154
|
},
|
|
150
155
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const fs = require('fs-extra');
|
|
2
2
|
const path = require('path');
|
|
3
|
+
const axios = require('axios');
|
|
3
4
|
const { datadir } = require('../utility/directories');
|
|
4
5
|
const hasPermission = require('../utility/hasPermission');
|
|
5
6
|
const socket = require('../utility/socket');
|
|
@@ -20,7 +21,7 @@ module.exports = {
|
|
|
20
21
|
}
|
|
21
22
|
},
|
|
22
23
|
|
|
23
|
-
get_meta:
|
|
24
|
+
get_meta: true,
|
|
24
25
|
async get() {
|
|
25
26
|
const permissions = process.env.PERMISSIONS ? process.env.PERMISSIONS.split(',') : null;
|
|
26
27
|
|
|
@@ -32,17 +33,17 @@ module.exports = {
|
|
|
32
33
|
};
|
|
33
34
|
},
|
|
34
35
|
|
|
35
|
-
platformInfo_meta:
|
|
36
|
+
platformInfo_meta: true,
|
|
36
37
|
async platformInfo() {
|
|
37
38
|
return platformInfo;
|
|
38
39
|
},
|
|
39
40
|
|
|
40
|
-
getSettings_meta:
|
|
41
|
+
getSettings_meta: true,
|
|
41
42
|
async getSettings() {
|
|
42
43
|
return this.settingsValue;
|
|
43
44
|
},
|
|
44
45
|
|
|
45
|
-
updateSettings_meta:
|
|
46
|
+
updateSettings_meta: true,
|
|
46
47
|
async updateSettings(values) {
|
|
47
48
|
if (!hasPermission(`settings/change`)) return false;
|
|
48
49
|
try {
|
|
@@ -58,4 +59,10 @@ module.exports = {
|
|
|
58
59
|
return false;
|
|
59
60
|
}
|
|
60
61
|
},
|
|
62
|
+
|
|
63
|
+
changelog_meta: true,
|
|
64
|
+
async changelog() {
|
|
65
|
+
const resp = await axios.default.get('https://raw.githubusercontent.com/dbgate/dbgate/master/CHANGELOG.md');
|
|
66
|
+
return resp.data;
|
|
67
|
+
},
|
|
61
68
|
};
|
|
@@ -9,6 +9,8 @@ const socket = require('../utility/socket');
|
|
|
9
9
|
const { encryptConnection } = require('../utility/crypting');
|
|
10
10
|
const { handleProcessCommunication } = require('../utility/processComm');
|
|
11
11
|
|
|
12
|
+
const processArgs = require('../utility/processArgs');
|
|
13
|
+
|
|
12
14
|
function getNamedArgs() {
|
|
13
15
|
const res = {};
|
|
14
16
|
for (let i = 0; i < process.argv.length; i++) {
|
|
@@ -45,6 +47,7 @@ function getPortalCollections() {
|
|
|
45
47
|
password: process.env[`PASSWORD_${id}`],
|
|
46
48
|
port: process.env[`PORT_${id}`],
|
|
47
49
|
databaseUrl: process.env[`URL_${id}`],
|
|
50
|
+
useDatabaseUrl: !!process.env[`URL_${id}`],
|
|
48
51
|
databaseFile: process.env[`FILE_${id}`],
|
|
49
52
|
defaultDatabase: process.env[`DATABASE_${id}`],
|
|
50
53
|
singleDatabase: !!process.env[`DATABASE_${id}`],
|
|
@@ -126,7 +129,7 @@ module.exports = {
|
|
|
126
129
|
}
|
|
127
130
|
},
|
|
128
131
|
|
|
129
|
-
list_meta:
|
|
132
|
+
list_meta: true,
|
|
130
133
|
async list() {
|
|
131
134
|
return portalConnections || this.datastore.find();
|
|
132
135
|
},
|
|
@@ -136,7 +139,13 @@ module.exports = {
|
|
|
136
139
|
raw: true,
|
|
137
140
|
},
|
|
138
141
|
test(req, res) {
|
|
139
|
-
const subprocess = fork(process.argv[1], [
|
|
142
|
+
const subprocess = fork(global['API_PACKAGE'] || process.argv[1], [
|
|
143
|
+
'--is-forked-api',
|
|
144
|
+
'--start-process',
|
|
145
|
+
'connectProcess',
|
|
146
|
+
...processArgs.getPassArgs(),
|
|
147
|
+
// ...process.argv.slice(3),
|
|
148
|
+
]);
|
|
140
149
|
subprocess.on('message', resp => {
|
|
141
150
|
if (handleProcessCommunication(resp, subprocess)) return;
|
|
142
151
|
// @ts-ignore
|
|
@@ -148,7 +157,7 @@ module.exports = {
|
|
|
148
157
|
subprocess.send(req.body);
|
|
149
158
|
},
|
|
150
159
|
|
|
151
|
-
save_meta:
|
|
160
|
+
save_meta: true,
|
|
152
161
|
async save(connection) {
|
|
153
162
|
if (portalConnections) return;
|
|
154
163
|
let res;
|
|
@@ -162,7 +171,30 @@ module.exports = {
|
|
|
162
171
|
return res;
|
|
163
172
|
},
|
|
164
173
|
|
|
165
|
-
|
|
174
|
+
update_meta: true,
|
|
175
|
+
async update({ _id, values }) {
|
|
176
|
+
if (portalConnections) return;
|
|
177
|
+
const res = await this.datastore.update({ _id }, { $set: values });
|
|
178
|
+
socket.emitChanged('connection-list-changed');
|
|
179
|
+
return res;
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
updateDatabase_meta: true,
|
|
183
|
+
async updateDatabase({ conid, database, values }) {
|
|
184
|
+
if (portalConnections) return;
|
|
185
|
+
const conn = await this.datastore.find({ _id: conid });
|
|
186
|
+
let databases = conn[0].databases || [];
|
|
187
|
+
if (databases.find(x => x.name == database)) {
|
|
188
|
+
databases = databases.map(x => (x.name == database ? { ...x, ...values } : x));
|
|
189
|
+
} else {
|
|
190
|
+
databases = [...databases, { name: database, ...values }];
|
|
191
|
+
}
|
|
192
|
+
const res = await this.datastore.update({ _id: conid }, { $set: { databases } });
|
|
193
|
+
socket.emitChanged('connection-list-changed');
|
|
194
|
+
return res;
|
|
195
|
+
},
|
|
196
|
+
|
|
197
|
+
delete_meta: true,
|
|
166
198
|
async delete(connection) {
|
|
167
199
|
if (portalConnections) return;
|
|
168
200
|
const res = await this.datastore.remove(_.pick(connection, '_id'));
|
|
@@ -170,14 +202,14 @@ module.exports = {
|
|
|
170
202
|
return res;
|
|
171
203
|
},
|
|
172
204
|
|
|
173
|
-
get_meta:
|
|
205
|
+
get_meta: true,
|
|
174
206
|
async get({ conid }) {
|
|
175
207
|
if (portalConnections) return portalConnections.find(x => x._id == conid);
|
|
176
208
|
const res = await this.datastore.find({ _id: conid });
|
|
177
|
-
return res[0];
|
|
209
|
+
return res[0] || null;
|
|
178
210
|
},
|
|
179
211
|
|
|
180
|
-
newSqliteDatabase_meta:
|
|
212
|
+
newSqliteDatabase_meta: true,
|
|
181
213
|
async newSqliteDatabase({ file }) {
|
|
182
214
|
const sqliteDir = path.join(filesdir(), 'sqlite');
|
|
183
215
|
if (!(await fs.exists(sqliteDir))) {
|
|
@@ -25,6 +25,7 @@ const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
|
25
25
|
const generateDeploySql = require('../shell/generateDeploySql');
|
|
26
26
|
const { createTwoFilesPatch } = require('diff');
|
|
27
27
|
const diff2htmlPage = require('../utility/diff2htmlPage');
|
|
28
|
+
const processArgs = require('../utility/processArgs');
|
|
28
29
|
|
|
29
30
|
module.exports = {
|
|
30
31
|
/** @type {import('dbgate-types').OpenedDatabaseConnection[]} */
|
|
@@ -74,10 +75,12 @@ module.exports = {
|
|
|
74
75
|
const existing = this.opened.find(x => x.conid == conid && x.database == database);
|
|
75
76
|
if (existing) return existing;
|
|
76
77
|
const connection = await connections.get({ conid });
|
|
77
|
-
const subprocess = fork(process.argv[1], [
|
|
78
|
+
const subprocess = fork(global['API_PACKAGE'] || process.argv[1], [
|
|
79
|
+
'--is-forked-api',
|
|
78
80
|
'--start-process',
|
|
79
81
|
'databaseConnectionProcess',
|
|
80
|
-
...
|
|
82
|
+
...processArgs.getPassArgs(),
|
|
83
|
+
// ...process.argv.slice(3),
|
|
81
84
|
]);
|
|
82
85
|
const lastClosed = this.closed[`${conid}/${database}`];
|
|
83
86
|
const newOpened = {
|
|
@@ -121,7 +124,7 @@ module.exports = {
|
|
|
121
124
|
return promise;
|
|
122
125
|
},
|
|
123
126
|
|
|
124
|
-
queryData_meta:
|
|
127
|
+
queryData_meta: true,
|
|
125
128
|
async queryData({ conid, database, sql }) {
|
|
126
129
|
console.log(`Processing query, conid=${conid}, database=${database}, sql=${sql}`);
|
|
127
130
|
const opened = await this.ensureOpened(conid, database);
|
|
@@ -132,7 +135,7 @@ module.exports = {
|
|
|
132
135
|
return res;
|
|
133
136
|
},
|
|
134
137
|
|
|
135
|
-
runScript_meta:
|
|
138
|
+
runScript_meta: true,
|
|
136
139
|
async runScript({ conid, database, sql }) {
|
|
137
140
|
console.log(`Processing script, conid=${conid}, database=${database}, sql=${sql}`);
|
|
138
141
|
const opened = await this.ensureOpened(conid, database);
|
|
@@ -140,21 +143,21 @@ module.exports = {
|
|
|
140
143
|
return res;
|
|
141
144
|
},
|
|
142
145
|
|
|
143
|
-
collectionData_meta:
|
|
146
|
+
collectionData_meta: true,
|
|
144
147
|
async collectionData({ conid, database, options }) {
|
|
145
148
|
const opened = await this.ensureOpened(conid, database);
|
|
146
149
|
const res = await this.sendRequest(opened, { msgtype: 'collectionData', options });
|
|
147
150
|
return res.result;
|
|
148
151
|
},
|
|
149
152
|
|
|
150
|
-
updateCollection_meta:
|
|
153
|
+
updateCollection_meta: true,
|
|
151
154
|
async updateCollection({ conid, database, changeSet }) {
|
|
152
155
|
const opened = await this.ensureOpened(conid, database);
|
|
153
156
|
const res = await this.sendRequest(opened, { msgtype: 'updateCollection', changeSet });
|
|
154
157
|
return res.result;
|
|
155
158
|
},
|
|
156
159
|
|
|
157
|
-
status_meta:
|
|
160
|
+
status_meta: true,
|
|
158
161
|
async status({ conid, database }) {
|
|
159
162
|
const existing = this.opened.find(x => x.conid == conid && x.database == database);
|
|
160
163
|
if (existing) {
|
|
@@ -176,7 +179,7 @@ module.exports = {
|
|
|
176
179
|
};
|
|
177
180
|
},
|
|
178
181
|
|
|
179
|
-
ping_meta:
|
|
182
|
+
ping_meta: true,
|
|
180
183
|
async ping({ conid, database }) {
|
|
181
184
|
let existing = this.opened.find(x => x.conid == conid && x.database == database);
|
|
182
185
|
|
|
@@ -192,7 +195,7 @@ module.exports = {
|
|
|
192
195
|
};
|
|
193
196
|
},
|
|
194
197
|
|
|
195
|
-
refresh_meta:
|
|
198
|
+
refresh_meta: true,
|
|
196
199
|
async refresh({ conid, database, keepOpen }) {
|
|
197
200
|
if (!keepOpen) this.close(conid, database);
|
|
198
201
|
|
|
@@ -200,7 +203,7 @@ module.exports = {
|
|
|
200
203
|
return { status: 'ok' };
|
|
201
204
|
},
|
|
202
205
|
|
|
203
|
-
syncModel_meta:
|
|
206
|
+
syncModel_meta: true,
|
|
204
207
|
async syncModel({ conid, database }) {
|
|
205
208
|
const conn = await this.ensureOpened(conid, database);
|
|
206
209
|
conn.subprocess.send({ msgtype: 'syncModel' });
|
|
@@ -224,13 +227,13 @@ module.exports = {
|
|
|
224
227
|
}
|
|
225
228
|
},
|
|
226
229
|
|
|
227
|
-
disconnect_meta:
|
|
230
|
+
disconnect_meta: true,
|
|
228
231
|
async disconnect({ conid, database }) {
|
|
229
232
|
await this.close(conid, database, true);
|
|
230
233
|
return { status: 'ok' };
|
|
231
234
|
},
|
|
232
235
|
|
|
233
|
-
structure_meta:
|
|
236
|
+
structure_meta: true,
|
|
234
237
|
async structure({ conid, database }) {
|
|
235
238
|
if (conid == '__model') {
|
|
236
239
|
const model = await importDbModel(database);
|
|
@@ -247,13 +250,13 @@ module.exports = {
|
|
|
247
250
|
// };
|
|
248
251
|
},
|
|
249
252
|
|
|
250
|
-
serverVersion_meta:
|
|
253
|
+
serverVersion_meta: true,
|
|
251
254
|
async serverVersion({ conid, database }) {
|
|
252
255
|
const opened = await this.ensureOpened(conid, database);
|
|
253
|
-
return opened.serverVersion;
|
|
256
|
+
return opened.serverVersion || null;
|
|
254
257
|
},
|
|
255
258
|
|
|
256
|
-
sqlPreview_meta:
|
|
259
|
+
sqlPreview_meta: true,
|
|
257
260
|
async sqlPreview({ conid, database, objects, options }) {
|
|
258
261
|
// wait for structure
|
|
259
262
|
await this.structure({ conid, database });
|
|
@@ -263,7 +266,7 @@ module.exports = {
|
|
|
263
266
|
return res;
|
|
264
267
|
},
|
|
265
268
|
|
|
266
|
-
exportModel_meta:
|
|
269
|
+
exportModel_meta: true,
|
|
267
270
|
async exportModel({ conid, database }) {
|
|
268
271
|
const archiveFolder = await archive.getNewArchiveFolder({ database });
|
|
269
272
|
await fs.mkdir(path.join(archivedir(), archiveFolder));
|
|
@@ -273,14 +276,22 @@ module.exports = {
|
|
|
273
276
|
return { archiveFolder };
|
|
274
277
|
},
|
|
275
278
|
|
|
276
|
-
generateDeploySql_meta:
|
|
279
|
+
generateDeploySql_meta: true,
|
|
277
280
|
async generateDeploySql({ conid, database, archiveFolder }) {
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
analysedStructure: await this.structure({ conid, database }),
|
|
281
|
+
const opened = await this.ensureOpened(conid, database);
|
|
282
|
+
const res = await this.sendRequest(opened, {
|
|
283
|
+
msgtype: 'generateDeploySql',
|
|
282
284
|
modelFolder: resolveArchiveFolder(archiveFolder),
|
|
283
285
|
});
|
|
286
|
+
return res;
|
|
287
|
+
|
|
288
|
+
// const connection = await connections.get({ conid });
|
|
289
|
+
// return generateDeploySql({
|
|
290
|
+
// connection,
|
|
291
|
+
// analysedStructure: await this.structure({ conid, database }),
|
|
292
|
+
// modelFolder: resolveArchiveFolder(archiveFolder),
|
|
293
|
+
// });
|
|
294
|
+
|
|
284
295
|
// const deployedModel = generateDbPairingId(await importDbModel(path.join(archivedir(), archiveFolder)));
|
|
285
296
|
// const currentModel = generateDbPairingId(await this.structure({ conid, database }));
|
|
286
297
|
// const currentModelPaired = matchPairedObjects(deployedModel, currentModel);
|
|
@@ -295,7 +306,7 @@ module.exports = {
|
|
|
295
306
|
// };
|
|
296
307
|
// return sql;
|
|
297
308
|
},
|
|
298
|
-
// runCommand_meta:
|
|
309
|
+
// runCommand_meta: true,
|
|
299
310
|
// async runCommand({ conid, database, sql }) {
|
|
300
311
|
// console.log(`Running SQL command , conid=${conid}, database=${database}, sql=${sql}`);
|
|
301
312
|
// const opened = await this.ensureOpened(conid, database);
|
|
@@ -338,7 +349,7 @@ module.exports = {
|
|
|
338
349
|
return res;
|
|
339
350
|
},
|
|
340
351
|
|
|
341
|
-
generateDbDiffReport_meta:
|
|
352
|
+
generateDbDiffReport_meta: true,
|
|
342
353
|
async generateDbDiffReport({ filePath, sourceConid, sourceDatabase, targetConid, targetDatabase }) {
|
|
343
354
|
const unifiedDiff = await this.getUnifiedDiff({ sourceConid, sourceDatabase, targetConid, targetDatabase });
|
|
344
355
|
|
package/src/controllers/files.js
CHANGED
|
@@ -20,7 +20,7 @@ function deserialize(format, text) {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
module.exports = {
|
|
23
|
-
list_meta:
|
|
23
|
+
list_meta: true,
|
|
24
24
|
async list({ folder }) {
|
|
25
25
|
if (!hasPermission(`files/${folder}/read`)) return [];
|
|
26
26
|
const dir = path.join(filesdir(), folder);
|
|
@@ -29,7 +29,7 @@ module.exports = {
|
|
|
29
29
|
return files;
|
|
30
30
|
},
|
|
31
31
|
|
|
32
|
-
listAll_meta:
|
|
32
|
+
listAll_meta: true,
|
|
33
33
|
async listAll() {
|
|
34
34
|
const folders = await fs.readdir(filesdir());
|
|
35
35
|
const res = [];
|
|
@@ -42,7 +42,7 @@ module.exports = {
|
|
|
42
42
|
return res;
|
|
43
43
|
},
|
|
44
44
|
|
|
45
|
-
delete_meta:
|
|
45
|
+
delete_meta: true,
|
|
46
46
|
async delete({ folder, file }) {
|
|
47
47
|
if (!hasPermission(`files/${folder}/write`)) return;
|
|
48
48
|
await fs.unlink(path.join(filesdir(), folder, file));
|
|
@@ -50,7 +50,7 @@ module.exports = {
|
|
|
50
50
|
socket.emitChanged(`all-files-changed`);
|
|
51
51
|
},
|
|
52
52
|
|
|
53
|
-
rename_meta:
|
|
53
|
+
rename_meta: true,
|
|
54
54
|
async rename({ folder, file, newFile }) {
|
|
55
55
|
if (!hasPermission(`files/${folder}/write`)) return;
|
|
56
56
|
await fs.rename(path.join(filesdir(), folder, file), path.join(filesdir(), folder, newFile));
|
|
@@ -58,7 +58,7 @@ module.exports = {
|
|
|
58
58
|
socket.emitChanged(`all-files-changed`);
|
|
59
59
|
},
|
|
60
60
|
|
|
61
|
-
copy_meta:
|
|
61
|
+
copy_meta: true,
|
|
62
62
|
async copy({ folder, file, newFile }) {
|
|
63
63
|
if (!hasPermission(`files/${folder}/write`)) return;
|
|
64
64
|
await fs.copyFile(path.join(filesdir(), folder, file), path.join(filesdir(), folder, newFile));
|
|
@@ -66,7 +66,7 @@ module.exports = {
|
|
|
66
66
|
socket.emitChanged(`all-files-changed`);
|
|
67
67
|
},
|
|
68
68
|
|
|
69
|
-
load_meta:
|
|
69
|
+
load_meta: true,
|
|
70
70
|
async load({ folder, file, format }) {
|
|
71
71
|
if (folder.startsWith('archive:')) {
|
|
72
72
|
const text = await fs.readFile(path.join(resolveArchiveFolder(folder.substring('archive:'.length)), file), {
|
|
@@ -80,7 +80,7 @@ module.exports = {
|
|
|
80
80
|
}
|
|
81
81
|
},
|
|
82
82
|
|
|
83
|
-
save_meta:
|
|
83
|
+
save_meta: true,
|
|
84
84
|
async save({ folder, file, data, format }) {
|
|
85
85
|
if (folder.startsWith('archive:')) {
|
|
86
86
|
const dir = resolveArchiveFolder(folder.substring('archive:'.length));
|
|
@@ -101,12 +101,12 @@ module.exports = {
|
|
|
101
101
|
}
|
|
102
102
|
},
|
|
103
103
|
|
|
104
|
-
saveAs_meta:
|
|
104
|
+
saveAs_meta: true,
|
|
105
105
|
async saveAs({ filePath, data, format }) {
|
|
106
106
|
await fs.writeFile(filePath, serialize(format, data));
|
|
107
107
|
},
|
|
108
108
|
|
|
109
|
-
favorites_meta:
|
|
109
|
+
favorites_meta: true,
|
|
110
110
|
async favorites() {
|
|
111
111
|
if (!hasPermission(`files/favorites/read`)) return [];
|
|
112
112
|
const dir = path.join(filesdir(), 'favorites');
|
|
@@ -125,7 +125,7 @@ module.exports = {
|
|
|
125
125
|
return res;
|
|
126
126
|
},
|
|
127
127
|
|
|
128
|
-
generateUploadsFile_meta:
|
|
128
|
+
generateUploadsFile_meta: true,
|
|
129
129
|
async generateUploadsFile() {
|
|
130
130
|
const fileName = `${uuidv1()}.html`;
|
|
131
131
|
return {
|
|
@@ -134,7 +134,7 @@ module.exports = {
|
|
|
134
134
|
};
|
|
135
135
|
},
|
|
136
136
|
|
|
137
|
-
exportChart_meta:
|
|
137
|
+
exportChart_meta: true,
|
|
138
138
|
async exportChart({ filePath, title, config, image }) {
|
|
139
139
|
const fileName = path.parse(filePath).base;
|
|
140
140
|
const imageFile = fileName.replace('.html', '-preview.png');
|
|
@@ -104,7 +104,7 @@ module.exports = {
|
|
|
104
104
|
return datastore;
|
|
105
105
|
},
|
|
106
106
|
|
|
107
|
-
getInfo_meta:
|
|
107
|
+
getInfo_meta: true,
|
|
108
108
|
async getInfo({ jslid }) {
|
|
109
109
|
const file = getJslFileName(jslid);
|
|
110
110
|
const firstLine = await readFirstLine(file);
|
|
@@ -112,13 +112,13 @@ module.exports = {
|
|
|
112
112
|
return null;
|
|
113
113
|
},
|
|
114
114
|
|
|
115
|
-
getRows_meta:
|
|
115
|
+
getRows_meta: true,
|
|
116
116
|
async getRows({ jslid, offset, limit, filters }) {
|
|
117
117
|
const datastore = await this.ensureDatastore(jslid);
|
|
118
118
|
return datastore.getRows(offset, limit, _.isEmpty(filters) ? null : filters);
|
|
119
119
|
},
|
|
120
120
|
|
|
121
|
-
getStats_meta:
|
|
121
|
+
getStats_meta: true,
|
|
122
122
|
getStats({ jslid }) {
|
|
123
123
|
const file = `${getJslFileName(jslid)}.stats`;
|
|
124
124
|
if (fs.existsSync(file)) {
|
|
@@ -146,7 +146,7 @@ module.exports = {
|
|
|
146
146
|
// }
|
|
147
147
|
},
|
|
148
148
|
|
|
149
|
-
saveFreeTable_meta:
|
|
149
|
+
saveFreeTable_meta: true,
|
|
150
150
|
async saveFreeTable({ jslid, data }) {
|
|
151
151
|
saveFreeTableData(getJslFileName(jslid), data);
|
|
152
152
|
return true;
|
|
@@ -7,14 +7,14 @@ function pickObjectNames(array) {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
module.exports = {
|
|
10
|
-
// tableData_meta:
|
|
10
|
+
// tableData_meta: true,
|
|
11
11
|
// async tableData({ conid, database, schemaName, pureName }) {
|
|
12
12
|
// const opened = await databaseConnections.ensureOpened(conid, database);
|
|
13
13
|
// const res = await databaseConnections.sendRequest(opened, { msgtype: 'tableData', schemaName, pureName });
|
|
14
14
|
// return res;
|
|
15
15
|
// },
|
|
16
16
|
|
|
17
|
-
listObjects_meta:
|
|
17
|
+
listObjects_meta: true,
|
|
18
18
|
async listObjects({ conid, database }) {
|
|
19
19
|
const opened = await databaseConnections.ensureOpened(conid, database);
|
|
20
20
|
const types = ['tables', 'collections', 'views', 'procedures', 'functions', 'triggers'];
|
|
@@ -27,7 +27,7 @@ module.exports = {
|
|
|
27
27
|
);
|
|
28
28
|
},
|
|
29
29
|
|
|
30
|
-
tableInfo_meta:
|
|
30
|
+
tableInfo_meta: true,
|
|
31
31
|
async tableInfo({ conid, database, schemaName, pureName }) {
|
|
32
32
|
const opened = await databaseConnections.ensureOpened(conid, database);
|
|
33
33
|
const table = opened.structure.tables.find(x => x.pureName == pureName && x.schemaName == schemaName);
|
|
@@ -38,7 +38,7 @@ module.exports = {
|
|
|
38
38
|
};
|
|
39
39
|
},
|
|
40
40
|
|
|
41
|
-
sqlObjectInfo_meta:
|
|
41
|
+
sqlObjectInfo_meta: true,
|
|
42
42
|
async sqlObjectInfo({ objectTypeField, conid, database, schemaName, pureName }) {
|
|
43
43
|
const opened = await databaseConnections.ensureOpened(conid, database);
|
|
44
44
|
const res = opened.structure[objectTypeField].find(x => x.pureName == pureName && x.schemaName == schemaName);
|