diff --git a/src/main/java/com/salesforce/dataloader/action/AbstractLoadAction.java b/src/main/java/com/salesforce/dataloader/action/AbstractLoadAction.java index 54524336..3fed6ad5 100644 --- a/src/main/java/com/salesforce/dataloader/action/AbstractLoadAction.java +++ b/src/main/java/com/salesforce/dataloader/action/AbstractLoadAction.java @@ -79,7 +79,7 @@ protected void checkDao(DataAccessObject dao) throws DataAccessObjectInitializat protected boolean visit() throws DataAccessObjectException, ParameterLoadException, OperationException, ConnectionException { - final int loadBatchSize = this.getConfig().getMaxRowsInImportBatch(); + final int loadBatchSize = this.getConfig().getCurrentSettingForMaxRowsInImportBatch(); final int daoRowNumBase = getDao().getCurrentRowNumber(); final List daoRowList = getDao().readTableRowList(loadBatchSize); if (daoRowList == null || daoRowList.size() == 0) return false; @@ -101,6 +101,7 @@ protected boolean visit() throws DataAccessObjectException, ParameterLoadExcepti // BulkV2 completed a job. // Create a new visitor for a new job. However, it should use // the LoadRateCalculator instance from the current visitor. + getLogger().info("Need to run multiple Bulkv2 API jobs to complete upload"); setVisitor(this.createVisitor(this.getVisitor().getLoadRateCalculator(), false)); } successfulVisit = getVisitor().visit(daoRow); diff --git a/src/main/java/com/salesforce/dataloader/action/visitor/DAOLoadVisitor.java b/src/main/java/com/salesforce/dataloader/action/visitor/DAOLoadVisitor.java index 6131a093..3018053b 100644 --- a/src/main/java/com/salesforce/dataloader/action/visitor/DAOLoadVisitor.java +++ b/src/main/java/com/salesforce/dataloader/action/visitor/DAOLoadVisitor.java @@ -112,7 +112,7 @@ protected DAOLoadVisitor(Controller controller, ILoaderProgress monitor, DataWri dynaArray = dynaList; SforceDynaBean.registerConverters(getConfig()); - this.MAX_ROWS_IN_BATCH = getConfig().getMaxRowsInImportBatch(); + this.MAX_ROWS_IN_BATCH = getConfig().getCurrentSettingForMaxRowsInImportBatch(); rowConversionFailureMap = new HashMap(); String newRichTextRegex = getConfig().getString(AppConfig.PROP_RICH_TEXT_FIELD_REGEX); if (newRichTextRegex != null diff --git a/src/main/java/com/salesforce/dataloader/action/visitor/bulk/BulkLoadVisitor.java b/src/main/java/com/salesforce/dataloader/action/visitor/bulk/BulkLoadVisitor.java index 1ac7e33a..bf04ed87 100644 --- a/src/main/java/com/salesforce/dataloader/action/visitor/bulk/BulkLoadVisitor.java +++ b/src/main/java/com/salesforce/dataloader/action/visitor/bulk/BulkLoadVisitor.java @@ -638,11 +638,6 @@ public Map getAttachments() { return this.jobUtil.getAttachments(); } - @Override - protected int getMaxBytesInBatch() { - return this.getConfig().isBulkV2APIEnabled() ? AppConfig.MAX_BULKV2_API_IMPORT_JOB_BYTES : AppConfig.MAX_BULK_API_IMPORT_BATCH_BYTES; - } - @Override protected int getBytesInBean(DynaBean dynaBean) { final ByteArrayOutputStream os = new ByteArrayOutputStream(); @@ -664,4 +659,9 @@ protected int getBytesInBean(DynaBean dynaBean) { } return beanBytes; } + + @Override + protected int getMaxBytesInBatch() { + return controller.getAppConfig().getMaxBytesInBulkBatch(); + } } diff --git a/src/main/java/com/salesforce/dataloader/config/AppConfig.java b/src/main/java/com/salesforce/dataloader/config/AppConfig.java index 57751d8f..6d4f2b8f 100644 --- a/src/main/java/com/salesforce/dataloader/config/AppConfig.java +++ b/src/main/java/com/salesforce/dataloader/config/AppConfig.java @@ -146,7 +146,8 @@ public class AppConfig { // Bulk v1 and v2 limits specified at https://developer.salesforce.com/docs/atlas.en-us.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_bulkapi.htm public static final int MAX_BULK_API_IMPORT_BATCH_BYTES = 10000000; public static final int MAX_NUM_ROWS_BULK_API_IMPORT_BATCH = 10000; - public static final int MAX_BULKV2_API_IMPORT_JOB_BYTES = 150000000; + public static final int DEFAULT_MAX_BULKV2_API_IMPORT_JOB_BYTES = 150000000; + private static int currentMaxBulkv2APIImportJobBytes = DEFAULT_MAX_BULKV2_API_IMPORT_JOB_BYTES; public static final int MAX_NUM_ROWS_BULKV2_API_IMPORT_JOB = 150000000; public static final int DEFAULT_NUM_ROWS_BULK_API_IMPORT_BATCH = 2000; @@ -1675,7 +1676,7 @@ public boolean isBatchMode() { return (AppUtil.getAppRunMode() == AppUtil.APP_RUN_MODE.BATCH); } - public int getMaxRowsInImportBatch() { + public int getCurrentSettingForMaxRowsInImportBatch() { boolean bulkApi = isBulkAPIEnabled(); boolean bulkV2Api = this.isBulkV2APIEnabled(); @@ -1689,17 +1690,17 @@ public int getMaxRowsInImportBatch() { } catch (ParameterLoadException e) { } int maxBatchSize = bulkApi ? MAX_NUM_ROWS_BULK_API_IMPORT_BATCH : MAX_NUM_ROWS_SOAP_API_IMPORT_BATCH; - return bs > maxBatchSize ? maxBatchSize : bs > 0 ? bs : getDefaultImportBatchSize(bulkApi, bulkV2Api); + return bs > maxBatchSize ? maxBatchSize : bs > 0 ? bs : getDefaultNumRowsImportBatch(bulkApi, bulkV2Api); } - public int getDefaultImportBatchSize(boolean bulkApi, boolean bulkV2Api) { + public int getDefaultNumRowsImportBatch(boolean bulkApi, boolean bulkV2Api) { if (bulkV2Api) { return MAX_NUM_ROWS_BULKV2_API_IMPORT_JOB; } return bulkApi ? DEFAULT_NUM_ROWS_BULK_API_IMPORT_BATCH : DEFAULT_NUM_ROWS_LOAD_BATCH; } - public int getMaxImportBatchSize(boolean bulkApi, boolean bulkV2Api) { + public int getMaxPossibleNumRowsImportBatchForAPIType(boolean bulkApi, boolean bulkV2Api) { if (bulkV2Api) { return MAX_NUM_ROWS_BULKV2_API_IMPORT_JOB; } @@ -2003,4 +2004,12 @@ public static AppConfig getCurrentConfig() { public static interface ConfigListener { void configValueChanged(String key, String oldValue, String newValue); } + + public static void setBulkV2JobMaxBytes(int maxBytes) { + currentMaxBulkv2APIImportJobBytes = maxBytes; + } + + public int getMaxBytesInBulkBatch() { + return isBulkV2APIEnabled() ? AppConfig.currentMaxBulkv2APIImportJobBytes : AppConfig.MAX_BULK_API_IMPORT_BATCH_BYTES; + } } diff --git a/src/main/java/com/salesforce/dataloader/ui/AdvancedSettingsDialog.java b/src/main/java/com/salesforce/dataloader/ui/AdvancedSettingsDialog.java index e6315d53..d8de447e 100644 --- a/src/main/java/com/salesforce/dataloader/ui/AdvancedSettingsDialog.java +++ b/src/main/java/com/salesforce/dataloader/ui/AdvancedSettingsDialog.java @@ -345,11 +345,11 @@ public void widgetSelected(SelectionEvent e) { setAllApiOptions(); // update batch size when this setting changes - int newDefaultBatchSize = getController().getAppConfig().getDefaultImportBatchSize(false, false); + int newDefaultBatchSize = getController().getAppConfig().getDefaultNumRowsImportBatch(false, false); logger.debug("Setting batch size to " + newDefaultBatchSize); textImportBatchSize.setText(String.valueOf(newDefaultBatchSize)); String[] args = {getImportBatchLimitsURL(), - Integer.toString(appConfig.getMaxImportBatchSize(useBulkAPI || useBulkV2API, useBulkV2API))}; + Integer.toString(appConfig.getMaxPossibleNumRowsImportBatchForAPIType(useBulkAPI || useBulkV2API, useBulkV2API))}; labelImportBatchSize.setText( Labels.getFormattedString(AdvancedSettingsDialog.class.getSimpleName() + ".uiLabel." + AppConfig.PROP_IMPORT_BATCH_SIZE, args)); labelImportBatchSize.redraw(); @@ -377,11 +377,11 @@ public void widgetSelected(SelectionEvent e) { setAllApiOptions(); // update batch size when this setting changes - int newDefaultBatchSize = getController().getAppConfig().getDefaultImportBatchSize(true, false); + int newDefaultBatchSize = getController().getAppConfig().getDefaultNumRowsImportBatch(true, false); logger.debug("Setting batch size to " + newDefaultBatchSize); textImportBatchSize.setText(String.valueOf(newDefaultBatchSize)); String[] args = {getImportBatchLimitsURL(), - Integer.toString(appConfig.getMaxImportBatchSize(useBulkAPI || useBulkV2API, useBulkV2API))}; + Integer.toString(appConfig.getMaxPossibleNumRowsImportBatchForAPIType(useBulkAPI || useBulkV2API, useBulkV2API))}; labelImportBatchSize.setText( Labels.getFormattedString(AdvancedSettingsDialog.class.getSimpleName() + ".uiLabel." + AppConfig.PROP_IMPORT_BATCH_SIZE, args)); labelImportBatchSize.redraw(); @@ -410,11 +410,11 @@ public void widgetSelected(SelectionEvent e) { setAllApiOptions(); // get default batch size for Bulk v2 and set it - int newDefaultBatchSize = getController().getAppConfig().getDefaultImportBatchSize(true, true); + int newDefaultBatchSize = getController().getAppConfig().getDefaultNumRowsImportBatch(true, true); logger.debug("Setting batch size to " + newDefaultBatchSize); textImportBatchSize.setText(String.valueOf(newDefaultBatchSize)); String[] args = {getImportBatchLimitsURL(), - Integer.toString(appConfig.getMaxImportBatchSize(useBulkAPI || useBulkV2API, useBulkV2API))}; + Integer.toString(appConfig.getMaxPossibleNumRowsImportBatchForAPIType(useBulkAPI || useBulkV2API, useBulkV2API))}; labelImportBatchSize.setText( Labels.getFormattedString(AdvancedSettingsDialog.class.getSimpleName() + ".uiLabel." + AppConfig.PROP_IMPORT_BATCH_SIZE, args)); labelImportBatchSize.redraw(); @@ -537,10 +537,10 @@ public void verifyText(VerifyEvent event) { this.importBatchSizeComposite.setLayout(layout); String[] args = {getImportBatchLimitsURL(), - Integer.toString(appConfig.getMaxImportBatchSize(useBulkAPI || useBulkV2API, useBulkV2API))}; + Integer.toString(appConfig.getMaxPossibleNumRowsImportBatchForAPIType(useBulkAPI || useBulkV2API, useBulkV2API))}; labelImportBatchSize = createLink(importBatchSizeComposite, null, args, AppConfig.PROP_IMPORT_BATCH_SIZE); textImportBatchSize = new Text(importBatchSizeComposite, SWT.BORDER); - textImportBatchSize.setText(Integer.toString(appConfig.getMaxRowsInImportBatch())); + textImportBatchSize.setText(Integer.toString(appConfig.getCurrentSettingForMaxRowsInImportBatch())); textImportBatchSize.setEnabled(!useBulkV2API); textImportBatchSize.addVerifyListener(new VerifyListener() { @Override diff --git a/src/main/java/com/salesforce/dataloader/ui/DataSelectionDialog.java b/src/main/java/com/salesforce/dataloader/ui/DataSelectionDialog.java index 62211601..7f116e6c 100644 --- a/src/main/java/com/salesforce/dataloader/ui/DataSelectionDialog.java +++ b/src/main/java/com/salesforce/dataloader/ui/DataSelectionDialog.java @@ -167,7 +167,7 @@ protected void processingWithBusyIndicator(Shell shell) { + "\n\n" + Labels.getString("LoadPage.importBatchSize") + " " - + getController().getAppConfig().getMaxRowsInImportBatch() + + getController().getAppConfig().getCurrentSettingForMaxRowsInImportBatch() + "\n" + Labels.getString("AdvancedSettingsDialog.uiLabel." + AppConfig.PROP_LOAD_ROW_TO_START_AT) + " " diff --git a/src/main/java/com/salesforce/dataloader/ui/LoadPage.java b/src/main/java/com/salesforce/dataloader/ui/LoadPage.java index 2f08cee1..e51cc964 100644 --- a/src/main/java/com/salesforce/dataloader/ui/LoadPage.java +++ b/src/main/java/com/salesforce/dataloader/ui/LoadPage.java @@ -53,7 +53,7 @@ public LoadPage(String name, Controller controller) { protected String getConfigInfo() { return Labels.getString("LoadPage.importBatchSize") + " " - + controller.getAppConfig().getMaxRowsInImportBatch() + + controller.getAppConfig().getCurrentSettingForMaxRowsInImportBatch() + " " + Labels.getString("AdvancedSettingsDialog.uiLabel." + AppConfig.PROP_LOAD_ROW_TO_START_AT) + " " diff --git a/src/test/java/com/salesforce/dataloader/process/CsvProcessTest.java b/src/test/java/com/salesforce/dataloader/process/CsvProcessTest.java index e85cc509..75c0eaae 100644 --- a/src/test/java/com/salesforce/dataloader/process/CsvProcessTest.java +++ b/src/test/java/com/salesforce/dataloader/process/CsvProcessTest.java @@ -222,8 +222,29 @@ public void testUpsertAccountCsv() throws Exception { } // manually inserts 50 accounts, then upserts 100 accounts (50 inserts and 50 updates) runUpsertProcess(configMap, 50, 50); + if (isSettingEnabled(configMap, AppConfig.PROP_BULKV2_API_ENABLED)) { + // test ability to run multiple Bulk v2 jobs + AppConfig.setBulkV2JobMaxBytes(1500); + runUpsertProcess(configMap, 0, 100); + AppConfig.setBulkV2JobMaxBytes(AppConfig.DEFAULT_MAX_BULKV2_API_IMPORT_JOB_BYTES); + } } - + + /** + * test ability to run multiple Bulk v2 jobs + */ + @Test + public void testBulkV2MultipleJobsCsv() throws Exception { + Map configMap = getUpdateTestConfig(true, DEFAULT_ACCOUNT_EXT_ID_FIELD, 50); + if (!isSettingEnabled(configMap, AppConfig.PROP_BULKV2_API_ENABLED)) { + return; + } + AppConfig.setBulkV2JobMaxBytes(1500); + // creates multiple bulk v2 jobs while creating 50 accounts, then upserting 100 accounts (50 inserts and 50 updates) + runUpsertProcess(configMap, 50, 50); + AppConfig.setBulkV2JobMaxBytes(AppConfig.DEFAULT_MAX_BULKV2_API_IMPORT_JOB_BYTES); + } + /** * Verify that when the constants are placed into the .sdl mapping file, * they are treated correctly. It tests that constants mapped on 1 field and diff --git a/src/test/resources/testfiles/data/bulkV2MultipleJobsCsvMap.sdl b/src/test/resources/testfiles/data/bulkV2MultipleJobsCsvMap.sdl new file mode 100644 index 00000000..4fea3f85 --- /dev/null +++ b/src/test/resources/testfiles/data/bulkV2MultipleJobsCsvMap.sdl @@ -0,0 +1,9 @@ +#Mapping values +#Tue Jun 20 18:59:17 PDT 2006 +ACCOUNTNUMBER__C=AccountNumber__c +NAME=Name +WEBSITE=Website +TYPE=Type +ANNUALREVENUE=AnnualRevenue +PHONE=Phone +ORACLE_ID__C=Oracle_Id__c \ No newline at end of file diff --git a/src/test/resources/testfiles/data/bulkV2MultipleJobsCsvTemplate.csv b/src/test/resources/testfiles/data/bulkV2MultipleJobsCsvTemplate.csv new file mode 100644 index 00000000..1f83e0be --- /dev/null +++ b/src/test/resources/testfiles/data/bulkV2MultipleJobsCsvTemplate.csv @@ -0,0 +1,101 @@ +NAME,TYPE,PHONE,ACCOUNTNUMBER__C,WEBSITE,ANNUALREVENUE,ORACLE_ID__C +account Upsert #0,Account,415-555-0000,ACCT_0,http://www.accountUpsert0.com,0,1-000000 +account Upsert #1,Account,415-555-0001,ACCT_1,http://www.accountUpsert1.com,1000,1-000001 +account Upsert #2,Account,415-555-0002,ACCT_2,http://www.accountUpsert2.com,2000,1-000002 +account Upsert #3,Account,415-555-0003,ACCT_3,http://www.accountUpsert3.com,3000,1-000003 +account Upsert #4,Account,415-555-0004,ACCT_4,http://www.accountUpsert4.com,4000,1-000004 +account Upsert #5,Account,415-555-0005,ACCT_5,http://www.accountUpsert5.com,5000,1-000005 +account Upsert #6,Account,415-555-0006,ACCT_6,http://www.accountUpsert6.com,6000,1-000006 +account Upsert #7,Account,415-555-0007,ACCT_7,http://www.accountUpsert7.com,7000,1-000007 +account Upsert #8,Account,415-555-0008,ACCT_8,http://www.accountUpsert8.com,8000,1-000008 +account Upsert #9,Account,415-555-0009,ACCT_9,http://www.accountUpsert9.com,9000,1-000009 +account Upsert #10,Account,415-555-0010,ACCT_10,http://www.accountUpsert10.com,10000,1-000010 +account Upsert #11,Account,415-555-0011,ACCT_11,http://www.accountUpsert11.com,11000,1-000011 +account Upsert #12,Account,415-555-0012,ACCT_12,http://www.accountUpsert12.com,12000,1-000012 +account Upsert #13,Account,415-555-0013,ACCT_13,http://www.accountUpsert13.com,13000,1-000013 +account Upsert #14,Account,415-555-0014,ACCT_14,http://www.accountUpsert14.com,14000,1-000014 +account Upsert #15,Account,415-555-0015,ACCT_15,http://www.accountUpsert15.com,15000,1-000015 +account Upsert #16,Account,415-555-0016,ACCT_16,http://www.accountUpsert16.com,16000,1-000016 +account Upsert #17,Account,415-555-0017,ACCT_17,http://www.accountUpsert17.com,17000,1-000017 +account Upsert #18,Account,415-555-0018,ACCT_18,http://www.accountUpsert18.com,18000,1-000018 +account Upsert #19,Account,415-555-0019,ACCT_19,http://www.accountUpsert19.com,19000,1-000019 +account Upsert #20,Account,415-555-0020,ACCT_20,http://www.accountUpsert20.com,20000,1-000020 +account Upsert #21,Account,415-555-0021,ACCT_21,http://www.accountUpsert21.com,21000,1-000021 +account Upsert #22,Account,415-555-0022,ACCT_22,http://www.accountUpsert22.com,22000,1-000022 +account Upsert #23,Account,415-555-0023,ACCT_23,http://www.accountUpsert23.com,23000,1-000023 +account Upsert #24,Account,415-555-0024,ACCT_24,http://www.accountUpsert24.com,24000,1-000024 +account Upsert #25,Account,415-555-0025,ACCT_25,http://www.accountUpsert25.com,25000,1-000025 +account Upsert #26,Account,415-555-0026,ACCT_26,http://www.accountUpsert26.com,26000,1-000026 +account Upsert #27,Account,415-555-0027,ACCT_27,http://www.accountUpsert27.com,27000,1-000027 +account Upsert #28,Account,415-555-0028,ACCT_28,http://www.accountUpsert28.com,28000,1-000028 +account Upsert #29,Account,415-555-0029,ACCT_29,http://www.accountUpsert29.com,29000,1-000029 +account Upsert #30,Account,415-555-0030,ACCT_30,http://www.accountUpsert30.com,30000,1-000030 +account Upsert #31,Account,415-555-0031,ACCT_31,http://www.accountUpsert31.com,31000,1-000031 +account Upsert #32,Account,415-555-0032,ACCT_32,http://www.accountUpsert32.com,32000,1-000032 +account Upsert #33,Account,415-555-0033,ACCT_33,http://www.accountUpsert33.com,33000,1-000033 +account Upsert #34,Account,415-555-0034,ACCT_34,http://www.accountUpsert34.com,34000,1-000034 +account Upsert #35,Account,415-555-0035,ACCT_35,http://www.accountUpsert35.com,35000,1-000035 +account Upsert #36,Account,415-555-0036,ACCT_36,http://www.accountUpsert36.com,36000,1-000036 +account Upsert #37,Account,415-555-0037,ACCT_37,http://www.accountUpsert37.com,37000,1-000037 +account Upsert #38,Account,415-555-0038,ACCT_38,http://www.accountUpsert38.com,38000,1-000038 +account Upsert #39,Account,415-555-0039,ACCT_39,http://www.accountUpsert39.com,39000,1-000039 +account Upsert #40,Account,415-555-0040,ACCT_40,http://www.accountUpsert40.com,40000,1-000040 +account Upsert #41,Account,415-555-0041,ACCT_41,http://www.accountUpsert41.com,41000,1-000041 +account Upsert #42,Account,415-555-0042,ACCT_42,http://www.accountUpsert42.com,42000,1-000042 +account Upsert #43,Account,415-555-0043,ACCT_43,http://www.accountUpsert43.com,43000,1-000043 +account Upsert #44,Account,415-555-0044,ACCT_44,http://www.accountUpsert44.com,44000,1-000044 +account Upsert #45,Account,415-555-0045,ACCT_45,http://www.accountUpsert45.com,45000,1-000045 +account Upsert #46,Account,415-555-0046,ACCT_46,http://www.accountUpsert46.com,46000,1-000046 +account Upsert #47,Account,415-555-0047,ACCT_47,http://www.accountUpsert47.com,47000,1-000047 +account Upsert #48,Account,415-555-0048,ACCT_48,http://www.accountUpsert48.com,48000,1-000048 +account Upsert #49,Account,415-555-0049,ACCT_49,http://www.accountUpsert49.com,49000,1-000049 +account Upsert #50,Account,415-555-0050,ACCT_50,http://www.accountUpsert50.com,50000,1-000050 +account Upsert #51,Account,415-555-0051,ACCT_51,http://www.accountUpsert51.com,51000,1-000051 +account Upsert #52,Account,415-555-0052,ACCT_52,http://www.accountUpsert52.com,52000,1-000052 +account Upsert #53,Account,415-555-0053,ACCT_53,http://www.accountUpsert53.com,53000,1-000053 +account Upsert #54,Account,415-555-0054,ACCT_54,http://www.accountUpsert54.com,54000,1-000054 +account Upsert #55,Account,415-555-0055,ACCT_55,http://www.accountUpsert55.com,55000,1-000055 +account Upsert #56,Account,415-555-0056,ACCT_56,http://www.accountUpsert56.com,56000,1-000056 +account Upsert #57,Account,415-555-0057,ACCT_57,http://www.accountUpsert57.com,57000,1-000057 +account Upsert #58,Account,415-555-0058,ACCT_58,http://www.accountUpsert58.com,58000,1-000058 +account Upsert #59,Account,415-555-0059,ACCT_59,http://www.accountUpsert59.com,59000,1-000059 +account Upsert #60,Account,415-555-0060,ACCT_60,http://www.accountUpsert60.com,60000,1-000060 +account Upsert #61,Account,415-555-0061,ACCT_61,http://www.accountUpsert61.com,61000,1-000061 +account Upsert #62,Account,415-555-0062,ACCT_62,http://www.accountUpsert62.com,62000,1-000062 +account Upsert #63,Account,415-555-0063,ACCT_63,http://www.accountUpsert63.com,63000,1-000063 +account Upsert #64,Account,415-555-0064,ACCT_64,http://www.accountUpsert64.com,64000,1-000064 +account Upsert #65,Account,415-555-0065,ACCT_65,http://www.accountUpsert65.com,65000,1-000065 +account Upsert #66,Account,415-555-0066,ACCT_66,http://www.accountUpsert66.com,66000,1-000066 +account Upsert #67,Account,415-555-0067,ACCT_67,http://www.accountUpsert67.com,67000,1-000067 +account Upsert #68,Account,415-555-0068,ACCT_68,http://www.accountUpsert68.com,68000,1-000068 +account Upsert #69,Account,415-555-0069,ACCT_69,http://www.accountUpsert69.com,69000,1-000069 +account Upsert #70,Account,415-555-0070,ACCT_70,http://www.accountUpsert70.com,70000,1-000070 +account Upsert #71,Account,415-555-0071,ACCT_71,http://www.accountUpsert71.com,71000,1-000071 +account Upsert #72,Account,415-555-0072,ACCT_72,http://www.accountUpsert72.com,72000,1-000072 +account Upsert #73,Account,415-555-0073,ACCT_73,http://www.accountUpsert73.com,73000,1-000073 +account Upsert #74,Account,415-555-0074,ACCT_74,http://www.accountUpsert74.com,74000,1-000074 +account Upsert #75,Account,415-555-0075,ACCT_75,http://www.accountUpsert75.com,75000,1-000075 +account Upsert #76,Account,415-555-0076,ACCT_76,http://www.accountUpsert76.com,76000,1-000076 +account Upsert #77,Account,415-555-0077,ACCT_77,http://www.accountUpsert77.com,77000,1-000077 +account Upsert #78,Account,415-555-0078,ACCT_78,http://www.accountUpsert78.com,78000,1-000078 +account Upsert #79,Account,415-555-0079,ACCT_79,http://www.accountUpsert79.com,79000,1-000079 +account Upsert #80,Account,415-555-0080,ACCT_80,http://www.accountUpsert80.com,80000,1-000080 +account Upsert #81,Account,415-555-0081,ACCT_81,http://www.accountUpsert81.com,81000,1-000081 +account Upsert #82,Account,415-555-0082,ACCT_82,http://www.accountUpsert82.com,82000,1-000082 +account Upsert #83,Account,415-555-0083,ACCT_83,http://www.accountUpsert83.com,83000,1-000083 +account Upsert #84,Account,415-555-0084,ACCT_84,http://www.accountUpsert84.com,84000,1-000084 +account Upsert #85,Account,415-555-0085,ACCT_85,http://www.accountUpsert85.com,85000,1-000085 +account Upsert #86,Account,415-555-0086,ACCT_86,http://www.accountUpsert86.com,86000,1-000086 +account Upsert #87,Account,415-555-0087,ACCT_87,http://www.accountUpsert87.com,87000,1-000087 +account Upsert #88,Account,415-555-0088,ACCT_88,http://www.accountUpsert88.com,88000,1-000088 +account Upsert #89,Account,415-555-0089,ACCT_89,http://www.accountUpsert89.com,89000,1-000089 +account Upsert #90,Account,415-555-0090,ACCT_90,http://www.accountUpsert90.com,90000,1-000090 +account Upsert #91,Account,415-555-0091,ACCT_91,http://www.accountUpsert91.com,91000,1-000091 +account Upsert #92,Account,415-555-0092,ACCT_92,http://www.accountUpsert92.com,92000,1-000092 +account Upsert #93,Account,415-555-0093,ACCT_93,http://www.accountUpsert93.com,93000,1-000093 +account Upsert #94,Account,415-555-0094,ACCT_94,http://www.accountUpsert94.com,94000,1-000094 +account Upsert #95,Account,415-555-0095,ACCT_95,http://www.accountUpsert95.com,95000,1-000095 +account Upsert #96,Account,415-555-0096,ACCT_96,http://www.accountUpsert96.com,96000,1-000096 +account Upsert #97,Account,415-555-0097,ACCT_97,http://www.accountUpsert97.com,97000,1-000097 +account Upsert #98,Account,415-555-0098,ACCT_98,http://www.accountUpsert98.com,98000,1-000098 +account Upsert #99,Account,415-555-0099,ACCT_99,http://www.accountUpsert99.com,99000,1-000099