leo-connector-common 5.0.0 → 5.0.3
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/README.md +6 -6
- package/base.js +45 -45
- package/checksum/index.js +793 -793
- package/checksum/lib/basicConnector.js +330 -330
- package/checksum/lib/checksumNibbler.js +401 -401
- package/checksum/lib/handler.js +75 -75
- package/checksum/lib/nibbler.js +168 -168
- package/checksum/lib/test.js +205 -205
- package/checksum/tests/body-too-large.utest.js +296 -296
- package/datawarehouse/combine.js +149 -149
- package/datawarehouse/load.js +366 -366
- package/datawarehouse/transform.js +64 -64
- package/dol.js +733 -733
- package/package.json +38 -38
- package/sql/nibbler.js +164 -164
- package/sql/snapshotter.js +287 -287
- package/sql/test/test.js +97 -97
- package/test/checksum/index.test.js +10 -10
- package/utils/validation.js +127 -127
|
@@ -1,330 +1,330 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
const crypto = require('crypto');
|
|
3
|
-
const base = require("./handler.js");
|
|
4
|
-
const moment = require("moment");
|
|
5
|
-
const logger = require("leo-logger")("leo-checksum.basic");
|
|
6
|
-
const Stream = require('stream').Stream;
|
|
7
|
-
|
|
8
|
-
function promisify(method, arity) {
|
|
9
|
-
if (method.length > arity) {
|
|
10
|
-
return function(...args) {
|
|
11
|
-
return new Promise((resolve, reject) => {
|
|
12
|
-
args.push((...args) => {
|
|
13
|
-
if (args[0]) reject(args[0]);
|
|
14
|
-
else resolve.apply(this, args.splice(1));
|
|
15
|
-
});
|
|
16
|
-
method.apply(this, args);
|
|
17
|
-
});
|
|
18
|
-
};
|
|
19
|
-
} else {
|
|
20
|
-
return method;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function readArray(array) {
|
|
25
|
-
let stream = new Stream(),
|
|
26
|
-
i = 0,
|
|
27
|
-
paused = false,
|
|
28
|
-
ended = false;
|
|
29
|
-
|
|
30
|
-
stream.readable = true;
|
|
31
|
-
stream.writable = false;
|
|
32
|
-
|
|
33
|
-
if (!Array.isArray(array))
|
|
34
|
-
throw new Error('event-stream.read expects an array');
|
|
35
|
-
|
|
36
|
-
stream.resume = function() {
|
|
37
|
-
if (ended) return;
|
|
38
|
-
paused = false;
|
|
39
|
-
let l = array.length;
|
|
40
|
-
while (i < l && !paused && !ended) {
|
|
41
|
-
stream.emit('data', array[i++]);
|
|
42
|
-
}
|
|
43
|
-
if (i == l && !ended)
|
|
44
|
-
ended = true, stream.readable = false, stream.emit('end');
|
|
45
|
-
};
|
|
46
|
-
process.nextTick(stream.resume);
|
|
47
|
-
stream.pause = function() {
|
|
48
|
-
paused = true;
|
|
49
|
-
};
|
|
50
|
-
stream.destroy = function() {
|
|
51
|
-
ended = true;
|
|
52
|
-
stream.emit('close');
|
|
53
|
-
};
|
|
54
|
-
return stream;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function buildKeys(settings) {
|
|
58
|
-
return Array.isArray(settings.fields) ? () => settings.fields : Object.keys;
|
|
59
|
-
}
|
|
60
|
-
module.exports = function(opts) {
|
|
61
|
-
|
|
62
|
-
opts = Object.assign({
|
|
63
|
-
batch: () => {
|
|
64
|
-
return Promise.reject("Batch Not Implemented");
|
|
65
|
-
},
|
|
66
|
-
individual: () => {
|
|
67
|
-
return Promise.reject("Individual Not Implemented");
|
|
68
|
-
},
|
|
69
|
-
sample: () => {
|
|
70
|
-
return Promise.reject("Sample Not Implemented");
|
|
71
|
-
},
|
|
72
|
-
nibble: () => {
|
|
73
|
-
return Promise.reject("Nibble Not Implemented");
|
|
74
|
-
},
|
|
75
|
-
range: () => {
|
|
76
|
-
return Promise.reject("Range Not Implemented");
|
|
77
|
-
},
|
|
78
|
-
initialize: () => {
|
|
79
|
-
return Promise.resolve({});
|
|
80
|
-
},
|
|
81
|
-
destroy: () => {
|
|
82
|
-
return Promise.resolve({});
|
|
83
|
-
},
|
|
84
|
-
delete: () => {
|
|
85
|
-
return Promise.reject("Delete Not Implemented");
|
|
86
|
-
}
|
|
87
|
-
}, opts);
|
|
88
|
-
|
|
89
|
-
let wrap = opts.wrap || ((handler, base) => {
|
|
90
|
-
return function(event, callback) {
|
|
91
|
-
base(event, handler, callback);
|
|
92
|
-
};
|
|
93
|
-
});
|
|
94
|
-
return base({
|
|
95
|
-
batch: wrap(opts.batch, batch),
|
|
96
|
-
individual: wrap(opts.individual, individual),
|
|
97
|
-
sample: wrap(opts.sample, sample),
|
|
98
|
-
nibble: wrap(opts.nibble, nibble),
|
|
99
|
-
range: wrap(opts.range, range),
|
|
100
|
-
initialize: wrap(opts.initialize, initialize),
|
|
101
|
-
destroy: wrap(opts.destroy, destroy),
|
|
102
|
-
delete: wrap(opts.delete, deleteFn)
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
function batch(event, handler, callback) {
|
|
106
|
-
logger.log("Calling Batch", event);
|
|
107
|
-
|
|
108
|
-
let startTime = moment.now();
|
|
109
|
-
let data = event.data;
|
|
110
|
-
|
|
111
|
-
promisify(handler, 2).call({
|
|
112
|
-
settings: event.settings,
|
|
113
|
-
session: event.session
|
|
114
|
-
}, data.start, data.end).then(stream => {
|
|
115
|
-
if (!Array.isArray(stream) && stream.hash) {
|
|
116
|
-
return callback(null, {
|
|
117
|
-
qty: stream.qty,
|
|
118
|
-
ids: data.ids,
|
|
119
|
-
start: data.start,
|
|
120
|
-
end: data.end,
|
|
121
|
-
hash: stream.hash
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
let ObjectKeys = buildKeys(event.settings);
|
|
126
|
-
stream = Array.isArray(stream) ? readArray(stream) : stream;
|
|
127
|
-
|
|
128
|
-
let result = {
|
|
129
|
-
qty: 0,
|
|
130
|
-
ids: data.ids,
|
|
131
|
-
start: data.start,
|
|
132
|
-
end: data.end,
|
|
133
|
-
hash: [0, 0, 0, 0]
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
stream.on("end", () => {
|
|
137
|
-
result.duration = moment.now() - startTime;
|
|
138
|
-
callback(null, result);
|
|
139
|
-
}).on("error", (err) => {
|
|
140
|
-
logger.log("Batch On Error", err);
|
|
141
|
-
callback(err);
|
|
142
|
-
}).on("data", (obj) => {
|
|
143
|
-
let allFields = "";
|
|
144
|
-
ObjectKeys(obj).forEach(key => {
|
|
145
|
-
let value = obj[key];
|
|
146
|
-
if (value instanceof Date) {
|
|
147
|
-
allFields += crypto.createHash('md5').update(Math.round(value.getTime() / 1000).toString()).digest('hex');
|
|
148
|
-
} else if (value !== null && value !== undefined && value.toString) {
|
|
149
|
-
allFields += crypto.createHash('md5').update(value.toString()).digest('hex');
|
|
150
|
-
} else {
|
|
151
|
-
allFields += " ";
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
let hash = crypto.createHash('md5').update(allFields).digest();
|
|
156
|
-
|
|
157
|
-
result.hash[0] += hash.readUInt32BE(0);
|
|
158
|
-
result.hash[1] += hash.readUInt32BE(4);
|
|
159
|
-
result.hash[2] += hash.readUInt32BE(8);
|
|
160
|
-
result.hash[3] += hash.readUInt32BE(12);
|
|
161
|
-
result.qty += 1;
|
|
162
|
-
});
|
|
163
|
-
}).catch(callback);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
function individual(event, handler, callback) {
|
|
167
|
-
logger.log("Calling Individual", event);
|
|
168
|
-
let startTime = moment.now();
|
|
169
|
-
let data = event.data;
|
|
170
|
-
promisify(handler, 2).call({
|
|
171
|
-
settings: event.settings,
|
|
172
|
-
session: event.session
|
|
173
|
-
}, data.start, data.end).then(stream => {
|
|
174
|
-
if (!Array.isArray(stream) && stream.checksums) {
|
|
175
|
-
return callback(null, {
|
|
176
|
-
ids: data.ids,
|
|
177
|
-
start: data.start,
|
|
178
|
-
end: data.end,
|
|
179
|
-
qty: stream.qty,
|
|
180
|
-
checksums: stream.checksums
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
let ObjectKeys = buildKeys(event.settings);
|
|
185
|
-
stream = Array.isArray(stream) ? readArray(stream) : stream;
|
|
186
|
-
let results = {
|
|
187
|
-
ids: data.ids,
|
|
188
|
-
start: data.start,
|
|
189
|
-
end: data.end,
|
|
190
|
-
qty: 0,
|
|
191
|
-
checksums: []
|
|
192
|
-
};
|
|
193
|
-
stream.on("end", () => {
|
|
194
|
-
results.duration = moment.now() - startTime;
|
|
195
|
-
callback(null, results);
|
|
196
|
-
}).on("error", (err) => {
|
|
197
|
-
logger.log("Individual On Error", err);
|
|
198
|
-
callback(err);
|
|
199
|
-
}).on("data", (obj) => {
|
|
200
|
-
let allFields = "";
|
|
201
|
-
|
|
202
|
-
ObjectKeys(obj).forEach(key => {
|
|
203
|
-
let value = obj[key];
|
|
204
|
-
if (value instanceof Date) {
|
|
205
|
-
allFields += crypto.createHash('md5').update(Math.round(value.getTime() / 1000).toString()).digest('hex');
|
|
206
|
-
} else if (value !== null && value !== undefined && value.toString) {
|
|
207
|
-
allFields += crypto.createHash('md5').update(value.toString()).digest('hex');
|
|
208
|
-
} else {
|
|
209
|
-
allFields += " ";
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
let hash = crypto.createHash('md5').update(allFields).digest('hex');
|
|
213
|
-
results.checksums.push({
|
|
214
|
-
id: obj[event.settings.id_column],
|
|
215
|
-
_id: event.settings._id_column ? obj[event.settings._id_column] : undefined,
|
|
216
|
-
hash: hash
|
|
217
|
-
});
|
|
218
|
-
results.qty += 1;
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
}).catch(callback);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function sample(event, handler, callback) {
|
|
225
|
-
logger.log("Calling Sample", event);
|
|
226
|
-
let data = event.data;
|
|
227
|
-
|
|
228
|
-
promisify(handler, 1).call({
|
|
229
|
-
settings: event.settings,
|
|
230
|
-
session: event.session
|
|
231
|
-
}, data.ids).then(stream => {
|
|
232
|
-
if (!Array.isArray(stream) && stream.checksums) {
|
|
233
|
-
return callback(null, {
|
|
234
|
-
ids: data.ids,
|
|
235
|
-
start: data.start,
|
|
236
|
-
end: data.end,
|
|
237
|
-
qty: stream.qty,
|
|
238
|
-
checksums: stream.checksums
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
let ObjectKeys = buildKeys(event.settings);
|
|
243
|
-
stream = Array.isArray(stream) ? readArray(stream) : stream;
|
|
244
|
-
|
|
245
|
-
let results = {
|
|
246
|
-
qty: 0,
|
|
247
|
-
ids: [],
|
|
248
|
-
start: data.start,
|
|
249
|
-
end: data.end,
|
|
250
|
-
checksums: []
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
stream.on("end", function() {
|
|
254
|
-
callback(null, results);
|
|
255
|
-
}).on("err", function(err) {
|
|
256
|
-
logger.log("error");
|
|
257
|
-
throw err;
|
|
258
|
-
}).on("data", function(obj) {
|
|
259
|
-
let out = [];
|
|
260
|
-
ObjectKeys(obj).forEach(key => {
|
|
261
|
-
let value = obj[key];
|
|
262
|
-
if (value instanceof Date) {
|
|
263
|
-
out.push(Math.round(value.getTime() / 1000) + " " + moment(value).utc().format());
|
|
264
|
-
} else if (value && typeof value == "object" && value.toHexString) {
|
|
265
|
-
out.push(value.toString());
|
|
266
|
-
} else {
|
|
267
|
-
out.push(value);
|
|
268
|
-
}
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
results.ids.push(obj[event.settings.id_column]);
|
|
272
|
-
results.checksums.push(out);
|
|
273
|
-
results.qty += 1;
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
}).catch(callback);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
function range(event, handler, callback) {
|
|
280
|
-
logger.log("Calling Range", event);
|
|
281
|
-
|
|
282
|
-
let data = event.data;
|
|
283
|
-
promisify(handler, 2).call({
|
|
284
|
-
settings: event.settings,
|
|
285
|
-
session: event.session
|
|
286
|
-
}, data.start, data.end).then(data => {
|
|
287
|
-
callback(null, data);
|
|
288
|
-
}).catch(callback);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
function nibble(event, handler, callback) {
|
|
292
|
-
logger.log("Calling Nibble", event);
|
|
293
|
-
|
|
294
|
-
let data = event.data;
|
|
295
|
-
promisify(handler, 4).call({
|
|
296
|
-
settings: event.settings,
|
|
297
|
-
session: event.session
|
|
298
|
-
}, data.start, data.end, data.limit, data.reverse).then(data => {
|
|
299
|
-
callback(null, Object.assign({
|
|
300
|
-
current: null,
|
|
301
|
-
next: null
|
|
302
|
-
}, data));
|
|
303
|
-
}).catch(callback);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
function initialize(event, handler, callback) {
|
|
307
|
-
logger.log("Calling Initialize", event);
|
|
308
|
-
promisify(handler, 1).call({
|
|
309
|
-
settings: event.settings,
|
|
310
|
-
session: event.session
|
|
311
|
-
}, event.data).then(data => callback(null, data)).catch(callback);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
function destroy(event, handler, callback) {
|
|
315
|
-
logger.log("Calling Destroy", event);
|
|
316
|
-
promisify(handler, 1).call({
|
|
317
|
-
settings: event.settings,
|
|
318
|
-
session: event.session
|
|
319
|
-
}, event.data).then(() => callback()).catch(callback);
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
function deleteFn(event, handler, callback) {
|
|
323
|
-
logger.log("Calling Delete", event);
|
|
324
|
-
promisify(handler, 1).call({
|
|
325
|
-
settings: event.settings,
|
|
326
|
-
session: event.session,
|
|
327
|
-
...event.data
|
|
328
|
-
}, event.data.ids).then(() => callback()).catch(callback);
|
|
329
|
-
}
|
|
330
|
-
};
|
|
1
|
+
"use strict";
|
|
2
|
+
const crypto = require('crypto');
|
|
3
|
+
const base = require("./handler.js");
|
|
4
|
+
const moment = require("moment");
|
|
5
|
+
const logger = require("leo-logger")("leo-checksum.basic");
|
|
6
|
+
const Stream = require('stream').Stream;
|
|
7
|
+
|
|
8
|
+
function promisify(method, arity) {
|
|
9
|
+
if (method.length > arity) {
|
|
10
|
+
return function(...args) {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
args.push((...args) => {
|
|
13
|
+
if (args[0]) reject(args[0]);
|
|
14
|
+
else resolve.apply(this, args.splice(1));
|
|
15
|
+
});
|
|
16
|
+
method.apply(this, args);
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
} else {
|
|
20
|
+
return method;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function readArray(array) {
|
|
25
|
+
let stream = new Stream(),
|
|
26
|
+
i = 0,
|
|
27
|
+
paused = false,
|
|
28
|
+
ended = false;
|
|
29
|
+
|
|
30
|
+
stream.readable = true;
|
|
31
|
+
stream.writable = false;
|
|
32
|
+
|
|
33
|
+
if (!Array.isArray(array))
|
|
34
|
+
throw new Error('event-stream.read expects an array');
|
|
35
|
+
|
|
36
|
+
stream.resume = function() {
|
|
37
|
+
if (ended) return;
|
|
38
|
+
paused = false;
|
|
39
|
+
let l = array.length;
|
|
40
|
+
while (i < l && !paused && !ended) {
|
|
41
|
+
stream.emit('data', array[i++]);
|
|
42
|
+
}
|
|
43
|
+
if (i == l && !ended)
|
|
44
|
+
ended = true, stream.readable = false, stream.emit('end');
|
|
45
|
+
};
|
|
46
|
+
process.nextTick(stream.resume);
|
|
47
|
+
stream.pause = function() {
|
|
48
|
+
paused = true;
|
|
49
|
+
};
|
|
50
|
+
stream.destroy = function() {
|
|
51
|
+
ended = true;
|
|
52
|
+
stream.emit('close');
|
|
53
|
+
};
|
|
54
|
+
return stream;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function buildKeys(settings) {
|
|
58
|
+
return Array.isArray(settings.fields) ? () => settings.fields : Object.keys;
|
|
59
|
+
}
|
|
60
|
+
module.exports = function(opts) {
|
|
61
|
+
|
|
62
|
+
opts = Object.assign({
|
|
63
|
+
batch: () => {
|
|
64
|
+
return Promise.reject("Batch Not Implemented");
|
|
65
|
+
},
|
|
66
|
+
individual: () => {
|
|
67
|
+
return Promise.reject("Individual Not Implemented");
|
|
68
|
+
},
|
|
69
|
+
sample: () => {
|
|
70
|
+
return Promise.reject("Sample Not Implemented");
|
|
71
|
+
},
|
|
72
|
+
nibble: () => {
|
|
73
|
+
return Promise.reject("Nibble Not Implemented");
|
|
74
|
+
},
|
|
75
|
+
range: () => {
|
|
76
|
+
return Promise.reject("Range Not Implemented");
|
|
77
|
+
},
|
|
78
|
+
initialize: () => {
|
|
79
|
+
return Promise.resolve({});
|
|
80
|
+
},
|
|
81
|
+
destroy: () => {
|
|
82
|
+
return Promise.resolve({});
|
|
83
|
+
},
|
|
84
|
+
delete: () => {
|
|
85
|
+
return Promise.reject("Delete Not Implemented");
|
|
86
|
+
}
|
|
87
|
+
}, opts);
|
|
88
|
+
|
|
89
|
+
let wrap = opts.wrap || ((handler, base) => {
|
|
90
|
+
return function(event, callback) {
|
|
91
|
+
base(event, handler, callback);
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
return base({
|
|
95
|
+
batch: wrap(opts.batch, batch),
|
|
96
|
+
individual: wrap(opts.individual, individual),
|
|
97
|
+
sample: wrap(opts.sample, sample),
|
|
98
|
+
nibble: wrap(opts.nibble, nibble),
|
|
99
|
+
range: wrap(opts.range, range),
|
|
100
|
+
initialize: wrap(opts.initialize, initialize),
|
|
101
|
+
destroy: wrap(opts.destroy, destroy),
|
|
102
|
+
delete: wrap(opts.delete, deleteFn)
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
function batch(event, handler, callback) {
|
|
106
|
+
logger.log("Calling Batch", event);
|
|
107
|
+
|
|
108
|
+
let startTime = moment.now();
|
|
109
|
+
let data = event.data;
|
|
110
|
+
|
|
111
|
+
promisify(handler, 2).call({
|
|
112
|
+
settings: event.settings,
|
|
113
|
+
session: event.session
|
|
114
|
+
}, data.start, data.end).then(stream => {
|
|
115
|
+
if (!Array.isArray(stream) && stream.hash) {
|
|
116
|
+
return callback(null, {
|
|
117
|
+
qty: stream.qty,
|
|
118
|
+
ids: data.ids,
|
|
119
|
+
start: data.start,
|
|
120
|
+
end: data.end,
|
|
121
|
+
hash: stream.hash
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
let ObjectKeys = buildKeys(event.settings);
|
|
126
|
+
stream = Array.isArray(stream) ? readArray(stream) : stream;
|
|
127
|
+
|
|
128
|
+
let result = {
|
|
129
|
+
qty: 0,
|
|
130
|
+
ids: data.ids,
|
|
131
|
+
start: data.start,
|
|
132
|
+
end: data.end,
|
|
133
|
+
hash: [0, 0, 0, 0]
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
stream.on("end", () => {
|
|
137
|
+
result.duration = moment.now() - startTime;
|
|
138
|
+
callback(null, result);
|
|
139
|
+
}).on("error", (err) => {
|
|
140
|
+
logger.log("Batch On Error", err);
|
|
141
|
+
callback(err);
|
|
142
|
+
}).on("data", (obj) => {
|
|
143
|
+
let allFields = "";
|
|
144
|
+
ObjectKeys(obj).forEach(key => {
|
|
145
|
+
let value = obj[key];
|
|
146
|
+
if (value instanceof Date) {
|
|
147
|
+
allFields += crypto.createHash('md5').update(Math.round(value.getTime() / 1000).toString()).digest('hex');
|
|
148
|
+
} else if (value !== null && value !== undefined && value.toString) {
|
|
149
|
+
allFields += crypto.createHash('md5').update(value.toString()).digest('hex');
|
|
150
|
+
} else {
|
|
151
|
+
allFields += " ";
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
let hash = crypto.createHash('md5').update(allFields).digest();
|
|
156
|
+
|
|
157
|
+
result.hash[0] += hash.readUInt32BE(0);
|
|
158
|
+
result.hash[1] += hash.readUInt32BE(4);
|
|
159
|
+
result.hash[2] += hash.readUInt32BE(8);
|
|
160
|
+
result.hash[3] += hash.readUInt32BE(12);
|
|
161
|
+
result.qty += 1;
|
|
162
|
+
});
|
|
163
|
+
}).catch(callback);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function individual(event, handler, callback) {
|
|
167
|
+
logger.log("Calling Individual", event);
|
|
168
|
+
let startTime = moment.now();
|
|
169
|
+
let data = event.data;
|
|
170
|
+
promisify(handler, 2).call({
|
|
171
|
+
settings: event.settings,
|
|
172
|
+
session: event.session
|
|
173
|
+
}, data.start, data.end).then(stream => {
|
|
174
|
+
if (!Array.isArray(stream) && stream.checksums) {
|
|
175
|
+
return callback(null, {
|
|
176
|
+
ids: data.ids,
|
|
177
|
+
start: data.start,
|
|
178
|
+
end: data.end,
|
|
179
|
+
qty: stream.qty,
|
|
180
|
+
checksums: stream.checksums
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
let ObjectKeys = buildKeys(event.settings);
|
|
185
|
+
stream = Array.isArray(stream) ? readArray(stream) : stream;
|
|
186
|
+
let results = {
|
|
187
|
+
ids: data.ids,
|
|
188
|
+
start: data.start,
|
|
189
|
+
end: data.end,
|
|
190
|
+
qty: 0,
|
|
191
|
+
checksums: []
|
|
192
|
+
};
|
|
193
|
+
stream.on("end", () => {
|
|
194
|
+
results.duration = moment.now() - startTime;
|
|
195
|
+
callback(null, results);
|
|
196
|
+
}).on("error", (err) => {
|
|
197
|
+
logger.log("Individual On Error", err);
|
|
198
|
+
callback(err);
|
|
199
|
+
}).on("data", (obj) => {
|
|
200
|
+
let allFields = "";
|
|
201
|
+
|
|
202
|
+
ObjectKeys(obj).forEach(key => {
|
|
203
|
+
let value = obj[key];
|
|
204
|
+
if (value instanceof Date) {
|
|
205
|
+
allFields += crypto.createHash('md5').update(Math.round(value.getTime() / 1000).toString()).digest('hex');
|
|
206
|
+
} else if (value !== null && value !== undefined && value.toString) {
|
|
207
|
+
allFields += crypto.createHash('md5').update(value.toString()).digest('hex');
|
|
208
|
+
} else {
|
|
209
|
+
allFields += " ";
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
let hash = crypto.createHash('md5').update(allFields).digest('hex');
|
|
213
|
+
results.checksums.push({
|
|
214
|
+
id: obj[event.settings.id_column],
|
|
215
|
+
_id: event.settings._id_column ? obj[event.settings._id_column] : undefined,
|
|
216
|
+
hash: hash
|
|
217
|
+
});
|
|
218
|
+
results.qty += 1;
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
}).catch(callback);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function sample(event, handler, callback) {
|
|
225
|
+
logger.log("Calling Sample", event);
|
|
226
|
+
let data = event.data;
|
|
227
|
+
|
|
228
|
+
promisify(handler, 1).call({
|
|
229
|
+
settings: event.settings,
|
|
230
|
+
session: event.session
|
|
231
|
+
}, data.ids).then(stream => {
|
|
232
|
+
if (!Array.isArray(stream) && stream.checksums) {
|
|
233
|
+
return callback(null, {
|
|
234
|
+
ids: data.ids,
|
|
235
|
+
start: data.start,
|
|
236
|
+
end: data.end,
|
|
237
|
+
qty: stream.qty,
|
|
238
|
+
checksums: stream.checksums
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
let ObjectKeys = buildKeys(event.settings);
|
|
243
|
+
stream = Array.isArray(stream) ? readArray(stream) : stream;
|
|
244
|
+
|
|
245
|
+
let results = {
|
|
246
|
+
qty: 0,
|
|
247
|
+
ids: [],
|
|
248
|
+
start: data.start,
|
|
249
|
+
end: data.end,
|
|
250
|
+
checksums: []
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
stream.on("end", function() {
|
|
254
|
+
callback(null, results);
|
|
255
|
+
}).on("err", function(err) {
|
|
256
|
+
logger.log("error");
|
|
257
|
+
throw err;
|
|
258
|
+
}).on("data", function(obj) {
|
|
259
|
+
let out = [];
|
|
260
|
+
ObjectKeys(obj).forEach(key => {
|
|
261
|
+
let value = obj[key];
|
|
262
|
+
if (value instanceof Date) {
|
|
263
|
+
out.push(Math.round(value.getTime() / 1000) + " " + moment(value).utc().format());
|
|
264
|
+
} else if (value && typeof value == "object" && value.toHexString) {
|
|
265
|
+
out.push(value.toString());
|
|
266
|
+
} else {
|
|
267
|
+
out.push(value);
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
results.ids.push(obj[event.settings.id_column]);
|
|
272
|
+
results.checksums.push(out);
|
|
273
|
+
results.qty += 1;
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
}).catch(callback);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function range(event, handler, callback) {
|
|
280
|
+
logger.log("Calling Range", event);
|
|
281
|
+
|
|
282
|
+
let data = event.data;
|
|
283
|
+
promisify(handler, 2).call({
|
|
284
|
+
settings: event.settings,
|
|
285
|
+
session: event.session
|
|
286
|
+
}, data.start, data.end).then(data => {
|
|
287
|
+
callback(null, data);
|
|
288
|
+
}).catch(callback);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function nibble(event, handler, callback) {
|
|
292
|
+
logger.log("Calling Nibble", event);
|
|
293
|
+
|
|
294
|
+
let data = event.data;
|
|
295
|
+
promisify(handler, 4).call({
|
|
296
|
+
settings: event.settings,
|
|
297
|
+
session: event.session
|
|
298
|
+
}, data.start, data.end, data.limit, data.reverse).then(data => {
|
|
299
|
+
callback(null, Object.assign({
|
|
300
|
+
current: null,
|
|
301
|
+
next: null
|
|
302
|
+
}, data));
|
|
303
|
+
}).catch(callback);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function initialize(event, handler, callback) {
|
|
307
|
+
logger.log("Calling Initialize", event);
|
|
308
|
+
promisify(handler, 1).call({
|
|
309
|
+
settings: event.settings,
|
|
310
|
+
session: event.session
|
|
311
|
+
}, event.data).then(data => callback(null, data)).catch(callback);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function destroy(event, handler, callback) {
|
|
315
|
+
logger.log("Calling Destroy", event);
|
|
316
|
+
promisify(handler, 1).call({
|
|
317
|
+
settings: event.settings,
|
|
318
|
+
session: event.session
|
|
319
|
+
}, event.data).then(() => callback()).catch(callback);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function deleteFn(event, handler, callback) {
|
|
323
|
+
logger.log("Calling Delete", event);
|
|
324
|
+
promisify(handler, 1).call({
|
|
325
|
+
settings: event.settings,
|
|
326
|
+
session: event.session,
|
|
327
|
+
...event.data
|
|
328
|
+
}, event.data.ids).then(() => callback()).catch(callback);
|
|
329
|
+
}
|
|
330
|
+
};
|