dbgate-api 4.4.4 → 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 +12 -12
- package/src/controllers/config.js +5 -5
- package/src/controllers/connections.js +18 -9
- package/src/controllers/databaseConnections.js +27 -21
- 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 +1 -0
- 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.
|
|
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.
|
|
30
|
-
"dbgate-sqltree": "^4.4.
|
|
31
|
-
"dbgate-tools": "^4.4.
|
|
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.
|
|
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,14 +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
100
|
const uniqueName = await this.getNewArchiveFolder({ database: newFolder });
|
|
101
101
|
await fs.rename(path.join(archivedir(), folder), path.join(archivedir(), uniqueName));
|
|
102
102
|
socket.emitChanged(`archive-folders-changed`);
|
|
103
103
|
},
|
|
104
104
|
|
|
105
|
-
deleteFolder_meta:
|
|
105
|
+
deleteFolder_meta: true,
|
|
106
106
|
async deleteFolder({ folder }) {
|
|
107
107
|
if (!folder) throw new Error('Missing folder parameter');
|
|
108
108
|
if (folder.endsWith('.link')) {
|
|
@@ -113,14 +113,14 @@ module.exports = {
|
|
|
113
113
|
socket.emitChanged(`archive-folders-changed`);
|
|
114
114
|
},
|
|
115
115
|
|
|
116
|
-
saveFreeTable_meta:
|
|
116
|
+
saveFreeTable_meta: true,
|
|
117
117
|
async saveFreeTable({ folder, file, data }) {
|
|
118
118
|
await saveFreeTableData(path.join(resolveArchiveFolder(folder), `${file}.jsonl`), data);
|
|
119
119
|
socket.emitChanged(`archive-files-changed-${folder}`);
|
|
120
120
|
return true;
|
|
121
121
|
},
|
|
122
122
|
|
|
123
|
-
loadFreeTable_meta:
|
|
123
|
+
loadFreeTable_meta: true,
|
|
124
124
|
async loadFreeTable({ folder, file }) {
|
|
125
125
|
return new Promise((resolve, reject) => {
|
|
126
126
|
const fileStream = fs.createReadStream(path.join(resolveArchiveFolder(folder), `${file}.jsonl`));
|
|
@@ -21,7 +21,7 @@ module.exports = {
|
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
23
|
|
|
24
|
-
get_meta:
|
|
24
|
+
get_meta: true,
|
|
25
25
|
async get() {
|
|
26
26
|
const permissions = process.env.PERMISSIONS ? process.env.PERMISSIONS.split(',') : null;
|
|
27
27
|
|
|
@@ -33,17 +33,17 @@ module.exports = {
|
|
|
33
33
|
};
|
|
34
34
|
},
|
|
35
35
|
|
|
36
|
-
platformInfo_meta:
|
|
36
|
+
platformInfo_meta: true,
|
|
37
37
|
async platformInfo() {
|
|
38
38
|
return platformInfo;
|
|
39
39
|
},
|
|
40
40
|
|
|
41
|
-
getSettings_meta:
|
|
41
|
+
getSettings_meta: true,
|
|
42
42
|
async getSettings() {
|
|
43
43
|
return this.settingsValue;
|
|
44
44
|
},
|
|
45
45
|
|
|
46
|
-
updateSettings_meta:
|
|
46
|
+
updateSettings_meta: true,
|
|
47
47
|
async updateSettings(values) {
|
|
48
48
|
if (!hasPermission(`settings/change`)) return false;
|
|
49
49
|
try {
|
|
@@ -60,7 +60,7 @@ module.exports = {
|
|
|
60
60
|
}
|
|
61
61
|
},
|
|
62
62
|
|
|
63
|
-
changelog_meta:
|
|
63
|
+
changelog_meta: true,
|
|
64
64
|
async changelog() {
|
|
65
65
|
const resp = await axios.default.get('https://raw.githubusercontent.com/dbgate/dbgate/master/CHANGELOG.md');
|
|
66
66
|
return resp.data;
|
|
@@ -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,7 @@ module.exports = {
|
|
|
162
171
|
return res;
|
|
163
172
|
},
|
|
164
173
|
|
|
165
|
-
update_meta:
|
|
174
|
+
update_meta: true,
|
|
166
175
|
async update({ _id, values }) {
|
|
167
176
|
if (portalConnections) return;
|
|
168
177
|
const res = await this.datastore.update({ _id }, { $set: values });
|
|
@@ -170,7 +179,7 @@ module.exports = {
|
|
|
170
179
|
return res;
|
|
171
180
|
},
|
|
172
181
|
|
|
173
|
-
updateDatabase_meta:
|
|
182
|
+
updateDatabase_meta: true,
|
|
174
183
|
async updateDatabase({ conid, database, values }) {
|
|
175
184
|
if (portalConnections) return;
|
|
176
185
|
const conn = await this.datastore.find({ _id: conid });
|
|
@@ -185,7 +194,7 @@ module.exports = {
|
|
|
185
194
|
return res;
|
|
186
195
|
},
|
|
187
196
|
|
|
188
|
-
delete_meta:
|
|
197
|
+
delete_meta: true,
|
|
189
198
|
async delete(connection) {
|
|
190
199
|
if (portalConnections) return;
|
|
191
200
|
const res = await this.datastore.remove(_.pick(connection, '_id'));
|
|
@@ -193,14 +202,14 @@ module.exports = {
|
|
|
193
202
|
return res;
|
|
194
203
|
},
|
|
195
204
|
|
|
196
|
-
get_meta:
|
|
205
|
+
get_meta: true,
|
|
197
206
|
async get({ conid }) {
|
|
198
207
|
if (portalConnections) return portalConnections.find(x => x._id == conid);
|
|
199
208
|
const res = await this.datastore.find({ _id: conid });
|
|
200
|
-
return res[0];
|
|
209
|
+
return res[0] || null;
|
|
201
210
|
},
|
|
202
211
|
|
|
203
|
-
newSqliteDatabase_meta:
|
|
212
|
+
newSqliteDatabase_meta: true,
|
|
204
213
|
async newSqliteDatabase({ file }) {
|
|
205
214
|
const sqliteDir = path.join(filesdir(), 'sqlite');
|
|
206
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,10 +276,13 @@ 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
281
|
const opened = await this.ensureOpened(conid, database);
|
|
279
|
-
const res = await this.sendRequest(opened, {
|
|
282
|
+
const res = await this.sendRequest(opened, {
|
|
283
|
+
msgtype: 'generateDeploySql',
|
|
284
|
+
modelFolder: resolveArchiveFolder(archiveFolder),
|
|
285
|
+
});
|
|
280
286
|
return res;
|
|
281
287
|
|
|
282
288
|
// const connection = await connections.get({ conid });
|
|
@@ -285,7 +291,7 @@ module.exports = {
|
|
|
285
291
|
// analysedStructure: await this.structure({ conid, database }),
|
|
286
292
|
// modelFolder: resolveArchiveFolder(archiveFolder),
|
|
287
293
|
// });
|
|
288
|
-
|
|
294
|
+
|
|
289
295
|
// const deployedModel = generateDbPairingId(await importDbModel(path.join(archivedir(), archiveFolder)));
|
|
290
296
|
// const currentModel = generateDbPairingId(await this.structure({ conid, database }));
|
|
291
297
|
// const currentModelPaired = matchPairedObjects(deployedModel, currentModel);
|
|
@@ -300,7 +306,7 @@ module.exports = {
|
|
|
300
306
|
// };
|
|
301
307
|
// return sql;
|
|
302
308
|
},
|
|
303
|
-
// runCommand_meta:
|
|
309
|
+
// runCommand_meta: true,
|
|
304
310
|
// async runCommand({ conid, database, sql }) {
|
|
305
311
|
// console.log(`Running SQL command , conid=${conid}, database=${database}, sql=${sql}`);
|
|
306
312
|
// const opened = await this.ensureOpened(conid, database);
|
|
@@ -343,7 +349,7 @@ module.exports = {
|
|
|
343
349
|
return res;
|
|
344
350
|
},
|
|
345
351
|
|
|
346
|
-
generateDbDiffReport_meta:
|
|
352
|
+
generateDbDiffReport_meta: true,
|
|
347
353
|
async generateDbDiffReport({ filePath, sourceConid, sourceDatabase, targetConid, targetDatabase }) {
|
|
348
354
|
const unifiedDiff = await this.getUnifiedDiff({ sourceConid, sourceDatabase, targetConid, targetDatabase });
|
|
349
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);
|