From 43c3f0c79ebfc99f9d9ab1760d28cdb3b07fff99 Mon Sep 17 00:00:00 2001 From: Aaron Crosman Date: Sat, 15 Jan 2022 12:35:41 -0500 Subject: [PATCH 1/7] Better recovery after second attempt on table. --- src/sf_calls.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/sf_calls.js b/src/sf_calls.js index 7c70f1f..c9fb8ee 100644 --- a/src/sf_calls.js +++ b/src/sf_calls.js @@ -555,7 +555,17 @@ const buildDatabase = (settings) => { // If we updated the schema, try again. if (changed) { logMessage('Database Create', 'Warning', `Proposed ${table} schema had too many string fields for your database. All strings will be text fields instead.`); - createDbTable(table); + createDbTable(schema, table); + } else { + logMessage('Database Create', 'Error', `Unable to create table: ${table}. There are too many columns for the database engine even after converting all text fields to use text storage. \nError ${err.errno}(${err.code}) creating table: ${err.message}. Full statement:\n ${err.sql}`); + tableStatuses[table] = false; + if (Object.getOwnPropertyNames(proposedSchema).length === tables.length) { + mainWindow.webContents.send('response_db_generated', { + status: true, + message: 'Database created', + responses: tableStatuses, + }); + } } } else { logMessage('Database Create', 'Error', `Error ${err.errno}(${err.code}) creating table: ${err.message}. Full statement:\n ${err.sql}`); From 4f7103cdbeaeb6d0026a553ab66f8c6a03790a5b Mon Sep 17 00:00:00 2001 From: Aaron Crosman Date: Sat, 15 Jan 2022 12:55:05 -0500 Subject: [PATCH 2/7] Change ID type, convert more fields when too long --- src/sf_calls.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sf_calls.js b/src/sf_calls.js index c9fb8ee..c0e4d80 100644 --- a/src/sf_calls.js +++ b/src/sf_calls.js @@ -25,7 +25,7 @@ const typeResolverBases = { double: 'decimal', email: 'string', encryptedstring: 'string', - id: 'string', + id: 'reference', int: 'integer', long: 'biginteger', masterrecord: 'string', @@ -542,12 +542,12 @@ const buildDatabase = (settings) => { } }) .catch((err) => { - // If the row is too big, replace all varchar with text and try again. + // If the row is too big, replace all varchar (except reference fields) with text and try again. if (err.code === 'ER_TOO_BIG_ROWSIZE') { let changed = false; const tableFields = Object.getOwnPropertyNames(proposedSchema[table]); for (let i = 0; i < tableFields.length; i += 1) { - if (proposedSchema[table][tableFields[i]].type === 'string') { + if (resolveFieldType(proposedSchema[table][tableFields[i]].type) === 'string') { proposedSchema[table][tableFields[i]].type = 'text'; changed = true; } From 1558c53cfedbbb5e0fd9ea9fc429845f078d72a0 Mon Sep 17 00:00:00 2001 From: Aaron Crosman Date: Sat, 15 Jan 2022 12:57:14 -0500 Subject: [PATCH 3/7] Fix linting error --- src/sf_calls.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sf_calls.js b/src/sf_calls.js index c0e4d80..6d72ee2 100644 --- a/src/sf_calls.js +++ b/src/sf_calls.js @@ -542,7 +542,7 @@ const buildDatabase = (settings) => { } }) .catch((err) => { - // If the row is too big, replace all varchar (except reference fields) with text and try again. + // If the row is too big, replace all varchar (except ref fields) with text and try again. if (err.code === 'ER_TOO_BIG_ROWSIZE') { let changed = false; const tableFields = Object.getOwnPropertyNames(proposedSchema[table]); From 68f9460d5ec3af5c7a912e06ba40f38d926e58f8 Mon Sep 17 00:00:00 2001 From: Aaron Crosman Date: Sat, 15 Jan 2022 16:39:24 -0500 Subject: [PATCH 4/7] Adding handler for too many key errors --- src/sf_calls.js | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/sf_calls.js b/src/sf_calls.js index 6d72ee2..2dffff8 100644 --- a/src/sf_calls.js +++ b/src/sf_calls.js @@ -559,24 +559,21 @@ const buildDatabase = (settings) => { } else { logMessage('Database Create', 'Error', `Unable to create table: ${table}. There are too many columns for the database engine even after converting all text fields to use text storage. \nError ${err.errno}(${err.code}) creating table: ${err.message}. Full statement:\n ${err.sql}`); tableStatuses[table] = false; - if (Object.getOwnPropertyNames(proposedSchema).length === tables.length) { - mainWindow.webContents.send('response_db_generated', { - status: true, - message: 'Database created', - responses: tableStatuses, - }); - } + } + if (err.code === 'ER_TOO_MANY_KEYS') { + logMessage('Database Create', 'Warning', `Error ${err.errno}(${err.code}) adding keys to ${table}. Table was created but some desired indexes may be missing.`); + tableStatuses[table] = true; } } else { logMessage('Database Create', 'Error', `Error ${err.errno}(${err.code}) creating table: ${err.message}. Full statement:\n ${err.sql}`); tableStatuses[table] = false; - if (Object.getOwnPropertyNames(proposedSchema).length === tables.length) { - mainWindow.webContents.send('response_db_generated', { - status: true, - message: 'Database created', - responses: tableStatuses, - }); - } + } + if (Object.getOwnPropertyNames(proposedSchema).length === tables.length) { + mainWindow.webContents.send('response_db_generated', { + status: true, + message: 'Database created', + responses: tableStatuses, + }); } return err; }); From 6df45207818fe5e1de932a8d4ca82e8acb6df559 Mon Sep 17 00:00:00 2001 From: Aaron Crosman Date: Sat, 15 Jan 2022 16:41:56 -0500 Subject: [PATCH 5/7] Nested conditional correction --- src/sf_calls.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/sf_calls.js b/src/sf_calls.js index 2dffff8..dc04688 100644 --- a/src/sf_calls.js +++ b/src/sf_calls.js @@ -560,12 +560,11 @@ const buildDatabase = (settings) => { logMessage('Database Create', 'Error', `Unable to create table: ${table}. There are too many columns for the database engine even after converting all text fields to use text storage. \nError ${err.errno}(${err.code}) creating table: ${err.message}. Full statement:\n ${err.sql}`); tableStatuses[table] = false; } - if (err.code === 'ER_TOO_MANY_KEYS') { - logMessage('Database Create', 'Warning', `Error ${err.errno}(${err.code}) adding keys to ${table}. Table was created but some desired indexes may be missing.`); - tableStatuses[table] = true; - } + } else if (err.code === 'ER_TOO_MANY_KEYS') { + logMessage('Database Create', 'Warning', `Error ${err.errno}(${err.code}) adding keys to ${table}. Table was created but some desired indexes may be missing.`); + tableStatuses[table] = true; } else { - logMessage('Database Create', 'Error', `Error ${err.errno}(${err.code}) creating table: ${err.message}. Full statement:\n ${err.sql}`); + logMessage('Database Create', 'Error', `Error ${err.errno}(${err.code}) creating table: ${err.message}.Full statement: \n ${err.sql}`); tableStatuses[table] = false; } if (Object.getOwnPropertyNames(proposedSchema).length === tables.length) { @@ -667,11 +666,11 @@ const handlers = { mainWindow.webContents.send('response_logout', { status: false, message: 'Logout Failed', - response: `${err}`, + response: `${err} `, limitInfo: conn.limitInfo, request: args, }); - logMessage(event.sender.getTitle(), 'Error', `Logout Failed ${err}`); + logMessage(event.sender.getTitle(), 'Error', `Logout Failed ${err} `); return true; } // now the session has been expired. @@ -699,7 +698,7 @@ const handlers = { mainWindow.webContents.send('response_error', { status: false, message: 'Describe Global Failed', - response: `${err}`, + response: `${err} `, limitInfo: conn.limitInfo, request: args, }); @@ -758,7 +757,7 @@ const handlers = { }); } }, (err) => { - logMessage('Field Fetch', 'Error', `Error loading describe for ${obj}: ${err}`); + logMessage('Field Fetch', 'Error', `Error loading describe for ${obj}: ${err} `); }); }); }, From 37f7e8103333fd7e3b98d29fc5be1cab38531efd Mon Sep 17 00:00:00 2001 From: Aaron Crosman Date: Sat, 15 Jan 2022 16:47:06 -0500 Subject: [PATCH 6/7] Correct status check list --- src/sf_calls.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sf_calls.js b/src/sf_calls.js index dc04688..14b8c76 100644 --- a/src/sf_calls.js +++ b/src/sf_calls.js @@ -567,7 +567,7 @@ const buildDatabase = (settings) => { logMessage('Database Create', 'Error', `Error ${err.errno}(${err.code}) creating table: ${err.message}.Full statement: \n ${err.sql}`); tableStatuses[table] = false; } - if (Object.getOwnPropertyNames(proposedSchema).length === tables.length) { + if (Object.getOwnPropertyNames(tableStatuses).length === tables.length) { mainWindow.webContents.send('response_db_generated', { status: true, message: 'Database created', From b793076b59c4100d205059605e9f2a12a271ab34 Mon Sep 17 00:00:00 2001 From: Aaron Crosman Date: Sat, 15 Jan 2022 17:21:15 -0500 Subject: [PATCH 7/7] Clean up loader message handling --- src/sf_calls.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/sf_calls.js b/src/sf_calls.js index 14b8c76..326453f 100644 --- a/src/sf_calls.js +++ b/src/sf_calls.js @@ -155,6 +155,14 @@ const logMessage = (title, channel, message) => { return true; }; +/** + * Updates the loader message in the interface. + * @param {String} message + */ +const updateLoader = (message) => { + mainWindow.webContents.send('update_loader', { message }); +}; + /** * Extracts the list of field values from a picklist value set. * @param {Array} valueList list of values from a Salesforce describe response. @@ -538,7 +546,7 @@ const buildDatabase = (settings) => { responses: tableStatuses, }); } else { - mainWindow.webContents.send('update_loader', { message: `Creating ${tables.length} tables, ${Object.getOwnPropertyNames(tableStatuses).length} complete` }); + updateLoader(`Creating ${tables.length} tables, ${Object.getOwnPropertyNames(tableStatuses).length} complete`); } }) .catch((err) => { @@ -559,13 +567,16 @@ const buildDatabase = (settings) => { } else { logMessage('Database Create', 'Error', `Unable to create table: ${table}. There are too many columns for the database engine even after converting all text fields to use text storage. \nError ${err.errno}(${err.code}) creating table: ${err.message}. Full statement:\n ${err.sql}`); tableStatuses[table] = false; + updateLoader(`Creating ${tables.length} tables, ${Object.getOwnPropertyNames(tableStatuses).length} complete`); } } else if (err.code === 'ER_TOO_MANY_KEYS') { logMessage('Database Create', 'Warning', `Error ${err.errno}(${err.code}) adding keys to ${table}. Table was created but some desired indexes may be missing.`); tableStatuses[table] = true; + updateLoader(`Creating ${tables.length} tables, ${Object.getOwnPropertyNames(tableStatuses).length} complete`); } else { logMessage('Database Create', 'Error', `Error ${err.errno}(${err.code}) creating table: ${err.message}.Full statement: \n ${err.sql}`); tableStatuses[table] = false; + updateLoader(`Creating ${tables.length} tables, ${Object.getOwnPropertyNames(tableStatuses).length} complete`); } if (Object.getOwnPropertyNames(tableStatuses).length === tables.length) { mainWindow.webContents.send('response_db_generated', { @@ -577,13 +588,13 @@ const buildDatabase = (settings) => { return err; }); - mainWindow.webContents.send('update_loader', { message: `Creating ${tables.length} tables` }); + updateLoader(`Creating ${tables.length} tables`); const dropCallback = (tableName, err) => { if (err) { logMessage('Database', 'Error', `Error dropping existing table ${err}`); } else { - mainWindow.webContents.send('update_loader', { message: `Creating ${tables.length} tables: deleted ${tableName}` }); + updateLoader(`Creating ${tables.length} tables: deleted ${tableName}`); createDbTable(db.schema, tableName); } }; @@ -735,13 +746,13 @@ const handlers = { // Log status logMessage('Schema', 'Info', `Fetching schema for ${args.objects.length} objects`); - mainWindow.webContents.send('update_loader', { message: `Loaded ${completedObjects} of ${args.objects.length} Object Describes` }); + updateLoader(`Loaded ${completedObjects} of ${args.objects.length} Object Describes`); args.objects.forEach((obj) => { conn.sobject(obj).describe().then((response) => { completedObjects += 1; proposedSchema[response.name] = buildFields(response.fields); - mainWindow.webContents.send('update_loader', { message: `Loaded ${completedObjects} of ${args.objects.length} Object Describes` }); + updateLoader(`Loaded ${completedObjects} of ${args.objects.length} Object Describes`); allObjects[response.name] = response; if (completedObjects === args.objects.length) { // Send Schema to interface for review.