@salesforce/plugin-data 3.6.9 → 3.7.0
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 +130 -18
- package/lib/bulkDataRequestCache.js +81 -5
- package/lib/bulkDataRequestCache.js.map +1 -1
- package/lib/bulkUtils.js +94 -0
- package/lib/bulkUtils.js.map +1 -1
- package/lib/commands/data/export/bulk.js +215 -0
- package/lib/commands/data/export/bulk.js.map +1 -0
- package/lib/commands/data/export/resume.js +79 -0
- package/lib/commands/data/export/resume.js.map +1 -0
- package/lib/types.js.map +1 -1
- package/messages/data.export.bulk.md +67 -0
- package/messages/data.export.resume.md +25 -0
- package/messages/messages.md +5 -1
- package/oclif.manifest.json +500 -241
- package/package.json +11 -8
package/README.md
CHANGED
|
@@ -81,6 +81,8 @@ sf plugins
|
|
|
81
81
|
- [`sf data delete bulk`](#sf-data-delete-bulk)
|
|
82
82
|
- [`sf data delete record`](#sf-data-delete-record)
|
|
83
83
|
- [`sf data delete resume`](#sf-data-delete-resume)
|
|
84
|
+
- [`sf data export bulk`](#sf-data-export-bulk)
|
|
85
|
+
- [`sf data export resume`](#sf-data-export-resume)
|
|
84
86
|
- [`sf data export tree`](#sf-data-export-tree)
|
|
85
87
|
- [`sf data get record`](#sf-data-get-record)
|
|
86
88
|
- [`sf data import tree`](#sf-data-import-tree)
|
|
@@ -142,7 +144,7 @@ EXAMPLES
|
|
|
142
144
|
$ sf data create file --file path/to/astro.png --parent-id a03fakeLoJWPIA3
|
|
143
145
|
```
|
|
144
146
|
|
|
145
|
-
_See code: [src/commands/data/create/file.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
147
|
+
_See code: [src/commands/data/create/file.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/create/file.ts)_
|
|
146
148
|
|
|
147
149
|
## `sf data create record`
|
|
148
150
|
|
|
@@ -198,7 +200,7 @@ EXAMPLES
|
|
|
198
200
|
TracedEntityId=01p17000000R6bLAAS"
|
|
199
201
|
```
|
|
200
202
|
|
|
201
|
-
_See code: [src/commands/data/create/record.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
203
|
+
_See code: [src/commands/data/create/record.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/create/record.ts)_
|
|
202
204
|
|
|
203
205
|
## `sf data delete bulk`
|
|
204
206
|
|
|
@@ -256,7 +258,7 @@ FLAG DESCRIPTIONS
|
|
|
256
258
|
and can be enabled only by a system administrator.
|
|
257
259
|
```
|
|
258
260
|
|
|
259
|
-
_See code: [src/commands/data/delete/bulk.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
261
|
+
_See code: [src/commands/data/delete/bulk.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/delete/bulk.ts)_
|
|
260
262
|
|
|
261
263
|
## `sf data delete record`
|
|
262
264
|
|
|
@@ -317,7 +319,7 @@ EXAMPLES
|
|
|
317
319
|
$ sf data delete record --use-tooling-api --sobject TraceFlag --record-id 7tf8c
|
|
318
320
|
```
|
|
319
321
|
|
|
320
|
-
_See code: [src/commands/data/delete/record.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
322
|
+
_See code: [src/commands/data/delete/record.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/delete/record.ts)_
|
|
321
323
|
|
|
322
324
|
## `sf data delete resume`
|
|
323
325
|
|
|
@@ -356,7 +358,117 @@ EXAMPLES
|
|
|
356
358
|
$ sf data delete resume --use-most-recent --target-org my-scratch
|
|
357
359
|
```
|
|
358
360
|
|
|
359
|
-
_See code: [src/commands/data/delete/resume.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
361
|
+
_See code: [src/commands/data/delete/resume.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/delete/resume.ts)_
|
|
362
|
+
|
|
363
|
+
## `sf data export bulk`
|
|
364
|
+
|
|
365
|
+
Bulk export records from an org into a file using a SOQL query. Uses Bulk API 2.0.
|
|
366
|
+
|
|
367
|
+
```
|
|
368
|
+
USAGE
|
|
369
|
+
$ sf data export bulk -o <value> --output-file <value> -r csv|json [--json] [--flags-dir <value>] [--api-version
|
|
370
|
+
<value>] [-w <minutes> | --async] [-q <value> | --query-file <value>] [--all-rows] [--column-delimiter
|
|
371
|
+
BACKQUOTE|CARET|COMMA|PIPE|SEMICOLON|TAB] [--line-ending LF|CRLF]
|
|
372
|
+
|
|
373
|
+
FLAGS
|
|
374
|
+
-o, --target-org=<value> (required) Username or alias of the target org. Not required if the `target-org`
|
|
375
|
+
configuration variable is already set.
|
|
376
|
+
-q, --query=<value> SOQL query to execute.
|
|
377
|
+
-r, --result-format=<option> (required) [default: csv] Format to write the results.
|
|
378
|
+
<options: csv|json>
|
|
379
|
+
-w, --wait=<minutes> Time to wait for the command to finish, in minutes.
|
|
380
|
+
--all-rows Include records that have been soft-deleted due to a merge or delete. By default,
|
|
381
|
+
deleted records are not returned.
|
|
382
|
+
--api-version=<value> Override the api version used for api requests made by this command
|
|
383
|
+
--async Don't wait for the job to complete.
|
|
384
|
+
--column-delimiter=<option> Column delimiter to be used when writing CSV output. Default is COMMA.
|
|
385
|
+
<options: BACKQUOTE|CARET|COMMA|PIPE|SEMICOLON|TAB>
|
|
386
|
+
--line-ending=<option> Line ending to be used when writing CSV output. Default value on Windows is is
|
|
387
|
+
`CRLF`; on macOS and Linux it's `LR`.
|
|
388
|
+
<options: LF|CRLF>
|
|
389
|
+
--output-file=<value> (required) File where records are written.
|
|
390
|
+
--query-file=<value> File that contains the SOQL query.
|
|
391
|
+
|
|
392
|
+
GLOBAL FLAGS
|
|
393
|
+
--flags-dir=<value> Import flag values from a directory.
|
|
394
|
+
--json Format output as json.
|
|
395
|
+
|
|
396
|
+
DESCRIPTION
|
|
397
|
+
Bulk export records from an org into a file using a SOQL query. Uses Bulk API 2.0.
|
|
398
|
+
|
|
399
|
+
You can use this command to export millions of records from an org, either to migrate data or to back it up.
|
|
400
|
+
|
|
401
|
+
Use a SOQL query to specify the fields of a standard or custom object that you want to export. Specify the SOQL query
|
|
402
|
+
either at the command line with the --query flag or read it from a file with the --query-file flag; you can't specify
|
|
403
|
+
both flags. The --output-file flag is required, which means you can only write the records to a file, in either CSV or
|
|
404
|
+
JSON format.
|
|
405
|
+
|
|
406
|
+
Bulk exports can take a while, depending on how many records are returned by the SOQL query. If the command times out,
|
|
407
|
+
or you specified the --async flag, the command displays the job ID. To see the status and get the results of the job,
|
|
408
|
+
run "sf data export resume" and pass the job ID to the --job-id flag.
|
|
409
|
+
|
|
410
|
+
IMPORTANT: This command uses Bulk API 2.0, which limits the type of SOQL queries you can run. For example, you can't
|
|
411
|
+
use aggregate functions such as count(). For the complete list of limitations, see the "SOQL Considerations" section
|
|
412
|
+
in the "Bulk API 2.0 and Bulk API Developer Guide"
|
|
413
|
+
(https://developer.salesforce.com/docs/atlas.en-us.api_asynch.meta/api_asynch/queries.htm).
|
|
414
|
+
|
|
415
|
+
EXAMPLES
|
|
416
|
+
Export the Id, Name, and Account.Name fields of the Contact object into a CSV-formatted file; if the export doesn't
|
|
417
|
+
complete in 10 minutes, the command ends and displays a job ID. Use the org with alias "my-scratch":
|
|
418
|
+
|
|
419
|
+
$ sf data export bulk --query "SELECT Id, Name, Account.Name FROM Contact" --output-file export-accounts.csv \
|
|
420
|
+
--wait 10 --target-org my-scratch
|
|
421
|
+
|
|
422
|
+
Similar to previous example, but use the default org, export the records into a JSON-formatted file, and include
|
|
423
|
+
records that have been soft deleted:
|
|
424
|
+
|
|
425
|
+
$ sf data export bulk --query "SELECT Id, Name, Account.Name FROM Contact" --output-file export-accounts.json \
|
|
426
|
+
--result-format json --wait 10 --all-rows
|
|
427
|
+
|
|
428
|
+
Export asynchronously; the command immediately returns a job ID that you then pass to the "sf data export resume"
|
|
429
|
+
command:
|
|
430
|
+
|
|
431
|
+
$ sf data export bulk --query "SELECT Id, Name, Account.Name FROM Contact" --output-file export-accounts.json \
|
|
432
|
+
--result-format json --async
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
_See code: [src/commands/data/export/bulk.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/export/bulk.ts)_
|
|
436
|
+
|
|
437
|
+
## `sf data export resume`
|
|
438
|
+
|
|
439
|
+
Resume a bulk export job that you previously started.
|
|
440
|
+
|
|
441
|
+
```
|
|
442
|
+
USAGE
|
|
443
|
+
$ sf data export resume [--json] [--flags-dir <value>] [-i <value>] [--use-most-recent] [--api-version <value>]
|
|
444
|
+
|
|
445
|
+
FLAGS
|
|
446
|
+
-i, --job-id=<value> Job ID of the bulk export.
|
|
447
|
+
--api-version=<value> Override the api version used for api requests made by this command
|
|
448
|
+
--use-most-recent Use the job ID of the bulk export job that was most recently run.
|
|
449
|
+
|
|
450
|
+
GLOBAL FLAGS
|
|
451
|
+
--flags-dir=<value> Import flag values from a directory.
|
|
452
|
+
--json Format output as json.
|
|
453
|
+
|
|
454
|
+
DESCRIPTION
|
|
455
|
+
Resume a bulk export job that you previously started.
|
|
456
|
+
|
|
457
|
+
When the original "data export bulk" command either times out or is run with the --async flag, it displays a job ID.
|
|
458
|
+
To see the status and get the results of the bulk export, run this command by either passing it the job ID or using
|
|
459
|
+
the --use-most-recent flag to specify the most recent bulk export job.
|
|
460
|
+
|
|
461
|
+
EXAMPLES
|
|
462
|
+
Resume a bulk export job run on your default org by specifying a job ID:
|
|
463
|
+
|
|
464
|
+
$ sf data export resume --job-id 750xx000000005sAAA
|
|
465
|
+
|
|
466
|
+
Resume the most recently-run bulk export job for an org with alias my-scratch:
|
|
467
|
+
|
|
468
|
+
$ sf data export resume --use-most-recent --target-org my-scratch
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
_See code: [src/commands/data/export/resume.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/export/resume.ts)_
|
|
360
472
|
|
|
361
473
|
## `sf data export tree`
|
|
362
474
|
|
|
@@ -417,7 +529,7 @@ EXAMPLES
|
|
|
417
529
|
my-scratch
|
|
418
530
|
```
|
|
419
531
|
|
|
420
|
-
_See code: [src/commands/data/export/tree.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
532
|
+
_See code: [src/commands/data/export/tree.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/export/tree.ts)_
|
|
421
533
|
|
|
422
534
|
## `sf data get record`
|
|
423
535
|
|
|
@@ -481,7 +593,7 @@ EXAMPLES
|
|
|
481
593
|
$ sf data get record --use-tooling-api --sobject TraceFlag --record-id 7tf8c
|
|
482
594
|
```
|
|
483
595
|
|
|
484
|
-
_See code: [src/commands/data/get/record.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
596
|
+
_See code: [src/commands/data/get/record.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/get/record.ts)_
|
|
485
597
|
|
|
486
598
|
## `sf data import tree`
|
|
487
599
|
|
|
@@ -546,7 +658,7 @@ FLAG DESCRIPTIONS
|
|
|
546
658
|
- files(array) - Files: An array of files paths to load
|
|
547
659
|
```
|
|
548
660
|
|
|
549
|
-
_See code: [src/commands/data/import/tree.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
661
|
+
_See code: [src/commands/data/import/tree.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/import/tree.ts)_
|
|
550
662
|
|
|
551
663
|
## `sf data query`
|
|
552
664
|
|
|
@@ -610,7 +722,7 @@ EXAMPLES
|
|
|
610
722
|
$ sf data query --query "SELECT Id FROM Contact" --bulk --wait 0
|
|
611
723
|
```
|
|
612
724
|
|
|
613
|
-
_See code: [src/commands/data/query.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
725
|
+
_See code: [src/commands/data/query.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/query.ts)_
|
|
614
726
|
|
|
615
727
|
## `sf data query resume`
|
|
616
728
|
|
|
@@ -648,7 +760,7 @@ EXAMPLES
|
|
|
648
760
|
$ sf data query resume --bulk-query-id 7500x000005BdFzXXX
|
|
649
761
|
```
|
|
650
762
|
|
|
651
|
-
_See code: [src/commands/data/query/resume.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
763
|
+
_See code: [src/commands/data/query/resume.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/query/resume.ts)_
|
|
652
764
|
|
|
653
765
|
## `sf data resume`
|
|
654
766
|
|
|
@@ -685,7 +797,7 @@ EXAMPLES
|
|
|
685
797
|
$ sf data resume --job-id 750xx000000005sAAA --batch-id 751xx000000005nAAA
|
|
686
798
|
```
|
|
687
799
|
|
|
688
|
-
_See code: [src/commands/data/resume.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
800
|
+
_See code: [src/commands/data/resume.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/resume.ts)_
|
|
689
801
|
|
|
690
802
|
## `sf data search`
|
|
691
803
|
|
|
@@ -735,7 +847,7 @@ EXAMPLES
|
|
|
735
847
|
$ sf data search --file query.txt --target-org my-scratch --result-format csv
|
|
736
848
|
```
|
|
737
849
|
|
|
738
|
-
_See code: [src/commands/data/search.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
850
|
+
_See code: [src/commands/data/search.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/search.ts)_
|
|
739
851
|
|
|
740
852
|
## `sf data update record`
|
|
741
853
|
|
|
@@ -797,7 +909,7 @@ EXAMPLES
|
|
|
797
909
|
"ExpirationDate=2017-12-01T00:58:04.000+0000"
|
|
798
910
|
```
|
|
799
911
|
|
|
800
|
-
_See code: [src/commands/data/update/record.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
912
|
+
_See code: [src/commands/data/update/record.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/update/record.ts)_
|
|
801
913
|
|
|
802
914
|
## `sf data upsert bulk`
|
|
803
915
|
|
|
@@ -850,7 +962,7 @@ EXAMPLES
|
|
|
850
962
|
my-scratch
|
|
851
963
|
```
|
|
852
964
|
|
|
853
|
-
_See code: [src/commands/data/upsert/bulk.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
965
|
+
_See code: [src/commands/data/upsert/bulk.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/upsert/bulk.ts)_
|
|
854
966
|
|
|
855
967
|
## `sf data upsert resume`
|
|
856
968
|
|
|
@@ -889,7 +1001,7 @@ EXAMPLES
|
|
|
889
1001
|
$ sf data upsert resume --use-most-recent --target-org my-scratch
|
|
890
1002
|
```
|
|
891
1003
|
|
|
892
|
-
_See code: [src/commands/data/upsert/resume.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
1004
|
+
_See code: [src/commands/data/upsert/resume.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/data/upsert/resume.ts)_
|
|
893
1005
|
|
|
894
1006
|
## `sf force data bulk delete`
|
|
895
1007
|
|
|
@@ -936,7 +1048,7 @@ EXAMPLES
|
|
|
936
1048
|
$ sf force data bulk delete --sobject MyObject__c --file files/delete.csv --wait 5 --target-org my-scratch
|
|
937
1049
|
```
|
|
938
1050
|
|
|
939
|
-
_See code: [src/commands/force/data/bulk/delete.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
1051
|
+
_See code: [src/commands/force/data/bulk/delete.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/force/data/bulk/delete.ts)_
|
|
940
1052
|
|
|
941
1053
|
## `sf force data bulk status`
|
|
942
1054
|
|
|
@@ -973,7 +1085,7 @@ EXAMPLES
|
|
|
973
1085
|
$ sf force data bulk status --job-id 750xx000000005sAAA --batch-id 751xx000000005nAAA --target-org my-scratch
|
|
974
1086
|
```
|
|
975
1087
|
|
|
976
|
-
_See code: [src/commands/force/data/bulk/status.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
1088
|
+
_See code: [src/commands/force/data/bulk/status.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/force/data/bulk/status.ts)_
|
|
977
1089
|
|
|
978
1090
|
## `sf force data bulk upsert`
|
|
979
1091
|
|
|
@@ -1031,6 +1143,6 @@ EXAMPLES
|
|
|
1031
1143
|
--target-org my-scratch
|
|
1032
1144
|
```
|
|
1033
1145
|
|
|
1034
|
-
_See code: [src/commands/force/data/bulk/upsert.ts](https://github.com/salesforcecli/plugin-data/blob/3.
|
|
1146
|
+
_See code: [src/commands/force/data/bulk/upsert.ts](https://github.com/salesforcecli/plugin-data/blob/3.7.0/src/commands/force/data/bulk/upsert.ts)_
|
|
1035
1147
|
|
|
1036
1148
|
<!-- commandsstop -->
|
|
@@ -40,7 +40,7 @@ export class BulkDataRequestCache extends TTLConfig {
|
|
|
40
40
|
if (!useMostRecent && !bulkJobId) {
|
|
41
41
|
throw messages.createError('bulkRequestIdRequiredWhenNotUsingMostRecent');
|
|
42
42
|
}
|
|
43
|
-
const
|
|
43
|
+
const resumeOptions = {
|
|
44
44
|
operation: 'query',
|
|
45
45
|
query: '',
|
|
46
46
|
pollingOptions: { pollTimeout: 0, pollInterval: 0 },
|
|
@@ -53,7 +53,7 @@ export class BulkDataRequestCache extends TTLConfig {
|
|
|
53
53
|
return {
|
|
54
54
|
jobInfo: { id: entry.jobId },
|
|
55
55
|
options: {
|
|
56
|
-
...
|
|
56
|
+
...resumeOptions,
|
|
57
57
|
connection: (await Org.create({ aliasOrUsername: entry.username })).getConnection(apiVersion),
|
|
58
58
|
},
|
|
59
59
|
};
|
|
@@ -65,7 +65,7 @@ export class BulkDataRequestCache extends TTLConfig {
|
|
|
65
65
|
return {
|
|
66
66
|
jobInfo: { id: entry.jobId },
|
|
67
67
|
options: {
|
|
68
|
-
...
|
|
68
|
+
...resumeOptions,
|
|
69
69
|
connection: (await Org.create({ aliasOrUsername: entry.username })).getConnection(apiVersion),
|
|
70
70
|
},
|
|
71
71
|
};
|
|
@@ -74,7 +74,7 @@ export class BulkDataRequestCache extends TTLConfig {
|
|
|
74
74
|
return {
|
|
75
75
|
jobInfo: { id: bulkJobId },
|
|
76
76
|
options: {
|
|
77
|
-
...
|
|
77
|
+
...resumeOptions,
|
|
78
78
|
connection: org.getConnection(apiVersion),
|
|
79
79
|
},
|
|
80
80
|
};
|
|
@@ -84,7 +84,7 @@ export class BulkDataRequestCache extends TTLConfig {
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
else if (useMostRecent) {
|
|
87
|
-
throw messages.createError('
|
|
87
|
+
throw messages.createError('error.missingCacheEntryError');
|
|
88
88
|
}
|
|
89
89
|
else {
|
|
90
90
|
throw messages.createError('bulkRequestIdRequiredWhenNotUsingMostRecent');
|
|
@@ -148,4 +148,80 @@ export class BulkUpsertRequestCache extends BulkDataRequestCache {
|
|
|
148
148
|
await cache.write();
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
|
+
export class BulkExportRequestCache extends TTLConfig {
|
|
152
|
+
static getDefaultOptions() {
|
|
153
|
+
return {
|
|
154
|
+
isGlobal: true,
|
|
155
|
+
isState: true,
|
|
156
|
+
filename: BulkExportRequestCache.getFileName(),
|
|
157
|
+
stateFolder: Global.SF_STATE_FOLDER,
|
|
158
|
+
ttl: Duration.days(7),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
static getFileName() {
|
|
162
|
+
return 'bulk-data-export-cache.json';
|
|
163
|
+
}
|
|
164
|
+
static async unset(key) {
|
|
165
|
+
const cache = await BulkUpsertRequestCache.create();
|
|
166
|
+
cache.unset(key);
|
|
167
|
+
await cache.write();
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Creates a new bulk export request cache entry for the given id.
|
|
171
|
+
*/
|
|
172
|
+
async createCacheEntryForRequest(bulkRequestId, outputInfo, username, apiVersion) {
|
|
173
|
+
if (!username) {
|
|
174
|
+
throw messages.createError('usernameRequired');
|
|
175
|
+
}
|
|
176
|
+
this.set(bulkRequestId, {
|
|
177
|
+
jobId: bulkRequestId,
|
|
178
|
+
outputInfo,
|
|
179
|
+
username,
|
|
180
|
+
apiVersion,
|
|
181
|
+
});
|
|
182
|
+
await this.write();
|
|
183
|
+
Logger.childFromRoot('BulkExportCache').debug(`bulk cache saved for ${bulkRequestId}`);
|
|
184
|
+
}
|
|
185
|
+
async resolveResumeOptionsFromCache(jobIdOrMostRecent, apiVersion) {
|
|
186
|
+
const resumeOptionsOptions = {
|
|
187
|
+
operation: 'query',
|
|
188
|
+
query: '',
|
|
189
|
+
pollingOptions: { pollTimeout: 0, pollInterval: 0 },
|
|
190
|
+
};
|
|
191
|
+
if (typeof jobIdOrMostRecent === 'boolean') {
|
|
192
|
+
const key = this.getLatestKey();
|
|
193
|
+
if (!key) {
|
|
194
|
+
throw messages.createError('error.missingCacheEntryError');
|
|
195
|
+
}
|
|
196
|
+
// key definitely exists because it came from the cache
|
|
197
|
+
const entry = this.get(key);
|
|
198
|
+
return {
|
|
199
|
+
jobInfo: { id: entry.jobId },
|
|
200
|
+
outputInfo: {
|
|
201
|
+
filePath: entry.outputInfo.filePath,
|
|
202
|
+
format: entry.outputInfo.format,
|
|
203
|
+
columnDelimiter: entry.outputInfo.columnDelimiter,
|
|
204
|
+
},
|
|
205
|
+
options: {
|
|
206
|
+
...resumeOptionsOptions,
|
|
207
|
+
connection: (await Org.create({ aliasOrUsername: entry.username })).getConnection(apiVersion),
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
const entry = this.get(jobIdOrMostRecent);
|
|
213
|
+
if (!entry) {
|
|
214
|
+
throw messages.createError('error.bulkRequestIdNotFound', [jobIdOrMostRecent]);
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
jobInfo: { id: entry.jobId },
|
|
218
|
+
outputInfo: entry.outputInfo,
|
|
219
|
+
options: {
|
|
220
|
+
...resumeOptionsOptions,
|
|
221
|
+
connection: (await Org.create({ aliasOrUsername: entry.username })).getConnection(apiVersion),
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
151
227
|
//# sourceMappingURL=bulkDataRequestCache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulkDataRequestCache.js","sourceRoot":"","sources":["../src/bulkDataRequestCache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"bulkDataRequestCache.js","sourceRoot":"","sources":["../src/bulkDataRequestCache.ts"],"names":[],"mappings":"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"}
|
package/lib/bulkUtils.js
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* Licensed under the BSD 3-Clause license.
|
|
5
5
|
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
6
6
|
*/
|
|
7
|
+
import { Transform, Readable } from 'node:stream';
|
|
8
|
+
import { pipeline } from 'node:stream/promises';
|
|
9
|
+
import * as fs from 'node:fs';
|
|
10
|
+
import { EOL } from 'node:os';
|
|
11
|
+
import { HttpApi } from '@jsforce/jsforce-node/lib/http-api.js';
|
|
12
|
+
import { Parser as csvParse } from 'csv-parse';
|
|
7
13
|
import { Messages } from '@salesforce/core';
|
|
8
14
|
import { Duration } from '@salesforce/kit';
|
|
9
15
|
import { capitalCase } from 'change-case';
|
|
@@ -107,4 +113,92 @@ export const validateSobjectType = async (sobjectType, connection) => {
|
|
|
107
113
|
};
|
|
108
114
|
/** calculate ms between the "now" time and the endWaitTime */
|
|
109
115
|
export const remainingTime = (now) => (endWaitTime) => Math.max((endWaitTime ?? now) - now, 0);
|
|
116
|
+
export var ColumnDelimiter;
|
|
117
|
+
(function (ColumnDelimiter) {
|
|
118
|
+
ColumnDelimiter["BACKQUOTE"] = "`";
|
|
119
|
+
ColumnDelimiter["CARET"] = "^";
|
|
120
|
+
ColumnDelimiter["COMMA"] = ",";
|
|
121
|
+
ColumnDelimiter["PIPE"] = "|";
|
|
122
|
+
ColumnDelimiter["SEMICOLON"] = ";";
|
|
123
|
+
ColumnDelimiter["TAB"] = "\t";
|
|
124
|
+
})(ColumnDelimiter || (ColumnDelimiter = {}));
|
|
125
|
+
async function bulkRequest(conn, url) {
|
|
126
|
+
const httpApi = new HttpApi(conn, {
|
|
127
|
+
responseType: 'text/plain', // this ensures jsforce doesn't try parsing the body
|
|
128
|
+
});
|
|
129
|
+
let headers;
|
|
130
|
+
httpApi.on('response', (response) => {
|
|
131
|
+
headers = response.headers;
|
|
132
|
+
});
|
|
133
|
+
const body = await httpApi.request({
|
|
134
|
+
url: conn.normalizeUrl(url),
|
|
135
|
+
method: 'GET',
|
|
136
|
+
});
|
|
137
|
+
if (!headers)
|
|
138
|
+
throw new Error('failed to get HTTP headers for bulk query');
|
|
139
|
+
return {
|
|
140
|
+
body,
|
|
141
|
+
headers,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
export async function exportRecords(conn, queryJob, outputInfo) {
|
|
145
|
+
let jobInfo;
|
|
146
|
+
queryJob.on('jobComplete', (completedJob) => {
|
|
147
|
+
jobInfo = completedJob;
|
|
148
|
+
});
|
|
149
|
+
await queryJob.poll();
|
|
150
|
+
if (jobInfo === undefined) {
|
|
151
|
+
throw new Error('could not get job info after polling');
|
|
152
|
+
}
|
|
153
|
+
let locator;
|
|
154
|
+
let recordsWritten = 0;
|
|
155
|
+
while (locator !== 'null') {
|
|
156
|
+
// we can't parallelize this because we:
|
|
157
|
+
// 1. need to get 1 batch to know the locator for the next one
|
|
158
|
+
// 2. merge all batches into one csv or json file
|
|
159
|
+
//
|
|
160
|
+
// eslint-disable-next-line no-await-in-loop
|
|
161
|
+
const res = await bulkRequest(conn, locator ? `/jobs/query/${jobInfo.id}/results?locator=${locator}` : `/jobs/query/${jobInfo.id}/results`);
|
|
162
|
+
if (outputInfo.format === 'json') {
|
|
163
|
+
const jsonWritable = fs.createWriteStream(outputInfo.filePath, {
|
|
164
|
+
// Open file for reading and appending. The file is created if it does not exist but fails if the path exists.
|
|
165
|
+
// https://nodejs.org/api/fs.html#file-system-flags
|
|
166
|
+
flags: 'ax+',
|
|
167
|
+
});
|
|
168
|
+
const totalRecords = jobInfo.numberRecordsProcessed;
|
|
169
|
+
if (!locator) {
|
|
170
|
+
// first write, start JSON array
|
|
171
|
+
jsonWritable.write(`[${EOL}`);
|
|
172
|
+
}
|
|
173
|
+
// eslint-disable-next-line no-await-in-loop
|
|
174
|
+
await pipeline(Readable.from(res.body), new csvParse({ columns: true, delimiter: ColumnDelimiter[outputInfo.columnDelimiter] }), new Transform({
|
|
175
|
+
objectMode: true,
|
|
176
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
177
|
+
transform(chunk, _encoding, callback) {
|
|
178
|
+
if (recordsWritten === totalRecords - 1) {
|
|
179
|
+
callback(null, ` ${JSON.stringify(chunk)}${EOL}]`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
recordsWritten++;
|
|
183
|
+
callback(null, ` ${JSON.stringify(chunk)},${EOL}`);
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
}), jsonWritable);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// csv
|
|
190
|
+
// eslint-disable-next-line no-await-in-loop
|
|
191
|
+
await pipeline(locator
|
|
192
|
+
? [
|
|
193
|
+
Readable.from(res.body.slice(res.body.indexOf(EOL) + 1)),
|
|
194
|
+
fs.createWriteStream(outputInfo.filePath, {
|
|
195
|
+
flags: 'a', // append mode
|
|
196
|
+
}),
|
|
197
|
+
]
|
|
198
|
+
: [Readable.from(res.body), fs.createWriteStream(outputInfo.filePath)]);
|
|
199
|
+
}
|
|
200
|
+
locator = res.headers['sforce-locator'];
|
|
201
|
+
}
|
|
202
|
+
return jobInfo;
|
|
203
|
+
}
|
|
110
204
|
//# sourceMappingURL=bulkUtils.js.map
|
package/lib/bulkUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulkUtils.js","sourceRoot":"","sources":["../src/bulkUtils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"bulkUtils.js","sourceRoot":"","sources":["../src/bulkUtils.ts"],"names":[],"mappings":"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"}
|