@nsshunt/stsdatamanagement 1.17.65 → 1.17.67

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.
@@ -0,0 +1,87 @@
1
+ // https://stackoverflow.com/questions/56356655/structuring-a-typescript-project-with-workers
2
+ //let faker = require('faker');
3
+ //import { parentPort } from 'node:worker_threads';
4
+ import crypto from 'crypto';
5
+ import { PGPoolManager } from './pgpoolmanager';
6
+ import { PGAccessLayer } from './pgaccesslayer';
7
+ /*
8
+ const { parentPort, workerData } = require('node:worker_threads');
9
+ //require('node:crypto');
10
+ const { PGPoolManager } = require('./pgpoolmanager')
11
+ const { PGAccessLayer } = require('./pgaccesslayer')
12
+ */
13
+ const userid = 'dbinitrunner';
14
+ const resfakerprefix = 'RESFK-';
15
+ const rescopyprefix = 'RESCP-';
16
+ class CliWorker {
17
+ fakerdataarray = [];
18
+ fakerdataarray2 = [];
19
+ totalDataSize = 0;
20
+ avgDataSize = 0;
21
+ copybatchsize = 250;
22
+ run = async (data) => {
23
+ const { start, iterations, datamin } = data.data;
24
+ let { datamax } = data.data;
25
+ let count = start;
26
+ const accesslayer = new PGAccessLayer(new PGPoolManager());
27
+ if (datamax > 0) {
28
+ datamax = (datamax <= datamin) ? datamin + 1 : datamax;
29
+ }
30
+ for (let i = 0; i < iterations; i++) {
31
+ //let randcard = faker.helpers.createCard();
32
+ const coreRecordSizeRange = crypto.randomInt(128, 192);
33
+ //const coreRecordSizeRange = 128;
34
+ const coreRecordSize = Math.floor(coreRecordSizeRange / 2);
35
+ let randcard = crypto.randomBytes(coreRecordSize).toString('hex');
36
+ //let randcard = 'helloworld'
37
+ if (datamax > 0) {
38
+ const n = crypto.randomInt(datamin, datamax);
39
+ //const n = 1024;
40
+ const n2 = Math.floor(n / 2);
41
+ const rndid = crypto.randomBytes(n2).toString('hex');
42
+ //const rndid = 'helloworld'
43
+ randcard += rndid;
44
+ }
45
+ const randcardstring = randcard;
46
+ //const randcardstring = JSON.stringify(randcard);
47
+ this.totalDataSize += randcardstring.length;
48
+ this.avgDataSize = Math.floor(this.totalDataSize / (i + 1));
49
+ const pn = ('' + count++).padStart(10, '0');
50
+ const id = resfakerprefix + pn;
51
+ const cpid = rescopyprefix + pn;
52
+ const datanow = new Date().toISOString();
53
+ //let datanow = new Date().toUTCString();
54
+ const fakerdata = {
55
+ //oid: i
56
+ resname: id,
57
+ resdesc: randcardstring,
58
+ vnum: 1,
59
+ validfrom: datanow,
60
+ validto: null,
61
+ dbaction: 1,
62
+ dbactionuser: userid
63
+ };
64
+ this.fakerdataarray.push(fakerdata);
65
+ const fakerdata2 = Object.assign({}, fakerdata);
66
+ fakerdata2.resname = cpid;
67
+ this.fakerdataarray2.push(fakerdata2);
68
+ //@@parentPort?.postMessage( { command: '', data: { totalDataSize: this.totalDataSize, avgDataSize: this.avgDataSize } } );
69
+ if ((i + 1) % this.copybatchsize === 0) {
70
+ await accesslayer.bulkInsert(this.fakerdataarray);
71
+ await accesslayer.bulkInsert(this.fakerdataarray2);
72
+ this.fakerdataarray = [];
73
+ this.fakerdataarray2 = [];
74
+ }
75
+ }
76
+ if (this.fakerdataarray.length > 0) {
77
+ await accesslayer.bulkInsert(this.fakerdataarray);
78
+ await accesslayer.bulkInsert(this.fakerdataarray2);
79
+ }
80
+ //@@parentPort?.postMessage( { command: 'done', data: null } );
81
+ };
82
+ }
83
+ const worker = new CliWorker();
84
+ onmessage = async function (data) {
85
+ worker.run(data);
86
+ };
87
+ //# sourceMappingURL=cliworker-old.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliworker-old.js","sourceRoot":"","sources":["../src/cliworker-old.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ // https://stackoverflow.com/questions/56356655/structuring-a-typescript-project-with-workers
2
+ //let faker = require('faker');
3
+ //import { parentPort } from 'node:worker_threads';
4
+ import crypto from 'crypto';
5
+ import { PGPoolManager } from './pgpoolmanager';
6
+ import { PGAccessLayer } from './pgaccesslayer';
7
+ /*
8
+ const { parentPort, workerData } = require('node:worker_threads');
9
+ //require('node:crypto');
10
+ const { PGPoolManager } = require('./pgpoolmanager')
11
+ const { PGAccessLayer } = require('./pgaccesslayer')
12
+ */
13
+ const userid = 'dbinitrunner';
14
+ const resfakerprefix = 'RESFK-';
15
+ const rescopyprefix = 'RESCP-';
16
+ export class CliWorker {
17
+ #options;
18
+ fakerdataarray = [];
19
+ fakerdataarray2 = [];
20
+ totalDataSize = 0;
21
+ avgDataSize = 0;
22
+ copybatchsize = 250;
23
+ constructor(options) {
24
+ this.#options = options;
25
+ }
26
+ Run = async () => {
27
+ let datamax = this.#options.datamax;
28
+ let count = this.#options.start;
29
+ const accesslayer = new PGAccessLayer(new PGPoolManager());
30
+ if (datamax > 0) {
31
+ datamax = (datamax <= this.#options.datamin) ? this.#options.datamin + 1 : datamax;
32
+ }
33
+ for (let i = 0; i < this.#options.iterations; i++) {
34
+ //let randcard = faker.helpers.createCard();
35
+ const coreRecordSizeRange = crypto.randomInt(128, 192);
36
+ //const coreRecordSizeRange = 128;
37
+ const coreRecordSize = Math.floor(coreRecordSizeRange / 2);
38
+ let randcard = crypto.randomBytes(coreRecordSize).toString('hex');
39
+ //let randcard = 'helloworld'
40
+ if (datamax > 0) {
41
+ const n = crypto.randomInt(this.#options.datamin, datamax);
42
+ //const n = 1024;
43
+ const n2 = Math.floor(n / 2);
44
+ const rndid = crypto.randomBytes(n2).toString('hex');
45
+ //const rndid = 'helloworld'
46
+ randcard += rndid;
47
+ }
48
+ const randcardstring = randcard;
49
+ //const randcardstring = JSON.stringify(randcard);
50
+ this.totalDataSize += randcardstring.length;
51
+ this.avgDataSize = Math.floor(this.totalDataSize / (i + 1));
52
+ const pn = ('' + count++).padStart(10, '0');
53
+ const id = resfakerprefix + pn;
54
+ const cpid = rescopyprefix + pn;
55
+ const datanow = new Date().toISOString();
56
+ //let datanow = new Date().toUTCString();
57
+ const fakerdata = {
58
+ //oid: i
59
+ resname: id,
60
+ resdesc: randcardstring,
61
+ vnum: 1,
62
+ validfrom: datanow,
63
+ validto: null,
64
+ dbaction: 1,
65
+ dbactionuser: userid
66
+ };
67
+ this.fakerdataarray.push(fakerdata);
68
+ const fakerdata2 = Object.assign({}, fakerdata);
69
+ fakerdata2.resname = cpid;
70
+ this.fakerdataarray2.push(fakerdata2);
71
+ this.#options.progress({ totalDataSize: this.totalDataSize, avgDataSize: this.avgDataSize });
72
+ if ((i + 1) % this.copybatchsize === 0) {
73
+ await accesslayer.bulkInsert(this.fakerdataarray);
74
+ await accesslayer.bulkInsert(this.fakerdataarray2);
75
+ this.fakerdataarray = [];
76
+ this.fakerdataarray2 = [];
77
+ }
78
+ }
79
+ if (this.fakerdataarray.length > 0) {
80
+ await accesslayer.bulkInsert(this.fakerdataarray);
81
+ await accesslayer.bulkInsert(this.fakerdataarray2);
82
+ }
83
+ return true;
84
+ };
85
+ }
86
+ //# sourceMappingURL=cliworker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliworker.js","sourceRoot":"","sources":["../src/cliworker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import prompts from 'prompts';
2
+ import 'colors';
3
+ import { PGPoolManager } from './pgpoolmanager';
4
+ import { PGAccessLayer } from './pgaccesslayer';
5
+ import { PGUtils } from './pgutils';
6
+ import { DataGenerator } from './datagenerator';
7
+ import Debug from "debug";
8
+ const debug = Debug(`proc:${process.pid}:DatabaseUtils`);
9
+ export class DatabaseUtils {
10
+ #accessLayer;
11
+ constructor(accessLayer) {
12
+ this.#accessLayer = accessLayer;
13
+ }
14
+ // options ::= { start: <int>, entries: <int>, minextradata: <int>, maxextradata: <int>,
15
+ // user: { name: <string>, password: <string>, email: <string> } }
16
+ CreateDatabase = async (options) => {
17
+ const fname = 'CreateDatabase';
18
+ const { iterations, workerScriptFolder } = options;
19
+ const builddbscript = `${options.databaseScriptFolder}/builddb.sql`;
20
+ debug(`Database Build Script: [${builddbscript}]`.yellow);
21
+ let localAccesslayer = null;
22
+ try {
23
+ try {
24
+ debug(`Dropping database.`.yellow);
25
+ await PGUtils.dropdatabase();
26
+ }
27
+ catch (error) {
28
+ console.error(`[${fname}]: Could not drop database: ${error}`);
29
+ // Do not re-throw. If there is no initial database, this will throw an error, ignore this.
30
+ }
31
+ // Create a new empty database
32
+ debug(`Creating new empty database.`.yellow);
33
+ await PGUtils.createdatabase();
34
+ localAccesslayer = new PGAccessLayer(new PGPoolManager());
35
+ // Build the database assets (tables, functions, etc.)
36
+ debug(`Building database assets (tables, functions, etc.).`.yellow);
37
+ await localAccesslayer.executedbscript(builddbscript);
38
+ //@@ make optional or move
39
+ if (typeof iterations !== 'undefined') {
40
+ // Add new faker entries
41
+ debug(`Adding test data.`.yellow);
42
+ const dg = new DataGenerator(localAccesslayer, workerScriptFolder);
43
+ await dg.RunAddFakerBulkInsert(options);
44
+ }
45
+ //@@ double logging
46
+ debug(`Database successfully initiailized.`.green);
47
+ console.log(`Database successfully initiailized.`.green);
48
+ }
49
+ catch (error) {
50
+ console.error(`[${fname}]: Could not create fresh database: ${error}`);
51
+ debug(`[${fname}]: Could not create fresh database: ${error}`);
52
+ }
53
+ finally {
54
+ if (localAccesslayer !== null) {
55
+ await localAccesslayer.enddatabase();
56
+ }
57
+ }
58
+ };
59
+ ResourceCount = async () => {
60
+ const retVal = await this.#accessLayer?.getResourceCount();
61
+ return retVal;
62
+ };
63
+ ExecuteDatabaseScript = async (scriptfile) => {
64
+ const retVal = await this.#accessLayer?.executedbscript(scriptfile);
65
+ return retVal;
66
+ };
67
+ ExecutedCustomScript = async () => {
68
+ const response = await prompts({
69
+ type: 'text',
70
+ name: 'script',
71
+ message: 'Script name to execute (stsrest01.sql)',
72
+ initial: './db-scripts/stsrest01.sql'
73
+ });
74
+ return this.ExecuteDatabaseScript(response.script);
75
+ };
76
+ }
77
+ //# sourceMappingURL=databaseutils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseutils.js","sourceRoot":"","sources":["../src/databaseutils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,255 @@
1
+ // https://medium.com/netscape/a-guide-to-create-a-nodejs-command-line-package-c2166ad0452e
2
+ // https://developer.okta.com/blog/2019/06/18/command-line-app-with-nodejs
3
+ import { $Options } from '@nsshunt/stsconfig';
4
+ const goptions = $Options();
5
+ import si from 'systeminformation'; // https://systeminformation.io/
6
+ import { v4 as uuidv4 } from 'uuid';
7
+ import path from 'path';
8
+ global.appRoot = path.resolve(__dirname);
9
+ import axios from 'axios';
10
+ import cliProgress from 'cli-progress';
11
+ import colors from 'colors';
12
+ import prompts from 'prompts';
13
+ import { Worker } from 'node:worker_threads';
14
+ import { Sleep } from '@nsshunt/stsutils';
15
+ const userid = 'dbinitrunner';
16
+ const resrandomuserprefix = 'RESRU-';
17
+ import Debug from "debug";
18
+ const debug = Debug(`proc:${process.pid}:DataGenerator`);
19
+ export class DataGenerator {
20
+ #accessLayer;
21
+ #useMultiBar = false;
22
+ #workerScriptFolder;
23
+ constructor(accessLayer, workerScriptFolder) {
24
+ this.#accessLayer = accessLayer;
25
+ this.#workerScriptFolder = workerScriptFolder;
26
+ }
27
+ //@@ JSON to come from config file if bound to a K6 script - so each K6 script should also have a prompts JSON for configuration - make generic
28
+ AskAddRandomUser = async () => {
29
+ const response = await prompts([
30
+ {
31
+ type: 'number',
32
+ name: 'iterations',
33
+ message: 'Number of iterations:',
34
+ initial: 10
35
+ },
36
+ {
37
+ type: 'number',
38
+ name: 'blocksize',
39
+ message: 'Block Size for randomuser microservice:',
40
+ initial: 500
41
+ },
42
+ {
43
+ type: 'number',
44
+ name: 'chunksize',
45
+ message: 'Number of simultaneous async calls to the randomname service:',
46
+ initial: 1
47
+ },
48
+ {
49
+ type: 'number',
50
+ name: 'sleepsize',
51
+ message: 'Duration to sleep (in ms) between chunked call blocks:',
52
+ initial: 1000
53
+ }
54
+ ]);
55
+ await this.RunAddRandomUser(response.iterations, response.blocksize, response.chunksize, response.sleepsize);
56
+ };
57
+ RunAddRandomUser = async (iterations, blocksize, chunksize, sleepsize) => {
58
+ // create new progress bar
59
+ const b1 = new cliProgress.SingleBar({
60
+ format: 'Random User |' + colors.cyan('{bar}') + '| {percentage}% || {value}/{total} Iterations || Size: {totalDataSize} || ETA: {eta_formatted}',
61
+ barCompleteChar: '\u2588',
62
+ barIncompleteChar: '\u2591',
63
+ hideCursor: true,
64
+ etaBuffer: 1000
65
+ });
66
+ // initialize the bar - defining payload token "speed" with the default value "N/A"
67
+ b1.start(iterations * blocksize, 0, {});
68
+ let totalDataSize = 0;
69
+ let promarray = [];
70
+ for (let i = 0; i < iterations; i++) {
71
+ const pp = async () => {
72
+ const retVal = await axios.get(`https://randomuser.me/api/?results=${blocksize}&nat=au,nz,us,gb`).catch(error => {
73
+ console.error(`Error in randomuser get: ${error}`);
74
+ if (error.response) {
75
+ // Request made and server responded
76
+ console.error("DATA:" + error.response.data);
77
+ console.error("STATUS: " + error.response.status);
78
+ console.error("HEADERS: " + error.response.headers);
79
+ }
80
+ else if (error.request) {
81
+ // The request was made but no response was received
82
+ console.error("REQUEST: " + error.request);
83
+ }
84
+ else {
85
+ // Something happened in setting up the request that triggered an Error
86
+ console.error('ERROR', error.message);
87
+ }
88
+ return null;
89
+ });
90
+ if (retVal === null) {
91
+ console.error('Skipping this test as we cannot control the randomuser service.');
92
+ return;
93
+ }
94
+ const randomusers = retVal.data.results;
95
+ const allPromises = randomusers.map(async (data) => {
96
+ totalDataSize += JSON.stringify(data).length;
97
+ const id = resrandomuserprefix + uuidv4();
98
+ await this.#accessLayer.createResource(userid, id, data);
99
+ b1.increment({ totalDataSize: totalDataSize });
100
+ });
101
+ await Promise.all(allPromises);
102
+ };
103
+ promarray.push(pp());
104
+ if ((i + 1) % chunksize === 0) {
105
+ await Promise.all(promarray);
106
+ promarray = [];
107
+ await Sleep(sleepsize);
108
+ }
109
+ //b1.increment({ totalDataSize: totalDataSize });
110
+ }
111
+ if (promarray.length > 0) {
112
+ await Promise.all(promarray);
113
+ }
114
+ b1.stop();
115
+ };
116
+ AskAddFaker = async (options) => {
117
+ const response = await prompts([
118
+ {
119
+ type: 'number',
120
+ name: 'start',
121
+ message: 'Start number for iterations (use -1 to append to current sequence):',
122
+ initial: -1
123
+ },
124
+ {
125
+ type: 'number',
126
+ name: 'iterations',
127
+ message: 'Number of iterations:',
128
+ initial: 10000
129
+ },
130
+ {
131
+ type: 'number',
132
+ name: 'datamin',
133
+ message: 'Minimum Extra Data Size:',
134
+ initial: 0
135
+ },
136
+ {
137
+ type: 'number',
138
+ name: 'datamax',
139
+ message: 'Maximum Extra Data Size:',
140
+ initial: 1024
141
+ }
142
+ ]);
143
+ const dbOptions = {
144
+ start: response.start,
145
+ iterations: response.iterations,
146
+ minextradata: response.datamin,
147
+ maxextradata: response.datamax,
148
+ workerScriptFolder: './node_modules/@nsshunt/stsdatamanagement/dist',
149
+ databaseScriptFolder: options.databaseScriptFolder,
150
+ useMultiBar: true
151
+ };
152
+ await this.RunAddFakerBulkInsert(dbOptions);
153
+ };
154
+ RunAddFakerBulkInsert = async (options) => {
155
+ this.#useMultiBar = options.useMultiBar;
156
+ let multibar = null;
157
+ if (this.#useMultiBar === true) {
158
+ multibar = new cliProgress.MultiBar({
159
+ format: 'Faker |' + colors.cyan('{bar}') + '| {percentage}% || {value}/{total} Iterations || Avg Size: {avgDataSize} || Size: {totalDataSize} || Duration: {duration_formatted} || ETA: {eta_formatted}',
160
+ clearOnComplete: false,
161
+ hideCursor: true
162
+ }, cliProgress.Presets.shades_grey);
163
+ }
164
+ const pa = [];
165
+ const valueObject = {
166
+ system: '*',
167
+ osInfo: '*',
168
+ cpu: '*',
169
+ mem: '*'
170
+ };
171
+ const sysinfo = await si.get(valueObject);
172
+ const useCPUs = goptions.useCPUs;
173
+ let numCPUs = 0;
174
+ if (useCPUs > 0) {
175
+ if (useCPUs >= 1) {
176
+ numCPUs = useCPUs;
177
+ }
178
+ else {
179
+ numCPUs = Math.round(sysinfo.cpu.cores * useCPUs);
180
+ }
181
+ }
182
+ else {
183
+ numCPUs = sysinfo.cpu.physicalCores;
184
+ }
185
+ //let numCPUs = require('os').cpus().length;
186
+ const blocksize = Math.floor(options.iterations / numCPUs);
187
+ const lastBlockSize = blocksize + (options.iterations % numCPUs);
188
+ let count = 0;
189
+ if (options.start === -1) {
190
+ const countresult = await this.#accessLayer.getResourceCount(`r.resname like 'RESFK-%'`);
191
+ count = Number(countresult.detail.count);
192
+ }
193
+ else {
194
+ count = options.start;
195
+ }
196
+ const bars = [];
197
+ for (let i = 0; i < numCPUs; i++) {
198
+ const iterations = (i === numCPUs - 1 ? lastBlockSize : blocksize);
199
+ let bar = null;
200
+ if (multibar !== null) {
201
+ bar = multibar.create(iterations, 0);
202
+ }
203
+ if (typeof bar === 'undefined') {
204
+ debug(`No TTY available for multi-bar progress.`.yellow);
205
+ bar = null;
206
+ }
207
+ bars.push(bar);
208
+ pa.push(this.StartWorkerThread(count + (i * blocksize), iterations, options.minextradata, options.maxextradata, bars[i]));
209
+ }
210
+ await Promise.all(pa);
211
+ if (this.#useMultiBar === true) {
212
+ multibar?.stop();
213
+ }
214
+ };
215
+ StartWorkerThread = (start, iterations, datamin, datamax, bar) => {
216
+ return new Promise((resolve, reject) => {
217
+ const envCopy = { ...process.env };
218
+ let totalIterations = 0;
219
+ const worker = new Worker(`${this.#workerScriptFolder}/cliworker.js`, {
220
+ workerData: { start: start, iterations: iterations, datamin: datamin, datamax: datamax },
221
+ env: envCopy
222
+ //type: 'module'
223
+ });
224
+ worker.on('message', (data) => {
225
+ if (data.command === 'done') {
226
+ if (!bar) {
227
+ console.log(`Iterations completed.`);
228
+ }
229
+ worker.terminate();
230
+ resolve(data.data);
231
+ }
232
+ else {
233
+ if (bar !== null) {
234
+ bar.increment({ totalDataSize: data.data.totalDataSize, avgDataSize: data.data.avgDataSize });
235
+ }
236
+ else {
237
+ totalIterations++;
238
+ if (totalIterations % 1000 === 0) {
239
+ console.log(`Iteration: [${totalIterations}] completed.`);
240
+ }
241
+ }
242
+ }
243
+ });
244
+ worker.on('error', (error) => {
245
+ reject(error);
246
+ });
247
+ worker.on('exit', (code) => {
248
+ if (code !== 0) {
249
+ reject(new Error(`Worker stopped with exit code ${code}`));
250
+ }
251
+ });
252
+ });
253
+ };
254
+ }
255
+ //# sourceMappingURL=datagenerator-old.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datagenerator-old.js","sourceRoot":"","sources":["../src/datagenerator-old.ts"],"names":[],"mappings":"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"}