stimulsoft-data-adapter 2021.3.7 → 2021.4.4
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/FirebirdAdapter.js +147 -141
- package/MSSQLAdapter.js +248 -229
- package/MySQLAdapter.js +207 -201
- package/PostgreSQLAdapter.js +246 -240
- package/app.js +89 -82
- package/package.json +50 -50
package/MSSQLAdapter.js
CHANGED
|
@@ -1,230 +1,249 @@
|
|
|
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
|
-
case sql.
|
|
60
|
-
case sql.
|
|
61
|
-
case sql.
|
|
62
|
-
case sql.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
case sql.
|
|
67
|
-
case sql.
|
|
68
|
-
case sql.
|
|
69
|
-
case sql.
|
|
70
|
-
types[columnIndex] = "
|
|
71
|
-
|
|
72
|
-
case sql.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
case sql.
|
|
76
|
-
types[columnIndex] = "
|
|
77
|
-
|
|
78
|
-
case sql.
|
|
79
|
-
types[columnIndex] = "
|
|
80
|
-
|
|
81
|
-
case sql.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (recordset[recordIndex][columnName]
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
info
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
case "
|
|
185
|
-
case "
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
case "
|
|
194
|
-
config
|
|
195
|
-
break;
|
|
196
|
-
|
|
197
|
-
case "
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
1
|
+
/*
|
|
2
|
+
Stimulsoft.Reports.JS
|
|
3
|
+
Version: 2021.4.4
|
|
4
|
+
Build date: 2021.11.18
|
|
5
|
+
License: https://www.stimulsoft.com/en/licensing/reports
|
|
6
|
+
*/
|
|
7
|
+
exports.process = function (command, onResult) {
|
|
8
|
+
var end = function (result) {
|
|
9
|
+
try {
|
|
10
|
+
if (connection) connection.close();
|
|
11
|
+
result.adapterVersion = "2021.4.4";
|
|
12
|
+
onResult(result);
|
|
13
|
+
}
|
|
14
|
+
catch (e) {
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
var onError = function (message) {
|
|
19
|
+
end({ success: false, notice: message });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
var connect = function () {
|
|
24
|
+
connection = new sql.ConnectionPool(config, function (error) {
|
|
25
|
+
if (error) onError(error.message);
|
|
26
|
+
else onConnect();
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var query = function (queryString) {
|
|
31
|
+
var request = connection.request();
|
|
32
|
+
request.query(queryString, function (error, recordset) {
|
|
33
|
+
if (error) onError(error.message);
|
|
34
|
+
else {
|
|
35
|
+
onQuery(recordset);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
var onConnect = function () {
|
|
41
|
+
if (command.queryString) query(command.queryString);
|
|
42
|
+
else end({ success: true });
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
var onQuery = function (recordset) {
|
|
46
|
+
recordset = recordset.recordset;
|
|
47
|
+
var columns = [];
|
|
48
|
+
var rows = [];
|
|
49
|
+
var types = [];
|
|
50
|
+
if (recordset.length > 0 && Array.isArray(recordset[0])) recordset = recordset[0];
|
|
51
|
+
for (var columnName in recordset.columns) {
|
|
52
|
+
var column = recordset.columns[columnName];
|
|
53
|
+
var columnIndex = columns.length;
|
|
54
|
+
columns.push(column.name);
|
|
55
|
+
|
|
56
|
+
switch (column.type) {
|
|
57
|
+
case sql.UniqueIdentifier:
|
|
58
|
+
case sql.BigInt:
|
|
59
|
+
case sql.timestamp:
|
|
60
|
+
case sql.Int:
|
|
61
|
+
case sql.SmallInt:
|
|
62
|
+
case sql.TinyInt:
|
|
63
|
+
types[columnIndex] = "int"; break;
|
|
64
|
+
|
|
65
|
+
case sql.Decimal:
|
|
66
|
+
case sql.Money:
|
|
67
|
+
case sql.SmallMoney:
|
|
68
|
+
case sql.Float:
|
|
69
|
+
case sql.Real:
|
|
70
|
+
types[columnIndex] = "number"; break;
|
|
71
|
+
|
|
72
|
+
case sql.DateTime:
|
|
73
|
+
case sql.Date:
|
|
74
|
+
case sql.DateTime2:
|
|
75
|
+
case sql.SmallDateTime:
|
|
76
|
+
types[columnIndex] = "datetime"; break;
|
|
77
|
+
|
|
78
|
+
case sql.DateTimeOffset:
|
|
79
|
+
types[columnIndex] = "datetimeZ"; break;
|
|
80
|
+
|
|
81
|
+
case sql.Time:
|
|
82
|
+
types[columnIndex] = "time"; break;
|
|
83
|
+
|
|
84
|
+
case sql.Bit:
|
|
85
|
+
types[columnIndex] = "boolean"; break;
|
|
86
|
+
|
|
87
|
+
case sql.Binary:
|
|
88
|
+
case sql.Image:
|
|
89
|
+
types[columnIndex] = "array"; break;
|
|
90
|
+
|
|
91
|
+
default:
|
|
92
|
+
types[columnIndex] = "string"; break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (recordset.length > 0 && Array.isArray(recordset[0])) recordset = recordset[0];
|
|
97
|
+
for (var recordIndex in recordset) {
|
|
98
|
+
var row = [];
|
|
99
|
+
for (var columnName in recordset[recordIndex]) {
|
|
100
|
+
var columnIndex = columns.indexOf(columnName);
|
|
101
|
+
if (recordset[recordIndex][columnName] instanceof Uint8Array ||
|
|
102
|
+
recordset[recordIndex][columnName] instanceof Buffer) {
|
|
103
|
+
types[columnIndex] = "array";
|
|
104
|
+
recordset[recordIndex][columnName] = Buffer.from(recordset[recordIndex][columnName]).toString('base64');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (recordset[recordIndex][columnName] != null && typeof recordset[recordIndex][columnName].toISOString === "function") {
|
|
108
|
+
var dateTime = recordset[recordIndex][columnName].toISOString();
|
|
109
|
+
if (types[columnIndex] == "time") {
|
|
110
|
+
recordset[recordIndex][columnName] = dateTime.substr(dateTime.indexOf("T") + 1).replace("Z", "");
|
|
111
|
+
}
|
|
112
|
+
else if (types[columnIndex] == "datetimeZ") {
|
|
113
|
+
var offset = "+00:00";
|
|
114
|
+
recordset[recordIndex][columnName] = dateTime.replace("Z", "") + offset;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
recordset[recordIndex][columnName] = dateTime.replace("Z", "");
|
|
118
|
+
types[columnIndex] = "datetime";
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (columnName == "" && Array.isArray(recordset[recordIndex][columnName])) {
|
|
123
|
+
for (var i = 0; i < recordset[recordIndex][columnName].length; i++) {
|
|
124
|
+
if (columns.length <= columnIndex + i && columns[columnIndex + i] != ""){
|
|
125
|
+
columns.splice(columnIndex + i - 1, 0, columns[columnIndex]);
|
|
126
|
+
types.splice(columnIndex + i - 1, 0, types[columnIndex]);
|
|
127
|
+
}
|
|
128
|
+
row[columnIndex + i] = recordset[recordIndex][columnName][i];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else
|
|
132
|
+
row[columnIndex] = recordset[recordIndex][columnName];
|
|
133
|
+
}
|
|
134
|
+
rows.push(row);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
for (var typeIndex in types) {
|
|
138
|
+
if (types[typeIndex] == "datetimeZ") types[typeIndex] = "datetimeoffset";
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
end({ success: true, columns: columns, rows: rows, types: types });
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
var getHostInfo = function (host) {
|
|
145
|
+
const info = {};
|
|
146
|
+
const regexPort = /(.*),([0-9]+)/;
|
|
147
|
+
const matchPort = regexPort.exec(host);
|
|
148
|
+
|
|
149
|
+
if (matchPort) {
|
|
150
|
+
info.port = matchPort[2].trim();
|
|
151
|
+
host = matchPort[1].trim();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const regexInstanceName = /(.*)\\(.*)/;
|
|
155
|
+
const matchInstanceName = regexInstanceName.exec(host);
|
|
156
|
+
if (matchInstanceName) {
|
|
157
|
+
info.instanceName = matchInstanceName[2].trim();
|
|
158
|
+
host = matchInstanceName[1].trim();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
info.host = host;
|
|
162
|
+
return info;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
var getConnectionStringConfig = function (connectionString) {
|
|
166
|
+
var config = {
|
|
167
|
+
options: {
|
|
168
|
+
trustServerCertificate: true,
|
|
169
|
+
cryptoCredentialsDetails: {
|
|
170
|
+
minVersion: 'TLSv1'
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
for (var propertyIndex in connectionString.split(";")) {
|
|
176
|
+
var property = connectionString.split(";")[propertyIndex];
|
|
177
|
+
if (property) {
|
|
178
|
+
var match = property.split("=");
|
|
179
|
+
if (match && match.length >= 2) {
|
|
180
|
+
match[0] = match[0].trim().toLowerCase();
|
|
181
|
+
match[1] = match[1].trim();
|
|
182
|
+
|
|
183
|
+
switch (match[0]) {
|
|
184
|
+
case "data source":
|
|
185
|
+
case "server":
|
|
186
|
+
var hostInfo = getHostInfo(match[1]);
|
|
187
|
+
config["server"] = hostInfo.host;
|
|
188
|
+
if ("port" in hostInfo) config["port"] = +hostInfo.port;
|
|
189
|
+
if ("instanceName" in hostInfo) config.options["instanceName"] = hostInfo.instanceName;
|
|
190
|
+
break;
|
|
191
|
+
|
|
192
|
+
case "database":
|
|
193
|
+
case "initial catalog":
|
|
194
|
+
config["database"] = match[1];
|
|
195
|
+
break;
|
|
196
|
+
|
|
197
|
+
case "uid":
|
|
198
|
+
case "user":
|
|
199
|
+
case "user id":
|
|
200
|
+
config["user"] = match[1];
|
|
201
|
+
break;
|
|
202
|
+
|
|
203
|
+
case "pwd":
|
|
204
|
+
case "password":
|
|
205
|
+
config["password"] = match[1];
|
|
206
|
+
break;
|
|
207
|
+
|
|
208
|
+
case "domain":
|
|
209
|
+
config["domain"] = match[1];
|
|
210
|
+
break;
|
|
211
|
+
|
|
212
|
+
case "encrypt":
|
|
213
|
+
config.options["encrypt"] = !!match[1];
|
|
214
|
+
break;
|
|
215
|
+
|
|
216
|
+
case "connectiontimeout":
|
|
217
|
+
config.options["connectionTimeout"] = match[1];
|
|
218
|
+
break;
|
|
219
|
+
|
|
220
|
+
case "requesttimeout":
|
|
221
|
+
config.options["requestTimeout"] = match[1];
|
|
222
|
+
break;
|
|
223
|
+
|
|
224
|
+
case "tdsversion":
|
|
225
|
+
config.options["tdsVersion"] = match[1];
|
|
226
|
+
break;
|
|
227
|
+
|
|
228
|
+
case "trustservercertificate":
|
|
229
|
+
config.options["trustServerCertificate"] = !!match[1];
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return config;
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
var sql = require('mssql');
|
|
240
|
+
var config = getConnectionStringConfig(command.connectionString);
|
|
241
|
+
if (!("connectionTimeout" in config) && "timeout" in command) config.connectionTimeout = command.timeout;
|
|
242
|
+
if (!("requestTimeout" in config) && "timeout" in command) config.requestTimeout = command.timeout;
|
|
243
|
+
|
|
244
|
+
connect();
|
|
245
|
+
}
|
|
246
|
+
catch (e) {
|
|
247
|
+
onError(e.stack);
|
|
248
|
+
}
|
|
230
249
|
}
|